官方API

官方API

步骤

1,APP端拉起微信小程序
2,小程序端获取微信运动数据
3,后台解密获取的微信运动数据

实现

1,APP端调起微信小程序

准备工作:
1)微信开放平台,微信公众平台注册应用,小程序,并绑定。通过微信开放平台注册的appid我称为应用id,通过微信公众平台注册的appid我称为小程序id,然后微信公众平台还有一个小程序原始id。
2)开始拉起小程序的时候一直跳转失败,也没有详细信息提示。这方面微信也太次了,官方文档也有很多坑,说的不明不白。按照官方文档,拉起小程序时需要一个应用id,一个小程序原始id。用微信公众平台获取到的appid就是跳转失败。
3)这里传入微信开放平台注册的appid就可以了。
具体代码:

String appId = "wxb4c043ea********"; // 填应用AppId
IWXAPI api = WXAPIFactory.createWXAPI(this, appId);
WXLaunchMiniProgram.Req req = new WXLaunchMiniProgram.Req();
req.userName = "gh_ec76********"; // 填小程序原始id
req.path = "pages/index/index?userid="+UserInfo.getUserid();                  //拉起小程序页面的可带参路径,不填默认拉起小程序首页
req.miniprogramType = WXLaunchMiniProgram.Req.MINIPTOGRAM_TYPE_RELEASE;// 可选打开 开发版,体验版和正式版//MINIPROGRAM_TYPE_PREVIEW
api.sendReq(req);

2,小程序获取微信运动数据

1)这个很简单,随便贴下代码就行了,不理解的可以看官方文档,这块没有坑。

onShow: function () {// 展示本地存储能力var logs = wx.getStorageSync('logs') || []var _this = this;logs.unshift(Date.now())wx.setStorageSync('logs', logs)// 登录wx.login({success: resLogin => {// 发送 res.code 到后台换取 openId, sessionKey, unionIdconsole.log(resLogin.code),wx.request({url: '**************************************************',data: {code: resLogin.code},success: res => {wx.getSetting({success: res => {wx.getWeRunData({success: resRun => {const encryptedData = resRun.encryptedData//console.log('ssss' + encryptedData);wx.request({url:      '****************************',data: {encryptedData: resRun.encryptedData,iv: resRun.iv,},success: resDecrypt => {console.log(resDecrypt)var runData = JSON.parse(resDecrypt.data.data)console.info(runData);// _this.aaa(runData)_this.globalData.step = runData;if (_this.stepCallBack) {_this.stepCallBack(runData);}},})},fail: res => {wx.showModal({title: '提示',//content: '开发者未开通微信运动,请关注“微信运动”公众号后重试',content: '获取微信运动步数,需要开启计步权限',showCancel: false,success: function (res) {if (res.confirm) {//跳转去设置wx.openSetting({success: res => {}})}}// showCancel: false,// confirmText: '知道了'})}})//}}})}}) }})},

3,后台解密运动数据

1)第一步获取session_key:

String code  = para.getString("code");
String appid  = para.getString("appid");
String appSecret  = para.getString("appSecret");
String result = GetSession(appid, appSecret, code);
JSONObject jsonObject = JSONObject.fromObject(result);
String sessionkey = jsonObject.getString("session_key");
Cache.put("sessionkey", sessionkey);

GetSession方法:

public static String GetSession(String appid,String appSecret,String code){String WX_URL = "https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=APPSECRET&js_code=acode&grant_type=authorization_code";String requestUrl = WX_URL.replace("APPID", appid).replace("APPSECRET", appSecret).replace("acode",code).replace("authorization_code", "authorization_code");String value = sendGet(requestUrl);return value;}

sendGet方法:

public static String sendGet(String url) {  String result = "";  BufferedReader in = null;  try {  //String urlNameString = url + "?" + param;  URL realUrl = new URL(url);  // 打开和URL之间的连接  URLConnection connection = realUrl.openConnection();  // 设置通用的请求属性  connection.setRequestProperty("accept", "*/*");  connection.setRequestProperty("connection", "Keep-Alive");  connection.setRequestProperty("user-agent",  "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");  // 建立实际的连接  connection.connect();  // 获取所有响应头字段  Map<String, List<String>> map = connection.getHeaderFields();  // 遍历所有的响应头字段  /*for (String key : map.keySet()) {  System.out.println(key + "--->" + map.get(key));  }*/  // 定义 BufferedReader输入流来读取URL的响应  in = new BufferedReader(new InputStreamReader(  connection.getInputStream()));  String line;  while ((line = in.readLine()) != null) {  result += line;  }  } catch (Exception e) {  e.printStackTrace();  }  // 使用finally块来关闭输入流  finally {  try {  if (in != null) {  in.close();  }  } catch (Exception e2) {  e2.printStackTrace();  }  }  return result;  }

这就可以获取到session_key,并且存储到缓存中。
2)解密数据

public void onDecrypt(String encryptedData, String iv, String appId,) throws Exception {String sessionkey = Cache.get("sessionkey");// 被加密的数据byte[] dataByte = Base64.decode(encryptedData);// 加密秘钥byte[] keyByte = Base64.decode(sessionkey);// 偏移量byte[] ivByte = Base64.decode(iv);try {// 如果密钥不足16位,那么就补足int base = 16;if (keyByte.length % base != 0) {int groups = keyByte.length / base + (keyByte.length % base != 0 ? 1 : 0);byte[] temp = new byte[groups * base];Arrays.fill(temp, (byte) 0);System.arraycopy(keyByte, 0, temp, 0, keyByte.length);keyByte = temp;}// 初始化Security.addProvider(new BouncyCastleProvider());Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding","BC");SecretKeySpec spec = new SecretKeySpec(keyByte, "AES");AlgorithmParameters parameters = AlgorithmParameters.getInstance("AES");parameters.init(new IvParameterSpec(ivByte));cipher.init(Cipher.DECRYPT_MODE, spec, parameters);// 初始化byte[] resultByte = cipher.doFinal(dataByte);if (null != resultByte && resultByte.length > 0) {String result = new String(resultByte, "UTF-8");System.out.println("result:"+result);
//                vdo.put("data", result);JSONObject jsonObject = JSONObject.fromObject(result);JSONArray jsonArray =                   jsonObject.getJSONArray("stepInfoList");//这就是解密的数据JSONObject json = (JSONObject) jsonArray.get(30);}} catch (NoSuchAlgorithmException e) {e.printStackTrace();} catch (NoSuchPaddingException e) {e.printStackTrace();} catch (InvalidParameterSpecException e) {e.printStackTrace();} catch (IllegalBlockSizeException e) {e.printStackTrace();} catch (BadPaddingException e) {e.printStackTrace();} catch (UnsupportedEncodingException e) {e.printStackTrace();} catch (InvalidKeyException e) {e.printStackTrace();} catch (InvalidAlgorithmParameterException e) {e.printStackTrace();} catch (NoSuchProviderException e) {e.printStackTrace();}}

就先贴代码吧,等有时间再加工加工。
有问题留言讨论,互相学习。

微信小程序获取微信运动数据并解密相关推荐

  1. 微信小程序-获取微信收货地址

    微信小程序获取微信收货地址 文章目录 微信小程序获取微信收货地址 一.在小程序管理后台( 小程序管理后台),「开发」-「开发管理」-「接口设置」中自助开通该接口权限. 二.开通之后直接调用接口. // ...

  2. 微信小程序获取微信公众号文章2

    微信小程序获取微信公众号文章2 前面介绍了一篇微信小程序打开微信公众号中的文章实战教程,主要介绍了实现的具体原理,但是实际去做的时候,发现了更多的坑,所以这里再补充一下. 原先的思路是不完整的 原先我 ...

  3. 微信小程序获取Onenet温湿度数据并控制灯亮灭

    ​ 其实之前就写过类似的文章,但是看过我博客的朋友就知道,我是先写微信小程序获取onenet,然后再写esp32上云到onenet.一篇是ESP32-C3通过MQTT协议把温湿度上传到OneNet平台 ...

  4. php 小程序 运动步数_微信小程序获取微信运动步数的实例代码

    现在运动计步很火,无论是蚂蚁森林,还是微信上都很火爆,本文介绍了微信小程序微信运动步数的实例代码,分享给大家 微信小程序API-微信运动 https://mp.weixin.qq.com/debug/ ...

  5. 微信小程序获取微信头像、微信昵称

    微信小程序获取头像昵称 <template><view class="top-user"><view class="top-content& ...

  6. 小程序步数解密php,微信小程序--获取微信运动步数的实例代码

    如今运动计步很火,不管是蚂蚁森林,仍是微信上都很火爆,本文介绍了微信小程序微信运动步数的实例代码,分享给你们php 思路:wx.login获取的code请求获取的session_key,wx.getW ...

  7. 微信小程序获取数据库的数据返回空数组

    在接触微信小程序的时候,请求数据库时返回了空数组,只要打开云开发控制台,在数据库里点击的你的集合,设置一下你的权限管理为-所有用户可读,仅创建者可读写,就行了

  8. 微信小程序获取微信名和头像登录

    小程序获取用户信息使用 wx.getUserProfile()方法 wx.getUserProfile()方法的用处:获取用户信息,页面上有点击事件button后才可以调用,每次请求都会弹出授权窗口, ...

  9. 微信小程序获取用户运动步数后端返回-41003

    最近在做一个运动步数兑换的小程序,记录下自己遇到的一些问题:1.授权流程(需要获取用户信息的授权和获取运动步数的授权)2.在获取运动步数时后端一直返回-41003 一.授权流程 由于微信的一些授权接口 ...

最新文章

  1. 【转】安全测试自学路线图
  2. 常用机器学习算法原理及推导
  3. centos7搭建时间服务器
  4. 汇编:LEA(取偏移地址)、LES
  5. mysql innodb ibd_MySQL innodb引擎下根据.frm和.ibd文件恢复表结构和数据
  6. TensorFlow tf.keras.callbacks.ModelCheckpoint
  7. Kubernetes Resource QoS Classes介绍
  8. php数据库之mysql (where 、order By 、 Update)
  9. 两个文本框异动任何一个能即时更新计算结果
  10. linux apache 停止命令,linux 下 apache启动、停止、重启命令
  11. 小波包分解、重构 matlab代码
  12. Cloudera迁移scm数据库
  13. 抽样调查之分层随机抽样
  14. c#将PDF文件转成图片
  15. 随机编码生成器MD5加密字符串工具
  16. 阿里ET大脑如何帮助养猪产业提升PSY从20到32?
  17. 高并发处理之商品详情页
  18. 三、数据特性计算(含信道通讯计算、码元速率计算、尼奎斯特定理、香农定理以及相应的练习题)——网络工程师成长之路
  19. Django解决css样式失效问题最终方法
  20. yeelink平台试玩

热门文章

  1. 什么时候我们变得不敢借钱给朋友了?
  2. scrcpy(android手机投屏神器)
  3. 图片识别文字OCR-制作可检索的PDF文档
  4. ubuntu linux 网速太慢
  5. 电话号码的组合(公式运算)
  6. Ubuntu16.04+Cuda8.0+Caffe+ Opencv3.2+Matlab2015b的配置、安装与编译 (二)
  7. ubuntu20.04 关闭图形界面
  8. 分布式电商项目——4.搭建微信公众号平台以及整合WxJava框架提供注册码
  9. HashMap的底层结构、原理、扩容机制
  10. php 求总页数,WordPress单篇文章分页,获取总页数代码