当前位置:首页 > 编程技术 > 正文内容

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

yc8881年前 (2023-01-05)编程技术196

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

1. 前言


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

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

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

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


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

  1. <button open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber">获取手机号</button>

bindgetphonenumber 事件回调

  1. methods: {
  2. // 获取用户授权的手机号
  3. getPhoneNumber: e => {
  4. if (e.detail.errMsg === 'getPhoneNumber:ok') {
  5. wx.request({
  6. url: 'http://tp6.cy/',
  7. method: 'POST',
  8. data: {
  9. iv: e.detail.iv,
  10. encryptedData: e.detail.encryptedData,
  11. },
  12. success: res => {
  13. console.log(res)
  14. }
  15. })
  16. } else {
  17. wx.showToast({
  18. title: '拒绝授权',
  19. })
  20. }
  21. },
  22. }

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

  1. {
  2. "encryptedData": "PIxZLRab9M9EQha6Od5WA5NT...",
  3. "iv": "CVN4qd7zUe6+vz9wuAvReQ=="
  4. }

3. 使用 EasyWechat 4.x 消息解密获取手机号


  1. composer require overtrue/wechat:~4.0

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

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

  1. $app = Factory::miniProgram($config);

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

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

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

三、解密成功 $decryptedData 的值

  1. {
  2. "phoneNumber": "15037846666",
  3. "purePhoneNumber": "15037846666",
  4. "countryCode": "86",
  5. "watermark": {
  6. "timestamp": 1622695392,
  7. "appid": "wxb80ec74221f8a9ff"
  8. }
  9. }

4. 在 EasyWechat 4.x 使用新接口获取手机号


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

  1. {
  2. "code": "dbad746bbaf51214f081e133668cc5a5ebbb9a526ad9e7b503e337a59c60414c",
  3. "encryptedData": "PIxZLRab9M9EQha6Od5WA5NT...",
  4. "iv": "CVN4qd7zUe6+vz9wuAvReQ=="
  5. }

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

  1. /**
  2. * 获取用户授权手机号
  3. * @param string $code
  4. */
  5. function getPhoneNumber(string $code)
  6. {
  7. $app = Factory::miniProgram($config);
  8. $access_token = $app->access_token->getToken()['access_token'];
  9. $url = 'https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=' . $access_token;
  10. // 使用 curl 发送网络请求
  11. $result = https_request($url, json_encode(['code' => $code]));
  12. $array = json_decode($res, true);
  13. if (isset($array['errcode']) && $array['errcode'] == 0) {
  14. // 获取成功
  15. // 手机号: $array['phone_info']['phoneNumber']
  16. } else {
  17. // 获取失败
  18. }
  19. }
  20. /**
  21. * http请求
  22. * @param string $url 请求的地址
  23. * @param string $data 请求参数
  24. */
  25. function https_request($url, $data = null)
  26. {
  27. $curl = curl_init();
  28. curl_setopt($curl, CURLOPT_URL, $url);
  29. curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
  30. curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
  31. if (!empty($data)) {
  32. curl_setopt($curl, CURLOPT_POST, 1);
  33. curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
  34. }
  35. curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
  36. $output = curl_exec($curl);
  37. curl_close($curl);
  38. return $output;
  39. }

本站发布的内容若侵犯到您的权益,请邮件联系站长删除,我们将及时处理!


从您进入本站开始,已表示您已同意接受本站【免责声明】中的一切条款!


本站大部分下载资源收集于网络,不保证其完整性以及安全性,请下载后自行研究。


本站资源仅供学习和交流使用,版权归原作者所有,请勿商业运营、违法使用和传播!请在下载后24小时之内自觉删除。


若作商业用途,请购买正版,由于未及时购买和付费发生的侵权行为,使用者自行承担,概与本站无关。


本文链接:https://www.10zhan.com/biancheng/10331.html

标签: 微信小程序
分享给朋友:

“获取用户授权的手机号【微信小程序】” 的相关文章

【说站】laravel实现自定义404页面并给页面传值

【说站】laravel实现自定义404页面并给页面传值

以 laravel5.8 为例,虽然有自带的404页面,但太简单,我们更希望能自定义404页面,将用户留在站点。实现的方式很简单,将自定义的视图文件命名为 404.blade.php,并放到 reso...

【说站】Thymeleaf报错Error resolving template “XXX”

【说站】Thymeleaf报错Error resolving template “XXX”

修改了一下开源项目的目录结构访问突然报错Error resolving template “XXX”可能原因有如下三种:第一种可能:原因:在使用springboot的过程中,如果使用thymeleaf...

【说站】用一句话就可以去除宝塔面板操作上的二次验证

【说站】用一句话就可以去除宝塔面板操作上的二次验证

用过宝塔的朋友应该都会发现,现在宝塔面板有些鸡肋的功能,删除文件、删除数据库、删除站点等操作都需要做计算题!不仅加了几秒的延时等待,还无法跳过!这时候就会有朋友在想,如何去除宝塔面板的二次验证,此篇文...

【说站】利用Webhook实现Java项目自动化部署

【说站】利用Webhook实现Java项目自动化部署

用webhook就能实现Java项目自动部署,其实原理很简单。费话不多说,直接往下看教程。1. 创建gitee仓库并初始化2. 在linux安装git3. 在宝塔的软件的商店里下载Webhook4....

【说站】vagrant实现linux虚拟机的安装并配置网络

【说站】vagrant实现linux虚拟机的安装并配置网络

一、VirtualBox的下载和安装1、下载VirtualBox官网下载:https://www.virtualbox.org/wiki/Downloads我的电脑是Windows的,所以下载Wind...

【说站】Java从resources读取文件内容的方法有哪些

【说站】Java从resources读取文件内容的方法有哪些

本文主要介绍的是java读取resource目录下文件的方法,比如这是你的src目录的结构├── main│ ├── java│ │ └── ...