diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/json/WxCpUserGsonAdapter.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/json/WxCpUserGsonAdapter.java index 0da35ff7fb..1df32b8601 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/json/WxCpUserGsonAdapter.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/json/WxCpUserGsonAdapter.java @@ -281,7 +281,12 @@ public JsonElement serialize(WxCpUser user, Type typeOfSrc, JsonSerializationCon } addProperty(o, MAIN_DEPARTMENT, user.getMainDepartment()); - addArrayProperty(o, DIRECT_LEADER, user.getDirectLeader()); + // Special handling for directLeader: include empty arrays to support WeChat Work API reset functionality + if (user.getDirectLeader() != null) { + JsonArray directLeaderArray = new JsonArray(); + Arrays.stream(user.getDirectLeader()).forEach(directLeaderArray::add); + o.add(DIRECT_LEADER, directLeaderArray); + } if (!user.getExtAttrs().isEmpty()) { JsonArray attrsJsonArray = new JsonArray(); diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/util/json/WxCpUserGsonAdapterTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/util/json/WxCpUserGsonAdapterTest.java index 9b62a8d580..66be5c66a2 100644 --- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/util/json/WxCpUserGsonAdapterTest.java +++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/util/json/WxCpUserGsonAdapterTest.java @@ -180,4 +180,31 @@ public void testSerialize() { "{\"type\":2,\"name\":\"测试app\"," + "\"miniprogram\":{\"appid\":\"wx8bd80126147df384\",\"pagepath\":\"/index\",\"title\":\"my miniprogram\"}}]}}"); } + + /** + * Test directLeader empty array serialization. + * This test verifies that empty directLeader arrays are included in JSON as "direct_leader":[] + * instead of being omitted, which is required for WeChat Work API to reset user direct leaders. + */ + @Test + public void testDirectLeaderEmptyArraySerialization() { + WxCpUser user = new WxCpUser(); + user.setUserId("testuser"); + user.setName("Test User"); + + // Test with empty array - should be serialized as "direct_leader":[] + user.setDirectLeader(new String[]{}); + String json = user.toJson(); + assertThat(json).contains("\"direct_leader\":[]"); + + // Test with null - should not include direct_leader field + user.setDirectLeader(null); + json = user.toJson(); + assertThat(json).doesNotContain("direct_leader"); + + // Test with non-empty array - should be serialized normally + user.setDirectLeader(new String[]{"leader1", "leader2"}); + json = user.toJson(); + assertThat(json).contains("\"direct_leader\":[\"leader1\",\"leader2\"]"); + } } diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/notify/WxPayRefundNotifyResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/notify/WxPayRefundNotifyResult.java index ae86b8c854..8615a2e461 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/notify/WxPayRefundNotifyResult.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/notify/WxPayRefundNotifyResult.java @@ -273,7 +273,7 @@ public String toString() { * */ @XStreamAlias("refund_recv_accout") - private String refundRecvAccout; + private String refundRecvAccount; /** *
@@ -324,7 +324,7 @@ public void loadXML(Document d) { settlementRefundFee = readXmlInteger(d, "settlement_refund_fee"); refundStatus = readXmlString(d, "refund_status"); successTime = readXmlString(d, "success_time"); - refundRecvAccout = readXmlString(d, "refund_recv_accout"); + refundRecvAccount = readXmlString(d, "refund_recv_accout"); refundAccount = readXmlString(d, "refund_account"); refundRequestSource = readXmlString(d, "refund_request_source"); } diff --git a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/notify/WxPayRefundNotifyResultTest.java b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/notify/WxPayRefundNotifyResultTest.java index 963afb2618..e7a22ee6cd 100644 --- a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/notify/WxPayRefundNotifyResultTest.java +++ b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/notify/WxPayRefundNotifyResultTest.java @@ -119,7 +119,7 @@ public void testFromXMLFastMode() throws WxPayException { refundNotifyResult.loadReqInfo(xmlDecryptedReqInfo); assertEquals(refundNotifyResult.getReqInfo().getRefundFee().intValue(), 15); assertEquals(refundNotifyResult.getReqInfo().getRefundStatus(), "SUCCESS"); - assertEquals(refundNotifyResult.getReqInfo().getRefundRecvAccout(), "用户零钱"); + assertEquals(refundNotifyResult.getReqInfo().getRefundRecvAccount(), "用户零钱"); System.out.println(refundNotifyResult); } finally { XmlConfig.fastMode = false;