koa实现小程序获取用户手机号(最新版)

957 阅读2分钟

要实现的是微信小程序的授权获取用户手机号功能,最终实现效果如下图:

image.png

总结:

前端:先在小程序中编写按钮给按钮加上open-type="getPhoneNumber"属性,并绑定触摸事件,通过按钮发起用户授权弹框,在用户授权之后,会得到一个加密的动态令牌,将这个动态令牌传给后端。

后端:向微信接口服务发送请求,获取接口调用凭据,拼接到请求的url上,带上前端传来的动态令牌,再次向微信接口服务发起请求,获取到解密后的手机号

1.用户在授权小程序后,拿到动态令牌,将令牌传到后端,由后端进行解密获取手机号

wxml文件

 <button open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber"></button>

js文件

  getPhoneNumber (e) {
    // console.log(e.detail.code)  // 动态令牌
    // console.log(e.detail.errMsg) // 回调信息(成功失败都会返回)
    // console.log(e.detail.errno)  // 错误码(失败时返回)
    let data = {
      code:e.detail.code
    }
    request('post','/login/getuserphonenumber',data).then(res=>{
      console.log(res);
    })
  }

2.调用getAccessToken接口获取access_token(获取接口调用凭据 | 微信开放文档 (qq.com))

这个接口需要获取AppID和AppSecret(小程序密钥)在微信开发平台即可获取

image.png

3.调用getPhoneNumber接口获取手机号手机号验证 | 微信开放文档 (qq.com)

koa后端代码

const Router = require("koa-router")
const router = new Router()
const axios = require('axios');

async function getAccessToken() {
   const appId = 'xxxxx';//xxxxx填你具体的AppID和密钥
   const appSecret = 'xxxxx';
   try {
      const response = await axios.get('https://api.weixin.qq.com/cgi-bin/token', {
         params: {
            grant_type: 'client_credential',
            appid: appId,
            secret: appSecret
         }
      });
      const { access_token } = response.data;
      // 在这里对 access_token 进行相应的处理和使用
      return access_token;
   } catch (error) {
      // 处理错误情况
      console.error('Failed to get access token:', error);
      throw new Error('Failed to get access token');
   }
}

async function getPhoneNumber(code){
   //调用并获取access_token
   const access_token = await getAccessToken()
   //获取access_token的接口地址
   let url = "https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=" + access_token
   const res = await axios.post(url,{code})
   const phoneNumber = res.data.phone_info.purePhoneNumber
   return phoneNumber
}
//将获取到的手机号通过接口返回给前端,接收一个code参数
router.post('/getuserphonenumber',async (ctx,next)=>{
   const { code } = ctx.request.body
   try {
      const phoneNumber = await getPhoneNumber(code);
      ctx.body = {
         phoneNumber
      };
   } catch (error) {
      ctx.status = 500;
      ctx.body = {
         error: 'Failed to get access token'
      };
   }
})
//导出路由,在路由的index文件中合并路由
module.exports = router

在开发者工具中的界面和真机调试页面略有不同,开发者工具中显示的效果和你的工具版本有关,我工具中显示的如下图:

image.png

真机调试如下图:

image.png