|
|
@@ -82,6 +82,46 @@ class HarResponseParserTest {
|
|
|
assertEquals("12.20", bean.getRcvAmount());
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 2026-09-28 第一份**真实的**查询响应 detail —— 原文照抄,一个字没改
|
|
|
+ * (出处:{@code HarOrderService} 那行「查询成功但手续费/渠道成本仍为空」的 WARN,
|
|
|
+ * 它把 detail 原文打了出来,订单 HAR1301886673700786176 退款后那次轮询)。
|
|
|
+ *
|
|
|
+ * 为什么这条用例必须存在:上面 `toBean_mapsDetail` 用的是**规范里的**字段名,
|
|
|
+ * 所以「上游根本不发这些名字」这个缺陷在本类里**完全不可见** —— 它活到今天的原因
|
|
|
+ * 就是这个。规范名 ⇒ 上游实际名(四格):
|
|
|
+ * platform_trade_no ⇒ alipay_order_no
|
|
|
+ * trade_time ⇒ trade_date
|
|
|
+ * refund_time ⇒ refund_date
|
|
|
+ * rcv_amount ⇒ actual_money
|
|
|
+ * 这是这份 docx 规范**第四次**被证伪(前三次:title、reason、通知里那两个名字)。
|
|
|
+ *
|
|
|
+ * 顺带一条负读数,别当发现用:这份 detail 里**没有**任何名字像「手续费 / 渠道成本」
|
|
|
+ * 的字段(未映射的金额只有 har_money=0 / request_money=null / merchant_money=null)。
|
|
|
+ * 0 与 null 在「这笔 0.01 的单没收费」与「这压根不是手续费字段」两种解释下**读数相同**
|
|
|
+ * ⇒ 分辨不了,所以那两格**不猜**、不映射。
|
|
|
+ */
|
|
|
+ @Test
|
|
|
+ void toBean_realQueryDetail_mapsTheNamesUpstreamActuallySends() {
|
|
|
+ String detail = """
|
|
|
+ {"alipay_order_no":"2026092823001417741424011978","order_no":"1156891538702077952","merchant_code":"142357140143751171","total_amount":0.01,"actual_money":0.01,"trade_date":"2026-09-28 09:54:51","buyer_logon_id":"475***@qq.com","buyer_user_id":"2088122583917741","status":2,"refund_date":"2026-09-28 10:23:54","reason":"商户申请退款","store_id":"785632","oper_name":null,"shop_name":null,"operator_id":"","stage_num":"","percent":"","subject":"测试0928","extra_params":"{}","refund_able":false,"biz":"har_ali_un_stage","har_money":0,"trade_type":"alipay_un_stage","phone_no":"0","shop_code":"0","request_money":null,"merchant_money":null,"app_apply":false,"related_orders":null,"third_order_no":"HAR1301886673700786176"}
|
|
|
+ """;
|
|
|
+
|
|
|
+ HarQueryDetail bean = HarResponseParser.toBean(detail, HarQueryDetail.class);
|
|
|
+
|
|
|
+ assertEquals("2026092823001417741424011978", bean.getPlatformTradeNo(),
|
|
|
+ "支付宝交易号在查询响应里叫 alipay_order_no");
|
|
|
+ assertEquals("2026-09-28 09:54:51", bean.getTradeTime(),
|
|
|
+ "交易时间在查询响应里叫 trade_date");
|
|
|
+ assertEquals("2026-09-28 10:23:54", bean.getRefundTime(),
|
|
|
+ "退款时间在查询响应里叫 refund_date");
|
|
|
+ assertEquals("0.01", bean.getRcvAmount(),
|
|
|
+ "实收金额在查询响应里叫 actual_money");
|
|
|
+ // 上游单号与状态仍是规范里那两个名字(这两格规范是对的)
|
|
|
+ assertEquals("1156891538702077952", bean.getOrderNo());
|
|
|
+ assertEquals(2, bean.getStatus());
|
|
|
+ }
|
|
|
+
|
|
|
/** 空串在上游确实会出现,用 String 接收才不会炸 */
|
|
|
@Test
|
|
|
void toBean_blankAmounts_doNotThrow() {
|