当前位置:   article > 正文

微信小程序授权获取用户手机号及后端解密_微信小程序 open-type="getphonenumber" 返回数据

微信小程序 open-type="getphonenumber" 返回数据

 

小程序在拉取用户授权的时候获取用户手机号,前端获取后后端解密就可以存到数据库了。

1.getPhoneNumber这个组件通过button来实现(别的标签无效)。将button中的open-type=“getPhoneNumber”,并且绑定bindgetphonenumber事件获取回调。

  1. <button open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber"
  2. >立即绑定</button>

2.在使用这个组件之前必须先调用login接口,如果没有调用login点击button时会提示先调用login。

  1. App({
  2. onLaunch: function () {
  3. wx.login({
  4. success: function (res) {
  5. if (res.code) {
  6. //发起网络请求
  7. console.log(res.code)
  8. } else {
  9. console.log('获取用户登录态失败!' + res.errMsg)
  10. }
  11. }
  12. });
  13. }
  14. })

注意

在回调中调用 wx.login 登录,可能会刷新登录态。此时服务器使用 code 换取的 sessionKey 不是加密时使用的 sessionKey,导致解密失败。建议开发者提前进行 login;或者在回调中先使用 checkSession 进行登录态检查,避免 login 刷新登录态。
 

3.通过bindgetphonenumber绑定的事件来获取回调。回调的参数有三个,

errMsg:用户点击取消或授权的信息回调。

iv:加密算法的初始向量(如果用户没有同意授权则为undefined)。

encryptedData: 用户信息的加密数据(如果用户没有同意授权同样返回undefined)

  1. getPhoneNumber(e) {
  2. let CONST = app.$.CONST
  3. let appid = CONST.APPID
  4. let secret = CONST.APPSECRET
  5. let grant_type = 'authorization_code'
  6. let encryptedData = e.detail.encryptedData
  7. let iv= e.detail.iv
  8. wx.login({
  9. success(res){
  10. wx.request({
  11. url: 'https://api.weixin.qq.com/sns/jscode2session?appid=wx8493c38c2f678a82&secret=57bfc41d2101a3a517b2bd7dec399803&js_code=' + res.code +'&grant_type=authorization_code',
  12. success(r) {
  13. let session_key = r.data.session_key
  14. request({
  15. url: “后端处理解密的API”,
  16. data:{
  17. id:app.$.info.id,//这个是当前用户的ID,便于存到数据库
  18. session_key,
  19. encryptedData,
  20. iv,
  21. appId:appid
  22. },
  23. success:res=>{
  24. console.log(res)
  25. }
  26. })
  27. }
  28. })
  29. }
  30. })
  31. },

4.后端解密API(js),按官方文档来

  1. const crypto = require('crypto')
  2. module.exports = async(ctx, next) => {
  3. let {
  4. iv,
  5. encryptedData,
  6. session_key,
  7. appId,
  8. id
  9. } = ctx.request.body
  10. function WXBizDataCrypt(appId, session_key) {
  11. this.appId = appId
  12. this.session_key = session_key
  13. }
  14. WXBizDataCrypt.prototype.decryptData = function(encryptedData, iv) {
  15. // base64 decode
  16. var session_key = new Buffer(this.session_key, 'base64')
  17. encryptedData = new Buffer(encryptedData, 'base64')
  18. iv = new Buffer(iv, 'base64')
  19. try {
  20. // 解密
  21. var decipher = crypto.createDecipheriv('aes-128-cbc', session_key, iv)
  22. // 设置自动 padding 为 true,删除填充补位
  23. decipher.setAutoPadding(true)
  24. var decoded = decipher.update(encryptedData, 'binary', 'utf8')
  25. decoded += decipher.final('utf8')
  26. decoded = JSON.parse(decoded)
  27. } catch (err) {
  28. throw new Error('Illegal Buffer')
  29. }
  30. if (decoded.watermark.appid !== this.appId) {
  31. throw new Error('Illegal Buffer')
  32. }
  33. return decoded
  34. }
  35. let pc = new WXBizDataCrypt(appId, session_key)
  36. let data = pc.decryptData(encryptedData, iv)
  37. return ctx.db('User')
  38. .update({
  39. phoneNum: data.phoneNumber
  40. }).where({
  41. id
  42. }).then(r =>{
  43. console.log(r)
  44. ctx.body = data
  45. })
  46. .catch(err=>{
  47. console.error(err)
  48. })
  49. }

5.至此返回的数据就是用户手机号了,中间的业务逻辑还是去看下官方文档的,这里说的不好,只是大概的逻辑是这样。

 

这里推荐一个公众号:前端进阶栈,里面不少干货,让我们一起学习,一起进步。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/284505?site
推荐阅读
相关标签
  

闽ICP备14008679号