合单支付

This commit is contained in:
felord.cn
2020-12-13 20:29:56 +08:00
parent 6fe24b770a
commit 9c186818cd
7 changed files with 265 additions and 2 deletions

View File

@@ -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;

View File

@@ -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);
}
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}