Java微信验签实现流程
流程图
flowchart TD
A[开始] --> B[获取微信支付回调参数]
B --> C[验证签名]
C --> D{验签结果}
D --> |验证成功| E[执行业务逻辑]
D --> |验证失败| F[返回验签失败]
E --> G[返回验签成功]
F --> G
G --> H[结束]
1. 获取微信支付回调参数
在Java中,我们可以通过使用HttpServletRequest对象来获取微信支付回调时的参数。具体实现如下所示:
HttpServletRequest request = ...; // 获取HttpServletRequest对象
String transactionId = request.getParameter("transaction_id"); // 获取微信支付订单号
String outTradeNo = request.getParameter("out_trade_no"); // 获取商户订单号
String totalFee = request.getParameter("total_fee"); // 获取订单金额
// 其他参数根据实际情况获取
2. 验证签名
微信支付回调时会将相关参数以及签名一并发送过来,我们需要通过校验签名来确保数据的完整性和准确性。具体实现如下:
String sign = request.getParameter("sign"); // 获取微信支付回调的签名
// 根据微信支付回调参数构建待签名字符串
SortedMap<String, String> paramMap = new TreeMap<>();
paramMap.put("transaction_id", transactionId);
paramMap.put("out_trade_no", outTradeNo);
paramMap.put("total_fee", totalFee);
// 其他参数根据实际情况添加
String signStr = generateSign(paramMap); // 生成待签名字符串
boolean verifyResult = verifySign(signStr, sign); // 验证签名
/**
* 生成待签名字符串
* @param paramMap 微信支付回调参数
* @return 待签名字符串
*/
private String generateSign(SortedMap<String, String> paramMap) {
StringBuilder sb = new StringBuilder();
for (Map.Entry<String, String> entry : paramMap.entrySet()) {
sb.append(entry.getKey()).append("=").append(entry.getValue()).append("&");
}
sb.append("key=").append(商户密钥); // 商户密钥根据实际情况填写
return MD5Util.md5(sb.toString()).toUpperCase(); // 使用MD5加密,并转换为大写字符串
}
/**
* 验证签名
* @param signStr 待签名字符串
* @param sign 微信支付回调的签名
* @return 验签结果
*/
private boolean verifySign(String signStr, String sign) {
return sign.equals(signStr);
}
通过以上代码,我们可以获取到微信支付回调的参数,并且校验签名的正确性。
3. 验签结果处理
根据验签结果,我们可以执行相应的业务逻辑。如果验签成功,则可以继续处理订单逻辑;如果验签失败,则需要返回验签失败给微信支付。具体实现如下:
if (verifyResult) {
// 执行业务逻辑
// ...
// 返回验签成功给微信支付
return "SUCCESS";
} else {
// 返回验签失败给微信支付
return "FAIL";
}
4. 完整示例代码
以下是一个完整的Java微信验签实现示例代码:
public class WeChatPayCallbackController {
@PostMapping("/callback")
public String callback(HttpServletRequest request) {
String transactionId = request.getParameter("transaction_id");
String outTradeNo = request.getParameter("out_trade_no");
String totalFee = request.getParameter("total_fee");
// 其他参数根据实际情况获取
String sign = request.getParameter("sign");
// 根据微信支付回调参数构建待签名字符串
SortedMap<String, String> paramMap = new TreeMap<>();
paramMap.put("transaction_id", transactionId);
paramMap.put("out_trade_no", outTradeNo);
paramMap.put("total_fee", totalFee);
// 其他参数根据实际情况添加
String signStr = generateSign(paramMap);
boolean verifyResult = verifySign(signStr, sign);
if (verifyResult) {
// 执行业务逻辑
// ...
// 返回验签成功给微信支付
return "SUCCESS";
} else {
// 返回验签失败给微信支付
return "FAIL";
}
}
/**
* 生成待签名字符串
* @param paramMap 微信支付回调参数
* @return 待签名字符串