微信回调数据处理 (xml --> map)

本文介绍了一种使用Java正则表达式将XML格式的微信支付回调数据转换为JSON的方法。作者详细展示了如何去除不必要的标签,并通过懒惰匹配模式精确提取所需字段。

由于工作上需要对接微信的支付接口,不过我对接的是华阳的接口,大部分都是以json数据传输的了(华阳中间对xml文件进行了转换)


但是支付之后回调的通知华阳并没有处理,我接收到的数据还是xml文件格式的,现在做java的大部分都是以json为主,说真的,个人很反感xml文件格式的数据传输


不过要做回调,也没办法,只能想办法去转换,获取数据,网上有很多关于xml文件转换的工具类,不过我不想使用,我想用jdk自带的API来完成这个转换。自然


而然的我们就会想到正则表达式,这家伙在把数据格式化处理起了很大的作用,学程序的应该都知道这个东西,好了,开始我要做的工作


原始的数据是


<xml><appid><![CDATA[wx2421b1c4370ec43b]]></appid><attach><![CDATA[支付测试]]></attach><bank_type><![CDATA[CFT]]></bank_type><fee_type><![CDATA[CNY]]></fee_type></xml>


第一步是先去掉  前后的 xml 标签,因为不需要用到, 正则表达式是    </?xml>       ? 问号有两个功能,  1,是表示前面的字符串出现0或1次    2是开启懒惰匹配模式

在这里即表示匹配  </xml> 其中 / 字符有或没有都会匹配得到


<appid><![CDATA[wx2421b1c4370ec43b]]></appid><attach><![CDATA[支付测试]]></attach><bank_type><![CDATA[CFT]]></bank_type><fee_type><![CDATA[CNY]]></fee_type>


剩下的就以代码给出来吧,写太多文件估计也没人爱看


package com.project.test;

import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test7 {

	public static void main(String[] args) {
		
		String xmlString = "<xml>"
				         + "<appid><![CDATA[wx2421b1c4370ec43b]]></appid>"
				         + "<attach><![CDATA[支付测试]]></attach>"
				         + "<bank_type><![CDATA[CFT]]></bank_type>"
				         + "<fee_type><![CDATA[CNY]]></fee_type>"
				         + "<total_fee>1</total_fee>"
				         + "</xml>";
		//去掉前后的xml标签
		xmlString = xmlString.replaceAll("</?xml>", "");
		System.out.println(xmlString);
		//匹配一段一段这样的数据   <attach><![CDATA[支付测试]]></attach>
		Pattern pattern = Pattern.compile("<.*?/.*?>");
		Matcher matcher = pattern.matcher(xmlString);
		//配置是否包含<![CDATA[CNY]]> CDATA 包裹的数据
		Pattern pattern2 = Pattern.compile("!.*]");
		Map<String, String> map = new HashMap<>();
		while(matcher.find()) {
			//获取键
			String key = matcher.group().replaceAll(".*/", "");
			key = key.substring(0, key.length() - 1);
			Matcher matcher2 = pattern2.matcher(matcher.group());
			String value = matcher.group().replaceAll("</?.*?>", "");
			//获取值
			if(matcher2.find() && !value.equals("DATA")) {
				value = matcher2.group().replaceAll("!.*\\[", "");
				value = value.substring(0, value.length() - 2);
			} 
			map.put(key, value);
		}
		System.out.println(map);
	}
}



主要就是要了解正则表达式的懒惰匹配模式用法,


   ? 问号有两个功能,  1,是表示前面的字符串出现0或1次    2是开启懒惰匹配模式

  
举个例子吧,比如现在有字符串   <zxc><ldh><hzh>

如果正则写成    <.*>   那就只会匹配到一个符合要求的,因为正则默认是开启贪婪模式的,有多少就匹配多少

如果你写成     <.*?>    会匹配到3个符合条件的    这里的 ? 就是开启了懒惰模式(对?后面的字符进行最短距离匹配)

大概就是这样,具体的百度一下

在使用 `weixin-java-pay` 4.7.0 版本处理微信支付回调时,开发者需要实现一个用于接收微信支付异步回调的接口,并通过 SDK 提供的工具类对回调数据进行验证和解析。 ### 微信支付回调处理的基本流程如下: 1. **配置回调接口 URL** 在微信商户平台中配置支付回调通知地址(Notify URL),该地址用于接收微信服务器发送的支付结果通知。 2. **接收微信回调请求** 微信服务器会通过 POST 请求将支付结果以 XML 格式发送到配置的回调地址。开发者需要在后端创建一个接口来接收并处理该请求。 3. **验证签名并解析回调数据** 使用 `WxPayService` 的 `notifyOfWxpay` 方法来处理回调请求,该方法内部会自动验证签名并解析支付结果。 4. **处理业务逻辑** 在确认支付成功后,开发者需要更新订单状态、发放商品、记录日志等操作。 ### 示例代码 以下是一个基于 Spring Boot 框架的示例代码: ```java @RestController @RequestMapping("/wxpay") public class WxPayNotifyController { @Autowired private WxPayService wxPayService; @PostMapping("/notify") public String handleWxPayNotify(@RequestBody Map<String, String> notifyData) { try { // 验证签名并解析支付结果 WxPayOrderNotifyResult notifyResult = wxPayService.notifyOfWxpay(notifyData); // 获取商户订单号 String outTradeNo = notifyResult.getOutTradeNo(); // 获取微信交易单号 String transactionId = notifyResult.getTransactionId(); // 获取交易状态 String tradeState = notifyResult.getTradeState(); if ("SUCCESS".equals(tradeState)) { // 支付成功,处理订单逻辑 // 例如更新订单状态为已支付 // updateOrderStatus(outTradeNo, "paid"); } else { // 其他状态,如支付失败、已关闭等 // 可记录日志或进行其他处理 } // 返回给微信服务器的成功响应 return "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>"; } catch (WxPayException e) { // 处理异常情况 e.printStackTrace(); // 返回错误响应 return "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[ERROR]]></return_msg></xml>"; } } } ``` ### 关键点说明 - `WxPayOrderNotifyResult` 是 SDK 提供的支付回调结果封装类,包含订单号、交易状态等信息。 - `notifyOfWxpay` 方法会对微信回调数据进行签名验证,确保请求来自微信服务器[^1]。 - 在支付成功后,开发者应根据业务需求更新订单状态、发放商品或服务。 - 回调接口必须返回特定格式的 XML 响应,否则微信服务器会认为通知失败并进行重试。 ### 异常处理 - 如果签名验证失败或数据解析失败,`notifyOfWxpay` 方法会抛出 `WxPayException`,开发者需要捕获该异常并记录日志以便排查问题。 - 建议将回调处理逻辑与业务逻辑解耦,避免因业务处理异常导致微信回调失败。 ### 安全建议 - 回调接口应设置为仅接受 POST 请求,防止被恶意访问。 - 建议对请求来源进行 IP 白名单限制,确保请求来自微信服务器。 - 对于重要的业务逻辑(如订单状态更新),应使用事务机制保证数据一致性。 ### 注意事项 - 微信支付回调通知可能会有重试机制,开发者需要确保接口幂等性,避免重复处理同一笔订单。 - 回调接口应尽量快速响应,避免因超时导致微信服务器重试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值