zoukankan      html  css  js  c++  java
  • 微信小程序踩坑之获取手机号

    最近在开发小程序遇到这样一个问题, 在用户点击授权后去解密手机号时会出现第一次失败,第二次成功的情况。研究了一段时间,终于找到比较合理的解决方案,在此记录并总结一下,希望可以帮助到大家。

    需求描述

    在用户点击获取电话按钮后, 将用户在微信内设置的电话解密显示在联系电话输入框内

    具体代码

    <view class="cu-form-group">
        <view class="title text-black">联系电话</view>
        <input class="radius"  name="mobile"   placeholder="请输入联系电话" value="{{detail.mobile}}" bindinput="onInputMobile"></input>
        <button bindgetphonenumber="getPhoneNumber" class="cu-btn line-blue sm" openType="getPhoneNumber">获取电话</button>
    </view>

    首先需要小程序 button 组件并设置 openType="getPhoneNumber"

    onLoad: async function () {
            this.getSessionKey()
        },
        async getSessionKey() {
            const { code } = await wx.login()
            const res = await Index.getSessionKey({
                code
            })
            if (res.code == 1) {
                this.setData({
                    session_key: res.data
                })
            }
        },
        getPhoneNumber: async function (e) {
            if (e.detail.errMsg === "getPhoneNumber:ok") {
                const res = await Index.getPhone({
                    iv: e.detail.iv,
                    encryptedData: e.detail.encryptedData,
                    session_key: this.data.session_key
                })
                if (res.err == 0) {
                    wx.showToast({
                        title: '网络有点儿小波动,请点击重试',
                        icon: 'none'
                    })
                    return
                }
                const detail = this.data.detail
                detail.mobile = res.err.phoneNumber
                this.setData({
                    detail
                })
            } else if (e.detail.errMsg === "getPhoneNumber:fail user deny") {
                wx.showModal({
                    title: '提示',
                    content: '你已拒绝授权,请重新点击并授权',
                    showCancel: false,
                    confirmText: "知道了"
                })
            }
        },

    在 onLoad 生命周期内获取登录 code , 并将 code 码发送给服务端获取 session_key

    服务端获取 session_key 请参考 小程序官方文档 。

    在用户点击获取电话按钮后, 将 session_key 以及获取到的 iv , encryptedData 发送给服务端进行解密。

    这样就可以获取到用户的手机号了。

    https://www.98891.com/article-6-1.html

    之前我们的方案是, 在用户点击获取电话按钮后, 直接在 getPhoneNumber 函数内调用 wx.logon() ,将 code , iv , encryptedData 发送给服务端, 服务端先拿 code 获取 session_key , 然后和 iv , encryptedData 结合进行解密,这样做的话就会出现第一次解密失败,然后再次点击按钮调用该解密接口就能成功。 而且隔5-6分钟就又会出现该情况。

    当调用 wx.checkSession(Object object) 检查登录态是否过期也是一直成功的。

    猜测

    后来想了一下,为什么在 getPhoneNumber 函数内调用 wx.login , 然后服务端拿 code 换 session_key ,并结合 iv , encryptedData 解密不行呢?而把 wx.login 放进 onLoad 内获取 session_key 就可以呢?

    我想应该是在 wx.login 调用时会刷新微信服务器的 session_key ,直接在 getPhoneNumber 调 wx.login ,或许微信服务器还没来得及刷新,服务端就拿着进行解密, 解密时用的还是上次过期的 session_key ,所以只有第二次以后才能成功。而 wx.login 放到 onload 内,就能来的及 session_key 了。

  • 相关阅读:
    go语言第一问:在其他地方执行编译go语言程序,结果会在哪个地方产生?
    ip地址获取无效,自己修改ip地址
    linux和windows双向互通的压缩包格式zip
    在notepad++中tab和空格的区别
    Django ----- app 和 ORM的操作和介绍
    Mysql --- 索引
    Mysql --创建用户和授权,备份
    Mysql --数据的增删改
    Mysql -- 外键的变种 三种关系
    Mysql -- 完整性约束
  • 原文地址:https://www.cnblogs.com/qianxiaox/p/14928121.html
Copyright © 2011-2022 走看看