在对接快手电商开放平台消息接口的时候发现文档只提供了一个java SDK。奈何目前不会Java,文档只提供了其他开放者一句话,差点把我强行逼退
自行解密步骤
使用Base64反编码密钥,使用反编码之后的密钥对接收到的消息体进行AES解密即可
单看这一句话我觉着是不可能写出来的,又琢磨了一下java代码,下载下来发现打不开。害,无奈之下发了工单,快手技术回复了一段具体Java解密代码
public static String decode(String message, String privateKey) throws KsMerchantApiException { try { if (KsStringUtils.isBlank(message) || KsStringUtils.isBlank(privateKey)) { throw new KsMerchantApiException("decode param is blank"); } Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); byte[] key = Base64.decodeBase64(privateKey); SecretKeySpec keySpec = new SecretKeySpec(key, KEY_ALGORITHM); cipher.init(Cipher.DECRYPT_MODE, keySpec, new IvParameterSpec(new byte[16])); return new String(cipher.doFinal(Base64.decodeBase64(message)), CHARSET); } catch (Exception e) { throw new KsMerchantApiException("decode message fail", e); } }
于是经过比克日志各种尝试之后得出正确解密方式 ,从此学会看Java写PHP 走向人生癫峰。。
/** * @Author xiadmin * @DateTime 2020-12-04T16:30:50+0800 * @param string $message加密数据 * @param string $privateKey消息密钥 */ function decode($message, $privateKey) { // base64 反编码数据 $message = base64_decode($message); // base64 反编码密钥 $key = base64_decode($privateKey); // Iv向量我根据demo代码猜应该是反编码密钥后的前16位。 一开始猜的解密方式是 aes-256-cbc 需要向量 // 实际上加密方式是 AES-128-CBC,是不需要向量的 // $iv = substr($key, 0, 16); // 只知道Java的加密是 采用AES加密。我PHP对应 aes-256-cbc? 不知道对不对 $result = openssl_decrypt($message, 'AES-128-CBC', $key, OPENSSL_RAW_DATA); return $result; }
上面是尝试的过程,不需要的话可以直接使用下面这个
/** * @Author xiadmin * @DateTime 2020-12-04T16:30:50+0800 * @param string $data 加密数据 * @param string $key 消息密钥 */ public function aes_decrypt($data, $key){ return openssl_decrypt(base64_decode($data), 'AES-128-CBC', base64_decode($key), OPENSSL_RAW_DATA); }