最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 微信小程序踩坑之获取手机号

    正文概述 掘金(沧海的雨季)   2021-06-18   464

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

    需求描述

    微信小程序踩坑之获取手机号

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

    具体代码

          <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发送给服务端进行解密。

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

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

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

    微信小程序踩坑之获取手机号

    猜测

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

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


    起源地下载网 » 微信小程序踩坑之获取手机号

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元