微信小程序获取手机号登录流程
所需条件
1. 非个人开发者账号
获取手机号文档
这个条件也说得上是情理之中了,[ 摊手 ]。
说句题外话,小程序获取用户在微信支付认证的姓名以及身份证信息的方法曾经可以,但现在GG了,文档内也搜不到API (why)。
2. AppID+AppSecret
AppID+AppSecret 获取
AppSecret只有账号的总管理员能申请,被授权的管理员无法申请。
AppSecret很重要,不要外泄或者传递给前台。
流程思路
可参考官方文档的登录流程时序
- 小程序触发 login() 方法获取 code (文档)
- 后台服务通过 code+AppID+AppSecret+grant_type 去获取 session_key+openid (文档)
- 小程序触发 getphonenumber() 方法获取 iv+encryptedData (文档)
- 后台服务通过 iv+encryptedData+session_key 去解密获取 PhoneNumber (文档)
注意:
- login() 生成的 code 是一次性的且有效期五分钟 。但在session_key未过期时,使用多个code换取的session_key是相同的,例:生成code1去换取session_key1,code1使用过变无效了,再生成code2,此时code2换取的session_key还是session_key1。
- login() 方法必须在 getphonenumber() 方法前触发,否则会出现第4步session_key失效导致解密失败的情况(评论内有详解)
- 第2步无法在小程序内请求,小程序内不允许请求以此来避免AppSecret在前端使用造成泄露
- 第2步参数 grant_type 传值为 authorization_code
- 第3步 getphonenumber() 方法必须由用户点击按钮触发,且按钮有写法要求。
流程:用户点击登录按钮后,微信弹出授权弹框,用户点击确定后触发 getphonenumber()。 - 第4步官方文档有给解密的demo,但没有 JS / JAVA 语言,但这能难的倒我们码农么?大佬写的JAVA解密Demo,修改下入参直接调用就行,感谢大佬。
代码实现
后台较为简单且涉密过多,无法展示。
login()
我是在页面初始化时调用wLogin(),将code传给后端,后端使用code+AppID+AppSecret 去换取 session_key+openid 并存到redis中
getPhoneNumber()
用户点击登录并确定授权之后触发getPhoneNumber方法,获取iv+encryptedData传给后台,后台再获取redis内的session_key进行解密获取手机号。
常见问题
- 解密过程报错(如:pad block corrupted)八成是session_key问题。
- 小程序内的所有请求地址都需配置且是https协议。
- web-view内的所有请求地址也都需配置且是https协议。
- 。。。
如有问题,欢迎提问。