获取公众号信息接口的 access_token 解密的方法
说明:
本文介绍说明大客商家使用定制接口:获取公众号信息,返回的 access_token 如何解密的方法
接口信息:
接口名称:获取公众号信息
接口 API:youzan.users.get.mpaccount.info.1.0.0
接口文档链接:https://doc.youzanyun.com/doc#/content/API/1-377/detail/api/0/865
JAVA 请求示例:
//YouZanClient 建议全局唯一,使用 spring 容器管理
YouZanClient yzClient = new DefaultYZClient();
Token token = new Token("YOUR_TOKEN");
YouzanUsersGetMpaccountInfo youzanUsersGetMpaccountInfo = new YouzanUsersGetMpaccountInfo();
//创建参数对象,并设置参数
YouzanUsersGetMpaccountInfoParams youzanUsersGetMpaccountInfoParams = new YouzanUsersGetMpaccountInfoParams();
YouzanUsersGetMpaccountInfoParamParams youzanUsersGetMpaccountInfoParamParams = new YouzanUsersGetMpaccountInfoParamParams();
YouzanUsersGetMpaccountInfoParamParams.setBusinessType(1);
YouzanUsersGetMpaccountInfoParamParams.setAccountType(1);
YouzanUsersGetMpaccountInfoParamParams.setKdtId(30223437);
youzanUsersGetMpaccountInfo.setAPIParams(youzanUsersGetMpaccountInfoParams);
YouzanUsersGetMpaccountInfoResult result = yzClient.invoke(youzanUsersGetMpaccountInfo, token, YouzanUsersGetMpaccountInfoResult.class);
返回参数:
{
"code": 200,
"data": {
"access_token": "Uxxinw2jQPv2_9JXsi445V3bRlsKih8CXAEqJyqVKNumndsILmK7pBCdqrnQSA32OdWlMhQ8y0zvDoB2LVsE1RIfLuIp2GBVXkKHiobUsyTzZr0kNd0O7WPoyw9L3Zk6bErcoeJxSjV6sPXBUj-ioSDOEGM7kC70rgE9ZjKFIDqfpaEL5rMXjURXUxVgyApHfKwZ98BHWVEOcSQuSyMR7g=="
},
"success": true,
"message": "successful"
}
access_token 解密方法:
返回参数 access_token 为加密后的公众号 accessToken,如果不经解密直接使用的话,会报错:
{
"errcode": 40014,
"errmsg": "invalid access_token hint: [kJ8g60719r258]"
}
解密方法:
需要使用 AES 加密 +base64,用 ClientSecret 作为秘钥逆向一下就可以了,具体参考解密代码示例:
public static String decrypt(String content, String secret) throws Exception {
//1.构造密钥生成器,指定为AES算法,不区分大小写
KeyGenerator keygen = KeyGenerator.getInstance("AES");
//生成一个128位的随机源,根据传入的字节数组
SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
secureRandom.setSeed(secret.getBytes(Charset.defaultCharset()));
keygen.init(128, secureRandom);
//3.产生原始对称密钥
SecretKey originalKey = keygen.generateKey();
//4.获得原始对称密钥的字节数组
byte[] raw = originalKey.getEncoded();
//5.根据字节数组生成AES密钥
SecretKey key = new SecretKeySpec(raw, "AES");
//6.根据指定算法AES自成密码器
Cipher cipher = Cipher.getInstance("AES");
//7.初始化密码器,第一个参数为加密(Encrypt_mode)或者解密(Decrypt_mode)操作,第二个参数为使用的KEY
cipher.init(Cipher.DECRYPT_MODE, key);
//8.将加密并编码后的内容解码成字节数组
byte[] decode = Base64.getUrlDecoder().decode(content);
//9.解密
byte[] byte_decode = cipher.doFinal(decode);
return new String(byte_decode, Charset.defaultCharset());
}