微信获取手机号

比特青焰引
• 阅读 1416

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

需求描述
获取电话

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

具体代码

  <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, 然后服务端拿code换session_key,并结合iv,encryptedData解密不行呢?而把wx.login放进onLoad内获取session_key就可以呢?

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

点赞
收藏
评论区
推荐文章
李志宽 李志宽
4年前
❤超级牛批,暴力破解聊天记录文件 ❤
前言:在电子取证过程中,也会遇到提取PC版微信数据的情况,看雪、52破解和CSDN等网上的PC版微信数据库破解文章实在是太简略了,大多数只有结果没有过程。经过反复试验终于成功解密了数据库,现在把详细过程记录下来,希望大家不要继续在已经解决的问题上过度浪费时间,以便更投入地研究尚未解决的问题。通过查阅资料得知,与安卓手机版微信的7位密码不同,PC版微信的密码是
胡哥有话说 胡哥有话说
4年前
喜大普奔,微信终于支持外网打开小程序啦!
前言千呼万唤始出来,微信小程序终于支持以URLScheme的形式从外部唤起了。longlongago我们只能在微信内的网页中使用微信开发标签小程序跳转按钮
马丁路德 马丁路德
4年前
小程序静默登录与维护自定义登录态
1.背景在小程序中,openid是一个用户对于一个小程序/公众号的标识,开发者可以通过这个标识识别出用户,就如同你的身份证一样。2.什么是静默登录?在普通的应用中,用户通过表单验证登录建立用户体系,这种常见的登录方式一般是通过登录页面表单进行登录,对用户来说是有感的。在小程序中,由于是基于微信,可以通过微信官方提供的API能力,使我们能够无感知得获取
放学路上 放学路上
3年前
微信小程序事件传参与vue传参的不同
1、vue点击事件传参(day)的写法:2、微信小程序写法(1)事件传参(2)获取参数dayprocess(e)console.log(e.currentTarget.dataset.day)3、总结:微信小程序不支持事件传参,可以通过把参数绑定在元素上,通过currentTarget.dataset获取参数。
关于皕杰小程序打开公众号推文
关联公众号1.首先,登录微信公众号的后台,然后找到小程序,并点击小程序管理;其次,在小程序管理中,找到快速注册并认证小程序,点击以后用管理员身份验证一下。然后搜索想要关联的小程序,点击下一步,就关联成功了。2.小程序与公众号关联的时候,有
Dax Dax
3年前
微信小程序不支持wx.getUserInfo授权的解决方法
微信小程序最近被吐槽最多的一个更改,就是用户使用wx.getUserInfo(开发和体验版)时不会弹出授权,正式版不受影响。现在授权方式是需要引导用户点击一个授权按钮,然后再弹出授权。我最近围绕这个做了一些研究,来看看我是如何做好这个授权。1.用户进来一个页面时,按照微信小程序的生命周期,开始解析onLoad里面的内容。所以我们在第一步,就把代码放在这里
Wesley13 Wesley13
3年前
.NET之微信小程序获取用户UnionID
前言:  在实际项目开发中我们经常会遇到账号统一的问题,如何在不同端或者是不同的登录方式下保证同一个会员或者用户账号唯一(便于用户信息的管理)。这段时间就有一个这样的需求,之前有个客户做了一个微信小程序商城(店主端的),然后现在又要做一个会员购物端的小程序商场。首先之前用户登录凭证都是使用微信openid来做的唯一标识,而现在客户需求是要做到用户
Wesley13 Wesley13
3年前
10分钟上线
_摘要:_ 阿里云函数计算是一个事件驱动的全托管计算服务。通过函数计算,您无需管理服务器等基础设施,只需编写代码并上传。微信小程序是一种不需要下载安装即可使用的应用,它可以在微信内被便捷地获取和传播。当微信小程序遇见serverless,他们会产生奇妙火花,利用函数计算可以快速搭建微信小程序的serverle.点此查看原文:http://clic
使用taro+canvas实现微信小程序的图片分享功能 | 京东云技术团队
业务场景二轮充电业务中,用户充电完成后在订单详情页展示订单相关信息,用户点击分享按钮唤起微信小程序分享菜单,将生成的图片海报分享给微信好友或者下载到本地,好友可通过扫描海报中的二维码加群领取优惠。使用场景及功能:微信小程序生成海报图片分享好友下载图片使用技
曼成 曼成
1年前
如何将手机号码归属地API接入到自己的程序当中?
在现代应用程序中,获取手机号码的归属地信息是一个常见的需求。这可以用于验证用户的手机号码,了解用户所在地区,以及提供个性化的服务。为了实现这一目标,你可以通过API接入第三方服务,以获取手机号码的归属地信息。
比特青焰引
比特青焰引
Lv1
因为她才一米六,所以一旦吵架了,我就必须先低头。
文章
3
粉丝
0
获赞
0