评论

已解决。小程序获取手机号时,checkSession通过但是获取手机号解密失败

小程序获取手机号偶尔解密失败

  • 一开始我的处理方式是在页面直接用checkSession,我的session_key是在index.js登录的时候保存到storage,这里check回调的是“success”。
  • 但是把此时storage里面的session_key结合授权按钮的参数去进行解密是失败的,需要在当前的Page再登陆一次才能成功。
  • 不推荐把session_key存放在缓存。所以以上做法直接跳过。
  • 最后参考了一个朋友的做法,在Page onLoad的时候执行一次wx.login(),然后拿到新的session_key,再用此时的新key去解密就通了。或者改为请求解密之前执行一次登录,据说出问题的概率还是很大
  • 结尾补充:最后一种方法还有个问题要考虑,就是最好执行获取手机号之前再checkSession一下(尽管没啥用)。

问题源头,由于这个函数在校验session_key的时候,无论是过期的key还是新的key都是success,所以有了之后一些列的问题,session_key的状态没法把控

Page({
  data: {
  	currentSessionKey: null
  },
   
  onLoad: function(options) {
    /* do something*/
  	const here = this;
    // 执行登录确保session_key在线
    wx.login({
      success(res) {
        if (res.code) {
        // call()是我自己基于wx.request封装的一个请求函数工具,这里通过后端发送登录请求获得openid
          const data = call(userLogin, {
            code: res.code
          });
          data.then(obj => {
            if (!obj.error) {
              here.setData({ currentSessionKey: obj.result.session_key })
            }
          });
        }
      },
      fail(error) {
        throw error;
      }
    });
  },
   
  // 点击按钮获取手机号权限并解析<button open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber" bindtap='doMyAction'>获取手机号</button>
  getPhoneNumber: function (e) {
  	const { encryptedData, iv } = e.detail;
    const options = { encryptedData: encryptedData, iv: iv, sessionKey: this.data.currentSessionKey };
    here.doGetPhone(options);
  },
   
  doMyAction: function() {
    // 还可以做一些事情
  },
 
  doGetPhone: function (options) {
    const {
      sessionKey,
      encryptedData,
      iv
    } = options;
 
    const here = this;
    // 向服务器请求解密
    wx.request({
     // 这里是解密用的接口
      url: 'https://xxx.com/python/decrypt',
      method: 'POST',
      data: {
        sessionKey: sessionKey,
        encryptedData: encryptedData,
        iv: iv
      },
      success(res) {
        // 最终获取到用户数据,国家代号前缀、不带前缀的手机号。默认是不带前缀
        const { countryCode, purePhoneNumber } = res.data;
        here.pageForward(countryCode, purePhoneNumber);
      },
      fail(error) {
        console.log(error);
        here.pageForward();
      }
    })
  },
   
  pageForward: function(countryCode, purePhoneNumber) {
   // 获取成功后我是跳转到另一个页面
    wx.navigateTo({
      url: `/pages/person/index?phone=${purePhoneNumber}`
    })
  }
})
最后一次编辑于  2020-09-15  
点赞 5
收藏
评论

31 个评论

  • 2020-05-06

    你们有碰到过sessionkey 里面带 空格吗 ? 然后解密失败

    2020-05-06
    赞同
    回复 1
    • Oliver
      Oliver
      2020-05-08
      这么奇葩吗😂
      2020-05-08
      回复
  • 二把刀
    二把刀
    2020-04-28

    这个文章666,厉害了,我的哥,是真的解决了

    2020-04-28
    赞同
    回复 1
    • lc
      lc
      2020-04-28
      666
      2020-04-28
      回复
  • 慢慢。
    慢慢。
    2020-03-21

    我每次获取手机号码之前,都会重新调用 wx.login 通过 code 让后端解密,也会经常失效。然后今天官方文档看到如下:


    所以下周回去看看

    2020-03-21
    赞同
    回复 7
    • 王明
      王明
      2021-06-10
      看看官方给的这个 文档能解决么???官方敢给出百分之百 解密成功测案列么
      2021-06-10
      回复
    • 沧海的雨季
      沧海的雨季
      2021-06-16
      兄弟,我们的情况跟你一样, 请问你这个解决了吗?
      2021-06-16
      回复
    • 慢慢。
      慢慢。
      2021-06-28回复沧海的雨季
      不能完全解决,仅供参考:
      2021-06-28
      回复
    • 慢慢。
      慢慢。
      2021-06-28回复王明
      看上面
      2021-06-28
      回复
    • 沧海的雨季
      沧海的雨季
      2021-07-06回复慢慢。
      我是每次都先再onload直接从服务端获取session_key了
      2021-07-06
      回复
    查看更多(2)
  • G.Y
    G.Y
    2020-01-09

    感谢,按照楼主的方法解决了

    2020-01-09
    赞同
    回复
  • 2019-12-05

    问题: 1分30秒 请求服务器会获取 unid 失败!

    解决: 在 onLoad 里面执行一次 wx.login({ success: function () { // 什么都没写 } })

    2019-12-05
    赞同
    回复 3
    • Oliver
      Oliver
      2019-12-05
      你这问题是获取unionid失败
      2019-12-05
      回复
    • 2019-12-05回复Oliver
      问题: 每隔90秒请求第一次就会失败,第二次就会成功,接着又过90秒之后的第一次还失败,第二次就成功了...
      2019-12-05
      回复
    • Oliver
      Oliver
      2019-12-06回复
      你可以加一个检测,如果拿不到就再请求一次,不过要避免死循环。这个问题就是导致以上问题的元凶,而且checkSession这个函数根本不靠谱,很无奈。。。
      2019-12-06
      回复
  • 2019-11-04

    我们也是弄了好久,这个解密功能微信做的逻辑太考究运气和试错性总结了

    2019-11-04
    赞同
    回复
  • 黄正梦
    黄正梦
    2019-11-01

    果然是个大坑,code已经用过,checkSession检查依旧通过。

    2019-11-01
    赞同
    回复
  • 青泞
    青泞
    2019-09-26

    我现在也出现问题了,之前几次还能获取的,之后就出现了乱码问题


    2019-09-26
    赞同
    回复 1
    • Oliver
      Oliver
      2019-09-26
      那很可能是session_key没对应上了
      2019-09-26
      回复
  • 安逸
    安逸
    2019-09-04

    我现在也遇到这个问题,请官方尽快解决!

    2019-09-04
    赞同
    回复
  • 钟
    2019-09-02

    这个问题我也碰到了, 真的坑, 希望有官方的人员能介入一下。另外,微信不建议把session_key保存在小程序端

    2019-09-02
    赞同
    回复

正在加载...

登录 后发表内容