Skip to content

Commit 108b00b

Browse files
authored
🎨 #3896 【小程序】添加虚拟支付退款推送(xpay_refund_notify)事件相关的字段
1 parent b42d6be commit 108b00b

File tree

4 files changed

+244
-30
lines changed

4 files changed

+244
-30
lines changed

weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaMessage.java

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package cn.binarywang.wx.miniapp.bean;
22

3+
import cn.binarywang.wx.miniapp.bean.xpay.WxMaXPayTeamInfo;
34
import cn.binarywang.wx.miniapp.config.WxMaConfig;
45
import cn.binarywang.wx.miniapp.util.crypt.WxMaCryptUtils;
56
import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder;
@@ -313,6 +314,110 @@ public class WxMaMessage implements Serializable {
313314
@XStreamAlias("settlement_time")
314315
private Long settlementTime;
315316

317+
// xpay_refund_notify 退款推送字段
318+
319+
/**
320+
* 微信退款单号.
321+
* xpay_refund_notify
322+
*/
323+
@SerializedName("WxRefundId")
324+
@XStreamAlias("WxRefundId")
325+
@XStreamConverter(value = XStreamCDataConverter.class)
326+
private String wxRefundId;
327+
328+
/**
329+
* 商户退款单号.
330+
* xpay_refund_notify
331+
*/
332+
@SerializedName("MchRefundId")
333+
@XStreamAlias("MchRefundId")
334+
@XStreamConverter(value = XStreamCDataConverter.class)
335+
private String mchRefundId;
336+
337+
/**
338+
* 退款单对应支付单的微信单号.
339+
* xpay_refund_notify
340+
*/
341+
@SerializedName("WxOrderId")
342+
@XStreamAlias("WxOrderId")
343+
@XStreamConverter(value = XStreamCDataConverter.class)
344+
private String wxOrderId;
345+
346+
/**
347+
* 退款单对应支付单的商户单号.
348+
* xpay_refund_notify
349+
*/
350+
@SerializedName("MchOrderId")
351+
@XStreamAlias("MchOrderId")
352+
@XStreamConverter(value = XStreamCDataConverter.class)
353+
private String mchOrderId;
354+
355+
/**
356+
* 退款金额,单位分.
357+
* xpay_refund_notify
358+
*/
359+
@SerializedName("RefundFee")
360+
@XStreamAlias("RefundFee")
361+
private Integer refundFee;
362+
363+
/**
364+
* 退款结果,0为成功,非0为失败.
365+
* xpay_refund_notify
366+
*/
367+
@SerializedName("RetCode")
368+
@XStreamAlias("RetCode")
369+
private Integer retCode;
370+
371+
/**
372+
* 退款结果详情,失败时为退款失败的原因.
373+
* xpay_refund_notify
374+
*/
375+
@SerializedName("RetMsg")
376+
@XStreamAlias("RetMsg")
377+
@XStreamConverter(value = XStreamCDataConverter.class)
378+
private String retMsg;
379+
380+
/**
381+
* 开始退款时间,秒级时间戳.
382+
* xpay_refund_notify
383+
*/
384+
@SerializedName("RefundStartTimestamp")
385+
@XStreamAlias("RefundStartTimestamp")
386+
private Long refundStartTimestamp;
387+
388+
/**
389+
* 结束退款时间,秒级时间戳.
390+
* xpay_refund_notify
391+
*/
392+
@SerializedName("RefundSuccTimestamp")
393+
@XStreamAlias("RefundSuccTimestamp")
394+
private Long refundSuccTimestamp;
395+
396+
/**
397+
* 退款单的微信支付单号.
398+
* xpay_refund_notify
399+
*/
400+
@SerializedName("WxpayRefundTransactionId")
401+
@XStreamAlias("WxpayRefundTransactionId")
402+
@XStreamConverter(value = XStreamCDataConverter.class)
403+
private String wxpayRefundTransactionId;
404+
405+
/**
406+
* 重试次数,从0开始,重试间隔为2 4 8 16...最多15次.
407+
* xpay_refund_notify
408+
*/
409+
@SerializedName("RetryTimes")
410+
@XStreamAlias("RetryTimes")
411+
private Integer retryTimes;
412+
413+
/**
414+
* 拼团信息.
415+
* xpay_goods_deliver_notify, xpay_refund_notify
416+
*/
417+
@SerializedName("TeamInfo")
418+
@XStreamAlias("TeamInfo")
419+
private WxMaXPayTeamInfo teamInfo;
420+
316421
/**
317422
* 不要直接使用这个字段,
318423
* 这个字段只是为了适配 SubscribeMsgPopupEvent SubscribeMsgChangeEvent SubscribeMsgSentEvent
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package cn.binarywang.wx.miniapp.bean.xpay;
2+
3+
import com.google.gson.annotations.SerializedName;
4+
import com.thoughtworks.xstream.annotations.XStreamAlias;
5+
import lombok.Data;
6+
import lombok.NoArgsConstructor;
7+
8+
import java.io.Serializable;
9+
10+
/**
11+
* 虚拟支付拼团信息.
12+
* 用于 xpay_goods_deliver_notify、xpay_refund_notify 等推送事件
13+
*/
14+
@Data
15+
@NoArgsConstructor
16+
@XStreamAlias("TeamInfo")
17+
public class WxMaXPayTeamInfo implements Serializable {
18+
private static final long serialVersionUID = 1L;
19+
20+
/**
21+
* 活动id.
22+
*/
23+
@SerializedName("ActivityId")
24+
@XStreamAlias("ActivityId")
25+
private String activityId;
26+
27+
/**
28+
* 团id.
29+
*/
30+
@SerializedName("TeamId")
31+
@XStreamAlias("TeamId")
32+
private String teamId;
33+
34+
/**
35+
* 团类型.
36+
* 1-支付全部,拼成退款
37+
*/
38+
@SerializedName("TeamType")
39+
@XStreamAlias("TeamType")
40+
private Integer teamType;
41+
42+
/**
43+
* 0-创团 1-参团.
44+
*/
45+
@SerializedName("TeamAction")
46+
@XStreamAlias("TeamAction")
47+
private Integer teamAction;
48+
}

weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaConstants.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,7 @@ public static final class XPayOrderStatus {
263263
public static final class XPayNotifyEvent {
264264
public static String COIN_PAY = "xpay_coin_pay_notify";
265265
public static String GOODS_DELIVER = "xpay_goods_deliver_notify";
266+
public static String REFUND = "xpay_refund_notify";
266267

267268
}
268269
@UtilityClass

weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/bean/WxMaMessageTest.java

Lines changed: 90 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package cn.binarywang.wx.miniapp.bean;
22

3+
import cn.binarywang.wx.miniapp.bean.xpay.WxMaXPayTeamInfo;
34
import me.chanjar.weixin.common.api.WxConsts;
45
import org.testng.annotations.Test;
56

@@ -294,38 +295,97 @@ public void testFromXmlForAllFieldsMap() {
294295
}
295296

296297
/**
297-
* 自定义交易组件付款通知事件测试用例
298-
* msgType等于event且event等于WxConsts.EventType.OPEN_PRODUCT_ORDER_PAY
298+
* 虚拟支付退款推送事件 xpay_refund_notify 测试用例(XML格式,含TeamInfo)
299299
*/
300300
@Test
301-
public void testFromXmlForOpenProductOrderPayEvent(){
302-
String xml = "<xml> \n" +
303-
" <ToUserName>gh_abcdefg</ToUserName> \n" +
304-
" <FromUserName>oABCD</FromUserName> \n" +
305-
" <CreateTime>1642658087</CreateTime> \n" +
306-
" <MsgType>event</MsgType> \n" +
307-
" <Event>open_product_order_pay</Event>\n" +
308-
" <order_info>\n" +
309-
" <out_order_id>123456</out_order_id>\n" +
310-
" <order_id>1234567</order_id>\n" +
311-
" <transaction_id>42000000123123</transaction_id>\n" +
312-
" <pay_time>2021-12-30 22:31:00</pay_time>\n" +
313-
" <amount>10</amount>\n" +
314-
" <sp_openid>oNMZ-5C0SPGHUiKsTwnOXpSHzFvw</sp_openid>\n" +
315-
" </order_info>\n" +
301+
public void testXPayRefundNotifyFromXml() {
302+
String xml = "<xml>\n" +
303+
" <ToUserName><![CDATA[gh_abcdefg]]></ToUserName>\n" +
304+
" <FromUserName><![CDATA[oABCDEFG]]></FromUserName>\n" +
305+
" <CreateTime>1700000000</CreateTime>\n" +
306+
" <MsgType><![CDATA[event]]></MsgType>\n" +
307+
" <Event><![CDATA[xpay_refund_notify]]></Event>\n" +
308+
" <OpenId><![CDATA[oABCDEFG]]></OpenId>\n" +
309+
" <WxRefundId><![CDATA[wx_refund_123]]></WxRefundId>\n" +
310+
" <MchRefundId><![CDATA[mch_refund_456]]></MchRefundId>\n" +
311+
" <WxOrderId><![CDATA[wx_order_789]]></WxOrderId>\n" +
312+
" <MchOrderId><![CDATA[mch_order_101]]></MchOrderId>\n" +
313+
" <RefundFee>100</RefundFee>\n" +
314+
" <RetCode>0</RetCode>\n" +
315+
" <RetMsg><![CDATA[success]]></RetMsg>\n" +
316+
" <RefundStartTimestamp>1700000000</RefundStartTimestamp>\n" +
317+
" <RefundSuccTimestamp>1700000010</RefundSuccTimestamp>\n" +
318+
" <WxpayRefundTransactionId><![CDATA[wxpay_refund_tx_202]]></WxpayRefundTransactionId>\n" +
319+
" <RetryTimes>0</RetryTimes>\n" +
320+
" <TeamInfo>\n" +
321+
" <ActivityId><![CDATA[act_001]]></ActivityId>\n" +
322+
" <TeamId><![CDATA[team_002]]></TeamId>\n" +
323+
" <TeamType>1</TeamType>\n" +
324+
" <TeamAction>0</TeamAction>\n" +
325+
" </TeamInfo>\n" +
316326
"</xml>";
317-
WxMaMessage wxMessage = WxMaMessage.fromXml(xml);
318-
assertThat(wxMessage.getMsgType()).isEqualTo("event");
319-
assertThat(wxMessage.getEvent()).isEqualTo(WxConsts.EventType.OPEN_PRODUCT_ORDER_PAY);
320-
Map<String, Object> allFieldsMap = wxMessage.getAllFieldsMap();
321-
Map<String, Object> orderInfo = (Map<String, Object>) allFieldsMap.get("order_info");
322-
assertThat(orderInfo).isNotEmpty();
323-
assertThat(orderInfo)
324-
.containsEntry("out_order_id","123456")
325-
.containsEntry("order_id","1234567")
326-
.containsEntry("transaction_id","42000000123123")
327-
.containsEntry("pay_time","2021-12-30 22:31:00")
328-
.containsEntry("amount","10")
329-
.containsEntry("sp_openid","oNMZ-5C0SPGHUiKsTwnOXpSHzFvw");
327+
328+
WxMaMessage msg = WxMaMessage.fromXml(xml);
329+
checkXPayRefundNotifyMessage(msg);
330+
}
331+
332+
/**
333+
* 虚拟支付退款推送事件 xpay_refund_notify 测试用例(JSON格式,含TeamInfo)
334+
*/
335+
@Test
336+
public void testXPayRefundNotifyFromJson() {
337+
String json = "{\n" +
338+
" \"ToUserName\": \"gh_abcdefg\",\n" +
339+
" \"FromUserName\": \"oABCDEFG\",\n" +
340+
" \"CreateTime\": 1700000000,\n" +
341+
" \"MsgType\": \"event\",\n" +
342+
" \"Event\": \"xpay_refund_notify\",\n" +
343+
" \"OpenId\": \"oABCDEFG\",\n" +
344+
" \"WxRefundId\": \"wx_refund_123\",\n" +
345+
" \"MchRefundId\": \"mch_refund_456\",\n" +
346+
" \"WxOrderId\": \"wx_order_789\",\n" +
347+
" \"MchOrderId\": \"mch_order_101\",\n" +
348+
" \"RefundFee\": 100,\n" +
349+
" \"RetCode\": 0,\n" +
350+
" \"RetMsg\": \"success\",\n" +
351+
" \"RefundStartTimestamp\": 1700000000,\n" +
352+
" \"RefundSuccTimestamp\": 1700000010,\n" +
353+
" \"WxpayRefundTransactionId\": \"wxpay_refund_tx_202\",\n" +
354+
" \"RetryTimes\": 0,\n" +
355+
" \"TeamInfo\": {\n" +
356+
" \"ActivityId\": \"act_001\",\n" +
357+
" \"TeamId\": \"team_002\",\n" +
358+
" \"TeamType\": 1,\n" +
359+
" \"TeamAction\": 0\n" +
360+
" }\n" +
361+
"}";
362+
363+
WxMaMessage msg = WxMaMessage.fromJson(json);
364+
checkXPayRefundNotifyMessage(msg);
365+
}
366+
367+
private void checkXPayRefundNotifyMessage(WxMaMessage msg) {
368+
assertEquals(msg.getToUser(), "gh_abcdefg");
369+
assertEquals(msg.getFromUser(), "oABCDEFG");
370+
assertEquals(msg.getCreateTime(), new Integer(1700000000));
371+
assertEquals(msg.getMsgType(), WxConsts.XmlMsgType.EVENT);
372+
assertEquals(msg.getEvent(), "xpay_refund_notify");
373+
assertEquals(msg.getWxRefundId(), "wx_refund_123");
374+
assertEquals(msg.getMchRefundId(), "mch_refund_456");
375+
assertEquals(msg.getWxOrderId(), "wx_order_789");
376+
assertEquals(msg.getMchOrderId(), "mch_order_101");
377+
assertEquals(msg.getRefundFee(), new Integer(100));
378+
assertEquals(msg.getRetCode(), new Integer(0));
379+
assertEquals(msg.getRetMsg(), "success");
380+
assertEquals(msg.getRefundStartTimestamp(), new Long(1700000000L));
381+
assertEquals(msg.getRefundSuccTimestamp(), new Long(1700000010L));
382+
assertEquals(msg.getWxpayRefundTransactionId(), "wxpay_refund_tx_202");
383+
assertEquals(msg.getRetryTimes(), new Integer(0));
384+
WxMaXPayTeamInfo teamInfo = msg.getTeamInfo();
385+
assertNotNull(teamInfo);
386+
assertEquals(teamInfo.getActivityId(), "act_001");
387+
assertEquals(teamInfo.getTeamId(), "team_002");
388+
assertEquals(teamInfo.getTeamType(), new Integer(1));
389+
assertEquals(teamInfo.getTeamAction(), new Integer(0));
330390
}
331391
}

0 commit comments

Comments
 (0)