获取公众号信息接口的 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());
    }