Jelajahi Sumber

fix: 支付分 API 调用改用 JsonNode.class 替代 String.class

RSAPublicKeyConfig 创建的 DefaultHttpClient 无法反序列化 String.class,
改用 JsonNode.class 让 SDK 自动解析 JSON 响应。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
skyline 2 minggu lalu
induk
melakukan
9c9a459785

+ 39 - 36
haha-service/src/main/java/com/haha/service/payment/payscore/impl/WxPayScoreStrategy.java

@@ -141,13 +141,11 @@ public class WxPayScoreStrategy implements PayScoreStrategy {
                     .addHeader("Accept", MediaType.APPLICATION_JSON.getValue())
                     .build();
 
-            HttpResponse<String> response = wxPayHttpClient.execute(httpRequest, String.class);
+            HttpResponse<JsonNode> response = wxPayHttpClient.execute(httpRequest, JsonNode.class);
 
             // 解析响应
-            String responseBody = response.getServiceResponse();
-            log.info("[微信支付分] 创建订单响应: body={}", responseBody);
+            JsonNode respJson = response.getServiceResponse();
 
-            JsonNode respJson = objectMapper.readTree(responseBody);
 
             String outOrderNo = getJsonString(respJson, "out_order_no");
             String state = getJsonString(respJson, "state");
@@ -157,7 +155,7 @@ public class WxPayScoreStrategy implements PayScoreStrategy {
             result.setPackageStr(packageStr);
 
             Map<String, Object> rawData = new HashMap<>();
-            rawData.put("response", responseBody);
+            rawData.put("response", respJson.toString());
             result.setRawData(rawData);
 
             log.info("[微信支付分] 创建订单成功 - 订单号: {}, 状态: {}, package: {}", outOrderNo, state, packageStr);
@@ -267,14 +265,12 @@ public class WxPayScoreStrategy implements PayScoreStrategy {
                     .addHeader("Accept", MediaType.APPLICATION_JSON.getValue())
                     .build();
 
-            HttpResponse<String> response = wxPayHttpClient.execute(httpRequest, String.class);
+            HttpResponse<JsonNode> response = wxPayHttpClient.execute(httpRequest, JsonNode.class);
 
             // 解析响应体
-            String responseBody = response.getServiceResponse();
-            log.info("[微信支付分] 完结订单响应: body={}", responseBody);
+            JsonNode respJson = response.getServiceResponse();
 
-            if (responseBody != null && !responseBody.isEmpty()) {
-                JsonNode respJson = objectMapper.readTree(responseBody);
+            if (respJson != null && respJson.size() > 0) {
                 String outOrderNo = getJsonString(respJson, "out_order_no");
                 String state = getJsonString(respJson, "state");
                 log.info("[微信支付分] 完结订单成功 - 订单号: {}, 状态: {}", outOrderNo, state);
@@ -330,14 +326,12 @@ public class WxPayScoreStrategy implements PayScoreStrategy {
                     .addHeader("Accept", MediaType.APPLICATION_JSON.getValue())
                     .build();
 
-            HttpResponse<String> response = wxPayHttpClient.execute(httpRequest, String.class);
+            HttpResponse<JsonNode> response = wxPayHttpClient.execute(httpRequest, JsonNode.class);
 
             // 解析响应体
-            String responseBody = response.getServiceResponse();
-            log.info("[微信支付分] 取消订单响应: body={}", responseBody);
+            JsonNode respJson = response.getServiceResponse();
 
-            if (responseBody != null && !responseBody.isEmpty()) {
-                JsonNode respJson = objectMapper.readTree(responseBody);
+            if (respJson != null && respJson.size() > 0) {
                 String outOrderNo = getJsonString(respJson, "out_order_no");
                 String state = getJsonString(respJson, "state");
                 log.info("[微信支付分] 取消订单成功 - 订单号: {}, 状态: {}", outOrderNo, state);
@@ -388,13 +382,11 @@ public class WxPayScoreStrategy implements PayScoreStrategy {
                     .addHeader("Accept", MediaType.APPLICATION_JSON.getValue())
                     .build();
 
-            HttpResponse<String> response = wxPayHttpClient.execute(httpRequest, String.class);
+            HttpResponse<JsonNode> response = wxPayHttpClient.execute(httpRequest, JsonNode.class);
 
             // 解析响应
-            String responseBody = response.getServiceResponse();
-            log.info("[微信支付分] 查询订单响应: body={}", responseBody);
+            JsonNode respJson = response.getServiceResponse();
 
-            JsonNode respJson = objectMapper.readTree(responseBody);
 
             String respOutOrderNo = getJsonString(respJson, "out_order_no");
             String state = getJsonString(respJson, "state");
@@ -408,7 +400,7 @@ public class WxPayScoreStrategy implements PayScoreStrategy {
             }
 
             Map<String, Object> rawData = new HashMap<>();
-            rawData.put("response", responseBody);
+            rawData.put("response", respJson.toString());
             result.setRawData(rawData);
 
             log.info("[微信支付分] 查询订单成功 - 订单号: {}, 状态: {}, 金额: {}元", 
@@ -476,11 +468,9 @@ public class WxPayScoreStrategy implements PayScoreStrategy {
                     .addHeader("Accept", MediaType.APPLICATION_JSON.getValue())
                     .build();
 
-            HttpResponse<String> response = wxPayHttpClient.execute(httpRequest, String.class);
-            String responseBody = response.getServiceResponse();
-            log.info("[微信支付分] 修改金额响应: body={}", responseBody);
+            HttpResponse<JsonNode> response = wxPayHttpClient.execute(httpRequest, JsonNode.class);
+            JsonNode respJson = response.getServiceResponse();
 
-            JsonNode respJson = objectMapper.readTree(responseBody);
             String outOrderNo = getJsonString(respJson, "out_order_no");
             String state = getJsonString(respJson, "state");
 
@@ -531,11 +521,9 @@ public class WxPayScoreStrategy implements PayScoreStrategy {
                     .addHeader("Accept", MediaType.APPLICATION_JSON.getValue())
                     .build();
 
-            HttpResponse<String> response = wxPayHttpClient.execute(httpRequest, String.class);
-            String responseBody = response.getServiceResponse();
-            log.info("[微信支付分] 同步订单响应: body={}", responseBody);
+            HttpResponse<JsonNode> response = wxPayHttpClient.execute(httpRequest, JsonNode.class);
+            JsonNode respJson = response.getServiceResponse();
 
-            JsonNode respJson = objectMapper.readTree(responseBody);
             String outOrderNo = getJsonString(respJson, "out_order_no");
             String state = getJsonString(respJson, "state");
 
@@ -584,11 +572,9 @@ public class WxPayScoreStrategy implements PayScoreStrategy {
                     .addHeader("Accept", MediaType.APPLICATION_JSON.getValue())
                     .build();
 
-            HttpResponse<String> response = wxPayHttpClient.execute(httpRequest, String.class);
-            String responseBody = response.getServiceResponse();
-            log.info("[微信支付分] 退款响应: body={}", responseBody);
+            HttpResponse<JsonNode> response = wxPayHttpClient.execute(httpRequest, JsonNode.class);
+            JsonNode respJson = response.getServiceResponse();
 
-            JsonNode respJson = objectMapper.readTree(responseBody);
             String outOrderNo = getJsonString(respJson, "out_order_no");
             String refundId = getJsonString(respJson, "refund_id");
 
@@ -632,11 +618,9 @@ public class WxPayScoreStrategy implements PayScoreStrategy {
                     .addHeader("Accept", MediaType.APPLICATION_JSON.getValue())
                     .build();
 
-            HttpResponse<String> response = wxPayHttpClient.execute(httpRequest, String.class);
-            String responseBody = response.getServiceResponse();
-            log.info("[微信支付分] 查询退款响应: body={}", responseBody);
+            HttpResponse<JsonNode> response = wxPayHttpClient.execute(httpRequest, JsonNode.class);
+            JsonNode respJson = response.getServiceResponse();
 
-            JsonNode respJson = objectMapper.readTree(responseBody);
             String status = getJsonString(respJson, "status");
 
             PayScoreResult result = PayScoreResult.success(outOrderNo, status);
@@ -797,6 +781,25 @@ public class WxPayScoreStrategy implements PayScoreStrategy {
             return json.get(key).asText();
         }
         return null;
+
+    /**
+     * 从 MalformedMessageException 中提取 JSON 响应体
+     * SDK 的 String.class 反序列化会抛此异常,响应体在异常消息中
+     */
+    private JsonNode parseResponseFromException(MalformedMessageException e) throws Exception {
+        String message = e.getMessage();
+        if (message != null) {
+            int start = message.indexOf("{");
+            int end = message.lastIndexOf("}");
+            if (start >= 0 && end > start) {
+                String body = message.substring(start, end + 1);
+                log.info("[微信支付分] 从异常中提取响应体: {}", body);
+                return objectMapper.readTree(body);
+            }
+        }
+        throw e;
+    }
+
     }
 
     /**