当前位置:   article > 正文

微信小程序开发-获取微信运动步数 C#解密步数_c# 获取微信健步走接口

c# 获取微信健步走接口

最近做一个微信小程序需用到微信运动数据,根据文档,我写了一个demo;先总结一下步骤,流程简单如下:

1、调用小程序API:wx.login获取code和sessionKey; 
2、调用小程序API: wx.getWeRunData获取微信运动数据(加密的); 
3、解密步骤2的数据;

我后台用C#的,其实其他语言原理一样,只有解密数据一个核心方法;

加密数据解密算法

接口如果涉及敏感数据(如wx.getUserInfo当中的 openId 和unionId ),接口的明文内容将不包含这些敏感数据。开发者如需要获取敏感数据,需要对接口返回的加密数据( encryptedData )进行对称解密。 解密算法如下:

  1. 对称解密使用的算法为 AES-128-CBC,数据采用PKCS#7填充。
  2. 对称解密的目标密文为 Base64_Decode(encryptedData),
  3. 对称解密秘钥 aeskey = Base64_Decode(session_key), aeskey 是16字节
  4. 对称解密算法初始向量 iv 会在数据接口中返回。

微信官方提供了多种编程语言的示例代码(点击下载)。每种语言类型的接口名字均一致。调用方式可以参照示例。

 

下载示例代码,没有C#的,只有C++、nodejs、python、php的,顿时受到巨大的打击。在网上找C#的AES-128-CBC算法,就没有一个好用的,下载下来半天调不通,看看nodejs和python的代码,简单到令人发指,顿时让我的信心再次遭受打击。

后端(c# .net core)

必须先登录获取到session_key 然后再去获取加密的步数,如果先获取步数再去登陆用登录的session_key去解密会报“填充无效,无法被移除。” ,我在调试过程中就碰到这个问题我在后端登录前端给我加密数据解密就出问题了

api

  1. [Route("api/[controller]/[action]")]
  2. [ApiController]
  3. public class WeChatController : TestControllerBase
  4. {
  5. private readonly ICacheManager _cacheManager;
  6. private IHttpClientFactory _httpClient;
  7. public WeChatController( ICacheManager cacheManager,IHttpClientFactory httpClient)
  8. {
  9. this._cacheManager = cacheManager;
  10. this._httpClient=httpClient;
  11. }
  12. /// <summary>
  13. /// 获取微信ID
  14. /// </summary>
  15. /// <returns></returns>
  16. [HttpGet]
  17. public async Task<dynamic> GetWechatID(string js_code)
  18. {
  19. try
  20. {
  21. using (var client = _httpClient.CreateClient())
  22. {
  23. var url = $"https://api.weixin.qq.com/sns/jscode2session?appid=这里是appid&secret=这里是secret&js_code={js_code}&grant_type=authorization_code";
  24. //使用注入的httpclientfactory获取client
  25. client.BaseAddress = new Uri(url);
  26. //设置请求体中的内容,并以post的方式请求
  27. var response = await client.GetAsync(url);
  28. //获取请求到数据,并转化为字符串
  29. var result = response.Content.ReadAsStringAsync().Result;
  30. dynamic aa = JsonConvert.DeserializeObject<dynamic>(result);
  31. string session_key = aa.session_key;
  32. string openid = aa.openid;
  33. string bb = PublicMethods.Encrypt(openid);
  34. _cacheManager.GetCache("微信登录").Remove(bb);
  35. _cacheManager.GetCache("微信登录").Set(bb, session_key);我将sessionkey缓存起来解密时需要用
  36. return Json(new { ok = true, msg = "sucess", data = bb });
  37. }
  38. }
  39. catch (Exception e)
  40. {
  41. return Json(new { ok = false, msg = "error", data = e.Message });
  42. }
  43. }
  44. /// <summary>
  45. /// 解密
  46. /// </summary>
  47. /// <param encryptedData="需要解密的步数"></param>
  48. /// <param iv="不知道"></param>
  49. /// <param wechatid="登录时缓存的session_key"></param>
  50. /// <returns></returns>
  51. [HttpPost]
  52. public ActionResult Decrypt(T微信步数解密 Decrypt)
  53. {
  54. string sessionKey = _cacheManager.GetCache("微信登录").GetOrDefault(Decrypt.wechatid).ToString(); //取出OnLogin的sessionKey
  55. string rawData =PublicMethods.AES_decrypt(Decrypt.encryptedData, sessionKey, Decrypt.iv);
  56. if (string.IsNullOrEmpty(rawData) == false)
  57. {
  58. return Ok(rawData);
  59. }
  60. return BadRequest("解密失败");
  61. }
  62. /// <summary>
  63. /// AES解密
  64. /// </summary>
  65. /// <param name="encryptedDataStr"></param>
  66. /// <param name="key"></param>
  67. /// <param name="iv"></param>
  68. /// <returns></returns>
  69. private static string AES_decrypt(string encryptedDataStr, string key, string iv)
  70. {
  71. try
  72. {
  73. RijndaelManaged rijalg = new RijndaelManaged();
  74. //-----------------
  75. //设置 cipher 格式 AES-128-CBC
  76. rijalg.KeySize = 128;
  77. rijalg.Padding = PaddingMode.PKCS7;
  78. rijalg.Mode = CipherMode.CBC;
  79. rijalg.Key = Convert.FromBase64String(key);
  80. rijalg.IV = Convert.FromBase64String(iv);
  81. byte[] encryptedData = Convert.FromBase64String(encryptedDataStr);
  82. //解密
  83. ICryptoTransform decryptor = rijalg.CreateDecryptor(rijalg.Key, rijalg.IV);
  84. string result = null;
  85. using (MemoryStream msDecrypt = new MemoryStream(encryptedData))
  86. {
  87. using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
  88. {
  89. using (StreamReader srDecrypt = new StreamReader(csDecrypt))
  90. {
  91. result = srDecrypt.ReadToEnd();
  92. }
  93. }
  94. }
  95. return result;
  96. }
  97. catch (Exception e)
  98. {
  99. return e.Message;
  100. }
  101. }
  102. private class T微信步数解密
  103. {
  104. public string iv { get; set; }
  105. public string encryptedData { get; set; }
  106. public string wechatid { get; set; }
  107. }
  108. }

 

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

闽ICP备14008679号