微信小程序-授权获取手机号

news/2025/2/22 18:07:48/文章来源:https://www.cnblogs.com/mingcore/p/18731178

前端

wxml

<button name='phone' class='phone'  value='{{userInfo.phone}}' wx:if="{{!userInfo.phone}}" bindgetphonenumber="getPhoneNumber" hover-class='none' open-type='getPhoneNumber'>点击获取
</button>

js

import { wxGetPhoneNumber } from "../../../api/miniapp/auth"
import { showErrorToast } from '../../../utils/util';
const app = getApp();Page({data: {userInfo: {},hasLogin: false},onShow: function () {let userInfo = wx.getStorageSync('userInfo');this.setData({userInfo: userInfo,hasLogin: true});},getPhoneNumber: function (e) {console.log('手机号获取',e);let that = this;if (e.detail.errMsg !== "getPhoneNumber:ok") {return;}if (!this.data.hasLogin) {wx.showToast({title: '绑定失败:请先登录',icon: 'none',duration: 2000});return;}wxGetPhoneNumber(e.detail.iv,e.detail.encryptedData).then((res) => {let userInfo = wx.getStorageSync('userInfo');userInfo.phone = res.data.phone;wx.setStorageSync('userInfo', userInfo);that.setData({userInfo: userInfo,hasLogin: true});wx.showToast({title: '绑定手机号成功',icon: 'success',duration: 2000});}).catch((error)=>{showErrorToast('绑定手机号失败');})}
})
export function wxGetPhoneNumber(iv,encryptedData) {return new Promise(function (resolve, reject) {wxlogin().then((res) => {app.wxRequest("/api/weixinopen/wxphonenumber", "GET", {code: res.code, //临时授权凭证iv: iv,encryptedData: encryptedData}).then(res => {if (res.code === 200) {resolve(res);} else {reject(res);}}).catch((error) => {reject(error);});}).catch((error) => {reject(error);})})
}

后端

  1. 创建OpenIdAndSessionKey.cs类
public class OpenIdAndSessionKey
{public string openid { get; set; }public string session_key { get; set; }public string errcode { get; set; }public string errmsg { get; set; }
}
  1. 请求https://api.weixin.qq.com/sns/jscode2session接口并传入参数
string text = "?appid=" + weixinOpenSettings.AppId + "&secret=" + weixinOpenSettings.AppSecret + "&js_code=" + code + "&grant_type=authorization_code";
string requestUri = "https://api.weixin.qq.com/sns/jscode2session" + text;
using HttpClient httpClient = new HttpClient();
byte[] wxresult = httpClient.GetByteArrayAsync(requestUri).Result;
var oiask = JsonConvert.DeserializeObject<OpenIdAndSessionKey>(Encoding.UTF8.GetString(wxresult));
  1. 创建WeixinAppPhoneNumber.cs
 public class WeixinAppPhoneNumber{public class Watermark{public string appid { get; set; }public string timestamp { get; set; }}public string phoneNumber { get; set; }public string purePhoneNumber { get; set; }public string countryCode { get; set; }public Watermark watermark { get; set; }}
  1. 创建类Cryptography和方法AES_decrypt
 public static string AES_decrypt(string encryptedData, string Session_key, string IV){try{byte[] array = Convert.FromBase64String(encryptedData);byte[] bytes = new RijndaelManaged{Key = Convert.FromBase64String(Session_key),IV = Convert.FromBase64String(IV),Mode = CipherMode.CBC,Padding = PaddingMode.PKCS7}.CreateDecryptor().TransformFinalBlock(array, 0, array.Length);return Encoding.Default.GetString(bytes);}catch (Exception){return "";}}
  1. 调用解密方法,WeixinAppPhoneNumber的phoneNumber拿到手机号。
 WeixinAppPhoneNumber weixinAppPhoneNumber = JsonConvert.DeserializeObject<WeixinAppPhoneNumber>(Cryptography.AES_decrypt(encryptedData, oiask.session_key, iv));

效果

手机

微信开发者工具

可以看到返回信息中并没有手机号,可以将返回的iv和encryptedData作为参数调用用户的后台服务器,由后台去获取对应的手机号然后返回给前端小程序。

注意事项

  1. 如果你用的是正式appid,获取手机号时可能出现以下问题,提示“getPhoneNumber:fail no permission”,如下图所示

目前了解到的解决办法有两个

  • 需要通过微信认证,通过该认证需要企业账号,且付费300元(Pass)。
    注:如果需要去认证,打开微信小程序管理界面,在底部头像处悬浮鼠标,找到“账号设置”选项并点击,在界面右侧“基本设置”选项卡下找到“微信认证”选项,点击右边的“去认证”链接按要求认证即可。
  • 使用微信测试号。
  1. 提示“getPhoneNumber:fail Error: 用户绑定的手机需要进行验证,请在客户端完成短信验证”。

在微信小程序开发平台上使用微信测试号获取手机号的时候会显示此错误信息,解决办法即在微信小程序开发工具上点击“预览”,然后用手机扫描二维码,在手机上获取手机号并填写验证码,以后再在微信小程序上操作便会有授权弹窗出现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/888085.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux 中xargs 中 -L和-n参数的差异

001、-L :按照换行符的数量来传递[root@PC1 dir1]# ls [root@PC1 dir1]# echo {0..9} 0 1 2 3 4 5 6 7 8 9 [root@PC1 dir1]# echo {0..9} | xargs -L 2 ## 利用echo生成一个1行的测试数据 0 1 2 3 4 5 6 7 8 9 [root@PC1 dir1]# seq 0 9 0 1 2 3 4 5 6 7 8 9 [ro…

【humanoid gym】关于在Issac gym里面PPO算法实现里transitions部分roll out storage的记录

1. 前言 一方面便于日后自己的温故学习,另一方面也便于大家的学习和交流。 如有不对之处,欢迎评论区指出错误,你我共同进步学习! 2. 正文 2.1 在on_policy_runner.py文件夹下,初始化的地方:然后我们寻找定义的地方,在ppo.py文件夹下:其中参数num_transitions_per_env其…

Windows快速部署xxl-job.jar

1.在官网下载文件 https://gitee.com/xuxueli0323/xxl-job 2.在idea打开项目 3.修改maven版本,当前版本(2025/2/22)需要使用maven3.6.3+,maven地址:https://maven.apache.org/download.cgi maven版本过老的报错信息:Failed to execute goal org.apache.maven.plugins:mav…

复制浏览器网页文字 粘贴时却乱码的解决

本文介绍在复制网页内容后粘贴时,粘贴内容出现一个方框图案而不是当初复制内容的解决办法~本文介绍在复制网页内容后粘贴时,粘贴内容出现一个方框图案而不是当初复制内容的解决办法。最近,需要将谷歌地球引擎(Google Earth Engine,GEE)网页中的一段代码复制到另一个网页中…

【翻译】凝视深渊:千核并发控制的评估

凝视深渊:千核并发控制的评估 作者 Xiangyao Yu MIT CSAIL yxy@csail.mit.edu George Bezerra MIT CSAIL gbezerra@csail.mit.edu Andrew Pavlo 卡内基梅隆大学 pavlo@cs.cmu.edu Srinivas Devadas MIT CSAIL devadas@csail.mit.edu Michael Stonebraker MIT CSAIL stonebrake…

2.21课堂测验

需求描述: 请设计一个仓储管理系统原型系统,该系统支持多个仓库的设立。统一设立物资台账,物资台账需包含物资编码、物资名称、规格、材质、供应商、品牌、物资分类,用户可以自定义物资的物资分类。需限制不同的物资名称、规格、材质的物资不能设立相同的物资编码。仓库人员…

CSS2

盒子模型所有HTML元素可以看作盒子,在CSS中,"box model"这一术语是用来设计和布局时使用 CSS盒模型本质上是一个盒子,封装周围的HTML元素,它包括:边距,边框,填充,和实际内容 Margin(外边距):元素与其他元素的距离(边框以外的距离),外边距是透明的,需要修…

清华大学第三版《DeepSeek:如何抓住DeepSeek红利》,普通人必备的Ai手册(附PDF手册)

前两天,清华大学发布了一部极为详尽的电子书——《DeepSeek从入门到精通》。这本书将DeepSeek的基础知识以及提示词的运用方法,讲解得清晰明了、浅显易懂,一经问世便迅速在网络上引发了广泛关注与热潮。 【清华第一版】《DeepSeek从入门到精通》率先登场,给广大对DeepSeek感…

Linux 中xargs 命令的-i和-I用法差异

001、-i 选项[root@PC1 dir1]# ls a.txt b.txt dir1 h.csv i.csv [root@PC1 dir1]# tree . ├── a.txt ├── b.txt ├── dir1 ├── h.csv └── i.csv1 directory, 4 files [root@PC1 dir1]# find *.txt | xargs -i mv {} dir1/ ## -i选项可以将xargs命令传…

宜家 App 存在的 bug All In One

宜家 App 存在的 bug All In One 某商品下架后,App 的订单中就无法再查看有关商品的任何详细信息宜家 App 存在的 bug All In One bugs某商品下架后,App 的订单中就无法再查看有关商品的任何详细信息解决方案使用 Google 搜索,获取对应的商品的网页版信息https://www.ikea.c…

2025寒假总结2

前言 这是第二篇总结,考虑到与前一篇的时间临近,所以不展开叙述做过的事情,此篇文章重点写关于最近的收获、现在的知识体系以及后面的计划。 Part 1 记录 这部分大概讲一下寒假做过的事,大体按照时间线展开。 首先 16 号是竞赛生大会,晚上回来后补完北京的游记,看了一会数…