首页 > 编程语言 > .NET Core 获取小程序手机号并解析

.NET Core 获取小程序手机号并解析

时间:2023-06-27 14:14:46浏览次数:41  
标签:Core aes code 手机号 phoneNumber var using NET string

方法一:

1. 小程序提供 微信用户授权后的 code,用户手机号的加密数据和iv。
2. 使用 code 换取 sessionkey。
3.  解密用户手机号的加密数据。

参考代码

        /// <summary>
        /// 获取openid,sessionkey
        /// </summary>
        /// <param name="appID"></param>
        /// <param name="appSecret"></param>
        /// <param name="code"></param>
        /// <returns>返回opendid,sessionkey</returns>
        public async Task<(string, string)> GetOpenIdAsync(string appID, string appSecret, string code)
        {
            //用于小程序登录
            var url = $"{WeChat_url}?appid={appID}&secret={appSecret}&js_code={code}&grant_type=authorization_code";

            var handler = new HttpClientHandler();
            handler.ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator;

            using (var client = new HttpClient(handler))
            {
                var response = await client.GetAsync(url);
                if (response.IsSuccessStatusCode)
                {
                    var content = await response.Content.ReadAsStringAsync();
                    var result = JsonConvert.DeserializeObject<JObject>(content);

                    _log4.LogInfo($"GetOpenIdAsync返回:{result}");

                    if (result.ContainsKey("openid"))
                    {
                        var openId = result["openid"].ToString();
                        var sessionkey = result["session_key"].ToString();
                        return (openId, sessionkey);
                    }
                    else
                    {
                        _log4.LogError($"GetOpenIdAsync失败:{result}");
                    }
                }
            }
            return ("", "");
        }
        /// <summary>
        /// 解析手机号
        /// </summary>
        /// <param name="encryptedData"></param>
        /// <param name="sessionKey"></param>
        /// <param name="iv"></param>
        /// <returns></returns>
        private string DecryptPhoneNumber(string encryptedData, string sessionKey, string iv)
        {
            var encryptedDataBytes = Convert.FromBase64String(encryptedData);
            var sessionKeyBytes = Convert.FromBase64String(sessionKey);
            var ivBytes = Convert.FromBase64String(iv);

            using (var aes = Aes.Create())
            {
                aes.Key = sessionKeyBytes;
                aes.IV = ivBytes;
                aes.Mode = CipherMode.CBC;
                aes.Padding = PaddingMode.PKCS7;

                using (var decryptor = aes.CreateDecryptor())
                {
                    var decryptedData = decryptor.TransformFinalBlock(encryptedDataBytes, 0, encryptedDataBytes.Length);
                    var decryptedString = Encoding.UTF8.GetString(decryptedData);

                    var result = JsonConvert.DeserializeObject<JObject>(decryptedString);
                    var phoneNumber = result["phoneNumber"].ToString();
                    //var phoneNumber = JObject.Parse(decryptedString)["phoneNumber"].Value<string>();
                    return phoneNumber;
                }
            }
        }

方法二:
1. 获取微信用户授权后的 code。

2. 使用 code 换取 access_token 和 openid。

3. 使用 access_token 和 openid 获取用户手机号的加密数据。

4. 解密用户手机号的加密数据。

using System;
using System.Net.Http;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Extensions.Configuration;
using Newtonsoft.Json.Linq;

public class WeChatService
{
    private readonly IConfiguration _configuration;
    private readonly HttpClient _httpClient;

    public WeChatService(IConfiguration configuration, HttpClient httpClient)
    {
        _configuration = configuration;
        _httpClient = httpClient;
    }

    public async Task<string> GetPhoneNumberAsync(string code, string encryptedData, string iv)
    {
        var appId = _configuration["WeChat:AppId"];
        var appSecret = _configuration["WeChat:AppSecret"];

        // 获取 access_token 和 openid
        var accessTokenUrl = $"https://api.weixin.qq.com/sns/oauth2/access_token?appid={appId}&secret={appSecret}&code={code}&grant_type=authorization_code";
        var accessTokenResponse = await _httpClient.GetAsync(accessTokenUrl);
        var accessTokenJson = await accessTokenResponse.Content.ReadAsStringAsync();
        var accessToken = JObject.Parse(accessTokenJson)["access_token"].Value<string>();
        var openid = JObject.Parse(accessTokenJson)["openid"].Value<string>();

        // 获取用户手机号的加密数据
        var phoneNumberUrl = $"https://api.weixin.qq.com/sns/userinfo?access_token={accessToken}&openid={openid}&lang=zh_CN";
        var phoneNumberResponse = await _httpClient.GetAsync(phoneNumberUrl);
        var phoneNumberJson = await phoneNumberResponse.Content.ReadAsStringAsync();
        var phoneNumberEncryptedData = JObject.Parse(phoneNumberJson)["encrypted_data"].Value<string>();

        // 解密用户手机号的加密数据
        var sessionKey = JObject.Parse(accessTokenJson)["session_key"].Value<string>();
        var phoneNumber = DecryptPhoneNumber(phoneNumberEncryptedData, sessionKey, iv);

        return phoneNumber;
    }

    private string DecryptPhoneNumber(string encryptedData, string sessionKey, string iv)
    {
        var encryptedDataBytes = Convert.FromBase64String(encryptedData);
        var sessionKeyBytes = Convert.FromBase64String(sessionKey);
        var ivBytes = Convert.FromBase64String(iv);

        using (var aes = Aes.Create())
        {
            aes.Key = sessionKeyBytes;
            aes.IV = ivBytes;
            aes.Mode = CipherMode.CBC;
            aes.Padding = PaddingMode.PKCS7;

            using (var decryptor = aes.CreateDecryptor())
            {
                var decryptedData = decryptor.TransformFinalBlock(encryptedDataBytes, 0, encryptedDataBytes.Length);
                var decryptedString = Encoding.UTF8.GetString(decryptedData);

                var phoneNumber = JObject.Parse(decryptedString)["phoneNumber"].Value<string>();
                return phoneNumber;
            }
        }
    }
}

 

标签:Core,aes,code,手机号,phoneNumber,var,using,NET,string
From: https://www.cnblogs.com/share1/p/17508673.html

相关文章

  • .NET Core WEB API中参数的模型绑定方式
    .NETCoreWEBAPI中参数的模型绑定方式有以下几种:参考文献:.NETCoreWEBAPI中接口参数的模型绑定的理解-枫叶456-博客园(cnblogs.com)微软官方说明文档 FromForm:当请求属于表单提交,也就是content-type为application/x-www-form-urlencoded,则必须给参数加上From......
  • PROFINET设备描述文件说讲之三
    设备中的模块PROFINETIO设备的第一个槽给了DAP,其他的槽位就是各种不同模块的。模块列表的层次结构如下所示:ModuleList|+--ModuleItem|+--ModuleInfo|||+--Name|+--TextId|+--InfoText|+--OrderNumber|+--HardwareRelease|+--SoftwareRelease|+--Use......
  • 将 SmartAssembly 与单文件可执行文件一起使用 (.NET Core 6)
    .NETCore6引入了创建单文件可执行文件的功能。这只允许分发一个应用程序文件,因为所有配置和依赖项都包含在二进制文件本身中。该功能为依赖项嵌入提供了一种本机方法,这在发布生成数百个程序集的独立应用程序时最有益。它可用于依赖于框架或自包含的应用程序,但在这两种情况下都......
  • Taurus .Net Core 微服务开源框架:Admin 插件【2】 - 系统环境信息管理
    前言:继上篇:Taurus.NetCore微服务开源框架:Admin插件【1】-微服务节点管理本篇继续介绍下一个内容:1、系统环境信息节点- OS-Environment界面 基本信息如上图,重点的几个参数:1、App-StartTime:应用程序启用时间,可以在更新程序或配置文件后,查看该时间,看应用程序是否更......
  • cnetos系统部署项目uwsgi正常启动查找不到进程
    主要原因是因为新买的服务器,参数配置没有更改1.解决方案,更改net.core.somaxconn的参数配置2.更改uwsgi参数配置net.core.somaxconn的作用net.core.somaxconn 是Linux中的一个kernel参数,表示socket监听(listen)的backlog上限。什么是backlog呢?backlog就是socket的监听......
  • NetBeans连接SQLServer2008配置
    一、配置SQLServer(一)SQLServer配置管理器1、打开SQLServer配置管理器  (1)文件路径,我的是C:\Windows\SysWOW64\mmc.exe,也可以从开始菜单找(如下图所示) ps网络资源:Windows10可能在菜单栏里找不到SQLserver的配置管理器,去路径:C:\Windows\system32,在该路径下找文件SQLSer......
  • Kubernetes 系列:Kubernetes 的安装(三)
    序前面介绍了k8s组件和对象的一些基本概念,了解了k8s具体是做什么的以及架构,那么接下来我们开始介绍怎么去安装k8s,这里我们以windows为例,其他平台可以参考Kubernetes官方文档,其实安装方式都是类似的。先决条件要在系统中安装Kubernetes,以下是一些需要特别注意的先决条件。软件......
  • Bertviz: 在Transformer模型中可视化注意力的工具(BERT,GPT-2,Albert,XLNet,RoBERTa,CTRL,etc
    BertVizBertViz是一个在Transformer模型中可视化注意力的工具,支持transformers库中的所有模型(BERT,GPT-2,XLNet,RoBERTa,XLM,CTRL等)。它扩展了LlionJones的Tensor2Tensor可视化工具和HuggingFace的transformers库。Blogpost:解构伯特,第2部分:视觉化注意的内部运作(第一部分不是先决......
  • rabbitmq在.net中的使用
    在.NET中使用RabbitMQ的步骤如下:安装RabbitMQ首先,您需要在系统上安装RabbitMQ。您可以从RabbitMQ官方网站下载适用于您所使用的操作系统的安装程序。如果您使用的是Windows操作系统,则可以从Microsoft官网下载安装程序。安装RabbitMQ客户端库 ......
  • Typora PicGo-Core gitee
    参考:(41条消息)Typora+PicGo-core插入图片自动上传,gitee,gitgub,sm.ms三种免费图床_jaymier的博客-CSDN博客(41条消息)Node.js下载安装及环境配置教程【超详细】_nodejs下载安装教程_WHF__的博客-CSDN博客1、安装Node.js下载|Node.js中文网(nodejs.cn)傻瓜式,直接下一步,可......