C# 微信小程序获取绑定手机号
#region 获取微信手机号
/// <summary>
/// 获取微信手机号
/// </summary>
/// <param name="aesIv">向量</param>
/// <param name="encryptedData">encryptedData</param>
/// <param name="code">加密数据</param>
/// <returns></returns>
[HttpGet]
[RespWrapFilter] //框架引用,用于返回Json串
public wechardetails<watermark> GetPhoneNumber(string aesIv, string encryptedData, string code)
{
try
{
#region 获取Session_Key
var AppId = ""; //微信小程序AppID
var Secret = ""; //微信小程序Secret
string serviceAddress = "https://api.weixin.qq.com/sns/jscode2session?appid=" + AppId + "&secret="
+ Secret + "&js_code=" + code + "&grant_type=authorization_code";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(serviceAddress);
request.Method = "GET";
request.ContentType = "text/html;charset=utf-8";
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream myResponseStream = response.GetResponseStream();
StreamReader myStreamReader = new StreamReader(myResponseStream, System.Text.Encoding.UTF8);
string retString = myStreamReader.ReadToEnd();
myStreamReader.Close();
myResponseStream.Close();
var obj = new
{
data = retString,
Success = true
};
Formatting microsoftDataFormatSettings = default(Formatting);
string result = JsonConvert.SerializeObject(obj, microsoftDataFormatSettings);
//序列化获取session_key
v_petminiuserdetails item = JsonConvert.DeserializeObject<v_petminiuserdetails>(retString);
#endregion
#region 获取微信绑定手机号
//判断是否是16位 如果不够补0
//text = tests(text);
//16进制数据转换成byte
byte[] encryptedDatas = Convert.FromBase64String(encryptedData); // strToToHexByte(text);
RijndaelManaged rijndaelCipher = new RijndaelManaged();
rijndaelCipher.Key = Convert.FromBase64String(item.session_key); // Encoding.UTF8.GetBytes(AesKey);
rijndaelCipher.IV = Convert.FromBase64String(aesIv);// Encoding.UTF8.GetBytes(AesIV);
rijndaelCipher.Mode = CipherMode.CBC;
rijndaelCipher.Padding = PaddingMode.PKCS7;
ICryptoTransform transform = rijndaelCipher.CreateDecryptor();
byte[] plainText = transform.TransformFinalBlock(encryptedDatas, 0, encryptedDatas.Length);
string results = Encoding.Default.GetString(plainText);
//序列化获取手机号码
wechardetails<watermark> getPhone = JsonConvert.DeserializeObject<wechardetails<watermark>>(results);
getPhone.watermark.openid = item.openid; //获取用户OpenID
return getPhone;
#endregion
}
catch (Exception ex)
{
return null;
}
}
#endregion
//实体Model
//获取用户openid、session_key
public class v_petminiuserdetails
{
/// <summary>
/// 微信用户openId
/// </summary>
public string openid { get; set; }
/// <summary>
/// session_key
/// </summary>
public string session_key { get; set; }
}
//获取用户手机号
public class wechardetails<T>
{
/// <summary>
/// 手机号
/// </summary>
public string phoneNumber { get; set; }
/// <summary>
/// 区域手机号
/// </summary>
public string purePhoneNumber { get; set; }
/// <summary>
/// 区码
/// </summary>
public string countryCode { get; set; }
public T watermark { get; set; }
}
public class watermark
{
/// <summary>
/// 时间戳
/// </summary>
public string timestamp { get; set; }
/// <summary>
/// 用户appid
/// </summary>
public string appid { get; set; }
/// <summary>
/// 用户openid
/// </summary>
public string openid { get; set; }
}
原文地址:https://www.cnblogs.com/YangWenStudent/p/11388341.html
- hbase源码系列(十三)缓存机制MemStore与Block Cache
- hbase源码系列(十四)Compact和Split
- 设计模式学习(四): 1.简单工厂 (附C#实现)
- 从头编写 asp.net core 2.0 web api 基础框架 (5) EF CRUD
- 从头编写 asp.net core 2.0 web api 基础框架 (4) EF配置
- RavenDb学习(十)附件,存储大对象
- 从头编写 asp.net core 2.0 web api 基础框架 (3)
- Distribute Cached 使用
- RavenDb学习(七) 异步工作以及维度查询
- RavenDb学习(五)结果转换
- sqoop 从sqlserver2008 导入数据到hadoop
- 从头编写 asp.net core 2.0 web api 基础框架 (2)
- hbase源码系列(四)数据模型-表定义和列族定义的具体含义
- RavenDb学习(四)处理文档相关性
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android 动态添加view或item并获取数据的实例
- Centos7实现MySQL基于日志还原数据的示例代码
- Android 三种延迟操作的实现方法
- 基于Android在布局中动态添加view的两种方法(总结)
- Android向node.js编写的服务器发送数据并接收请求
- Android startActivityForResult和setResult的区别
- Linux系统使用Fuser命令的方法
- Android实现地理定位功能
- Android实现在ServiceManager中加入自定义服务的方法详解
- Android studio so库找不到问题解决办法
- Android使用ViewPager实现屏幕滑动效果
- Android 自定义view实现进度条加载效果实例代码
- Android电池电量监听的示例代码
- Android 解决ScrollView嵌套CridView显示问题
- Android利用zxing快速集成二维码扫描的实例教程