Merge remote-tracking branch 'wechat/develop' into develop

This commit is contained in:
曾浩 2020-09-15 20:02:20 +08:00
commit e56289f4c8
4 changed files with 307 additions and 0 deletions

View File

@ -0,0 +1,120 @@
package com.github.binarywang.wxpay.bean.ecommerce;
import com.google.gson.annotations.SerializedName;
import lombok.*;
import java.io.Serializable;
/**
* 请求分账回退
* * <pre>
* * 文档地址https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/ecommerce/profitsharing/chapter3_3.shtml
* * </pre>
* @author: f00lish
* @date: 2020/09/14
*/
@Data
@Builder
@NoArgsConstructor(access = AccessLevel.PRIVATE)
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class ReturnOrdersRequest implements Serializable {
private static final long serialVersionUID = -3674823388136221959L;
/**
* <pre>
* 字段名二级商户号
* 变量名sub_mchid
* 是否必填
* 类型string32
* 描述
* 分账出资的电商平台二级商户填写微信支付分配的商户号
* 示例值1900000109
* </pre>
*/
@SerializedName(value = "sub_mchid")
private String subMchid;
/**
* <pre>
* 字段名微信分账单号
* 变量名order_id
* 是否必填与out_order_no二选一
* 类型string64
* 描述
* 微信分账单号微信系统返回的唯一标识微信分账单号和商户分账单号二选一填写
* 示例值3008450740201411110007820472
* </pre>
*/
@SerializedName(value = "order_id")
private String orderId;
/**
* <pre>
* 字段名商户分账单号
* 变量名out_order_no
* 是否必填与order_id二选一
* 类型string64
* 描述
* 商户系统内部的分账单号在商户系统内部唯一单次分账多次分账完结分账应使用不同的商户分账单号同一分账单号多次请求等同一次
* 示例值P20150806125346
* </pre>
*/
@SerializedName(value = "out_order_no")
private String outOrderNo;
/**
* <pre>
* 字段名商户回退单号
* 变量名out_return_no
* 是否必填
* 类型string64
* 描述
* 此回退单号是商户在自己后台生成的一个新的回退单号在商户后台唯一
* 示例值P20150806125346
* </pre>
*/
@SerializedName(value = "out_return_no")
private String outReturnNo;
/**
* <pre>
* 字段名回退商户号
* 变量名return_mchid
* 是否必填
* 类型string32
* 描述
* 只能对原分账请求中成功分给商户接收方进行回退
* 示例值86693852
* </pre>
*/
@SerializedName(value = "return_mchid")
private String returnMchid;
/**
* <pre>
* 字段名回退金额
* 变量名amount
* 是否必填
* 类型int
* 描述
* 需要从分账接收方回退的金额单位为分只能为整数不能超过原始分账单分出给该接收方的金额
* 示例值10
* </pre>
*/
@SerializedName(value = "amount")
private Integer amount;
/**
* <pre>
* 字段名回退描述
* 变量名description
* 是否必填
* 类型string80
* 描述
* 分账回退的原因描述
* 示例值分账回退
* </pre>
*/
@SerializedName(value = "description")
private String description;
}

View File

@ -0,0 +1,168 @@
package com.github.binarywang.wxpay.bean.ecommerce;
import com.google.gson.annotations.SerializedName;
import lombok.*;
import java.io.Serializable;
import java.util.Date;
/**
* @author: f00lish
* @date: 2020/09/14
*/
@Data
@Builder
@NoArgsConstructor(access = AccessLevel.PRIVATE)
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class ReturnOrdersResult implements Serializable {
private static final long serialVersionUID = 2296020044225854203L;
/**
* <pre>
* 字段名二级商户号
* 变量名sub_mchid
* 是否必填
* 类型string32
* 描述
* 分账出资的电商平台二级商户填写微信支付分配的商户号
* 示例值1900000109
* </pre>
*/
@SerializedName(value = "sub_mchid")
private String subMchid;
/**
* <pre>
* 字段名微信分账单号
* 变量名order_id
* 是否必填与out_order_no二选一
* 类型string64
* 描述
* 微信分账单号微信系统返回的唯一标识微信分账单号和商户分账单号二选一填写
* 示例值3008450740201411110007820472
* </pre>
*/
@SerializedName(value = "order_id")
private String orderId;
/**
* <pre>
* 字段名商户分账单号
* 变量名out_order_no
* 是否必填与order_id二选一
* 类型string64
* 描述
* 商户系统内部的分账单号在商户系统内部唯一单次分账多次分账完结分账应使用不同的商户分账单号同一分账单号多次请求等同一次
* 示例值P20150806125346
* </pre>
*/
@SerializedName(value = "out_order_no")
private String outOrderNo;
/**
* <pre>
* 字段名商户回退单号
* 变量名out_return_no
* 是否必填
* 类型string64
* 描述
* 此回退单号是商户在自己后台生成的一个新的回退单号在商户后台唯一
* 示例值P20150806125346
* </pre>
*/
@SerializedName(value = "out_return_no")
private String R20190516001;
/**
* <pre>
* 字段名回退商户号
* 变量名return_mchid
* 是否必填
* 类型string32
* 描述
* 只能对原分账请求中成功分给商户接收方进行回退
* 示例值86693852
* </pre>
*/
@SerializedName(value = "return_mchid")
private String returnMchid;
/**
* <pre>
* 字段名回退金额
* 变量名amount
* 是否必填
* 类型int
* 描述
* 需要从分账接收方回退的金额单位为分只能为整数不能超过原始分账单分出给该接收方的金额
* 示例值10
* </pre>
*/
@SerializedName(value = "amount")
private Integer amount;
/**
* <pre>
* 字段名微信回退单号
* 变量名return_no
* 是否必填
* 类型string64
* 描述
* 微信分账回退单号微信系统返回的唯一标识
* 示例值3008450740201411110007820472
* </pre>
*/
@SerializedName(value = "return_no")
private String returnNo;
/**
* <pre>
* 字段名回退结果
* 变量名result
* 是否必填
* 类型string32
* 描述
* 如果请求返回为处理中则商户可以通过调用回退结果查询接口获取请求的最终处理结果枚举值
* PROCESSING处理中
* SUCCESS已成功
* FAIL已失败
* 注意如果返回为处理中请勿变更商户回退单号使用相同的参数再次发起分账回退否则会出现资金风险 在处理中状态的回退单如果5天没有成功会因为超时被设置为已失败
* 示例值SUCCESS
* </pre>
*/
@SerializedName(value = "result")
private String result;
/**
* <pre>
* 字段名失败原因
* 变量名fail_reason
* 是否必填
* 类型string32
* 描述
* 回退失败的原因此字段仅回退结果为FAIL时存在枚举值
* ACCOUNT_ABNORMAL分账接收方账户异常
* TIME_OUT_CLOSED:超时关单
* 示例值TIME_OUT_CLOSED
* </pre>
*/
@SerializedName(value = "fail_reason")
private String failReason;
/**
* <pre>
* 字段名完成时间
* 变量名finish_time
* 是否必填
* 类型string64
* 描述
* 分账回退完成时间遵循rfc3339标准格式
* 格式为YYYY-MM-DDTHH:mm:ss.sss+TIMEZONEYYYY-MM-DD表示年月日T出现在字符串中表示time元素的开头HH:mm:ss.sss表示时分秒毫秒TIMEZONE表示时区+08:00表示东八区时间领先UTC 8小时即北京时间例如2015-05-20T13:29:35.120+08:00表示北京时间2015年5月20日 13点29分35秒
* 示例值2015-05-20T13:29:35.120+08:00
* </pre>
*/
@SerializedName(value = "finish_time")
private Date finishTime;
}

View File

@ -201,4 +201,16 @@ public interface EcommerceService {
*/
ProfitSharingResult profitSharing(ProfitSharingRequest request) throws WxPayException;
/**
* <pre>
* 请求分账回退API
* 文档地址: https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/ecommerce/profitsharing/chapter3_3.shtml
* </pre>
*
* @param request 分账回退请求
* @return 返回数据 return orders result
* @throws WxPayException the wx pay exception
*/
ReturnOrdersResult returnOrders(ReturnOrdersRequest request) throws WxPayException;
}

View File

@ -155,6 +155,13 @@ public class EcommerceServiceImpl implements EcommerceService {
return GSON.fromJson(response, ProfitSharingResult.class);
}
@Override
public ReturnOrdersResult returnOrders(ReturnOrdersRequest request) throws WxPayException {
String url = String.format("%s/v3/ecommerce/profitsharing/returnorders", this.payService.getPayBaseUrl());
String response = this.payService.postV3(url, GSON.toJson(request));
return GSON.fromJson(response, ReturnOrdersResult.class);
}
private boolean verifyNotifySign(SignatureHeader header, String data) {
String beforeSign = String.format("%s\n%s\n%s\n",
header.getTimeStamp(),