【uni-app】小程序实现微信授权登陆(附流程图)

微信授权登陆是比较常见的一种登陆方式,今天来总结下实现流程

  • 进入授权登陆页面

  • 初始化调用wx.login获取登陆凭证code(用户无感知)

//封装微信获取用户code,避免嵌套
login() {
    return new Promise((resolve, reject) => {
        uni.login({
            success(res) {
                resolve(res);
            },
            fail(err) {
                reject(err);
            }
        });
    });
}
  • 用登陆凭证code调用后端接口去获取用户登录态信息,包括用户在当前小程序的唯一标识(openid)、微信开放平台帐号下的唯一标识(unionid,若当前小程序已绑定到微信开放平台帐号)及本次登录的会话密钥(session_key)等(用户无感知)

async init() {
    //调用微信登陆
    let res = await this.login()
    if (res.code && ['login:ok'].includes(res.errMsg)) {
        //后端通过code调用微信API返回openid/unionid/session_key参数, 存储起来,前端无法直接调用微信相关API
        let openIdRes = await getWechatOpenIdByCode({ code: res.code })
        if (openIdRes.success) {
            let { openId, sessionKey } = openIdRes
            this.openId = openId
            this.sessionKey = sessionKey
        }
    } else {
        //异常处理,再次发起请求或者抛出异常
        // .....
    }
},

  •  用户点击微信手机号快捷登录按钮,触发授权弹窗(需用户主动触发,不允许api主动调用),详细使用看官方文档

  • 用户允许授权会触发getphoneNumber小程序事件获取到encryptedData, iv参数
//微信授权登陆按钮
<u-button  open-type="getPhoneNumber" @getphonenumber="getphoneNumber">用户授权登陆</u-button>

//JS部分

//用户授权登陆允许后,返回encryptedData, iv参数
getPhoneNumber(e) {
    //拿到参数后进一步去解密....
    // 授权通过后轮询等待获取sessionKey响应成功
    if (['getPhoneNumber:ok'].includes(e?.detail?.errMsg)) {
          this.handlePolling(e)
    }
}


/**
* 轮询查询是否有sessionKey,防止初始化接口响应时间过长拿不到解密入参,用户解密失败
*/
handlePolling(e) {
    this.timer = setInterval(() => {
        if (this.sessionKey) {
            this.decryptDataInfo(e.detail)
            this.timer = null
        }
    }, 300)
},
  • 调用后端解密接口,解密拿到用户的手机信息(手机号、区号、国家等)
  • 调用后端登陆接口,传入openId、用户手机号,返回登陆token完成登陆
  • /**
      * 解密获取手机号码,区号
      */
    async decryptDataInfo(detail:any) {
        let params =  {
            encryptedData: detail.encryptedData,
            sessionKey: this.sessionKey,
            iv: detail.iv,
            appId: getLocalStorage(AppIdKey),
        }
    
        let res = await decryptApi(params) 
        if (res.success) {
            //解密成功,获取到手机号码,区号等信息
            let data = JSON.parse(res.data)
            // 调用后端登陆接口传入信息,完成登陆
            this.loginMinor(data)
        } else {
           //....异常处理
        }
    }

    有些朋友可能觉得写的不够清晰,重新补充了个流程图

  • 15
    点赞
  • 76
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
uni-app实现 H5 静默微信授权,你可以按照以下步骤进行操作: 1. 首先,确保你已经在微信公众平台上注册了你的应用,并获取到了 AppID。 2. 在 uni-app 项目中的 `main.js` 文件中引入微信 JS-SDK: ```javascript import wx from 'weixin-js-sdk' Vue.prototype.$wx = wx ``` 3. 创建一个 `wechat.js` 文件,用于封装微信 JS-SDK 的相关操作,例如: ```javascript import wx from 'weixin-js-sdk' export function initWechatConfig() { // 向后端请求获取微信配置信息 // ... // 初始化微信 JS-SDK wx.config({ debug: false, appId: '', // 你的 AppID timestamp: '', // 后端返回的时间戳 nonceStr: '', // 后端返回的随机字符串 signature: '', // 后端返回的签名 jsApiList: ['checkJsApi', 'login', 'getUserInfo'] // 需要使用的微信 API }) } export function login() { return new Promise((resolve, reject) => { wx.ready(() => { wx.login({ success: res => { if (res.code) { // 将 code 发送到后端服务器进行处理,获取用户信息 // ... resolve(res.code) } else { reject(new Error('微信登录失败')) } }, fail: err => { reject(err) } }) }) }) } export function getUserInfo() { return new Promise((resolve, reject) => { wx.ready(() => { wx.getUserInfo({ success: res => { // 获取到用户信息,进行处理 // ... resolve(res.userInfo) }, fail: err => { reject(err) } }) }) }) } ``` 4. 在需要授权的页面中,调用 `initWechatConfig()` 方法初始化微信 JS-SDK 配置,在需要获取用户信息的地方调用 `login()` 方法进行登录,并在登录成功后再调用 `getUserInfo()` 方法获取用户信息。 5. 根据获取到的用户信息进行业务逻辑处理。 通过以上步骤,你可以在 uni-app H5 中实现静默微信授权。请注意,具体的实现细节可能会因为你的业务逻辑和后端实现而有所不同。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值