Spring Boot 接收微信支付通知参数

微信支付通知参数

首先明确微信支付通知参数是xml格式,示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<xml>
<openid><![CDATA[sandboxopenid]]></openid>
<trade_type><![CDATA[NATIVE]]></trade_type>
<coupon_fee><![CDATA[3]]></coupon_fee>
<cash_fee_type><![CDATA[CNY]]></cash_fee_type>
<nonce_str><![CDATA[20200110152332175]]></nonce_str>
<time_end><![CDATA[20200110152337]]></time_end>
<err_code_des><![CDATA[SUCCESS]]></err_code_des>
<return_code><![CDATA[SUCCESS]]></return_code>
<mch_id><![CDATA[128875980]]></mch_id>
<settlement_total_fee><![CDATA[100]]></settlement_total_fee>
<sign><![CDATA[2767F6B8A2D87850572D66C5737377E5]]></sign>
<cash_fee><![CDATA[99]]></cash_fee>
<coupon_id_1><![CDATA[67890]]></coupon_id_1>
<coupon_type_0><![CDATA[CASH]]></coupon_type_0>
<coupon_id_0><![CDATA[123456]]></coupon_id_0>
<coupon_fee_0><![CDATA[1]]></coupon_fee_0>
<coupon_fee_1><![CDATA[2]]></coupon_fee_1>
<is_subscribe><![CDATA[Y]]></is_subscribe>
<return_msg><![CDATA[OK]]></return_msg>
<fee_type><![CDATA[CNY]]></fee_type>
<bank_type><![CDATA[CMC]]></bank_type>
<attach><![CDATA[pay-test]]></attach>
<device_info><![CDATA[sandbox]]></device_info>
<out_trade_no><![CDATA[wx20200110152332175]]></out_trade_no>
<coupon_type_1><![CDATA[NO_CASH]]></coupon_type_1>
<result_code><![CDATA[SUCCESS]]></result_code>
<total_fee><![CDATA[102]]></total_fee>
<appid><![CDATA[wx28f9d88adc6a2f8c]]></appid>
<coupon_count><![CDATA[2]]></coupon_count>
<transaction_id><![CDATA[8911232246620200110152337851054]]></transaction_id>
<err_code><![CDATA[SUCCESS]]></err_code>
</xml>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<xml>
<openid><![CDATA[oaJiE1PwlwP_Tee0Z7uzrQFJeRqE]]></openid>
<trade_type><![CDATA[JSAPI]]></trade_type>
<cash_fee_type><![CDATA[CNY]]></cash_fee_type>
<nonce_str><![CDATA[20200116115914930]]></nonce_str>
<time_end><![CDATA[20200116115919]]></time_end>
<err_code_des><![CDATA[SUCCESS]]></err_code_des>
<return_code><![CDATA[SUCCESS]]></return_code>
<mch_id><![CDATA[128875980]]></mch_id>
<settlement_total_fee><![CDATA[101]]></settlement_total_fee>
<sign><![CDATA[B54319B2A47D9DC27F298DEC5A8B386A]]></sign>
<cash_fee><![CDATA[101]]></cash_fee>
<is_subscribe><![CDATA[Y]]></is_subscribe>
<return_msg><![CDATA[OK]]></return_msg>
<fee_type><![CDATA[CNY]]></fee_type>
<bank_type><![CDATA[CMC]]></bank_type>
<attach><![CDATA[pay-test]]></attach>
<device_info><![CDATA[sandbox]]></device_info>
<out_trade_no><![CDATA[wx20200116115914930]]></out_trade_no>
<result_code><![CDATA[SUCCESS]]></result_code>
<total_fee><![CDATA[101]]></total_fee>
<appid><![CDATA[wx28f9d88adc6a2f8c]]></appid>
<transaction_id><![CDATA[8766393522120200116115919172596]]></transaction_id>
<err_code><![CDATA[SUCCESS]]></err_code>
</xml>

依赖

1
2
3
4
5
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>2.9.7</version>
</dependency>

配置XML转换器

1
2
3
4
5
6
7
8
9
10
@Configuration
public class MessageConverterConfig extends WebMvcConfigurationSupport {

@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
Jackson2ObjectMapperBuilder builder = Jackson2ObjectMapperBuilder.xml();
builder.indentOutput(true);
converters.add(new MappingJackson2XmlHttpMessageConverter(builder.build()));
}
}

参数模型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
/**
* @author yezhou
* @version 1.0
* @date 2020/9/8 9:32
* @home http://www.appblog.cn
*/
@Data
@JacksonXmlRootElement(localName = "xml")
public class WechatPayNotifyDto {

@JacksonXmlProperty(localName = "mch_id")
private String mchId;

@JacksonXmlProperty(localName = "appid")
private String appid;

@JacksonXmlProperty(localName = "openid")
private String openid;

@JacksonXmlProperty(localName = "is_subscribe")
private String isSubscribe;

@JacksonXmlProperty(localName = "trade_type")
private String tradeType;

@JacksonXmlProperty(localName = "out_trade_no")
private String outTradeNo;

@JacksonXmlProperty(localName = "transaction_id")
private String transactionId;

@JacksonXmlProperty(localName = "fee_type")
private String feeType;

@JacksonXmlProperty(localName = "total_fee")
private String totalFee;

@JacksonXmlProperty(localName = "device_info")
private String deviceInfo;

@JacksonXmlProperty(localName = "time_end")
private String timeEnd;

@JacksonXmlProperty(localName = "return_code")
private String returnCode;

@JacksonXmlProperty(localName = "return_msg")
private String returnMsg;

@JacksonXmlProperty(localName = "result_code")
private String resultCode;

@JacksonXmlProperty(localName = "err_code")
private String errCode;

@JacksonXmlProperty(localName = "err_code_des")
private String errCodeDes;

@JacksonXmlProperty(localName = "cash_fee_type")
private String cashFeeType;

@JacksonXmlProperty(localName = "cash_fee")
private String cashFee;

@JacksonXmlProperty(localName = "settlement_total_fee")
private String settlementTotalFee;

@JacksonXmlProperty(localName = "nonce_str")
private String nonceStr;

@JacksonXmlProperty(localName = "sign")
private String sign;

@JacksonXmlProperty(localName = "bank_type")
private String bankType;

@JacksonXmlProperty(localName = "attach")
private String attach;
}

Controller层

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
* @author yezhou
* @version 1.0
* @date 2020/9/8 9:31
* @home http://www.appblog.cn
*/
@Slf4j
@RestController
@RequestMapping("/")
public class XmlAcceptController {

@RequestMapping(value = "/payNotify", method = RequestMethod.POST, consumes = MediaType.APPLICATION_XML_VALUE, produces = MediaType.APPLICATION_XML_VALUE)
@ResponseBody
public String payCallback(@RequestBody WechatPayNotifyDto notifyDto) {
log.info(JSON.toJSONString(notifyDto));
return "success";
}

}

运行结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
{
"appid":"wx28f9d88adc6a2f8c",
"attach":"pay-test",
"bankType":"CMC",
"cashFee":"101",
"cashFeeType":"CNY",
"deviceInfo":"sandbox",
"errCode":"SUCCESS",
"errCodeDes":"SUCCESS",
"feeType":"CNY",
"isSubscribe":"Y",
"mchId":"128875980",
"nonceStr":"20200116115914930",
"openid":"oaJiE1PwlwP_Tee0Z7uzrQFJeRqE",
"outTradeNo":"wx20200116115914930",
"resultCode":"SUCCESS",
"returnCode":"SUCCESS",
"returnMsg":"OK",
"settlementTotalFee":"101",
"sign":"B54319B2A47D9DC27F298DEC5A8B386A",
"timeEnd":"20200116115919",
"totalFee":"101",
"tradeType":"JSAPI",
"transactionId":"8766393522120200116115919172596"
}

Powered by AppBlog.CN     浙ICP备14037229号

Copyright © 2012 - 2021 APP开发技术博客 All Rights Reserved.

访客数 : | 访问量 :