java微信退款解密,微信退款-异步通知 报文解密
拿到报文 对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微信退款解密,微信退款-异步通知 报文解密相关推荐
- 微信开发 ━━ 微信商户v3微信支付回调之php篇
开发内容都在这里: 微信支付API v3 证书和回调报文解密 在微信支付时提供一个回调地址,支付完成后微信会向这个回调地址发送一个json格式的报文,将报文内容解密后获取订单号等数据 报文内容: {& ...
- java微信支付异步通知_Java中微信支付退款异步通知解码
微信所有的支付结果都是加密处理的,他和订单支付成功的异步通知不一样. 他的基本返回是: SUCCESS 我们需要对req_info解码才能看到退款的明文 解码后会得到明文: 解密步骤如下: (1)对加 ...
- 微信退款异步通知获得的req_infoAES加密和解密方法以及常见的问题
在接触到微信退款时了解到AES解密 微信退款异步通知接口地址 https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=9_16&index= ...
- java 微信申请退款,退款回调通知,解密,V2版
下载微信官方提供的SDK,转 https://blog.csdn.net/qq_40506288/article/details/110918650 博客查看下载流程 微信退款说明,官方提供:http ...
- 微信退款通知req_info解密java_2018.05.24 解密微信退款结果通知中的加密信息req_info...
在微信返回的退款结果通知中,包含了一个加密信息字段req_info 微信支付文档中有提及到如何解密: 现在我们就一步一步解密得到返回的字段信息: 前提工作: 1.添加maven依赖 org.bounc ...
- 解密微信退款结果通知中的加密信息req_info遇到的坑
在微信返回的退款结果通知中,包含了一个加密信息字段req_info 微信支付文档中有提及到如何解密: 前提工作: 1.添加maven依赖 <dependency> <groupId& ...
- Java支付宝二维码支付和退款,微信二维码支付
在蚂蚁金服开发平台下载demo 打开 TradePayDemo 项目,里面的main可以直接运行,在配置文件zfbinfo.properties中改为自己支付宝的信息 # 支付宝网关名.partner ...
- Java微信APP支付-申请退款
前面已经讲过微信APP支付的统一下单.支付结果通知的接口开发,现在我们讲述一下申请退款的流程开发. 官方的API地址:https://pay.weixin.qq.com/wiki/doc/api/ap ...
- nodejs开发微信支付之接收退款申请通知
nodejs开发微信支付之退款结果通知url 前言 步骤 1.先对加密串A进行base64解密 2.对商户key做md5,得到32位小写key 3.用key*对加密串B做AES-256-ECB解密 前 ...
最新文章
- [训练日志] 7月22-31日
- 设计模式一:设计模式遵循的原则
- linux runable进程查询,关于Linux下进程的详解【进程查看与管理】
- CV:计算机视觉技术之图像基础知识—以python的cv2库来了解计算机视觉图像基础
- 使用ABAP SAT工具分析SAP OData service实现明细
- linux-buff/cache过大导致内存不足-程序异常
- 密码学专题 相关概念的解析 对称算法|算法的安全性|非对称算法存在的问题|单向散列函数|数字签名的弊端|密钥交换
- 70 个常见 Spring 面试题,Java 晋升必会
- 双屏鼠标经常跑到副屏_这个电脑的双屏幕,让我重新找回了修图的乐趣
- Java Reflect
- python学习中包的生成和调用(idle和pycharm)
- Apache Dril l和 Prestodb是合并多租数据源户统一查询
- 计算机基础.办公自动化期末试卷复习必看
- python:使用requests,bs4爬取mmjpg上的图片
- SimHei字体(永久有效)
- html5 几何酷站,10个值得学习的HTML5+CSS3视觉特效酷站欣赏
- 理论+实验:Apache网页与安全优化(网页压缩、网页缓存、隐藏版本信息、网页图片防盗链)
- 东方财富代码选股_教你选股!一招搞定!
- LeetCode-Python-275. H指数 II
- POJ 1463 入门树dp Strategic game