Skip to content

Commit 9fca71d

Browse files
authored
🎨 #3963 【小程序】补充虚拟支付 xpay_complaint_notify 投诉推送事件支持
1 parent c69a82d commit 9fca71d

File tree

4 files changed

+122
-4
lines changed

4 files changed

+122
-4
lines changed

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

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ public class WxMaMessage implements Serializable {
189189
@XStreamConverter(value = XStreamCDataConverter.class)
190190
private String revokeInfo;
191191

192-
@SerializedName("OpenID")
192+
@SerializedName(value = "OpenID", alternate = {"OpenId"})
193193
@XStreamAlias("OpenID")
194194
@XStreamConverter(value = XStreamCDataConverter.class)
195195
private String openId;
@@ -418,6 +418,52 @@ public class WxMaMessage implements Serializable {
418418
@XStreamAlias("TeamInfo")
419419
private WxMaXPayTeamInfo teamInfo;
420420

421+
// xpay_complaint_notify 用户投诉推送字段
422+
423+
/**
424+
* 微信支付交易单号.
425+
* xpay_complaint_notify
426+
*/
427+
@SerializedName("TransactionId")
428+
@XStreamAlias("TransactionId")
429+
@XStreamConverter(value = XStreamCDataConverter.class)
430+
private String complaintTransactionId;
431+
432+
/**
433+
* 投诉单号.
434+
* xpay_complaint_notify
435+
*/
436+
@SerializedName("ComplaintId")
437+
@XStreamAlias("ComplaintId")
438+
@XStreamConverter(value = XStreamCDataConverter.class)
439+
private String complaintId;
440+
441+
/**
442+
* 投诉详情.
443+
* xpay_complaint_notify
444+
*/
445+
@SerializedName("ComplaintDetail")
446+
@XStreamAlias("ComplaintDetail")
447+
@XStreamConverter(value = XStreamCDataConverter.class)
448+
private String complaintDetail;
449+
450+
/**
451+
* 投诉时间,秒级时间戳.
452+
* xpay_complaint_notify
453+
*/
454+
@SerializedName("ComplaintTime")
455+
@XStreamAlias("ComplaintTime")
456+
private Long complaintTime;
457+
458+
/**
459+
* 请求编号.
460+
* xpay_complaint_notify
461+
*/
462+
@SerializedName("RequestId")
463+
@XStreamAlias("RequestId")
464+
@XStreamConverter(value = XStreamCDataConverter.class)
465+
private String requestId;
466+
421467
/**
422468
* 不要直接使用这个字段,
423469
* 这个字段只是为了适配 SubscribeMsgPopupEvent SubscribeMsgChangeEvent SubscribeMsgSentEvent

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -261,9 +261,10 @@ public static final class XPayOrderStatus {
261261
}
262262
@UtilityClass
263263
public static final class XPayNotifyEvent {
264-
public static String COIN_PAY = "xpay_coin_pay_notify";
265-
public static String GOODS_DELIVER = "xpay_goods_deliver_notify";
266-
public static String REFUND = "xpay_refund_notify";
264+
public static final String COIN_PAY = "xpay_coin_pay_notify";
265+
public static final String GOODS_DELIVER = "xpay_goods_deliver_notify";
266+
public static final String REFUND = "xpay_refund_notify";
267+
public static final String COMPLAINT = "xpay_complaint_notify";
267268

268269
}
269270
@UtilityClass

weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/xml/XStreamTransformer.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,8 @@ private static void registerClass(Class<?> clz) {
101101
if (clz.equals(WxMaMessage.class)) {
102102
// 操蛋的微信,模板消息推送成功的消息是MsgID,其他消息推送过来是MsgId
103103
xstream.aliasField("MsgID", WxMaMessage.class, "msgId");
104+
// xpay 事件推送使用 OpenId(小写 d),但通用字段注解为 OpenID(大写 D)
105+
xstream.aliasField("OpenId", WxMaMessage.class, "openId");
104106
}
105107

106108
register(clz, xstream);

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

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -388,4 +388,73 @@ private void checkXPayRefundNotifyMessage(WxMaMessage msg) {
388388
assertEquals(teamInfo.getTeamType(), new Integer(1));
389389
assertEquals(teamInfo.getTeamAction(), new Integer(0));
390390
}
391+
392+
/**
393+
* 虚拟支付投诉推送事件 xpay_complaint_notify 测试用例(XML格式)
394+
*/
395+
@Test
396+
public void testXPayComplaintNotifyFromXml() {
397+
String xml = "<xml>\n" +
398+
" <ToUserName><![CDATA[gh_abcdefg]]></ToUserName>\n" +
399+
" <FromUserName><![CDATA[official_openid]]></FromUserName>\n" +
400+
" <CreateTime>1700000100</CreateTime>\n" +
401+
" <MsgType><![CDATA[event]]></MsgType>\n" +
402+
" <Event><![CDATA[xpay_complaint_notify]]></Event>\n" +
403+
" <OpenId><![CDATA[user_openid_abc]]></OpenId>\n" +
404+
" <WxOrderId><![CDATA[wx_order_cmp_001]]></WxOrderId>\n" +
405+
" <MchOrderId><![CDATA[mch_order_cmp_002]]></MchOrderId>\n" +
406+
" <TransactionId><![CDATA[transaction_cmp_003]]></TransactionId>\n" +
407+
" <ComplaintId><![CDATA[complaint_004]]></ComplaintId>\n" +
408+
" <ComplaintDetail><![CDATA[商品未收到]]></ComplaintDetail>\n" +
409+
" <ComplaintTime>1700000050</ComplaintTime>\n" +
410+
" <RetryTimes>0</RetryTimes>\n" +
411+
" <RequestId><![CDATA[req_005]]></RequestId>\n" +
412+
"</xml>";
413+
414+
WxMaMessage msg = WxMaMessage.fromXml(xml);
415+
checkXPayComplaintNotifyMessage(msg);
416+
}
417+
418+
/**
419+
* 虚拟支付投诉推送事件 xpay_complaint_notify 测试用例(JSON格式)
420+
*/
421+
@Test
422+
public void testXPayComplaintNotifyFromJson() {
423+
String json = "{\n" +
424+
" \"ToUserName\": \"gh_abcdefg\",\n" +
425+
" \"FromUserName\": \"official_openid\",\n" +
426+
" \"CreateTime\": 1700000100,\n" +
427+
" \"MsgType\": \"event\",\n" +
428+
" \"Event\": \"xpay_complaint_notify\",\n" +
429+
" \"OpenId\": \"user_openid_abc\",\n" +
430+
" \"WxOrderId\": \"wx_order_cmp_001\",\n" +
431+
" \"MchOrderId\": \"mch_order_cmp_002\",\n" +
432+
" \"TransactionId\": \"transaction_cmp_003\",\n" +
433+
" \"ComplaintId\": \"complaint_004\",\n" +
434+
" \"ComplaintDetail\": \"商品未收到\",\n" +
435+
" \"ComplaintTime\": 1700000050,\n" +
436+
" \"RetryTimes\": 0,\n" +
437+
" \"RequestId\": \"req_005\"\n" +
438+
"}";
439+
440+
WxMaMessage msg = WxMaMessage.fromJson(json);
441+
checkXPayComplaintNotifyMessage(msg);
442+
}
443+
444+
private void checkXPayComplaintNotifyMessage(WxMaMessage msg) {
445+
assertEquals(msg.getToUser(), "gh_abcdefg");
446+
assertEquals(msg.getFromUser(), "official_openid");
447+
assertEquals(msg.getCreateTime(), new Integer(1700000100));
448+
assertEquals(msg.getMsgType(), WxConsts.XmlMsgType.EVENT);
449+
assertEquals(msg.getEvent(), "xpay_complaint_notify");
450+
assertEquals(msg.getOpenId(), "user_openid_abc");
451+
assertEquals(msg.getWxOrderId(), "wx_order_cmp_001");
452+
assertEquals(msg.getMchOrderId(), "mch_order_cmp_002");
453+
assertEquals(msg.getComplaintTransactionId(), "transaction_cmp_003");
454+
assertEquals(msg.getComplaintId(), "complaint_004");
455+
assertEquals(msg.getComplaintDetail(), "商品未收到");
456+
assertEquals(msg.getComplaintTime(), new Long(1700000050L));
457+
assertEquals(msg.getRetryTimes(), new Integer(0));
458+
assertEquals(msg.getRequestId(), "req_005");
459+
}
391460
}

0 commit comments

Comments
 (0)