在使用小程序的时候,经常会遇到获取手机号的提示框,不给手机号就不让访问,比如下面这个:
这种情况还经常发生在饭店点餐的时候,原先纸质的菜单直接被一个二维码取代,用户扫码后首先就要获取你的手机号你才能点餐。 不得不说小程序获取用户手机号是非常的便捷,今天这篇文章就来学习下小程序获取手机号的流程。
说明:小程序获取手机号功能不是谁都可以用的,必须是非个人账号,而且还要认证过的哦
功能拆分
大事化小,我们先把整个流程拆分下:
wx.login()
用户认证,获取session_key
用于后面数据解密- 点击获取用户手机号,弹出微信授权界面
- 点击允许按钮,获取到加密的用户信息
- 通过
session_key
解密上面的加密信息,最终得到用户的手机号
流程图大致如下:
457
下面就按上面的步骤一步一步来开发,下面所用的代码是UniAPP
[1]代码,后端接口为PHP
代码。
用户认证
小程序文档[2]中开头就指明需要wx.login()
这一步,所以这一步绝对不能跳过:
1 | onload(){ |
调用login
前,先可以checkSession
一下,如果过期了再更新session_key
,减少网络请求。
PHP
接口相对简单很多:
1 | $appid = 'xxxx'; |
有两个注意点:
- 如果请求
jscode2session
接口失败,你需要的再小程序后台【request合法域名】中添加接口域名 unionid
并不是每个账号都会返回,必须要绑定同一个开放平台后[3]才会有
触发点击按钮事件
创建一个按钮:
1 | <button type="default" open-type="getPhoneNumber" @getphonenumber="getPhoneNumberCallback">手机号</button> |
创建对应的回掉函数:
1 | methods: { |
回掉函数中可以拿到加密过后的用户数据:
11110
接下来就是解密数据了。
数据解密
看很多文章说直接在小程序端解密数据,方法是可行的,而且不用写后端接口,但是小程序可以被反编译
,造成appid
和secret
的泄漏,安全性很低,所以我建议还是后端解密。
详细的解密步骤可以参看官方文档[4],这里只贴一张官方的图:
签名校验以及数据加解密涉及用户的会话密钥 session_key。 开发者应该事先通过wx.login 登录流程获取会话密钥 session_key 并保存在服务器。为了数据不被篡改,开发者不应该把 session_key 传到小程序客户端等服务器外的环境。
解密数据步骤如下:
- 对称解密使用的算法为 AES-128-CBC,数据采用PKCS#7填充。
- 对称解密的目标密文为 Base64_Decode(encryptedData)。
- 对称解密秘钥 aeskey = Base64_Decode(session_key), aeskey 是16字节。
- 对称解密算法初始向量 为Base64_Decode(iv),其中iv由数据接口返回。
微信官方提供了多种编程语言的示例代码[5],我们直接下载后使用,这里以PHP
为例:
1 |
|
最后,通过一顿操作后成功拿到数据交给前端处理。
参考:
-
UniApp:https://uniapp.dcloud.io
-
小程序文档:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/getPhoneNumber.html
-
UnionId机制:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/union-id.html
-
小程序开放数据解密:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/signature.html
-
小程序解密示例代码:https://res.wx.qq.com/wxdoc/dist/assets/media/aes-sample.eae1f364.zip