1.小程序登录
小程序可以通过微信官方提供的登录能力方便地获取微信提供的用户身份标识,快速建立小程序内的用户体系。
登录流程时序
调用 wx.login() 获取 临时登录凭证code 并回传到开发者服务器
- 调用 auth.code2Session 接口,换取 用户唯一标识 OpenID 和 会话密钥 session_key。
之后开发者服务器可以根据用户标识来生成自定义登录态,用于后续业务逻辑中前后端交互时识别用户身份。
2.获取手机号
当然获取手机号只需要临时登录凭证code,上面的openID是完成自己的业务逻辑用户身份识别。
获取微信用户绑定的手机号,需先调用wx.login接口。
因为需要用户主动触发才能发起获取手机号接口,所以该功能不由 API 来调用,需用 button 组件的点击来触发。
使用方法
需要将 button 组件 open-type
的值设置为 getPhoneNumber
,当用户点击并同意之后,可以通过 bindgetphonenumber
事件回调获取到微信服务器返回的加密数据, 然后在第三方服务端结合 session_key
以及 app_id
进行解密获取手机号。
注意
在回调中调用 wx.login 登录,可能会刷新登录态。此时服务器使用 code 换取的 sessionKey 不是加密时使用的 sessionKey,导致解密失败。建议开发者提前进行 login
;或者在回调中先使用 checkSession
进行登录态检查,避免 login
刷新登录态。
代码示例
<button open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber"></button>
Page({
getPhoneNumber (e) {
console.log(e.detail.errMsg)
console.log(e.detail.iv)
console.log(e.detail.encryptedData)
}
})
完整的流程:
wx.login({
success(res) {
if (res.code) {
// //注释的地方是跟自己后端交互,自定义登录态,逻辑业务
// wx.request({
// url: 'https://test.com/onLogin',
// data: {
// code: res.code
// }
// })
console.log('登录成功!' + res.code)
} else {
console.log('登录失败!' + res.errMsg)
}
}
})
}, getPhoneNumber(e) {
//将这下面参数传后端,进行解密。再返回给你,就获取到手机号了
console.log('errMsg='+e.detail.errMsg)
console.log('iv=' +e.detail.iv)
console.log('data=' +e.detail.encryptedData)
}
getPhoneNumber返回参数说明
参数 | 类型 | 说明 | 最低版本 |
---|---|---|---|
encryptedData | String | 包括敏感数据在内的完整用户信息的加密数据,详细见加密数据解密算法 | |
iv | String | 加密算法的初始向量,详细见加密数据解密算法 | |
cloudID | string | 敏感数据对应的云 ID,开通云开发的小程序才会返回,可通过云调用直接获取开放数据,详细见云调用直接获取开放数据 | 基础库 2.8.0 |
获取得到的开放数据为以下 json 结构:
{
"phoneNumber": "13580006666",
"purePhoneNumber": "13580006666",
"countryCode": "86",
"watermark":
{
"appid":"APPID",
"timestamp": TIMESTAMP
}
}
参数 | 类型 | 说明 |
---|---|---|
phoneNumber | String | 用户绑定的手机号(国外手机号会有区号) |
purePhoneNumber | String | 没有区号的手机号 |
countryCode | String | 区号 |