微信小程式開發-獲取微信運動步數
阿新 • • 發佈:2019-02-11
官方API
步驟
最近做一個微信小程式需用到微信運動資料,根據文件,我寫了一個demo;先總結一下步驟,流程簡單如下:
1、呼叫小程式API:wx.login獲取code和sessionKey;
2、呼叫小程式API: wx.getWeRunData獲取微信運動資料(加密的);
3、解密步驟2的資料;
我後臺用C#的,其實其他語言原理一樣,只有解密資料一個核心方法;
實現程式碼:
前端(小程式的 JS)
const util = require('../../utils/util.js')
Page({
/**
* 頁面的初始資料
*/
data: {
runData:[],
},
/**
* 生命週期函式--監聽頁面載入
*/
onLoad: function (options) {
//1、呼叫小程式API:wx.login獲取code和sessionKey;
var that=this;
wx.login({
success: function (resLogin) {
if (resLogin.code) {
wx.request({
url: 'http://localhost:9281/wxapp/onlogin' ,
data: {
code: resLogin.code
},
success: function (resSession) {
//2、呼叫小程式API: wx.getWeRunData獲取微信運動資料(加密的);
wx.getWeRunData({
success(resRun) {
const encryptedData = resRun
console.info(resRun);
//3、解密步驟2的資料;
wx.request({
url: 'http://localhost:9281/wxapp/decrypt',
data: {
encryptedData: resRun.encryptedData,
iv: resRun.iv,
code: resLogin.code
},
method: 'GET', // OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT
// header: {}, // 設定請求的 header
success: function (resDecrypt) {
var runData = JSON.parse(resDecrypt.data.data)
console.info(runData);
if (runData.stepInfoList)
{
runData.stepInfoList = runData.stepInfoList.reverse()
for (var i in runData.stepInfoList)
{
runData.stepInfoList[i].date = util.formatTime(new Date(runData.stepInfoList[i].timestamp*1000))
}
that.setData({ runData: runData.stepInfoList });
}
}
});
}
})
}
})
} else {
console.log('獲取使用者登入態失敗!' + res.errMsg)
}
}
});
},
})
後端(c# .net MVC)
//控制器
public class WxAppController : BaseController
{
/// <summary>
/// 登入,獲取sessionKey,對應上面的http://localhost:9281/wxapp/onlogin
/// </summary>
/// <param name="code">code</param>
/// <returns></returns>
public ActionResult OnLogin(string code)
{
if (string.IsNullOrEmpty(code) == false)
{
var sessionKey= WxAppHelper.GetSessionKey("你的appid", "你的appSecret", code);
if (string.IsNullOrEmpty(sessionKey) == false)
{
//將sessionKey放入快取,key是code
CacheHelper.Set(code, sessionKey, 360);
return WritingSuccess("登入成功");
}
}
return WritingFailed("登入失敗");
}
/// <summary>
/// 解密,對應上面的http://localhost:9281/wxapp/decrypt
/// </summary>
/// <returns></returns>
public ActionResult Decrypt()
{
string code = Request["code"];
string iv = Request["iv"];
string encryptedData = Request["encryptedData"];
string sessionKey = CacheHelper.Get(code); //取出OnLogin的sessionKey
string rawData = WxAppHelper.AES_decrypt(encryptedData, sessionKey, iv);
if (string.IsNullOrEmpty(rawData) == false)
{
return WritingSuccess("解密成功", rawData);
}
return WritingFailed("解密失敗");
}
//WxAppHelper的GetSession
public static AppSession GetSession(string appid,string appSecret,string code)
{
string api = "https://api.weixin.qq.com/sns/jscode2session?appid={0}&secret={1}&js_code={2}&grant_type=authorization_code";
string url = string.Format(api, appid, appSecret, code);
var sessionStr = HttpUtil.Get(url);
if (string.IsNullOrEmpty(sessionStr) == false)
{
return JsonHelper.Json2Object<AppSession>(sessionStr);
}
return null;
}
/// <summary>
/// AES解密
/// </summary>
/// <param name="encryptedDataStr"></param>
/// <param name="key"></param>
/// <param name="iv"></param>
/// <returns></returns>
public static string AES_decrypt(string encryptedDataStr, string key, string iv)
{
RijndaelManaged rijalg = new RijndaelManaged();
//-----------------
//設定 cipher 格式 AES-128-CBC
rijalg.KeySize = 128;
rijalg.Padding = PaddingMode.PKCS7;
rijalg.Mode = CipherMode.CBC;
rijalg.Key = Convert.FromBase64String(key);
rijalg.IV = Convert.FromBase64String(iv);
byte[] encryptedData = Convert.FromBase64String(encryptedDataStr);
//解密
ICryptoTransform decryptor = rijalg.CreateDecryptor(rijalg.Key, rijalg.IV);
string result=null;
using (MemoryStream msDecrypt = new MemoryStream(encryptedData))
{
using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
{
using (StreamReader srDecrypt = new StreamReader(csDecrypt))
{
result= srDecrypt.ReadToEnd();
}
}
}
return result;
}
//實體
public class AppSession
{
public string session_key;
public int expires_in;
public string openid;
}
ok啦,就是這麼簡單,我們看看執行結果:
執行結果
簡單吧~,哪裡寫的不清楚可以留言交流