当前位置:   article > 正文

微信小程序获取手机号(.NET)_微信小程序获取用户手机号

微信小程序获取用户手机号

原文源自https://blog.csdn.net/weixin_43803985/article/details/103910205​​​​​

原文这是老版本的,.net6的话,需要更改接口名称

接口名称是get,参数个数不一样,不知道这里能不能叫重载,.net6里面不支持,所以需要更改名称

1.根据原文代码板块实现

首先还是把代码正确贴进去吧

1.1微信小程序首页app,js

  1. // app.js
  2. App({
  3. onLaunch() {
  4. // 展示本地存储能力
  5. const logs = wx.getStorageSync('logs') || []
  6. logs.unshift(Date.now())
  7. wx.setStorageSync('logs', logs)
  8. // 登录
  9. wx.login({
  10. success: res => {
  11. // 发送 res.code 到后台换取 openId, sessionKey, unionId
  12. console.log(res)
  13. if (res.code) {
  14. console.log("code========" + JSON.stringify(res));
  15. //发起网络请求
  16. wx.request({
  17. url: 'https://localhost:7122/api/Login/Get/Get',
  18. data: {
  19. code: res.code
  20. },
  21. success: data => {
  22. console.log("data" + JSON.stringify(data.data));
  23. this.globalData.session_key = data.data.session_key;
  24. this.globalData.openid = data.data.openid;
  25. console.log("openid" + this.globalData.openid);
  26. },
  27. fail:data=>{
  28. console.log(data)
  29. }
  30. })
  31. } else {
  32. console.log('登录失败!' + res.errMsg)
  33. }
  34. }
  35. })
  36. },
  37. globalData: {
  38. userInfo: null,
  39. selectedIndex:0,
  40. session_key:'',
  41. openid:''
  42. }
  43. })

剩下的比如appstatus这些需要的参数就自己加,这边只是获取手机号

通过wx.login()获取code然后通过

  1. wx.request({
  2. url: 'https://localhost:7122/api/Login/Get/Get',
  3. data: {
  4. code: res.code
  5. },
  6. })

发送至后端换取openId, sessionKey, unionId

再来看看后端这个接口代码如何实现

1.2后端换取openId, sessionKey, unionId

对应的控制器里面贴进去就好了

  1. [Route("Get")]
  2. [HttpGet]
  3. public object Get(string code)
  4. {
  5. string cod = code;
  6. string html = string.Empty;
  7. string url = "https://api.weixin.qq.com/sns/jscode2session?appid="your_appid"&secret="your_secret"&js_code=" + cod + "&grant_type=authorization_code";
  8. HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
  9. request.Method = "GET";
  10. request.ContentType = "text/html;charset=UTF-8";
  11. HttpWebResponse response = request.GetResponse() as HttpWebResponse;
  12. Stream ioStream = response.GetResponseStream();
  13. StreamReader sr = new StreamReader(ioStream, Encoding.UTF8);
  14. html = sr.ReadToEnd();
  15. sr.Close();
  16. ioStream.Close();
  17. response.Close();
  18. RepParamrep rep = JsonConvert.DeserializeObject<RepParamrep>(html);
  19. return rep;
  20. }

在model里面加入对应的类用于存储openId, sessionKey(只要能返回这两个值就行了)

  1. public class RepParamrep
  2. {
  3. public string session_key { get; set; }
  4. public string openid { get; set; }
  5. }

至此第一步就完成了。

1.3前端传参

前端wxml连接到函数就好了

  1. const app = getApp();
  2. Page({
  3. /**
  4. * 页面的初始数据
  5. */
  6. data: {
  7. userinfo: {}, // 添加一个userinfo属性用于存储用户信息
  8. number: '', // Global variable to store the phone number
  9. userPhone: '',
  10. userNicheng: '',
  11. hid1: false,
  12. hid2: true,
  13. },
  14. /**
  15. * 生命周期函数--监听页面加载
  16. */
  17. onLoad: function (options) {
  18. // You can add any other initialization code here
  19. },
  20. bindGetUserInfo: function(e) {
  21. this.setData({
  22. userNicheng: e.detail.userInfo.nickName,
  23. hid1: true,
  24. hid2: false
  25. })
  26. },
  27. getPhoneNumber: function(e) {
  28. var that = this;
  29. console.log("getPhoneNumberok" + e.detail.errMsg);
  30. if (e.detail.errMsg == "getPhoneNumber:ok") {
  31. wx.request({
  32. url: 'https://localhost:7122/api/Login/GetPhone/Get',
  33. data: {
  34. encryptedData: e.detail.encryptedData,
  35. iv: e.detail.iv,
  36. session_key: app.globalData.session_key
  37. },
  38. method: "get",
  39. success: function(res) {
  40. console.log(res)
  41. that.setData({
  42. userPhone: res.data,
  43. }) ,
  44. app.globalData.userInfo = res.data;
  45. },
  46. fail:function(res){
  47. console.log(res.errMsg)
  48. }
  49. })
  50. }
  51. },
  52. onShow() {
  53. if (typeof this.getTabBar === 'function' &&
  54. this.getTabBar()) {
  55. this.getTabBar().setData({
  56. //唯一标识(其它设置不同的整数)
  57. selected: 3
  58. })
  59. }
  60. },
  61. })
  62. ;

将对应参数传递过去即可最后赋值给userinfo

1.4后端换取

  1. [Route("Get")]
  2. [HttpGet]
  3. public string GetPhone(string encryptedData, string iv, string session_key)
  4. {
  5. string _telPhone = getPhoneNumber(encryptedData, iv, session_key);
  6. return _telPhone;
  7. }
  8. private string getPhoneNumber(string encryptedData, string IV, string Session_key)
  9. {
  10. try{
  11. byte[] encryData = Convert.FromBase64String(encryptedData);
  12. RijndaelManaged rijndaelCipher = new RijndaelManaged();
  13. rijndaelCipher.Key = Convert.FromBase64String(Session_key);
  14. rijndaelCipher.IV = Convert.FromBase64String(IV);
  15. rijndaelCipher.Mode = CipherMode.CBC;
  16. rijndaelCipher.Padding = PaddingMode.PKCS7;
  17. ICryptoTransform transform = rijndaelCipher.CreateDecryptor();
  18. byte[] plainText = transform.TransformFinalBlock(encryData, 0, encryData.Length);
  19. string result = Encoding.Default.GetString(plainText);
  20. dynamic model = Newtonsoft.Json.Linq.JToken.Parse(result) as dynamic;
  21. return model.phoneNumber;
  22. }
  23. catch (Exception ex)
  24. {
  25. return "";
  26. }
  27. }

这样就将手机号传递至前端了

2.login解析

本来也不准备写解析,毕竟自己也不会,还是觉得应该知其然知其所以然。

之前了解我认为的步骤是code从微信的接口https://api.weixin.qq.com/sns/jscode2session?

  1. // 定义一个公共方法 Get,该方法接收一个字符串参数 code 并返回一个 object。
  2. public object Get(string code)
  3. {
  4. // 把传入的 code 参数赋值给一个局部变量 cod。
  5. string cod = code;
  6. // 初始化一个空字符串 html。
  7. string html = string.Empty;
  8. // 构造一个 URL,这个 URL 是用来请求微信 API 的,其中包含了 appid、secret 和 js_code 等参数。
  9. // 注意:在实际应用中,直接把 appid 和 secret 写在代码中是不安全的,应该从配置文件或环境变量中读取。
  10. string url = "https://api.weixin.qq.com/sns/jscode2session?appid="+yourappid+"&secret="+yoursecret+"&js_code=" + cod + "&grant_type=authorization_code";
  11. // 创建一个 HttpWebRequest 对象 request,并设置其 URL 为上面构造的 URL。
  12. HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
  13. // 设置 HTTP 请求方法为 GET。
  14. request.Method = "GET";
  15. // 设置请求的内容类型为 text/html,字符集为 UTF-8。
  16. request.ContentType = "text/html;charset=UTF-8";
  17. // 发送请求,并获取响应。
  18. HttpWebResponse response = request.GetResponse() as HttpWebResponse;
  19. // 获取响应流。
  20. Stream ioStream = response.GetResponseStream();
  21. // 使用 StreamReader 读取响应流中的数据,编码为 UTF-8。
  22. StreamReader sr = new StreamReader(ioStream, Encoding.UTF8);
  23. // 把流中的所有数据读取到一个字符串中,并赋值给 html 变量。
  24. html = sr.ReadToEnd();
  25. // 关闭 StreamReader。
  26. sr.Close();
  27. // 关闭响应流。
  28. ioStream.Close();
  29. // 关闭响应。
  30. response.Close();
  31. // 使用 JsonConvert 把 html(它实际上是一个 JSON 字符串)反序列化为 RepParamrep 对象。
  32. RepParamrep rep = JsonConvert.DeserializeObject<RepParamrep>(html);
  33. // 返回反序列化得到的对象。
  34. return rep;
  35. }

来换取对应参数,最后通过解密获取手机号

调用微信的 API 来通过 js_code 获取 session 信息。其中涉及到了 HTTP 请求的发送、响应的接收、以及 JSON 数据的反序列化等操作。需要注意的是,代码中的 appid 和 secret 直接硬编码在了代码中,这种做法在生产环境中是不推荐的,应该从安全的地方(如环境变量、加密的配置文件等)读取这些敏感信息。这里推荐放入appsettings.json里面,方便实际更改与测试。

这是解密解析,使用提供的密钥(Session_key)和初始化向量(IV)来解密加密的电话号码(encryptedData)。解密后,电话号码被从返回的JSON对象中提取出来并返回。

  1. // 定义一个名为getPhoneNumber的方法,它接收三个字符串参数:encryptedData, IV, Session_key,并返回一个字符串
  2. private string getPhoneNumber(string encryptedData, string IV, string Session_key)
  3. {
  4. try
  5. {
  6. // 将encryptedData从Base64格式转换为字节数组
  7. byte[] encryData = Convert.FromBase64String(encryptedData);
  8. // 创建一个RijndaelManaged类的实例,这是一个用于执行Rijndael对称加密算法的类
  9. RijndaelManaged rijndaelCipher = new RijndaelManaged();
  10. // 将Session_key从Base64格式转换为字节数组,并设置为Rijndael算法的密钥
  11. rijndaelCipher.Key = Convert.FromBase64String(Session_key);
  12. // 将IV从Base64格式转换为字节数组,并设置为Rijndael算法的初始化向量
  13. rijndaelCipher.IV = Convert.FromBase64String(IV);
  14. // 设置Rijndael算法的模式为CBC(Cipher Block Chaining)
  15. rijndaelCipher.Mode = CipherMode.CBC;
  16. // 设置Rijndael算法的填充模式为PKCS7
  17. rijndaelCipher.Padding = PaddingMode.PKCS7;
  18. // 创建一个解密器对象
  19. ICryptoTransform transform = rijndaelCipher.CreateDecryptor();
  20. // 使用解密器对象对输入的加密数据进行解密,得到明文数据
  21. byte[] plainText = transform.TransformFinalBlock(encryData, 0, encryData.Length);
  22. // 将解密后的字节数组转换为字符串,使用默认的字符编码
  23. string result = Encoding.Default.GetString(plainText);
  24. // 使用Newtonsoft.Json.Linq.JToken类将解密后的字符串解析为JSON对象,并将其转换为动态类型
  25. dynamic model = Newtonsoft.Json.Linq.JToken.Parse(result) as dynamic;
  26. // 从解析的JSON对象中提取phoneNumber字段的值,并返回
  27. return model.phoneNumber;
  28. }
  29. catch (Exception ex)
  30. {
  31. // 如果在尝试过程中发生任何异常,则捕获该异常并返回一个空字符串
  32. return "";
  33. }
  34. }

解密略微麻烦,推荐了解过程能够使用即可,毕竟这也是为了安全性着想。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/792078
推荐阅读
相关标签
  

闽ICP备14008679号