微信小程序获取用户微信运动步数数据
如何通过小程序来获取微信运动的步数数据呢,这个api腾讯是开放的,今天我们来讲讲如何编写前后端代码实现这个功能。
一、小程序端代码
我们先获取sessionkey这个值,这个值是参与微信运动的数据解密的,所以要提前获取,那么怎么获取呢
wx.login({ success(res) { console.log(res); var code = res.code wx.request({ url: '后端url', method: "post", data: { code }, success: function (res) { console.log(res.data.openid); if(res.code==200){ that.setData({sessionkey:res.data}); } } }) } })
<?php $appid = "wx1231312321"; $appsecret = "12312334343534534535"; $code = $_GET['code']; if ($code == '') { echo json_encode([ 'code' => '201', 'data' => 'code不能为空' ]); exit(); } $url = 'https://api.weixin.qq.com/sns/jscode2session?appid='.$appid.'&secret='.$appsecret.'&js_code='.$code.'&grant_type=authorization_code'; $result = http_curl($url); $token = json_decode($result, 1); if (isset($token['session_key'])) { $sessionkey = $token['session_key']; //拿到openid echo json_encode([ 'code' => '200', 'data' => $sessionkey ]); exit(); } echo json_encode([ 'code' => '201', 'data' => "登陆失败" ]); function http_curl($url) { $curlobj = curl_init(); curl_setopt($curlobj, CURLOPT_URL, $url); curl_setopt($curlobj, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curlobj, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($curlobj, CURLOPT_SSL_VERIFYHOST, FALSE); $output = curl_exec($curlobj); curl_close($curlobj); return $output; } ?>
onLoad() { var that = this wx.getWeRunData({ success(res){ console.log(res) wx.request({ url: '后端解密url', data: { encrypteddata: res.encryptedData, iv: res.iv, session: that.data.sessionkey }, method: 'GET', // OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT // header: {}, // 设置请求的 header success: function (res) { let todayStep = res.data.stepInfoList.pop() that.setData({ step: todayStep.step }); } }) } }) },
<?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; } } /** * error code 说明. * <ul> * <li>-41001: encodingAesKey 非法</li> * <li>-41003: aes 解密失败</li> * <li>-41004: 解密后得到的buffer非法</li> * <li>-41005: base64加密失败</li> * <li>-41016: base64解密失败</li> * </ul> */ class ErrorCode { public static $OK = 0; public static $IllegalAesKey = -41001; public static $IllegalIv = -41002; public static $IllegalBuffer = -41003; public static $DecodeBase64Error = -41004; } $pc = new Wxbizdatacrypt($appid, $sessionkey); $errCode = $pc->decryptData($encrypteddata, $iv, $data); if ($errCode == 0) { print($data . "\n"); } else { print($errCode . "\n"); } ?>好了,可以获取到数据了。
好了,整个过程就这么简单。
网友评论0