更新记录

1.0.1(2025-04-13)

1、增加图形验证功能 2、增加短信验证登陆功能

1.0.0(2025-04-13)

上传插件


平台兼容性

Vue2 Vue3
App 快应用 微信小程序 支付宝小程序 百度小程序 字节小程序 QQ小程序
Android:4.4,iOS:不确定,HarmonyNext:不确定 × × × × × ×
钉钉小程序 快手小程序 飞书小程序 京东小程序 鸿蒙元服务
× × × × ×
H5-Safari Android Browser 微信浏览器(Android) QQ浏览器(Android) Chrome IE Edge Firefox PC-Safari
× × × × × × × × ×

hjy-topvpn

插件说明

本插件支持 uni-app 和 uni-app x 项目,uni-app x 的uts语法上有细微的区别。请先下载示例(uni-app)项目进行学习、试用,使用 HBuilderX 导入示例项目后,点击插件页面“试用”按钮引入插件,打包自定义基座就可以进行使用了。天融信SDK支持CPU的指令集包括arm、arm-v7a,arm64-v8a,其他CPU架构 不支持,其中arm64-v8a只支持国际协议国际算法,不支持国密,建议在真机环境下运行调试。

插件示例使用

1、通过插件市场“使用 HBuilderX 导入示例项目”下载插件示例项目(uniapp-vue2)

2、通过插件市场“试用”导入插件到示例项目中

3、打包并运行自定义基座(真机调试)

4、uni-app x (vue3)示例项目请联系作者提供

5、运行时提示“VPN实例初始化失败!可能是权限问题导致。”请先到 【 设置->应用管理 】 页面找到本程序,并在其 【 应用权限 】 中授权电话、存储和网络等权限然后再试(本示例程序未加入动态权限申请的功能);

获取插件对象

import * as topvpn from "@/uni_modules/hjy-topvpn";

演示界面

<template>
    <view style="padding: 5px 10px;">
        <view class="uni-padding-wrap uni-common-mt">
            <view class="uni-form-item uni-column">
                <view class="row-item"><text class="title">服务器IP:</text>
                <uni-easyinput v-model="mVpnAddress" placeholder="请输入服务器IP" />
                </view>
            </view>
            <view class="uni-form-item uni-column">
                <view class="row-item"><text class="title">端口:</text>
                <uni-easyinput type="digit"  v-model="mVpnPort" placeholder="请输入服务器端口" />
                </view>
            </view>
            <view class="uni-form-item uni-column">
                <view class="row-item"><text class="title">账  号:</text>
                <uni-easyinput  v-model="mUserName" placeholder="请输入账号" />
                </view>
            </view>
            <view class="uni-form-item uni-column">
                <view class="row-item"><text class="title">密   码:</text>
                <uni-easyinput type="password" v-model="mUserPassword" placeholder="请输入密码" />
                </view>
            </view>
            <view v-if="showRand">
                <view class="uni-form-item uni-column">
                    <view class="row-item"><text class="title">校验码:</text>
                    <uni-easyinput  v-model="randCode" placeholder="请输入图形校验码" />
                        <view @click="getRandCode()" style="width: 80px; background-color: black; height: 38px; border: solid 1 px red;"><image :src="randCodeBase64" style="width: 80px; height: 38px; "></image></view>
                    </view>
                </view>
                <view class="uni-btn-v">
                    <button type="default" @click="doRandAuth()" plain="true">图形辅助认证</button>
                </view>
            </view>
            <view class="uni-form-item uni-column" v-if="loginType==3">
                <view class="row-item"><text class="title">验证码:</text>
                <uni-easyinput  v-model="smsCode" placeholder="请输入短信验证码" />
                    <csr-button :count-down="true" :count-down-num="99" count-down-text="重新获取" class="btn" width="200rpx" height="70rpx" type="hollow" @click="regetSmsCode()" >获取验证码</csr-button>
                </view>
            </view>
            <view class="uni-btn-v">
                <button style="margin: 20rpx 0;" type="default" @click="doConfigVpn()" plain="true">配置VPN</button>
                <button style="margin-bottom: 20rpx;" type="default" @click="loginVPN()" :disabled="isDisabled" plain="true">登陆</button>
                <button style="margin-bottom: 20rpx;" type="default" @click="logoutVPN()" :disabled="isDisabled" plain="true">登出</button>
                <button style="margin-bottom: 20rpx;" type="default" @click="getVPNState()" plain="true">获取VPN状态</button>
                <button style="margin-bottom: 20rpx;" type="default" @click="getResource()" :disabled="isDisabled" plain="true">获取资源</button>
                <button style="margin-bottom: 20rpx;" type="default" @click="startService()" :disabled="isDisabled" plain="true">开启服务</button>
                <button style="margin-bottom: 20rpx;" type="default" @click="closeService()" :disabled="isDisabled" plain="true">关闭服务</button>
            </view>
        </view>
    </view>
</template>

初始化

export default {
    data() {
        return {
            isDisabled: true,
            showRand:false,
            loginType:0,//0-用户名口令认证,1-软证书认证,2-软证书双因子认证,3-短信认证
            mVpnAddress: '10.7.100.96',
            mVpnPort:443,
            mUserName: '',
            mUserPassword: '1',
            randCode:'',
            smsCode:'',
            randCodeBase64:''
        }
    },
    onLoad() {

    },
    created() {
        this.initSDK()
    },
    methods: {
        initSDK(){
            let res= topvpn.initSDK();
            if(!res){
                uni.showModal({
                    title: '提示',
                    content: 'VPN实例初始化失败!可能是权限问题导致。',
                    showCancel:false
                });
            }
            // this.getRandCode();
        }
    }
}

配置VPN

doConfigVpn(){
    uni.showLoading({
        title:'正在配置VPN...'
    })
    topvpn.doConfigurationVPN(this.mVpnAddress,this.mVpnPort,this.mUserName,this.mUserPassword,result => {
        uni.hideLoading()
        if(result.data.resId>-1){
            this.isDisabled=false;
            if(result.data.type=='OPERATION_GET_SIM'){
                //短信验证码登陆
                this.loginType=3;
            }else if(result.data.type=='OPERATION_GET_CAPTCHA'){
                console.log('验证码',result);
                //图形验证码验证
                this.showRand=true;
                if(result.data.extral){
                    that.randCodeBase64="data:image/png;base64," + result.result.data.extral;
                }else{
                     uni.showModal({title:"requestCaptcha-fail",content:'获取图形验证码失败',showCancel:false});
                }
            }
        }else{
            uni.showModal({
                title: '提示',
                content: result.message,
                showCancel:false
            });
        }
        console.log(result)
    })
}

登陆VPN

loginVPN(){
    if(this.loginType==3){
        //短信登陆
        topvpn.loginSMS(this.mUserName,this.smsCode,result => {
            uni.showModal({
                title: '提示',
                content: result.message,
                showCancel:false
            });
            console.log(result)
        })
    }else{
        topvpn.loginVPN(this.mUserName,this.mUserPassword,this.randCode,result => {
            uni.showModal({
                title: '提示',
                content: result.message,
                showCancel:false
            });
            console.log(result)
        })
    }
}

获取短信验证码

regetSmsCode(){
    topvpn.requestSim(this.mUserName,result => {
        uni.showModal({
            title: '提示',
            content: result.message,
            showCancel:false
        });
        console.log(result)
    })
}

获取图形验证码

getRandCode(){
    const that=this;
    topvpn.requestCaptcha(function(result){
        console.log('验证码',result);
        if(result.data.extral){
            that.randCodeBase64="data:image/png;base64," + result.result.data.extral;
        }else{
             uni.showModal({title:"requestCaptcha-fail",content:'获取图形验证码失败',showCancel:false});
        }
    });
}

登陆

logoutVPN(){
    topvpn.logoutVPN();
}

获取VPN状态

getVPNState(){
    let res = topvpn.getVPNState();
    console.log(res);
}

获取资源

getResource(){
    topvpn.getResource();
}

开启服务

startService(){
    topvpn.startService();
}

关闭服务

closeService(){
    topvpn.closeService();
}

常见问题原因排查

错误码 返回值说明
0 当前操作已经成功完成
-1 当前操作失败
-2 用户传入了非法的参数
-6 用户名或密码错误
-15 无法和 Vone 建立安全连接
-18 该用户已经登录,当前操作已被拒绝
-19 用户尚未登录,请登录
-20 当前用户未正确配置可访问的资源,请与管理员联系
-21 当前 VPN 服务已经在运行中
-22 VPN 服务已关闭,安全隧道已断开
-35 当前设备尚未开启 WIFI 或数据流量
-41 用户没有授权,操作已取消
-439 服务器验证客户端 SessionID 非法
-40039 短信认证码错误
-40077 不允许多点登录,可以按需踢掉该用户
-40024 首次登录修改密码
-40023 密码太简单
-40022 密码过期

隐私、权限声明

1. 本插件需要申请的系统权限列表:

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件不采集任何数据

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

使用中有什么不明白的地方,就向插件作者提问吧~ 我要提问