Browse Source

:new: #1916 【微信支付】电商收付通增加关闭普通支付单的接口

f00lish 4 years ago
parent
commit
0306103d28

+ 61 - 0
weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/PartnerTransactionsCloseRequest.java

@@ -0,0 +1,61 @@
+package com.github.binarywang.wxpay.bean.ecommerce;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * 关闭普通订单请求
+ * @author: f00lish
+ * @date: 2020/12/09
+ */
+@Data
+@NoArgsConstructor
+public class PartnerTransactionsCloseRequest implements Serializable {
+
+  private static final long serialVersionUID = -7602636370950088329L;
+
+  /**
+   * <pre>
+   * 字段名:服务商户号
+   * 变量名:sp_mchid
+   * 是否必填:是
+   * 类型:string(32)
+   * 描述:
+   *  服务商户号,由微信支付生成并下发
+   * 示例值:1230000109
+   * </pre>
+   */
+  @SerializedName(value = "sp_mchid")
+  private String spMchid;
+
+  /**
+   * <pre>
+   * 字段名:二级商户号
+   * 变量名:sub_mchid
+   * 是否必填:是
+   * 类型:string(32)
+   * 描述:
+   *  二级商户的商户号,有微信支付生成并下发。
+   * 示例值:1900000109
+   * </pre>
+   */
+  @SerializedName(value = "sub_mchid")
+  private String subMchid;
+
+  /**
+   * <pre>
+   * 字段名:商户订单号
+   * 变量名:out_trade_no
+   * 是否必填:是
+   * 类型:string(32)
+   * 描述:
+   *  商户系统内部订单号,只能是数字、大小写字母_-*且在同一个商户号下唯一,详见【商户订单号】。
+   * 特殊规则:最小字符长度为6
+   * 示例值:1217752501201407033233368018
+   * </pre>
+   */
+  private transient String outTradeNo;
+}

+ 11 - 0
weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/EcommerceService.java

@@ -168,6 +168,17 @@ public interface EcommerceService {
 
   /**
    * <pre>
+   * 关闭普通订单API
+   * 文档地址: https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/ecommerce/e_transactions/chapter3_6.shtml
+   * </pre>
+   *
+   * @param request 关闭普通订单请求
+   * @throws WxPayException the wx pay exception
+   */
+  void closePartnerTransactions(PartnerTransactionsCloseRequest request) throws WxPayException;
+
+  /**
+   * <pre>
    * 服务商账户实时余额
    * 文档地址: https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/pages/amount.shtml
    * </pre>

+ 6 - 0
weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/EcommerceServiceImpl.java

@@ -150,6 +150,12 @@ public class EcommerceServiceImpl implements EcommerceService {
   }
 
   @Override
+  public void closePartnerTransactions(PartnerTransactionsCloseRequest request) throws WxPayException {
+    String url = String.format("%s/v3/pay/partner/transactions/out-trade-no/%s/close", this.payService.getPayBaseUrl(), request.getOutTradeNo());
+    String response = this.payService.postV3(url, GSON.toJson(request));
+  }
+
+  @Override
   public FundBalanceResult spNowBalance(SpAccountTypeEnum accountType) throws WxPayException {
     String url = String.format("%s/v3/merchant/fund/balance/%s", this.payService.getPayBaseUrl(), accountType);
     URI uri = URI.create(url);

+ 14 - 2
weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceApacheHttpImpl.java

@@ -100,7 +100,13 @@ public class WxPayServiceApacheHttpImpl extends BaseWxPayServiceImpl {
     try (CloseableHttpResponse response = httpClient.execute(httpPost)) {
       //v3已经改为通过状态码判断200 204 成功
       int statusCode = response.getStatusLine().getStatusCode();
-      String responseString = EntityUtils.toString(response.getEntity(), StandardCharsets.UTF_8);
+      //post方法有可能会没有返回值的情况
+      String responseString;
+      if (response.getEntity() == null) {
+        responseString = null;
+      }else {
+        responseString = EntityUtils.toString(response.getEntity(), StandardCharsets.UTF_8);
+      }
       if (HttpStatus.SC_OK == statusCode || HttpStatus.SC_NO_CONTENT == statusCode) {
         this.log.info("\n【请求地址】:{}\n【请求数据】:{}\n【响应数据】:{}", url, requestStr, responseString);
         return responseString;
@@ -166,7 +172,13 @@ public class WxPayServiceApacheHttpImpl extends BaseWxPayServiceImpl {
     try (CloseableHttpResponse response = httpClient.execute(httpPost)) {
       //v3已经改为通过状态码判断200 204 成功
       int statusCode = response.getStatusLine().getStatusCode();
-      String responseString = EntityUtils.toString(response.getEntity(), StandardCharsets.UTF_8);
+      //post方法有可能会没有返回值的情况
+      String responseString;
+      if (response.getEntity() == null) {
+        responseString = null;
+      }else {
+        responseString = EntityUtils.toString(response.getEntity(), StandardCharsets.UTF_8);
+      }
       if (HttpStatus.SC_OK == statusCode || HttpStatus.SC_NO_CONTENT == statusCode) {
         this.log.info("\n【请求地址】:{}\n【响应数据】:{}", url, responseString);
         return responseString;