小程序获取微信运动步数,咱们看文档: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,这个是解密的主要文件

/**

* 对微信小程序用户加密数据的解密示例代码.

*

* @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

/**

* 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;

}

?>

php 小程序 运动步数_小程序同步微信步数 - xiangqian1的个人空间 - OSCHINA - 中文开源技术交流社区...相关推荐

  1. 仿射解密c语言程序实验报告,仿射加密解密 - 依姆哣特的个人空间 - OSCHINA - 中文开源技术交流社区...

    //功能:仿射加密 密钥:[3][5][9][11][15][17][19][21][23]有逆元的数 例子:pku  c=7,d=3  输出 :EVN 编辑环境:vc++6.0 include in ...

  2. python数组和链表的区别_数组和链表的区别 - toddler的个人空间 - OSCHINA - 中文开源技术交流社区...

    数组是将元素在内存中连续存放,由于每个元素占用内存相同,可以通过下标迅速访问数组中任何元素.但是如果要在数组中增加一个元素,需要移动大量元素,在内存中空出一个元素的空间,然后将要增加的元素放在其中.同 ...

  3. q7固件 数码视讯_数码视讯Q7的刷机 - osc_8quu62cg的个人空间 - OSCHINA - 中文开源技术交流社区...

    Q7的硬件配置 CPU: S905L RAM: MIRA P3P4GF4DMF/P3P4GF4BLF DDR3 512MB * 2 = 1GB ROM: 镁光29F64G08CBABB(NAND) * ...

  4. mysql消除冗余关键字_优化mysql语句 - 可爱的wzz的个人空间 - OSCHINA - 中文开源技术交流社区...

    1.查询SQL尽量不要使用select *,而是select具体字段. 反例子: select * from employee; 正例子: select id,name from employee; ...

  5. java新建常量_【Java】常量 - 每日坚果的个人空间 - OSCHINA - 中文开源技术交流社区...

    常量是什么: 常量是初始化值后不能再改变的值,可以理解为只能赋值一次的变量 创建常量的三种方式: 1. 在类中使用final修饰 定义: public class Demo04 { final int ...

  6. python计算等额本金_等额本金-逆推 - tedzheng的个人空间 - OSCHINA - 中文开源技术交流社区...

    等额本金是递归逆推的一个方法: 父亲准备4年的生活费,使且整存零取的方式,控制每月底只能提取1000元,假设银行年利息为1.71% 思路: 第48个月取出1000,则要先求出47个月时银行存款的具体金 ...

  7. java重载覆盖隐藏_重载,覆盖以及隐藏 - osc_4dki3x9l的个人空间 - OSCHINA - 中文开源技术交流社区...

    重载是指同名函数具有不同的参数表.在同一访问区域内声明的几个具有不同参数列表(参数的类型.个数.顺序不同)的同名函数,程序会根据不同的参数列来确定具体调用哪个函数.对于重载函数的调用,编译期间确定,是 ...

  8. 关于码云的一些基本知识_网络攻防前期知识储备 - osc_ojkfylwq的个人空间 - OSCHINA - 中文开源技术交流社区...

    一.如何提问 1.我的观点:提问分为课堂提问和课下提问两种.课堂中应该是当面交流的,更加鼓励当有疑问的时候在稍作整理思路后直接大胆的提问.课下疑问的解决,不可能时时的交流,更加需要独立的思考,而提问需 ...

  9. java开源写字板_简单的写字板 - 努力喵的个人空间 - OSCHINA - 中文开源技术交流社区...

    #include #include "acllib.h" void mouseListener(int x, int y, int button, int event) { sta ...

最新文章

  1. 微信小程序开发-笔记
  2. nitrous.io mysql_云IDE:Nitrous.io的介绍以及活用手段
  3. 2.修改/etc/hosts文件 /安装SSH、配置SSH无密码登陆(全程切换到hadoop用户下操作)
  4. 谨慎全面地对待“滞销”
  5. linux删除指定端口的进程
  6. Leetcode--1028. 从先序遍历还原二叉树(Java)
  7. android软键盘把布局顶上去,Android 软键盘弹出时把原来布局顶上去的解决方法
  8. 基于python的在线考试系统-Python程序设计考试系统的开发与应用.pdf
  9. Android Studio的Android Monitor窗口中把标签拉出来之后放不回去的解决方法
  10. 理解和使用 Unity UI 系统(canvas和CanvasScaler )
  11. jdbc数据库连接池连接
  12. 获得当月时间chuo_擅用GTD时间管理法,远离焦虑情绪,让你的工作、学习井然有序...
  13. mysql常用语句1
  14. canvas应用之各种游戏转盘
  15. Must specify unique android:id, android:tag, or have a parent with an id for 异常
  16. 全国智慧园区解决方案TOP50 | 附下载
  17. 有关找共享单车那些事
  18. 双机(51单片机)串行通信最基本的方法
  19. 面对流氓软件,是逃避还是反击?(连载二、一场口水引发的战争)
  20. 与Bosun一起监控

热门文章

  1. 关于iPhone4s 设置手机铃声过程中的问题
  2. 2012风投投了哪些移动互联网公司?
  3. Git如何彻底删除文件或文件夹(包括历史记录)
  4. PHP打包下载整个文件夹或多文件
  5. 有关The Last Promise的汉化①国外高手的FE7 hack版
  6. 2022前端工程师面试过程分享
  7. 【业务】数据仓库和银行相关业务知识点汇总 (持续更新)
  8. Android基于腾讯云实时音视频实现类似微信视频通话最小化悬浮
  9. javascript常用功能收藏
  10. RenameTo的三种操作方式