Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

🆕 #1764 微信支付电商收付通增加请求分账回退接口 #4

Merged
merged 1 commit into from
Sep 16, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -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
* 是否必填:是
* 类型:string(32)
* 描述:
* 分账出资的电商平台二级商户,填写微信支付分配的商户号。
* 示例值:1900000109
* </pre>
*/
@SerializedName(value = "sub_mchid")
private String subMchid;

/**
* <pre>
* 字段名:微信分账单号
* 变量名:order_id
* 是否必填:与out_order_no二选一
* 类型:string(64)
* 描述:
* 微信分账单号,微信系统返回的唯一标识。微信分账单号和商户分账单号二选一填写。
* 示例值:3008450740201411110007820472
* </pre>
*/
@SerializedName(value = "order_id")
private String orderId;

/**
* <pre>
* 字段名:商户分账单号
* 变量名:out_order_no
* 是否必填:与order_id二选一
* 类型:string(64)
* 描述:
* 商户系统内部的分账单号,在商户系统内部唯一(单次分账、多次分账、完结分账应使用不同的商户分账单号),同一分账单号多次请求等同一次。
* 示例值:P20150806125346
* </pre>
*/
@SerializedName(value = "out_order_no")
private String outOrderNo;

/**
* <pre>
* 字段名:商户回退单号
* 变量名:out_return_no
* 是否必填:是
* 类型:string(64)
* 描述:
* 此回退单号是商户在自己后台生成的一个新的回退单号,在商户后台唯一。
* 示例值:P20150806125346
* </pre>
*/
@SerializedName(value = "out_return_no")
private String outReturnNo;

/**
* <pre>
* 字段名:回退商户号
* 变量名:return_mchid
* 是否必填:是
* 类型:string(32)
* 描述:
* 只能对原分账请求中成功分给商户接收方进行回退。
* 示例值:86693852
* </pre>
*/
@SerializedName(value = "return_mchid")
private String returnMchid;

/**
* <pre>
* 字段名:回退金额
* 变量名:amount
* 是否必填:是
* 类型:int
* 描述:
* 需要从分账接收方回退的金额,单位为分,只能为整数,不能超过原始分账单分出给该接收方的金额。
* 示例值:10
* </pre>
*/
@SerializedName(value = "amount")
private Integer amount;

/**
* <pre>
* 字段名:回退描述
* 变量名:description
* 是否必填:是
* 类型:string(80)
* 描述:
* 分账回退的原因描述
* 示例值:分账回退
* </pre>
*/
@SerializedName(value = "description")
private String description;
}
Original file line number Diff line number Diff line change
@@ -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
* 是否必填:是
* 类型:string(32)
* 描述:
* 分账出资的电商平台二级商户,填写微信支付分配的商户号。
* 示例值:1900000109
* </pre>
*/
@SerializedName(value = "sub_mchid")
private String subMchid;

/**
* <pre>
* 字段名:微信分账单号
* 变量名:order_id
* 是否必填:与out_order_no二选一
* 类型:string(64)
* 描述:
* 微信分账单号,微信系统返回的唯一标识。微信分账单号和商户分账单号二选一填写。
* 示例值:3008450740201411110007820472
* </pre>
*/
@SerializedName(value = "order_id")
private String orderId;

/**
* <pre>
* 字段名:商户分账单号
* 变量名:out_order_no
* 是否必填:与order_id二选一
* 类型:string(64)
* 描述:
* 商户系统内部的分账单号,在商户系统内部唯一(单次分账、多次分账、完结分账应使用不同的商户分账单号),同一分账单号多次请求等同一次。
* 示例值:P20150806125346
* </pre>
*/
@SerializedName(value = "out_order_no")
private String outOrderNo;

/**
* <pre>
* 字段名:商户回退单号
* 变量名:out_return_no
* 是否必填:是
* 类型:string(64)
* 描述:
* 此回退单号是商户在自己后台生成的一个新的回退单号,在商户后台唯一。
* 示例值:P20150806125346
* </pre>
*/
@SerializedName(value = "out_return_no")
private String R20190516001;

/**
* <pre>
* 字段名:回退商户号
* 变量名:return_mchid
* 是否必填:是
* 类型:string(32)
* 描述:
* 只能对原分账请求中成功分给商户接收方进行回退。
* 示例值:86693852
* </pre>
*/
@SerializedName(value = "return_mchid")
private String returnMchid;

/**
* <pre>
* 字段名:回退金额
* 变量名:amount
* 是否必填:是
* 类型:int
* 描述:
* 需要从分账接收方回退的金额,单位为分,只能为整数,不能超过原始分账单分出给该接收方的金额。
* 示例值:10
* </pre>
*/
@SerializedName(value = "amount")
private Integer amount;

/**
* <pre>
* 字段名:微信回退单号
* 变量名:return_no
* 是否必填:是
* 类型:string(64)
* 描述:
* 微信分账回退单号,微信系统返回的唯一标识。
* 示例值:3008450740201411110007820472
* </pre>
*/
@SerializedName(value = "return_no")
private String returnNo;

/**
* <pre>
* 字段名:回退结果
* 变量名:result
* 是否必填:是
* 类型:string(32)
* 描述:
* 如果请求返回为处理中,则商户可以通过调用回退结果查询接口获取请求的最终处理结果,枚举值:
* PROCESSING:处理中
* SUCCESS:已成功
* FAIL:已失败
* 注意:如果返回为处理中,请勿变更商户回退单号,使用相同的参数再次发起分账回退,否则会出现资金风险 在处理中状态的回退单如果5天没有成功,会因为超时被设置为已失败
* 示例值:SUCCESS
* </pre>
*/
@SerializedName(value = "result")
private String result;

/**
* <pre>
* 字段名:失败原因
* 变量名:fail_reason
* 是否必填:否
* 类型:string(32)
* 描述:
* 回退失败的原因,此字段仅回退结果为FAIL时存在,枚举值:
* ACCOUNT_ABNORMAL:分账接收方账户异常
* TIME_OUT_CLOSED::超时关单
* 示例值:TIME_OUT_CLOSED
* </pre>
*/
@SerializedName(value = "fail_reason")
private String failReason;

/**
* <pre>
* 字段名:完成时间
* 变量名:finish_time
* 是否必填:是
* 类型:string(64)
* 描述:
* 分账回退完成时间,遵循rfc3339标准格式
* 格式为YYYY-MM-DDTHH:mm:ss.sss+TIMEZONE,YYYY-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;

}
Original file line number Diff line number Diff line change
Expand Up @@ -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;

}
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,13 @@ public ProfitSharingResult profitSharing(ProfitSharingRequest request) throws Wx
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(),
Expand Down