今天开始在写带支付版的二手书了,涉及到用户注册信息需要获取手机号,这里有两个办法,第一是购买短信接口,第二是直接小程序开放数据获取手机号。
两者的区别:第一种对小程序没有类型要求,个人的都可以实现。第二种必须要企业认证小程序才行,但是这种办法一方面可以直接拉取用户绑定微信的手机号,方便操作体验好,还可以使用腾讯自带的短信接口,要省一笔钱。
由于支付也必须要认证,所以这里肯定选择第二种办法,直接用小程序自带api获取。
官方文档地址:
https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/getPhoneNumber.html
通过button设置getPhoneNumber可以直接获取到encryptedData,iv这两个加密参数,但需要进行解密才能进一步获取手机号,解密说明文档:
https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/signature.html#%E5%8A%A0%E5%AF%86%E6%95%B0%E6%8D%AE%E8%A7%A3%E5%AF%86%E7%AE%97%E6%B3%95
我们还差一个参数session_key,这个获取需要通过另一条接口:
https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/login/auth.code2Session.html
绕的有点晕,我们直接看代码:
login.js文件
//获取用户手机号
getPhoneNumber: function(e) {
let that = this;
//判断用户是否授权确认
if (!e.detail.errMsg || e.detail.errMsg != "getPhoneNumber:ok") {
wx.showToast({
title: '获取手机号失败',
icon: 'none'
})
return;
}
wx.showLoading({
title: '获取手机号中...',
})
wx.login({
success(re) {
wx.cloud.callFunction({
name: 'regist', // 对应云函数名
data: {
$url: "phone", //云函数路由参数
encryptedData: e.detail.encryptedData,
iv: e.detail.iv,
code: re.code
},
success: res => {
console.log(res);
wx.hideLoading()
//获取成功,设置手机号码
that.setData({
phone: res.result.data.phoneNumber
})
},
fail: err => {
console.error(err);
wx.hideLoading()
wx.showToast({
title: '获取失败,请重新获取',
icon: 'none'
})
}
})
},
fail: err => {
console.error(err);
wx.hideLoading()
wx.showToast({
title: '获取失败,请重新获取',
icon: 'none'
})
}
})
},
云函数regist:
先把上面第一和第二行的文件传上,下载地址:
http://oss.98api.cn/zip/xcx_cryptojs.rar
然后再来看index.js
// 云函数入口文件
const cloud = require('wx-server-sdk');
const TcbRouter = require('tcb-router');//云函数路由
const rq = require('request');
const wxurl ='https://api.weixin.qq.com';
const appid ='xxxxx';//你的小程序appid
const secret = 'xxxxxxxxx';//你的小程序secret
var WXBizDataCrypt = require('./RdWXBizDataCrypt') // 用于手机号解密
cloud.init()
// 云函数入口函数
exports.main = async (event, context) => {
const app = new TcbRouter({ event });
//获取电话号码
app.router('phone', async (ctx) => {
ctx.body = new Promise(resolve => {
rq({
url: wxurl + '/sns/jscode2session?appid=' + appid + '&secret=' + secret + '&js_code=' + event.code+'&grant_type=authorization_code',
method: "GET",
json: true,
}, function (error, response, body) {
const decrypt1 = new WXBizDataCrypt(appid, body.session_key) // -解密第一步
const decrypt2 = decrypt1.decryptData(event.encryptedData, event.iv) // 解密第二步*/
resolve({ data: decrypt2 })
});
});
});
return app.serve();
}
安装依赖,上传部署,获取完毕
参考文章:https://www.jianshu.com/p/9651cc121afe 记录此篇日志
①做了一个小程序php开发交流圈,感兴趣可以加入我们:
②还在找抖音快手等小视频去水印工具吗?我开发了一款支持全网短视频去水印的小工具,能直接保存到相册的,来看看嘛: