1
头图

登录流程如下

  1. 登录,wx.login拿到code,调用后端接口
  2. 后端通过appIdappsecretcode获取session_keyopenid
  3. 后端自定义登录态,与openidsessiong_key关联,返回自定义登录态给前端
  4. 前端拿到登录态(token),后续拿token请求接口即可。

登录的同时要加手机号验证,流程如下:

  1. 前端点击一键登录按钮,按钮绑定open-type="getPhoneNumber"
  2. @getphonenumber的回调中拿到手机code
  3. 拿到手机code码后,接着调用wx.login获取登录code
  4. 调用登录接口,同时将手机code码、登录code码传给后端
  5. 后端首先拿登录code码获取openidsessiong_key等信息,然后调用getAccessToken接口获取access_token
  6. 通过access_token调用获取getPhoneNumber接口获取手机号
  7. 后端自定义登录态,关联手机号,逻辑根据实际情况调整
  8. 返回登录态(token)以及其它附带信息给前端

image.png

登录跟获取手机号可以拆开,有些类型的小程序仅登录就好了,不需要手机号参与,这两个功能在小程序端是分开的模块,如果你的业务里需要登录时验证手机号,可以将登录和获取手机号的逻辑整合到一起。

参考文档:
小程序登录文档
wx.login
手机号快速验证组件
快速验证-获取手机号
获取接口调用凭据getAccessToken
通过code获取网站授权 access_token
小程序帐号登录规范要求与修改指引

获取手机号code

通过开放能力open-type实现 open-type="getPhoneNumber" @getphonenumber="getPhoneNumber"
需要注意,微信小程序开发者账号必须认证且隐私协议完善后才可以调用该API

<button type="primary" :style="customStyle.sure" open-type="getPhoneNumber" @getphonenumber="getPhoneNumber">
一键登录
</button>
const getPhoneNumber = (e) => {
    try {
        if (e.detail.errno == 112) { 
            // 获取失败的状态,自定义处理
            return getApp().errFeedback(e.detail);
        }
        if(e.detail.errMsg == 'getPhoneNumber:fail user deny'){
            uni.showToast({
                title: '您已拒绝授权,相关功能将不可用',
                icon: 'none',
                duration: 1000
            });
            return;
        }
            console.log('获取手机号', e.detail.code);
    } catch (err) {
        console.log(err);
    } finally {
    }
};

同意授权的返回

如果拒绝授权,则返回:

获取AccessToken

在这里生成AppSecret

const getAccessToken = async (code) => {
    return new Promise((resolve, reject) => {
        uni.request({
            method: 'GET',
            url: `https://api.weixin.qq.com/cgi-bin/token`,
            data: {
                grant_type: 'client_credential', // 固定值
                appid: '你的appid',
                secret: '你的AppSecret'
            },
            dataType: 'json',
            success: (response) => {
        console.log('获取access_token', response);
                if (response.statusCode != 200) {
                    uni.showToast({
                        title: '获取登录凭证失败~',
                        icon: 'none',
                        duration: 1000
                    });
                    return;
                }
                let { data } = response;
                resolve(data.access_token);
            },
            fail: (err) => {
                console.log('请求失败', err);
            }
        });
    });
};

成功的响应:


兔子先森
710 声望1.1k 粉丝

致力于新技术的推广与优秀技术的普及。