mirror of
https://github.com/dromara/payment-spring-boot.git
synced 2026-03-13 21:33:41 +08:00
合单支付
This commit is contained in:
@@ -34,6 +34,11 @@ public enum WechatPayV3Type {
|
||||
*/
|
||||
APP(HttpMethod.POST, "%s/v3/pay/transactions/app"),
|
||||
|
||||
/**
|
||||
* 合单下单-APP支付API.
|
||||
*/
|
||||
COMBINE_APP(HttpMethod.POST, "%s/v3/combine-transactions/app"),
|
||||
|
||||
/**
|
||||
* H5支付.
|
||||
*/
|
||||
@@ -111,11 +116,21 @@ public enum WechatPayV3Type {
|
||||
MARKETING_FAVOR_CALLBACKS(HttpMethod.POST, "%s/v3/marketing/favor/callbacks");
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* The Pattern.
|
||||
*/
|
||||
private final String pattern;
|
||||
/**
|
||||
* The Method.
|
||||
*/
|
||||
private final HttpMethod method;
|
||||
|
||||
/**
|
||||
* Instantiates a new Wechat pay v 3 type.
|
||||
*
|
||||
* @param method the method
|
||||
* @param pattern the pattern
|
||||
*/
|
||||
WechatPayV3Type(HttpMethod method, String pattern) {
|
||||
this.method = method;
|
||||
this.pattern = pattern;
|
||||
|
||||
@@ -0,0 +1,71 @@
|
||||
package cn.felord.payment.wechat.v3;
|
||||
|
||||
import cn.felord.payment.wechat.WechatPayProperties;
|
||||
import cn.felord.payment.wechat.enumeration.WeChatServer;
|
||||
import cn.felord.payment.wechat.enumeration.WechatPayV3Type;
|
||||
import cn.felord.payment.wechat.v3.model.combine.CombinePayParams;
|
||||
import com.fasterxml.jackson.databind.node.ObjectNode;
|
||||
import org.springframework.http.RequestEntity;
|
||||
import org.springframework.web.util.UriComponentsBuilder;
|
||||
|
||||
import java.net.URI;
|
||||
|
||||
/**
|
||||
* 微信合单支付.
|
||||
*
|
||||
* @author felord.cn
|
||||
* @since 1.0.0.RELEASE
|
||||
*/
|
||||
public class WechatCombinePayApi extends AbstractApi{
|
||||
/**
|
||||
* Instantiates a new Abstract api.
|
||||
*
|
||||
* @param wechatPayClient the wechat pay client
|
||||
* @param tenantId the tenant id
|
||||
*/
|
||||
public WechatCombinePayApi(WechatPayClient wechatPayClient, String tenantId) {
|
||||
super(wechatPayClient, tenantId);
|
||||
}
|
||||
|
||||
/**
|
||||
* 合单下单-APP支付API
|
||||
* <p>
|
||||
* 使用合单支付接口,用户只输入一次密码,即可完成多个订单的支付。目前最多一次可支持50笔订单进行合单支付。
|
||||
* <p>
|
||||
* 注意:
|
||||
* • 订单如果需要进行抽佣等,需要在合单中指定需要进行分账(profit_sharing为true);指定后,交易资金进入二级商户账户,处于冻结状态,可在后续使用分账接口进行分账,利用分账完结进行资金解冻,实现抽佣和对二级商户的账期。
|
||||
*
|
||||
* @param combinePayParams the combine pay params
|
||||
* @return the wechat response entity
|
||||
*/
|
||||
public WechatResponseEntity<ObjectNode> appPay(CombinePayParams combinePayParams) {
|
||||
WechatResponseEntity<ObjectNode> wechatResponseEntity = new WechatResponseEntity<>();
|
||||
this.client().withType(WechatPayV3Type.APP, combinePayParams)
|
||||
.function(this::combinePayFunction)
|
||||
.consumer(wechatResponseEntity::convert)
|
||||
.request();
|
||||
return wechatResponseEntity;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Combine pay function request entity.
|
||||
*
|
||||
* @param type the type
|
||||
* @param params the params
|
||||
* @return the request entity
|
||||
*/
|
||||
private RequestEntity<?> combinePayFunction(WechatPayV3Type type, CombinePayParams params) {
|
||||
WechatPayProperties.V3 v3 = this.wechatMetaBean().getV3();
|
||||
params.setCombineAppid(v3.getAppId());
|
||||
params.setCombineMchid(v3.getMchId());
|
||||
|
||||
String notifyUrl = v3.getDomain().concat(params.getNotifyUrl());
|
||||
params.setNotifyUrl(notifyUrl);
|
||||
URI uri = UriComponentsBuilder.fromHttpUrl(type.uri(WeChatServer.CHINA))
|
||||
.build()
|
||||
.toUri();
|
||||
return Post(uri, params);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
|
||||
package cn.felord.payment.wechat.v3.model.combine;
|
||||
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* 合单支付订单金额信息.
|
||||
*
|
||||
* @author felord.cn
|
||||
* @since 1.0.0.RELEASE
|
||||
*/
|
||||
@Data
|
||||
public class CombineAmount {
|
||||
/**
|
||||
* 符合ISO 4217标准的三位字母代码,必填,人民币:CNY 。
|
||||
*/
|
||||
private String currency = "CNY";
|
||||
/**
|
||||
* 子单金额,单位为分,必填
|
||||
* <p>
|
||||
* 境外场景下,标价金额要超过商户结算币种的最小单位金额,例如结算币种为美元,则标价金额必须大于1美分
|
||||
*/
|
||||
private Long totalAmount;
|
||||
}
|
||||
@@ -0,0 +1,62 @@
|
||||
|
||||
package cn.felord.payment.wechat.v3.model.combine;
|
||||
|
||||
import cn.felord.payment.wechat.v3.model.SettleInfo;
|
||||
import lombok.Data;
|
||||
|
||||
import java.time.OffsetDateTime;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 合单支付参数.
|
||||
*
|
||||
* @author felord.cn
|
||||
* @since 1.0.0.RELEASE
|
||||
*/
|
||||
@Data
|
||||
public class CombinePayParams {
|
||||
|
||||
/**
|
||||
* 合单商户appid,必填
|
||||
*/
|
||||
private String combineAppid;
|
||||
/**
|
||||
* 合单商户号,必填
|
||||
*/
|
||||
private String combineMchid;
|
||||
/**
|
||||
* 合单商户订单号,必填,商户侧需要保证同一商户下唯一
|
||||
*/
|
||||
private String combineOutTradeNo;
|
||||
/**
|
||||
* 合单支付者信息,选填
|
||||
*/
|
||||
private CombinePayerInfo combinePayerInfo;
|
||||
/**
|
||||
* 通知地址,必填,接收微信支付异步通知回调地址,通知url必须为直接可访问的URL,不能携带参数。
|
||||
* <p>
|
||||
* <strong>合单支付需要独立的通知地址。</strong>
|
||||
*/
|
||||
private String notifyUrl;
|
||||
/**
|
||||
* 合单支付场景信息描述,选填
|
||||
*/
|
||||
private CombineSceneInfo sceneInfo;
|
||||
/**
|
||||
* 子单信息,必填,最多50单
|
||||
*/
|
||||
private List<SubOrder> subOrders;
|
||||
/**
|
||||
* 结算信息,选填
|
||||
*/
|
||||
private SettleInfo settleInfo;
|
||||
/**
|
||||
* 交易起始时间,选填
|
||||
*/
|
||||
private OffsetDateTime timeStart;
|
||||
/**
|
||||
* 交易结束时间,选填
|
||||
*/
|
||||
private OffsetDateTime timeExpire;
|
||||
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
|
||||
package cn.felord.payment.wechat.v3.model.combine;
|
||||
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* 合单支付,支付者信息.
|
||||
*
|
||||
* @author felord.cn
|
||||
* @since 1.0.0.RELEASE
|
||||
*/
|
||||
@Data
|
||||
public class CombinePayerInfo {
|
||||
/**
|
||||
* 使用合单appid获取的对应用户openid。是用户在商户appid下的唯一标识。
|
||||
*/
|
||||
private String openid;
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
|
||||
package cn.felord.payment.wechat.v3.model.combine;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* 合单支付场景信息.
|
||||
*
|
||||
* @author felord.cn
|
||||
* @since 1.0.0.RELEASE
|
||||
*/
|
||||
@Data
|
||||
public class CombineSceneInfo {
|
||||
/**
|
||||
* 商户设备号,选填。
|
||||
*/
|
||||
private String deviceId;
|
||||
/**
|
||||
* 用户终端ip,必填。
|
||||
*/
|
||||
private String payerClientIp;
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
|
||||
package cn.felord.payment.wechat.v3.model.combine;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* 子单信息,最多50单.
|
||||
*
|
||||
* @author felord.cn
|
||||
* @since 1.0.0.RELEASE
|
||||
*/
|
||||
@Data
|
||||
public class SubOrder {
|
||||
/**
|
||||
* 合单支付订单金额信息,必填。
|
||||
*/
|
||||
private CombineAmount amount;
|
||||
|
||||
/**
|
||||
* 附加数据,必填,在查询API和支付通知中原样返回,可作为自定义参数使用。
|
||||
*/
|
||||
private String attach;
|
||||
|
||||
/**
|
||||
* 商品描述,必填,需传入应用市场上的APP名字-实际商品名称,例如:天天爱消除-游戏充值。
|
||||
*/
|
||||
private String description;
|
||||
|
||||
/**
|
||||
* 子单发起方商户号,必填,必须与发起方appid有绑定关系。
|
||||
*/
|
||||
private String mchid;
|
||||
|
||||
/**
|
||||
* 子单商户订单号,必填,商户系统内部订单号,要求32个字符内,只能是数字、大小写字母_-|*@ ,且在同一个商户号下唯一。
|
||||
*/
|
||||
private String outTradeNo;
|
||||
|
||||
/**
|
||||
* 二级商户商户号,由微信支付生成并下发。
|
||||
* <p>
|
||||
* 服务商子商户的商户号,被合单方。
|
||||
* <p>
|
||||
* 直连商户不用传二级商户号。
|
||||
*/
|
||||
private String subMchid;
|
||||
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user