当前位置:   article > 正文

微信退款回调信息解密笔记_微信v3退款回调中怎么解密 .net

微信v3退款回调中怎么解密 .net

微信退款回调信息解密过程记录,方便自己查看

解密步骤: 

(1)对加密串A做base64解码,得到加密串B

(2)对商户key做md5,得到32位小写key* ( key设置路径:微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->密钥设置 )

(3)用key*对加密串B做AES-256-ECB解密(PKCS7Padding)

 

  1. import java.util.Base64;
  2. public class Base64Util {
  3. /**
  4. * 解码
  5. * @param encodedText
  6. * @return
  7. */
  8. public static byte[] decode(String encodedText){
  9. final Base64.Decoder decoder = Base64.getDecoder();
  10. return decoder.decode(encodedText);
  11. }
  12. /**
  13. * 编码
  14. * @param data
  15. * @return
  16. */
  17. public static String encode(byte[] data){
  18. final Base64.Encoder encoder = Base64.getEncoder();
  19. return encoder.encodeToString(data);
  20. }
  21. }
  1. import javax.crypto.Cipher;
  2. import javax.crypto.spec.SecretKeySpec;
  3. public class AESUtil {
  4. /**
  5. * 密钥算法
  6. */
  7. private static final String ALGORITHM = "AES";
  8. /**
  9. * 加解密算法/工作模式/填充方式
  10. */
  11. private static final String ALGORITHM_MODE_PADDING = "AES/ECB/PKCS5Padding";
  12. /**
  13. * AES加密
  14. *
  15. * @param data
  16. * @return
  17. * @throws Exception
  18. */
  19. public static String encryptData(String data,String password) throws Exception {
  20. // 创建密码器
  21. Cipher cipher = Cipher.getInstance(ALGORITHM_MODE_PADDING);
  22. SecretKeySpec key = new SecretKeySpec(MD5.MD5Encode(password).toLowerCase().getBytes(), ALGORITHM);
  23. // 初始化
  24. cipher.init(Cipher.ENCRYPT_MODE, key);
  25. return Base64Util.encode(cipher.doFinal(data.getBytes()));
  26. }
  27. /**
  28. * AES解密
  29. *
  30. * @param base64Data
  31. * @return
  32. * @throws Exception
  33. */
  34. public static String decryptData(String base64Data,String password) throws Exception {
  35. Cipher cipher = Cipher.getInstance(ALGORITHM_MODE_PADDING);
  36. SecretKeySpec key = new SecretKeySpec(MD5.MD5Encode(password).toLowerCase().getBytes(), ALGORITHM);
  37. cipher.init(Cipher.DECRYPT_MODE, key);
  38. byte[] decode = Base64Util.decode(base64Data);
  39. byte[] doFinal = cipher.doFinal(decode);
  40. return new String(doFinal,"utf-8");
  41. }
  42. }

 

  1. /**
  2. * InputStream流转换成String字符串
  3. * @param inStream InputStream流
  4. * @param encoding 编码格式
  5. * @return String字符串
  6. */
  7. public static String inputStreamToString(InputStream inStream, String encoding){
  8. String result = null;
  9. try {
  10. if(inStream != null){
  11. ByteArrayOutputStream outStream = new ByteArrayOutputStream();
  12. byte[] tempBytes = new byte[1024];
  13. int count = -1;
  14. while((count = inStream.read(tempBytes, 0, 1024)) != -1){
  15. outStream.write(tempBytes, 0, count);
  16. }
  17. tempBytes = null;
  18. outStream.flush();
  19. result = new String(outStream.toByteArray(), encoding);
  20. }
  21. } catch (Exception e) {
  22. result = null;
  23. }
  24. return result;
  25. }
  26. /**
  27. * xml转换成map
  28. * @param xml
  29. * @return
  30. */
  31. public static Map<String, String> readStringXmlOut(String xml) {
  32. Map<String, String> map = new HashMap<String, String>();
  33. Document doc = null;
  34. try {
  35. doc = DocumentHelper.parseText(xml); // 将字符串转为XML
  36. Element rootElt = doc.getRootElement(); // 获取根节点
  37. List<Element> list = rootElt.elements();// 获取根节点下所有节点
  38. for (Element element : list) { // 遍历节点
  39. map.put(element.getName(), element.getText()); // 节点的name为map的key,text为map的value
  40. }
  41. } catch (DocumentException e) {
  42. e.printStackTrace();
  43. } catch (Exception e) {
  44. e.printStackTrace();
  45. }
  46. return map;
  47. }

测试方法

打印结果:

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/232449
推荐阅读