拿到报文 对req_info 用商户秘钥进行解密

package com.ly.upg.message.util;

import com.alibaba.fastjson.JSONObject;

import com.snake.bsys.common.log.Log;

import com.tencent.common.MD5;

import com.tencent.common.XMLParser;

import org.bouncycastle.jce.provider.BouncyCastleProvider;

import javax.crypto.BadPaddingException;

import javax.crypto.Cipher;

import javax.crypto.IllegalBlockSizeException;

import javax.crypto.NoSuchPaddingException;

import javax.crypto.spec.SecretKeySpec;

import java.security.InvalidKeyException;

import java.security.NoSuchAlgorithmException;

import java.security.NoSuchProviderException;

import java.security.Security;

import java.util.Base64;

import java.util.HashMap;

import java.util.Map;

/**

* @Title:

* @Description:微信退款报文解密

* @Created by yangjie on 2020/1/4/15:18.

*/

public class WxDecryptUtil {

public static Map excute(String keyStr,String orgStr) throws BadPaddingException, IllegalBlockSizeException {

//MD5.MD5Encode(secretKey).toLowerCase().getBytes()

SecretKeySpec key = new SecretKeySpec((MD5.MD5Encode(keyStr).toLowerCase().getBytes()), "AES");

Security.addProvider(new BouncyCastleProvider());

Cipher cipher = null;

try {

cipher = Cipher.getInstance("AES/ECB/PKCS7Padding", "BC");

} catch (NoSuchAlgorithmException e) {

e.printStackTrace();

} catch (NoSuchProviderException e) {

e.printStackTrace();

} catch (NoSuchPaddingException e) {

e.printStackTrace();

}

try {

cipher.init(Cipher.DECRYPT_MODE, key);

} catch (InvalidKeyException e) {

e.printStackTrace();

}

Base64.Decoder decoder = Base64.getDecoder();

String reqInfo = orgStr.replaceAll(" ","+");

byte[] decryptContent = cipher.doFinal(decode(reqInfo));

try {

Map map = new HashMap();

map = XMLParser.getMapFromXML(new String(decryptContent, "utf-8"));

Log.logger.info("微信解密后的报文-->"+ JSONObject.toJSONString(map));

return map;

} catch (Exception e) {

e.printStackTrace();

}

return null;

}

public static byte[] decode(String encodedText){

final Base64.Decoder decoder = Base64.getDecoder();

return decoder.decode(encodedText);

}

public static void main(String[] args) {

try {

// req_info

String org = "Nr2R4wa3OQpKFFV3EmMB463MPGliaPI78OKgLy61tSwbDwE2SCPgUYG9yls54PSOMmgPdCUia2BYKAnzFdNmQdyWDNIN4XO9mHNcFw/ubwVyeBqzs1CVvqPZEhV4hEfgGrK81x58YsvewULHS0JAkZgtGXDFgduaaV179Wny7YiogFk0i/hromZgGyG1+emNJxJhzo7KkEqSSztRMTOJp+28RyV4iEIWD1WvKJkiKx4/yNOXVsRTaKXEeKnlMj5v01lVdsxUa1HziW5PT6l7wp0bfOVU3mc2+aYf7dgqT9NWEZ56bU92+27l/GKa3fFTDvjFNNqDcGP66AmfAToL8D09peXCj8t2J9Af7+5mngRqGVzNM/FBOnK6th3nmDZFp9Acoy4wxskDloLUB4KBZjtnZYyEAq9Bex7AZMwsW10uLy8TXLwUh9j0WGXORKytne2gbnHEHfbGp/6xmp1EOZKHRJPAW198cYrzEy8WqTVjv3fqWqnw2rrcDwFp57PLk4e1QPec4rRwloP71p4oS8q6Hj3ZLYENRI74iofhUhZRryPtcQNeaXDBWC0Q2VWW/va6BpaKA1f0eOG5ITcoaoqaECFTz10B9vyX5MbVIjjSRmiQV2bY3d4c2y794Bh3VxZkLrEJ3pjbb9Jc8abwfDD9gjxlGW/gj9AbnKpjuoeGsj/RJqzspmNmwQxnxkQ7MEejbX0xgc0y4mq6EuFxJcqkEcFxNwrjheIqTNkGbIk8vjeimbKIh820GKmKmF4HNYV0z6h3dCF/7Jp9HhnxpvQdIwDpUzeQe8QXI0+I3yO36hdXeo3qH/bUtbQO/nN20HwbDvVanMIvA5Gp1RcRngY2uFx38CReqmIhbn5j4L+SwtmQ6B0LXqlAb/HQPeXd891Bq6vf8GwdQGygZOIETzddfblhCPBvNe0a7oaWY7ygXNM+HQw/9T1tEfesrBy2JL4BPhAjqlTUDZfldLd3Mf0MhMJNaEWXI+iUFRsXbRlIHuURglFzrZWvl/UzPGZk/nhpp5p4yX/HF9z0iObanrxLIJRAdPB1qAReLoC7BztScICQ8vF5euSk3cczPeU8";

// 商户秘钥

String key = "HqPzKWBaZyhvClKXiqUO2uR5kzg84Pyb";

Map test = excute(key,org);

} catch (BadPaddingException e) {

e.printStackTrace();

} catch (IllegalBlockSizeException e) {

e.printStackTrace();

}

}

}

package com.ly.upg.message.util;

import com.alibaba.fastjson.JSONObject;

import com.snake.bsys.common.log.Log;

import com.tencent.common.MD5;

import com.tencent.common.XMLParser;

import org.bouncycastle.jce.provider.BouncyCastleProvider;

import org.xml.sax.SAXException;

import javax.crypto.Cipher;

import javax.crypto.spec.SecretKeySpec;

import javax.xml.parsers.ParserConfigurationException;

import java.io.IOException;

import java.security.Security;

import java.util.Base64;

import java.util.HashMap;

import java.util.Map;

/**

* @Title:

* @Description:

* @Created by yangjie on 2020/1/3/18:46.

*/

public class CipherTextUtil {

/**

* 密钥算法

*/

private static final String ALGORITHM = "AES";

/**

* 加解密算法/工作模式/填充方式

*/

private static final String ALGORITHM_MODE_PADDING = "AES/ECB/PKCS7Padding";

static {

try {

Security.addProvider(new BouncyCastleProvider());

} catch (Exception e) {

e.printStackTrace();

}

}

/**

* AES解密

*/

public static String decryptData(byte[] b,SecretKeySpec key) throws Exception {

Cipher cipher = Cipher.getInstance(ALGORITHM_MODE_PADDING);

cipher.init(Cipher.DECRYPT_MODE, key);

return new String(cipher.doFinal(b));

}

public static Map decrypt(String secretKey, String orgStr) throws IOException, SAXException, ParserConfigurationException {

SecretKeySpec key = new SecretKeySpec(MD5.MD5Encode(secretKey).toLowerCase().getBytes(), ALGORITHM);

Log.logger.info("微信退款解密原始字符串-->"+orgStr);

Log.logger.info("微信退款解密key-->"+secretKey);

byte[] b = new byte[0];

try {

b = Base64Util.decode(orgStr.replaceAll(" ","+"));

if(b == null|| b.length == 0){

Log.logger.error("微信解密原始字符串-解码失败decode.");

return null;

}

}catch (Exception e){

Log.logger.error("微信解密原始字符串-解码异常decode.");

}

String B = null;

try {

Log.logger.info("微信退款报文解密AES解密开始:解码b="+JSONObject.toJSONString(b)+",秘钥key="+key.toString());

Log.logger.info("微信退款报文解密AES解密开始:解码b="+b.length);

B = decryptData(b,key);

} catch (Exception e) {

Log.logger.error("微信退款报文解密AES解密失败"+e.getMessage());

e.printStackTrace();

return null;

}

Map map = new HashMap();

map = XMLParser.getMapFromXML(B);

Log.logger.info("微信解密后的报文-->"+JSONObject.toJSONString(map));

return map;

}

public static byte[] decode(String encodedText){

final Base64.Decoder decoder = Base64.getDecoder();

return decoder.decode(encodedText);

}

public static void main(String[] args) throws Exception {

String A = "Nr2R4wa3OQpKFFV3EmMB463MPGliaPI78OKgLy61tSwbDwE2SCPgUYG9yls54PSOMmgPdCUia2BYKAnzFdNmQdyWDNIN4XO9mHNcFw/ubwVyeBqzs1CVvqPZEhV4hEfgGrK81x58YsvewULHS0JAkZgtGXDFgduaaV179Wny7YiogFk0i/hromZgGyG1+emNJxJhzo7KkEqSSztRMTOJp+28RyV4iEIWD1WvKJkiKx4/yNOXVsRTaKXEeKnlMj5v01lVdsxUa1HziW5PT6l7wp0bfOVU3mc2+aYf7dgqT9NWEZ56bU92+27l/GKa3fFTDvjFNNqDcGP66AmfAToL8D09peXCj8t2J9Af7+5mngRqGVzNM/FBOnK6th3nmDZFp9Acoy4wxskDloLUB4KBZjtnZYyEAq9Bex7AZMwsW10uLy8TXLwUh9j0WGXORKytne2gbnHEHfbGp/6xmp1EOZKHRJPAW198cYrzEy8WqTVjv3fqWqnw2rrcDwFp57PLk4e1QPec4rRwloP71p4oS8q6Hj3ZLYENRI74iofhUhZRryPtcQNeaXDBWC0Q2VWW/va6BpaKA1f0eOG5ITcoaoqaECFTz10B9vyX5MbVIjjSRmiQV2bY3d4c2y794Bh3VxZkLrEJ3pjbb9Jc8abwfDD9gjxlGW/gj9AbnKpjuoeGsj/RJqzspmNmwQxnxkQ7MEejbX0xgc0y4mq6EuFxJcqkEcFxNwrjheIqTNkGbIk8vjeimbKIh820GKmKmF4HNYV0z6h3dCF/7Jp9HhnxpvQdIwDpUzeQe8QXI0+I3yO36hdXeo3qH/bUtbQO/nN20HwbDvVanMIvA5Gp1RcRngY2uFx38CReqmIhbn5j4L+SwtmQ6B0LXqlAb/HQPeXd891Bq6vf8GwdQGygZOIETzddfblhCPBvNe0a7oaWY7ygXNM+HQw/9T1tEfesrBy2JL4BPhAjqlTUDZfldLd3Mf0MhMJNaEWXI+iUFRsXbRlIHuURglFzrZWvl/UzPGZk/nhpp5p4yX/HF9z0iObanrxLIJRAdPB1qAReLoC7BztScICQ8vF5euSk3cczPeU8";

byte[] b = Base64Util.decode(A.replaceAll(" ","+"));

Map map = decrypt("HqPzKWBaZyhvClKXiqUO2uR5kzg84Pyb", A);

System.out.println(JSONObject.toJSONString(map));

}

}

很诡异的问题是在服务器 总是报 pad block corrupted 错误 至今未解决 难搞哦

来源:oschina

链接:https://my.oschina.net/u/3690153/blog/3154109

java微信退款解密,微信退款-异步通知 报文解密相关推荐

  1. 微信开发 ━━ 微信商户v3微信支付回调之php篇

    开发内容都在这里: 微信支付API v3 证书和回调报文解密 在微信支付时提供一个回调地址,支付完成后微信会向这个回调地址发送一个json格式的报文,将报文内容解密后获取订单号等数据 报文内容: {& ...

  2. java微信支付异步通知_Java中微信支付退款异步通知解码

    微信所有的支付结果都是加密处理的,他和订单支付成功的异步通知不一样. 他的基本返回是: SUCCESS 我们需要对req_info解码才能看到退款的明文 解码后会得到明文: 解密步骤如下: (1)对加 ...

  3. 微信退款异步通知获得的req_infoAES加密和解密方法以及常见的问题

    在接触到微信退款时了解到AES解密 微信退款异步通知接口地址 https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=9_16&index= ...

  4. java 微信申请退款,退款回调通知,解密,V2版

    下载微信官方提供的SDK,转 https://blog.csdn.net/qq_40506288/article/details/110918650 博客查看下载流程 微信退款说明,官方提供:http ...

  5. 微信退款通知req_info解密java_2018.05.24 解密微信退款结果通知中的加密信息req_info...

    在微信返回的退款结果通知中,包含了一个加密信息字段req_info 微信支付文档中有提及到如何解密: 现在我们就一步一步解密得到返回的字段信息: 前提工作: 1.添加maven依赖 org.bounc ...

  6. 解密微信退款结果通知中的加密信息req_info遇到的坑

    在微信返回的退款结果通知中,包含了一个加密信息字段req_info 微信支付文档中有提及到如何解密: 前提工作: 1.添加maven依赖 <dependency> <groupId& ...

  7. Java支付宝二维码支付和退款,微信二维码支付

    在蚂蚁金服开发平台下载demo 打开 TradePayDemo 项目,里面的main可以直接运行,在配置文件zfbinfo.properties中改为自己支付宝的信息 # 支付宝网关名.partner ...

  8. Java微信APP支付-申请退款

    前面已经讲过微信APP支付的统一下单.支付结果通知的接口开发,现在我们讲述一下申请退款的流程开发. 官方的API地址:https://pay.weixin.qq.com/wiki/doc/api/ap ...

  9. nodejs开发微信支付之接收退款申请通知

    nodejs开发微信支付之退款结果通知url 前言 步骤 1.先对加密串A进行base64解密 2.对商户key做md5,得到32位小写key 3.用key*对加密串B做AES-256-ECB解密 前 ...

最新文章

  1. [训练日志] 7月22-31日
  2. 设计模式一:设计模式遵循的原则
  3. linux runable进程查询,关于Linux下进程的详解【进程查看与管理】
  4. CV:计算机视觉技术之图像基础知识—以python的cv2库来了解计算机视觉图像基础
  5. 使用ABAP SAT工具分析SAP OData service实现明细
  6. linux-buff/cache过大导致内存不足-程序异常
  7. 密码学专题 相关概念的解析 对称算法|算法的安全性|非对称算法存在的问题|单向散列函数|数字签名的弊端|密钥交换
  8. 70 个常见 Spring 面试题,Java 晋升必会
  9. 双屏鼠标经常跑到副屏_这个电脑的双屏幕,让我重新找回了修图的乐趣
  10. Java Reflect
  11. python学习中包的生成和调用(idle和pycharm)
  12. Apache Dril l和 Prestodb是合并多租数据源户统一查询
  13. 计算机基础.办公自动化期末试卷复习必看
  14. python:使用requests,bs4爬取mmjpg上的图片
  15. SimHei字体(永久有效)
  16. html5 几何酷站,10个值得学习的HTML5+CSS3视觉特效酷站欣赏
  17. 理论+实验:Apache网页与安全优化(网页压缩、网页缓存、隐藏版本信息、网页图片防盗链)
  18. 东方财富代码选股_教你选股!一招搞定!
  19. LeetCode-Python-275. H指数 II
  20. POJ 1463 入门树dp Strategic game

热门文章

  1. information_schema.partitions mysql
  2. 618真香数码产品有哪些、618数码精品清单
  3. MVC简介(MVC是什么)
  4. python asyncio.sleep_Python asyncio 模块
  5. Springboot商品限时秒杀系统
  6. 介绍一个可以离线查询 IP 来源和 ISP 信息的终端利器
  7. 三菱PLC FX3U源码,原理图,PCB全套资料
  8. 智能手机也能编程?程序员的福音或是噩梦?
  9. Android(ButterKnife)黄油刀使用详解
  10. 两个Beta函数类型的积分及其一般形式