ios11修改微信步数_小程序同步微信步数
文章正文
小程序獲取微信運動步數,咱們看文檔:https://developers.weixin.qq.com/miniprogram/dev/api/open-api/werun/wx.getWeRunData.html
調用前需要?用戶授權?scope.werun。
獲取用戶過去三十天微信運動步數。需要先調用?wx.login?接口。步數信息會在用戶主動進入小程序時更新。
其主要的思路就是:用wx.login獲取的code請求獲取的session_key,加上appid,利用這兩個參數,到wx.getWeRunData獲取的iv,encryptData,最后將它們一起發送到后臺解密就可以獲取到微信運動步數了。
下面來看看小程序獲取session_key,用來解密的必須參數。
onLoad: function (options) {
var that = this;
wx.login({
success: function (res) {
var appid = "wx065bc****454e37b"; //寫自己的appid
var secret = "39f201920ea****c628df7c133e"; //寫自己的secret
if (res.code) {
wx.request({
url: 'https://api.weixin.qq.com/sns/jscode2session?appid=' + appid + '&secret=' + secret + '&js_code=' + res.code + '&grant_type=authorization_code',
header: {
'content-type': 'json'
},
success: function (res) {
var session_key = res.data.session_key;
//console.log(res);
that.getData(appid, session_key);
}
})
}
}
})
},
上面獲取的session_key用getData方法來接收
getData方法
//獲取encryptedData(沒有解密的步數)和iv(加密算法的初始向量)
getData: function (appid, session_key) {
wx.getSetting({
success: function (res) {
wx.getWeRunData({
success: function (res) {
//console.log(res);
console.log("appid:" + appid + "session_key:" + session_key + "encryptedData:" + res.encryptedData + "iv:" + res.iv);
var encryptedData = res.encryptedData;
var iv = res.iv;
console.log(encryptedData);
wx.request({
url: getApp().data.apiUrl + '/promotion/steps',
data: {
encryptedData: encryptedData,
iv: iv,
appid: appid,
session_key: session_key,
},
method: 'POST',
header: {
'Content-type': 'application/json', // 默認值
'project': 'xxxxx' //這里是我這接口的設置,可以忽略
},
dataType: 'json',
success: function (res) {
console.log(res);
}
});
},
fail: function (res) {
wx.showModal({
title: '提示',
content: '開發者未開通微信運動,請關注“微信運動”公眾號后重試',
showCancel: false,
confirmText: '知道了'
})
}
})
}
})
}
獲取到的encryptedData?,?iv?,?session_key,?appid,這一類是加密文件,需要傳到服務器后端參與解密。這里說到的解密, 這里的數據截圖如下:
文檔里有講到:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/signature.html#method-decode
小程序可以通過各種前端接口獲取微信提供的開放數據。考慮到開發者服務端也需要獲取這些開放數據,微信提供了兩種獲取方式,我這里用到的第一種方式。
開發者后臺校驗與解密開放數據
微信會對這些開放數據做簽名和加密處理。開發者后臺拿到開放數據后可以對數據進行校驗簽名和解密,來保證數據不被篡改。
簽名校驗以及數據加解密涉及用戶的會話密鑰 session_key。開發者應該事先通過 wx.login 登錄流程獲取會話密鑰 session_key 并保存在服務器。為了數據不被篡改,開發者不應該把 session_key 傳到小程序客戶端等服務器外的環境。
加密數據解密算法
接口如果涉及敏感數據(如wx.getUserInfo當中的 openId 和 unionId),接口的明文內容將不包含這些敏感數據。開發者如需要獲取敏感數據,需要對接口返回的加密數據(encryptedData) 進行對稱解密。解密算法如下:對稱解密使用的算法為 AES-128-CBC,數據采用PKCS#7填充。對稱解密的目標密文為 Base64_Decode(encryptedData)。對稱解密秘鑰 aeskey = Base64_Decode(session_key), aeskey 是16字節。對稱解密算法初始向量 為Base64_Decode(iv),其中iv由數據接口返回。
下面的例子我已經封裝在laravel5.8,原生的demo可見文檔下載處。引入文件把文件放在app目錄下,我命名為steps,然后在composer.json的autoload處,增加classmap。 "autoload": {
"classmap": [
"app/steps"
]
},
然后運行語句:composer dump-autoload
index.php
這里的encryptedData?,?iv?,?session_key,?appid,就暫時寫死了,你可以通過POST過來而獲取到數據.
public function index(){
try{
//1:wx后臺得到
$appid = 'wx06****454e37b';
//2:[客戶端]發送到服務器js_code(服務器用js_code換取sessionKey)
$sessionKey = 'diqMTiHO*****ndsdr1MSkQ==';
//3:[客戶端]發送到服務器(客戶端getUserInfo()獲取)
$encryptedData="rvCEuvIXURTceySws/XpwPdEQ68cEDFNWF8Mm23S3y/dnMS3...";
//4:[客戶端]發送到服務器(客戶端getUserInfo()獲取)
$iv = 'QG5vntg****qQUztOmw==';
//用appid、sessionKey初始化“解密處理類
$pc = new WXBizDataCrypt($appid,$sessionKey);
//執行解密,正確返回$data,錯誤返回$errCode
$errCode = $pc->decryptData($encryptedData, $iv, $data);
if ($errCode == 0) { //0表示正常
$result = $data . "
";
} else {
$result = $errCode . "
";
}
$ret = [
'code' => 1,
'data' => $result,
];
}catch (Exception $e){
$ret = "提示信息:".$e->getMessage()."行:".$e->getLine();
}
return $ret;
}
wxBizDataCrypt.php,這個是解密的主要文件
<?php /**
* 對微信小程序用戶加密數據的解密示例代碼.
*
* @copyright Copyright (c) 1998-2014 Tencent Inc.
*/include_once "errorCode.php";class WXBizDataCrypt{private $appid;private $sessionKey;/**
* 構造函數
* @param $sessionKey string 用戶在小程序登錄后獲取的會話密鑰
* @param $appid string 小程序的appid
*/public function __construct( $appid, $sessionKey){$this->sessionKey = $sessionKey;$this->appid = $appid;
}/**
* 檢驗數據的真實性,并且獲取解密后的明文.
* @param $encryptedData string 加密的用戶數據
* @param $iv string 與用戶數據一同返回的初始向量
* @param $data string 解密后的原文
*
* @return int 成功0,失敗返回對應的錯誤碼
*/public function decryptData( $encryptedData, $iv, &$data ){if (strlen($this->sessionKey) != 24) {return ErrorCode::$IllegalAesKey;
}
$aesKey=base64_decode($this->sessionKey);if (strlen($iv) != 24) {return ErrorCode::$IllegalIv;
}
$aesIV=base64_decode($iv);
$aesCipher=base64_decode($encryptedData);
$result=openssl_decrypt( $aesCipher, "AES-128-CBC", $aesKey, 1, $aesIV);
$dataObj=json_decode( $result );if( $dataObj == NULL )
{return ErrorCode::$IllegalBuffer;
}if( $dataObj->watermark->appid != $this->appid )
{return ErrorCode::$IllegalBuffer;
}
$data = $result;return ErrorCode::$OK;
}
}錯誤信息文件,errorCode.php
<?php /**
* error code 說明.
*
* -41001: encodingAesKey 非法
* -41003: aes 解密失敗
* -41004: 解密后得到的buffer非法
* -41005: base64加密失敗
* -41016: base64解密失敗
*
*/class ErrorCode{public static $OK = 0;public static $IllegalAesKey = -41001;public static $IllegalIv = -41002;public static $IllegalBuffer = -41003;public static $DecodeBase64Error = -41004;
}?>
總結
以上是生活随笔為你收集整理的ios11修改微信步数_小程序同步微信步数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php版程氏音乐cms管理系统 v3.0
- 下一篇: 迷你世界怎么绑定手机号?