微信小程序解密用户信息,解密微信运动数据

时间:2024-02-22 07:31:28

本篇主要描述微信小程序的后台登录,获取用户信息,解密微信运动数据

首先 登录由前端发起 小程序授权用户才能进行登录 前端具体接口信息可登录微信开放平台进行查看

前端调用 wx.login() 获取临时登录凭证code ,并回将code传到后台服务器,后台服务器通过微信开放的code2Session接口

GET https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code

 进行调用,微信接口将返回session_key,openid等信息

请求参数

属性类型默认值必填说明
appid string   小程序 appId
secret string   小程序 appSecret
js_code string   登录时获取的 code
grant_type string   授权类型,此处只需填写 authorization_code

返回的 JSON 数据包

属性类型说明
openid string 用户唯一标识
session_key string 会话密钥
unionid string 用户在开放平台的唯一标识符,在满足 UnionID 下发条件的情况下会返回
errcode number 错误码
errmsg string 错误信息

 

 此时 我们可以获取openid,以及秘钥session_key,通过前端调用 wx.getUserInfo(Object object)可以获取到除openid外的其他用户信息(需判断是否授权,授权后才能调用),

前端具体接口信息可在微信开放平台查看

https://developers.weixin.qq.com/miniprogram/dev/api/open-api/user-info/wx.getUserInfo.html

wx.getUserInfo会返回UserInfo信息以及encryptedData(包括敏感数据在内的完整用户信息的加密数据),iv(加密算法的初始向量)

我们也可以利用session_key对encryptedData进行解密获取到用户的具体信息(包含unionId)

具体解密方法这里简单写一下,解密微信用户数据,运动数据,解密手机号都是这种解密方式,

给出一个链接可以参考这个大哥的 https://www.jianshu.com/p/3170749b6660

import com.sun.jersey.core.util.Base64;
import org.bouncycastle.jce.provider.BouncyCastleProvider;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.security.*;

public class DES2Util {

    private static final String AES = "AES";
    private static final String AES_CBC_PKCS7 = "AES/CBC/PKCS7Padding";

    public static String decryptWxInfo(String encryptedData, String iv, String sessionKey){
        try {
            byte[] data = Base64.decode(encryptedData);
            byte[] aseKey = Base64.decode(iv);
            byte[] ivData = Base64.decode(sessionKey);
            Security.addProvider(new BouncyCastleProvider());
            Cipher cipher = Cipher.getInstance(AES_CBC_PKCS7);
            Key sKeySpec = new SecretKeySpec(aseKey, AES);
            //初始化
            cipher.init(Cipher.DECRYPT_MODE, sKeySpec, generateIv(ivData));

            byte[] result = cipher.doFinal(data);
            return new String(result);
        }catch (Exception e){
            e.printStackTrace();
            return null;
        }
    }

    public static AlgorithmParameters generateIv(byte[] ivData) throws Exception {
        AlgorithmParameters params = AlgorithmParameters.getInstance("AES");
        params.init(new IvParameterSpec(ivData));
        return params;
    }
}

 

微信运动数据需前端调用wx.getWeRunData(Object object)  微信官方接口描述:

https://developers.weixin.qq.com/miniprogram/dev/api/open-api/werun/wx.getWeRunData.html

该接口会返回encryptedData(微信运动数据的加密信息) iv(加密算法的初始向量)

通过之前获取的session_key 可对加密信息进行解密 解密方法参照微信用户数据解密的链接

微信小程序登录流程就是前端返回 code、encryptedData(微信用户加密信息)、iv,后端根据code通过code2Session接口获取session_key,

然后用session_key去解密encryptedData来获取微信用户数据

注意:前端调用wx.getUserInfo(Object object)  wx.getWeRunData(Object object) 需判断是否授权

  session_key有过期时间 有效期是30天 为用户新生成code后原session_key失效

  微信小程序前端没有cookie  前端可以将后台返回的登录标识存在storage 请求后台时加到header(建议使用token)

  微信小程序绑定 微信开放平台后,解密信息才会出现unionId

  同一个用户在微信公众开放下的不同应用(小程序,公众号)上有不同的openid 有相同的unionId