前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >获取用户授权的手机号【微信小程序】

获取用户授权的手机号【微信小程序】

作者头像
很酷的站长
发布2023-01-08 11:40:14
3.9K0
发布2023-01-08 11:40:14
举报
文章被收录于专栏:站长的编程笔记
1. 前言

特别注意:个人号小程序无法使用

目前该接口针对非个人开发者,且完成了认证的小程序开放(不包含海外主体)

微信开发文档: https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/getPhoneNumber.html

2. 获取用户授权手机号 button 组件

定义按钮组件,用于调起授权手机号弹窗

代码语言:javascript
复制
<button open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber">获取手机号</button>

bindgetphonenumber 事件回调

代码语言:javascript
复制
methods: {
// 获取用户授权的手机号
getPhoneNumber: e => {
if (e.detail.errMsg === 'getPhoneNumber:ok') {
wx.request({
url: 'http://tp6.cy/',
method: 'POST',
data: {
iv: e.detail.iv,
encryptedData: e.detail.encryptedData,
},
success: res => {
console.log(res)
}
})
} else {
wx.showToast({
title: '拒绝授权',
})
}
},
}

将以下数据传给后端,后台可通过解密数据得到手机号

代码语言:javascript
复制
{
"encryptedData": "PIxZLRab9M9EQha6Od5WA5NT...",
"iv": "CVN4qd7zUe6+vz9wuAvReQ=="
}
3. 使用 EasyWechat 4.x 消息解密获取手机号

代码语言:javascript
复制
composer require overtrue/wechat:~4.0

消息解密文档: https://easywechat.com/docs/4.x/mini-program/decrypt

一、获取小程序相关功能所属实例

代码语言:javascript
复制
$app = Factory::miniProgram($config);

https://easywechat.com/docs/4.x/mini-program/index

二、进行消息解密时最好使用 try catch 捕获可能出现的异常

代码语言:javascript
复制
try {
    // 消息解密
    // $session 根据 wx.login 的临时登录凭证 code 换取的 session_key
    // $iv, $encryptedData 在 bindgetphonenumber 事件回调中获取
    $decryptedData = $app->encryptor->decryptData($session, $iv, $encryptedData);
} catch (\Throwable $th) {
    // 解密失败
    // 当使用的$session已过期时,解密会抛出异常,
    // 此时错误信息:The given payload is invalid.
    echo $th->getMessage();
}
// 手机号为空代表解密失败 fault 是自定义的抛出异常的函数
empty($decryptedData['phoneNumber']) && fault('解密失败');
// 解密成功后的操作
// ...

三、解密成功 $decryptedData 的值

代码语言:javascript
复制
{
    "phoneNumber": "15037846666",
    "purePhoneNumber": "15037846666",
    "countryCode": "86",
    "watermark": {
        "timestamp": 1622695392,
        "appid": "wxb80ec74221f8a9ff"
    }
}
4. 在 EasyWechat 4.x 使用新接口获取手机号

从基础库 2.21.2 开始,对获取手机号的接口进行了安全升级,bindgetphonenumber 事件回调方法中的 e.detail 中增加了一个 code 属性。新版本接口不再需要提前调用 wx.login 进行登录(调用 wx.login 是为了获取 session_key)

代码语言:javascript
复制
{
    "code": "dbad746bbaf51214f081e133668cc5a5ebbb9a526ad9e7b503e337a59c60414c",
    "encryptedData": "PIxZLRab9M9EQha6Od5WA5NT...",
    "iv": "CVN4qd7zUe6+vz9wuAvReQ=="
}

前端开发者只需要将上面的 code 传递给接口,后端开发者就能获取到手机号,因为这个接口是新版的,EasyWechat4.x 还没有更新,所以需要自己手动调用新版接口,代码示例如下所示

代码语言:javascript
复制
/**
 * 获取用户授权手机号
 * @param string $code
 */
function getPhoneNumber(string $code)
{
    $app = Factory::miniProgram($config);
    $access_token = $app->access_token->getToken()['access_token'];
    $url = 'https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=' . $access_token;
    // 使用 curl 发送网络请求
    $result = https_request($url, json_encode(['code' => $code]));
    $array  = json_decode($res, true);
    if (isset($array['errcode']) && $array['errcode'] == 0) {
        // 获取成功
        // 手机号: $array['phone_info']['phoneNumber']
    } else {
        // 获取失败
    }
}
/**
 * http请求
 * @param string $url  请求的地址
 * @param string $data 请求参数
 */
function https_request($url, $data = null)
{
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
    if (!empty($data)) {
        curl_setopt($curl, CURLOPT_POST, 1);
        curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
    }
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    $output = curl_exec($curl);
    curl_close($curl);
    return $output;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 前言
  • 2. 获取用户授权手机号 button 组件
  • 3. 使用 EasyWechat 4.x 消息解密获取手机号
  • 4. 在 EasyWechat 4.x 使用新接口获取手机号
相关产品与服务
云开发 CloudBase
云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档