前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >小程序同步微信步数

小程序同步微信步数

作者头像
php007
发布2019-08-08 17:06:44
3.3K0
发布2019-08-08 17:06:44
举报
文章被收录于专栏:PHP专享栏PHP专享栏
文章正文

小程序获取微信运动步数,咱们看文档: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_keygetData方法来接收

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
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-08-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 风帆 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 调用前需要 用户授权 scope.werun。
  • 下面来看看小程序获取session_key,用来解密的必须参数。
  • getData方法
  • 开发者后台校验与解密开放数据
  • 加密数据解密算法
    • index.php
      • wxBizDataCrypt.php,这个是解密的主要文件
        • 错误信息文件,errorCode.php
        相关产品与服务
        数据库一体机 TData
        数据库一体机 TData 是融合了高性能计算、热插拔闪存、Infiniband 网络、RDMA 远程直接存取数据的数据库解决方案,为用户提供高可用、易扩展、高性能的数据库服务,适用于 OLAP、 OLTP 以及混合负载等各种应用场景下的极限性能需求,支持 Oracle、SQL Server、MySQL 和 PostgreSQL 等各种主流数据库。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档