diff --git a/payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/enumeration/WechatPayV3Type.java b/payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/enumeration/WechatPayV3Type.java index 2653956..c58ce5c 100644 --- a/payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/enumeration/WechatPayV3Type.java +++ b/payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/enumeration/WechatPayV3Type.java @@ -17,7 +17,7 @@ public enum WechatPayV3Type { /** * 文件下载 */ - FILE_DOWNLOAD(HttpMethod.GET,"%s/v3/billdownload/file"), + FILE_DOWNLOAD(HttpMethod.GET, "%s/v3/billdownload/file"), /** * 微信公众号支付或者小程序支付. @@ -34,11 +34,6 @@ public enum WechatPayV3Type { */ APP(HttpMethod.POST, "%s/v3/pay/transactions/app"), - /** - * 合单下单-APP支付API. - */ - COMBINE_APP(HttpMethod.POST, "%s/v3/combine-transactions/app"), - /** * H5支付. */ @@ -57,27 +52,55 @@ public enum WechatPayV3Type { TRANSACTION_OUT_TRADE_NO(HttpMethod.GET, "%s/v3/pay/transactions/out-trade-no/{out_trade_no}"), + /** + * 合单下单-APP支付API. + */ + COMBINE_APP(HttpMethod.POST, "%s/v3/combine-transactions/app"), + + /** + * 合单下单-微信公众号支付或者小程序支付. + */ + COMBINE_JSAPI(HttpMethod.POST, "%s/v3/pay/combine-transactions/jsapi"), + /** + * 合单下单-H5支付API. + */ + COMBINE_MWEB(HttpMethod.POST, "%s/v3/pay/combine-transactions/h5"), + /** + * 合单下单-Native支付API. /v3/combine-transactions/out-trade-no/{combine_out_trade_no} + */ + COMBINE_NATIVE(HttpMethod.POST, "%s/v3/pay/combine-transactions/native"), + /** + * 合单查询订单API. + */ + COMBINE_TRANSACTION_OUT_TRADE_NO(HttpMethod.GET, "%s/v3/combine-transactions/out-trade-no/{combine_out_trade_no}"), + + /** + * 合单关闭订单API. + */ + COMBINE_CLOSE(HttpMethod.POST, "%s/v3/combine-transactions/out-trade-no/{combine_out_trade_no}/close"), + + /** * 创建代金券批次API. */ - MARKETING_FAVOR_STOCKS_COUPON_STOCKS(HttpMethod.POST,"%s/v3/marketing/favor/coupon-stocks"), + MARKETING_FAVOR_STOCKS_COUPON_STOCKS(HttpMethod.POST, "%s/v3/marketing/favor/coupon-stocks"), /** * 激活代金券批次API. */ - MARKETING_FAVOR_STOCKS_START(HttpMethod.POST,"%s/v3/marketing/favor/stocks/{stock_id}/start"), + MARKETING_FAVOR_STOCKS_START(HttpMethod.POST, "%s/v3/marketing/favor/stocks/{stock_id}/start"), /** * 暂停代金券批次API. */ - MARKETING_FAVOR_STOCKS_PAUSE(HttpMethod.POST,"%s/v3/marketing/favor/stocks/{stock_id}/pause"), + MARKETING_FAVOR_STOCKS_PAUSE(HttpMethod.POST, "%s/v3/marketing/favor/stocks/{stock_id}/pause"), /** * 发放代金券API、根据商户号查用户的券. */ - MARKETING_FAVOR_USERS_COUPONS(HttpMethod.POST,"%s/v3/marketing/favor/users/{openid}/coupons"), + MARKETING_FAVOR_USERS_COUPONS(HttpMethod.POST, "%s/v3/marketing/favor/users/{openid}/coupons"), /** * 重启代金券API. */ - MARKETING_FAVOR_STOCKS_RESTART(HttpMethod.POST,"%s/v3/marketing/favor/stocks/{stock_id}/restart"), + MARKETING_FAVOR_STOCKS_RESTART(HttpMethod.POST, "%s/v3/marketing/favor/stocks/{stock_id}/restart"), /** * 条件查询批次列表API. */ @@ -162,7 +185,7 @@ public enum WechatPayV3Type { * @return the string */ public String uri(WeChatServer weChatServer) { - return String.format(this.pattern,weChatServer.domain()); + return String.format(this.pattern, weChatServer.domain()); } } diff --git a/payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/v3/WechatApiProvider.java b/payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/v3/WechatApiProvider.java index e7de4c5..0a313c1 100644 --- a/payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/v3/WechatApiProvider.java +++ b/payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/v3/WechatApiProvider.java @@ -7,6 +7,9 @@ package cn.felord.payment.wechat.v3; * @since 1.0.0.RELEASE */ public class WechatApiProvider { + /** + * The Wechat pay client. + */ private final WechatPayClient wechatPayClient; /** @@ -24,8 +27,8 @@ public class WechatApiProvider { * @param tenantId the tenant id * @return the wechat marketing favor api */ - public WechatMarketingFavorApi favorApi(String tenantId){ - return new WechatMarketingFavorApi(this.wechatPayClient,tenantId); + public WechatMarketingFavorApi favorApi(String tenantId) { + return new WechatMarketingFavorApi(this.wechatPayClient, tenantId); } /** @@ -34,8 +37,18 @@ public class WechatApiProvider { * @param tenantId the tenant id * @return the wechat pay api */ - public WechatDirectPayApi directPayApi(String tenantId){ - return new WechatDirectPayApi(wechatPayClient,tenantId); + public WechatDirectPayApi directPayApi(String tenantId) { + return new WechatDirectPayApi(wechatPayClient, tenantId); + } + + /** + * 合单支付. + * + * @param tenantId the tenant id + * @return the wechat combine pay api + */ + public WechatCombinePayApi combinePayApi(String tenantId) { + return new WechatCombinePayApi(wechatPayClient, tenantId); } /** @@ -44,8 +57,8 @@ public class WechatApiProvider { * @param tenantId the tenant id * @return the wechat pay callback */ - public WechatPayCallback callback(String tenantId){ - return new WechatPayCallback(wechatPayClient.signatureProvider(),tenantId); + public WechatPayCallback callback(String tenantId) { + return new WechatPayCallback(wechatPayClient.signatureProvider(), tenantId); } } diff --git a/payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/v3/WechatCombinePayApi.java b/payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/v3/WechatCombinePayApi.java index bf13f97..5b219f0 100644 --- a/payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/v3/WechatCombinePayApi.java +++ b/payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/v3/WechatCombinePayApi.java @@ -3,6 +3,8 @@ 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.CombineCloseParams; +import cn.felord.payment.wechat.v3.model.combine.CombineH5PayParams; import cn.felord.payment.wechat.v3.model.combine.CombinePayParams; import com.fasterxml.jackson.databind.node.ObjectNode; import org.springframework.http.RequestEntity; @@ -40,7 +42,7 @@ public class WechatCombinePayApi extends AbstractApi{ */ public WechatResponseEntity appPay(CombinePayParams combinePayParams) { WechatResponseEntity wechatResponseEntity = new WechatResponseEntity<>(); - this.client().withType(WechatPayV3Type.APP, combinePayParams) + this.client().withType(WechatPayV3Type.COMBINE_APP, combinePayParams) .function(this::combinePayFunction) .consumer(wechatResponseEntity::convert) .request(); @@ -48,6 +50,26 @@ public class WechatCombinePayApi extends AbstractApi{ } + /** + * 合单下单-JSAPI支付/小程序支付API + *

+ * 使用合单支付接口,用户只输入一次密码,即可完成多个订单的支付。目前最多一次可支持50笔订单进行合单支付。 + *

+ * 注意: + * • 订单如果需要进行抽佣等,需要在合单中指定需要进行分账(profit_sharing为true);指定后,交易资金进入二级商户账户,处于冻结状态,可在后续使用分账接口进行分账,利用分账完结进行资金解冻,实现抽佣和对二级商户的账期。 + * + * @param combinePayParams the combine pay params + * @return wechat response entity + */ + public WechatResponseEntity jsPay(CombinePayParams combinePayParams) { + WechatResponseEntity wechatResponseEntity = new WechatResponseEntity<>(); + this.client().withType(WechatPayV3Type.COMBINE_JSAPI, combinePayParams) + .function(this::combinePayFunction) + .consumer(wechatResponseEntity::convert) + .request(); + return wechatResponseEntity; + } + /** * Combine pay function request entity. * @@ -68,4 +90,107 @@ public class WechatCombinePayApi extends AbstractApi{ return Post(uri, params); } + /** + * 合单下单-H5支付API. + *

+ * 使用合单支付接口,用户只输入一次密码,即可完成多个订单的支付。目前最多一次可支持50笔订单进行合单支付。 + *

+ * 注意: + * • 订单如果需要进行抽佣等,需要在合单中指定需要进行分账(profit_sharing为true);指定后,交易资金进入二级商户账户,处于冻结状态,可在后续使用分账接口进行分账,利用分账完结进行资金解冻,实现抽佣和对二级商户的账期。 + * + * @param combineH5PayParams the combine h 5 pay params + * @return the wechat response entity + */ + public WechatResponseEntity h5Pay(CombineH5PayParams combineH5PayParams) { + WechatResponseEntity wechatResponseEntity = new WechatResponseEntity<>(); + this.client().withType(WechatPayV3Type.COMBINE_MWEB, combineH5PayParams) + .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, CombineH5PayParams 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); + } + + /** + * 合单下单-Native支付API. + *

+ * 使用合单支付接口,用户只输入一次密码,即可完成多个订单的支付。目前最多一次可支持50笔订单进行合单支付。 + *

+ * 注意: + * • 订单如果需要进行抽佣等,需要在合单中指定需要进行分账(profit_sharing为true);指定后,交易资金进入二级商户账户,处于冻结状态,可在后续使用分账接口进行分账,利用分账完结进行资金解冻,实现抽佣和对二级商户的账期。 + * + * @param combinePayParams the combine pay params + * @return the wechat response entity + */ + public WechatResponseEntity nativePay(CombinePayParams combinePayParams) { + WechatResponseEntity wechatResponseEntity = new WechatResponseEntity<>(); + this.client().withType(WechatPayV3Type.COMBINE_NATIVE, combinePayParams) + .function(this::combinePayFunction) + .consumer(wechatResponseEntity::convert) + .request(); + return wechatResponseEntity; + } + + /** + * 合单查询订单API. + * + * @param combineOutTradeNo the combine out trade no + * @return the wechat response entity + */ + public WechatResponseEntity queryTransactionByOutTradeNo(String combineOutTradeNo) { + WechatResponseEntity wechatResponseEntity = new WechatResponseEntity<>(); + this.client().withType(WechatPayV3Type.COMBINE_TRANSACTION_OUT_TRADE_NO, combineOutTradeNo) + .function((wechatPayV3Type, outTradeNo) -> { + URI uri = UriComponentsBuilder.fromHttpUrl(wechatPayV3Type.uri(WeChatServer.CHINA)) + .build() + .expand(outTradeNo) + .toUri(); + return Get(uri); + }) + .consumer(wechatResponseEntity::convert) + .request(); + return wechatResponseEntity; + } + + /** + * 合单关闭订单API. + *

+ * 合单支付订单只能使用此合单关单api完成关单。 + * + * 微信服务器返回 204。 + * + * @param combineCloseParams the combine close params + * @return the wechat response entity + */ + public WechatResponseEntity close(CombineCloseParams combineCloseParams) { + WechatResponseEntity wechatResponseEntity = new WechatResponseEntity<>(); + this.client().withType(WechatPayV3Type.COMBINE_NATIVE, combineCloseParams) + .function((wechatPayV3Type, params) -> { + URI uri = UriComponentsBuilder.fromHttpUrl(wechatPayV3Type.uri(WeChatServer.CHINA)) + .build().toUri(); + return Post(uri,params); + }) + .consumer(wechatResponseEntity::convert) + .request(); + return wechatResponseEntity; + } } diff --git a/payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/v3/WechatPayCallback.java b/payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/v3/WechatPayCallback.java index d632f4d..0854378 100644 --- a/payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/v3/WechatPayCallback.java +++ b/payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/v3/WechatPayCallback.java @@ -1,10 +1,7 @@ package cn.felord.payment.wechat.v3; -import cn.felord.payment.wechat.v3.model.CouponConsumeData; -import cn.felord.payment.wechat.v3.model.ResponseSignVerifyParams; import cn.felord.payment.PayException; -import cn.felord.payment.wechat.v3.model.CallbackParams; -import cn.felord.payment.wechat.v3.model.TransactionConsumeData; +import cn.felord.payment.wechat.v3.model.*; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.PropertyNamingStrategy; @@ -26,8 +23,17 @@ import java.util.function.Consumer; */ @Slf4j public class WechatPayCallback { + /** + * The constant MAPPER. + */ private static final ObjectMapper MAPPER = new ObjectMapper(); + /** + * The Signature provider. + */ private final SignatureProvider signatureProvider; + /** + * The Tenant id. + */ private final String tenantId; static { @@ -72,20 +78,44 @@ public class WechatPayCallback { *

* 无需开发者判断,只有扣款成功微信才会回调此接口 * - * @param params the params - * @param couponConsumeDataConsumer the coupon consume data consumer + * @param params the params + * @param transactionConsumeDataConsumer the transaction consume data consumer * @return the map */ @SneakyThrows - public Map transactionCallback(ResponseSignVerifyParams params, Consumer couponConsumeDataConsumer) { + public Map transactionCallback(ResponseSignVerifyParams params, Consumer transactionConsumeDataConsumer) { String data = callback(params, EventType.TRANSACTION); TransactionConsumeData transactionConsumeData = MAPPER.readValue(data, TransactionConsumeData.class); - couponConsumeDataConsumer.accept(transactionConsumeData); + transactionConsumeDataConsumer.accept(transactionConsumeData); return Collections.singletonMap("code", "SUCCESS"); } + /** + * 微信合单支付成功回调. + *

+ * 无需开发者判断,只有扣款成功微信才会回调此接口 + * + * @param params the params + * @param combineTransactionConsumeDataConsumer the combine transaction consume data consumer + * @return the map + */ + @SneakyThrows + public Map combineTransactionCallback(ResponseSignVerifyParams params, Consumer combineTransactionConsumeDataConsumer) { + String data = callback(params, EventType.TRANSACTION); + CombineTransactionConsumeData combineTransactionConsumeData = MAPPER.readValue(data, CombineTransactionConsumeData.class); + combineTransactionConsumeDataConsumer.accept(combineTransactionConsumeData); + return Collections.singletonMap("code", "SUCCESS"); + } + + /** + * Callback string. + * + * @param params the params + * @param eventType the event type + * @return the string + */ @SneakyThrows private String callback(ResponseSignVerifyParams params, EventType eventType) { if (signatureProvider.responseSignVerify(params)) { @@ -122,8 +152,16 @@ public class WechatPayCallback { */ TRANSACTION("TRANSACTION.SUCCESS"); + /** + * The Event. + */ private final String event; + /** + * Instantiates a new Event type. + * + * @param event the event + */ EventType(String event) { this.event = event; } diff --git a/payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/v3/WechatPayClient.java b/payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/v3/WechatPayClient.java index ba463fa..6b1b930 100644 --- a/payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/v3/WechatPayClient.java +++ b/payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/v3/WechatPayClient.java @@ -219,10 +219,7 @@ public class WechatPayClient { ObjectNode body = responseEntity.getBody(); HttpStatus statusCode = responseEntity.getStatusCode(); if (!statusCode.is2xxSuccessful()) { - throw new PayException("wechat pay server error,statusCode "+ statusCode +",result : " + body); - } - if (Objects.isNull(body)) { - throw new PayException("cant obtain wechat response body"); + throw new PayException("wechat pay server error,statusCode " + statusCode + ",result : " + body); } ResponseSignVerifyParams params = new ResponseSignVerifyParams(); @@ -235,7 +232,9 @@ public class WechatPayClient { //构造验签名串 params.setWechatpayTimestamp(headers.getFirst("Wechatpay-Timestamp")); params.setWechatpayNonce(headers.getFirst("Wechatpay-Nonce")); - params.setBody(body.toString()); + + String content = Objects.isNull(body) ? "" : body.toString(); + params.setBody(content); // 验证微信服务器签名 if (signatureProvider.responseSignVerify(params)) { @@ -263,12 +262,12 @@ public class WechatPayClient { String body = responseEntity.getBody(); HttpStatus statusCode = responseEntity.getStatusCode(); if (!statusCode.is2xxSuccessful()) { - throw new PayException("wechat pay server error,statusCode "+ statusCode +",result : " + body); + throw new PayException("wechat pay server error,statusCode " + statusCode + ",result : " + body); } if (Objects.isNull(body)) { throw new PayException("cant obtain wechat response body"); } - return body; + return body; } } diff --git a/payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/v3/model/CombineTransactionConsumeData.java b/payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/v3/model/CombineTransactionConsumeData.java new file mode 100644 index 0000000..4da8137 --- /dev/null +++ b/payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/v3/model/CombineTransactionConsumeData.java @@ -0,0 +1,137 @@ + +package cn.felord.payment.wechat.v3.model; + +import cn.felord.payment.wechat.v3.model.combine.CombinePayerInfo; +import lombok.Data; + +import java.util.List; + + +/** + * 合单支付回调解密数据. + * + * @author felord.cn + * @since 1.0.0.RELEASE + */ +@Data +public class CombineTransactionConsumeData { + + /** + * 合单商户appid. + */ + private String combineAppid; + + /** + * 合单商户号. + */ + private String combineMchid; + + /** + * 合单商户订单号. + */ + private String combineOutTradeNo; + + /** + * 支付者. + */ + private CombinePayerInfo combinePayerInfo; + + /** + * 场景信息,合单支付回调只返回device_id + */ + private SceneInfo sceneInfo; + + /** + * 合单支付回调子订单. + */ + private List subOrders; + + /** + * 合单支付回调子订单. + * + * @author felord.cn + * @since 1.0.0.RELEASE + */ + @Data + public static class SubOrderCallback { + + + /** + * The Amount. + */ + private CombineAmount amount; + + /** + * The Attach. + */ + private String attach; + + /** + * The Bank type. + */ + private String bankType; + + /** + * The Mchid. + */ + private String mchid; + + /** + * The Out trade no. + */ + private String outTradeNo; + + /** + * The Sub mchid. + */ + private String subMchid; + + /** + * The Success time. + */ + private String successTime; + + /** + * The Trade state. + */ + private String tradeState; + + /** + * The Trade type. + */ + private String tradeType; + + /** + * The Transaction id. + */ + private String transactionId; + + } + + /** + * 订单金额信息. + * + * @author felord.cn + * @since 1.0.0.RELEASE + */ + @Data + public static class CombineAmount{ + /** + * 标价金额,单位为分. + */ + private Long totalAmount; + /** + * 标价币种. + */ + private String currency; + /** + * 现金支付金额. + */ + private Long payerAmount; + /** + * 现金支付币种. + */ + private String payerCurrency; + } + +} diff --git a/payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/v3/model/combine/CombineCloseParams.java b/payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/v3/model/combine/CombineCloseParams.java new file mode 100644 index 0000000..ec57d31 --- /dev/null +++ b/payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/v3/model/combine/CombineCloseParams.java @@ -0,0 +1,56 @@ +package cn.felord.payment.wechat.v3.model.combine; + +import lombok.Data; + +import java.util.List; + +/** + * 合单支付 关单参数. + * + * @author felord.cn + * @since 1.0.0.RELEASE + */ +@Data +public class CombineCloseParams { + /** + * 合单商户appid,必填 + */ + private String combineAppid; + /** + * 合单商户订单号,必填,商户侧需要保证同一商户下唯一 + */ + private String combineOutTradeNo; + /** + * 子单信息,必填,最多50单 + */ + private List subOrders; + + /** + * 关单-子单信息,最多50单. + * + * @author felord.cn + * @since 1.0.0.RELEASE + */ + @Data + public static class ClosingSubOrder { + /** + * 子单发起方商户号,必填,必须与发起方appid有绑定关系。 + */ + private String mchid; + + /** + * 子单商户订单号,必填,商户系统内部订单号,要求32个字符内,只能是数字、大小写字母_-|*@ ,且在同一个商户号下唯一。 + */ + private String outTradeNo; + + /** + * 二级商户商户号,由微信支付生成并下发。 + *

+ * 服务商子商户的商户号,被合单方。 + *

+ * 直连商户不用传二级商户号。 + */ + private String subMchid; + + } +} diff --git a/payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/v3/model/combine/CombineH5PayParams.java b/payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/v3/model/combine/CombineH5PayParams.java new file mode 100644 index 0000000..1b29817 --- /dev/null +++ b/payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/v3/model/combine/CombineH5PayParams.java @@ -0,0 +1,60 @@ + +package cn.felord.payment.wechat.v3.model.combine; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.time.OffsetDateTime; +import java.util.List; + +/** + * 合单支付 H5支付参数. + * + * @author felord.cn + * @since 1.0.0.RELEASE + */ +@Data +public class CombineH5PayParams { + + /** + * 合单商户appid,必填 + */ + private String combineAppid; + /** + * 合单商户号,必填 + */ + private String combineMchid; + /** + * 合单商户订单号,必填,商户侧需要保证同一商户下唯一 + */ + private String combineOutTradeNo; + /** + * 合单支付者信息,选填 + */ + private CombinePayerInfo combinePayerInfo; + /** + * 通知地址,必填,接收微信支付异步通知回调地址,通知url必须为直接可访问的URL,不能携带参数。 + *

+ * 合单支付需要独立的通知地址。 + */ + private String notifyUrl; + /** + * 合单支付场景信息描述,选填 + */ + private CombineH5SceneInfo sceneInfo; + /** + * 子单信息,必填,最多50单 + */ + private List subOrders; + /** + * 交易起始时间,选填 + */ + @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "GMT+8") + private OffsetDateTime timeStart; + /** + * 交易结束时间,选填 + */ + @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "GMT+8") + private OffsetDateTime timeExpire; + +} diff --git a/payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/v3/model/combine/CombineH5SceneInfo.java b/payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/v3/model/combine/CombineH5SceneInfo.java new file mode 100644 index 0000000..a97b294 --- /dev/null +++ b/payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/v3/model/combine/CombineH5SceneInfo.java @@ -0,0 +1,11 @@ +package cn.felord.payment.wechat.v3.model.combine; + +import cn.felord.payment.wechat.v3.model.H5Info; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class CombineH5SceneInfo extends CombineSceneInfo { + private H5Info h5Info; +} diff --git a/payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/v3/model/combine/CombinePayParams.java b/payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/v3/model/combine/CombinePayParams.java index ec0d6e2..0e23334 100644 --- a/payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/v3/model/combine/CombinePayParams.java +++ b/payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/v3/model/combine/CombinePayParams.java @@ -1,14 +1,14 @@ package cn.felord.payment.wechat.v3.model.combine; -import cn.felord.payment.wechat.v3.model.SettleInfo; +import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import java.time.OffsetDateTime; import java.util.List; /** - * 合单支付参数. + * 合单支付 APP支付、JSAPI支付、小程序支付、Native支付参数. * * @author felord.cn * @since 1.0.0.RELEASE @@ -46,17 +46,15 @@ public class CombinePayParams { * 子单信息,必填,最多50单 */ private List subOrders; - /** - * 结算信息,选填 - */ - private SettleInfo settleInfo; /** * 交易起始时间,选填 */ + @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "GMT+8") private OffsetDateTime timeStart; /** * 交易结束时间,选填 */ + @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "GMT+8") private OffsetDateTime timeExpire; } diff --git a/payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/v3/model/combine/SubOrder.java b/payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/v3/model/combine/SubOrder.java index ccd2a7b..786ba07 100644 --- a/payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/v3/model/combine/SubOrder.java +++ b/payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/v3/model/combine/SubOrder.java @@ -1,6 +1,7 @@ package cn.felord.payment.wechat.v3.model.combine; +import cn.felord.payment.wechat.v3.model.SettleInfo; import lombok.Data; /** @@ -45,5 +46,9 @@ public class SubOrder { */ private String subMchid; + /** + * 结算信息,选填 + */ + private SettleInfo settleInfo; }