🆕 #1759 微信支付增加电商收付通请求分账接口

* 增加微信收付通请求分账接口
This commit is contained in:
f00lish 2020-09-13 09:28:43 +08:00 committed by GitHub
parent 6c31059020
commit 91d484f730
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 282 additions and 0 deletions

View File

@ -0,0 +1,192 @@
package com.github.binarywang.wxpay.bean.ecommerce;
import com.google.gson.annotations.SerializedName;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 请求分账 对象
* <pre>
* 文档地址https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/ecommerce/profitsharing/chapter3_1.shtml
* </pre>
* @author: f00lish
* @date: 2020/09/12
*/
@Data
@NoArgsConstructor
public class ProfitSharingRequest implements Serializable {
private static final long serialVersionUID = -8662837652326828377L;
/**
* <pre>
* 字段名公众账号ID
* 变量名appid
* 是否必填
* 类型string32
* 描述
* 微信分配的公众账号ID
* 示例值wx8888888888888888
* </pre>
*/
@SerializedName(value = "appid")
private String appid;
/**
* <pre>
* 字段名二级商户号
* 变量名sub_mchid
* 是否必填
* 类型string32
* 描述
* 分账出资的电商平台二级商户填写微信支付分配的商户号
* 示例值1900000109
* </pre>
*/
@SerializedName(value = "sub_mchid")
private String subMchid;
/**
* <pre>
* 字段名微信订单号
* 变量名transaction_id
* 是否必填
* 类型string32
* 描述
* 微信支付订单号
* 示例值4208450740201411110007820472
* </pre>
*/
@SerializedName(value = "transaction_id")
private String transactionId;
/**
* <pre>
* 字段名商户分账单号
* 变量名out_order_no
* 是否必填
* 类型string64
* 描述
* 商户系统内部的分账单号在商户系统内部唯一单次分账多次分账完结分账应使用不同的商户分账单号同一分账单号多次请求等同一次
* 示例值P20150806125346
* </pre>
*/
@SerializedName(value = "out_order_no")
private String outOrderNo;
/**
* <pre>
* 字段名分账接收方列表
* 变量名receivers
* 是否必填
* 类型array
* 描述
* 分账接收方列表支持设置出资商户作为分账接收方单次分账最多可有5个分账接收方
* </pre>
*/
@SerializedName(value = "receivers")
private Receiver[] receivers;
/**
* <pre>
* 字段名是否分账完成
* 变量名finish
* 是否必填
* 类型bool
* 描述
* 是否完成分账
* 1如果为true该笔订单剩余未分账的金额会解冻回电商平台二级商户
* 2如果为false该笔订单剩余未分账的金额不会解冻回电商平台二级商户可以对该笔订单再次进行分账
* 示例值true
* </pre>
*/
@SerializedName(value = "finish")
private Boolean finish;
@Data
@NoArgsConstructor
public static class Receiver implements Serializable {
private static final long serialVersionUID = 8995144356011793136L;
/**
* <pre>
* 字段名分账接收方类型
* 变量名type
* 是否必填
* 类型string32
* 描述
* 分账接收方类型枚举值
* MERCHANT_ID商户
* PERSONAL_OPENID个人
* 示例值MERCHANT_ID
* </pre>
*/
@SerializedName(value = "type")
private String type;
/**
* <pre>
* 字段名分账接收方账号
* 变量名receiver_account
* 是否必填
* 类型string32
* 描述
* 分账接收方账号
* 类型是MERCHANT_ID时是商户ID
* 类型是PERSONAL_OPENID时是个人openidopenid获取方法 https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/ecommerce/guide/chapter2_1.shtml#menu1
* 示例值1900000109
* </pre>
*/
@SerializedName(value = "receiver_account")
private String receiverAccount;
/**
* <pre>
* 字段名分账金额
* 变量名amount
* 是否必填
* 类型int
* 描述
* 分账金额单位为分只能为整数不能超过原订单支付金额及最大分账比例金额
* 示例值190
* </pre>
*/
@SerializedName(value = "amount")
private Integer amount;
/**
* <pre>
* 字段名分账描述
* 变量名description
* 是否必填
* 类型string180
* 描述
* 分账的原因描述分账账单中需要体现
* 示例值分给商户1900000109
* </pre>
*/
@SerializedName(value = "description")
private String description;
/**
* <pre>
* 字段名分账个人姓名
* 变量名receiver_name
* 是否必填
* 类型string10240
* 描述
* 可选项在接收方类型为个人的时可选填若有值会检查与 receiver_name 是否实名匹配不匹配会拒绝分账请求
* 1分账接收方类型是PERSONAL_OPENID时是个人姓名的密文选传传则校验 此字段的加密方法详见敏感信息加密说明
* 2使用微信支付平台证书中的公钥
* 3使用RSAES-OAEP算法进行加密
* 4将请求中HTTP头部的Wechatpay-Serial设置为证书序列号
* 示例值hu89ohu89ohu89o
* </pre>
*/
@SerializedName(value = "receiver_name")
private String receiverName;
}
}

View File

@ -0,0 +1,71 @@
package com.github.binarywang.wxpay.bean.ecommerce;
import com.google.gson.annotations.SerializedName;
import java.io.Serializable;
/**
* 请求分账 结果响应
* @author: f00lish
* @date: 2020/09/12
*/
public class ProfitSharingResult implements Serializable {
private static final long serialVersionUID = 9026456165403642050L;
/**
* <pre>
* 字段名二级商户号
* 变量名sub_mchid
* 是否必填
* 类型string32
* 描述
* 分账出资的电商平台二级商户填写微信支付分配的商户号
* 示例值1900000109
* </pre>
*/
@SerializedName(value = "sub_mchid")
private String subMchid;
/**
* <pre>
* 字段名微信订单号
* 变量名transaction_id
* 是否必填
* 类型string32
* 描述
* 微信支付订单号
* 示例值4208450740201411110007820472
* </pre>
*/
@SerializedName(value = "transaction_id")
private String transactionId;
/**
* <pre>
* 字段名商户分账单号
* 变量名out_order_no
* 是否必填
* 类型string64
* 描述
* 商户系统内部的分账单号在商户系统内部唯一单次分账多次分账完结分账应使用不同的商户分账单号同一分账单号多次请求等同一次
* 示例值P20150806125346
* </pre>
*/
@SerializedName(value = "out_order_no")
private String outOrderNo;
/**
* <pre>
* 字段名微信分账单号
* 变量名order_id
* 是否必填
* 类型string (64)
* 描述
* 微信分账单号微信系统返回的唯一标识
* 示例值6754760740201411110007865434
* </pre>
*/
@SerializedName(value = "order_id")
private String orderId;
}

View File

@ -174,4 +174,16 @@ public interface EcommerceService {
* @return 返回数据
*/
FundBalanceResult subDayEndBalance(String subMchid, String date) throws WxPayException;
/**
* <pre>
* 请求分账API
* 文档地址: https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/ecommerce/profitsharing/chapter3_1.shtml
* </pre>
*
* @param request 分账请求
* @return 返回数据
*/
ProfitSharingResult profitSharing(ProfitSharingRequest request) throws WxPayException;
}

View File

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