mirror of
https://github.com/dromara/payment-spring-boot.git
synced 2026-03-20 09:23:41 +08:00
微信先享卡回调
This commit is contained in:
@@ -0,0 +1,18 @@
|
|||||||
|
package cn.felord.payment.wechat.enumeration;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 目标完成类型、优惠使用类型
|
||||||
|
*
|
||||||
|
* @author felord.cn
|
||||||
|
* @since 1.0.2.RELEASE
|
||||||
|
*/
|
||||||
|
public enum StrategyType {
|
||||||
|
/**
|
||||||
|
* 增加数量,表示用户发生了履约行为
|
||||||
|
*/
|
||||||
|
INCREASE,
|
||||||
|
/**
|
||||||
|
* 减少数量,表示取消用户的履约行为(例如用户取消购买、退货退款等)
|
||||||
|
*/
|
||||||
|
DECREASE
|
||||||
|
}
|
||||||
@@ -6,7 +6,7 @@ import cn.felord.payment.wechat.v3.model.CouponConsumeData;
|
|||||||
import cn.felord.payment.wechat.v3.model.ResponseSignVerifyParams;
|
import cn.felord.payment.wechat.v3.model.ResponseSignVerifyParams;
|
||||||
import cn.felord.payment.wechat.v3.model.TransactionConsumeData;
|
import cn.felord.payment.wechat.v3.model.TransactionConsumeData;
|
||||||
import cn.felord.payment.wechat.v3.model.combine.CombineTransactionConsumeData;
|
import cn.felord.payment.wechat.v3.model.combine.CombineTransactionConsumeData;
|
||||||
import cn.felord.payment.wechat.v3.model.discountcard.DiscountCardAcceptedConsumeData;
|
import cn.felord.payment.wechat.v3.model.discountcard.*;
|
||||||
import cn.felord.payment.wechat.v3.model.payscore.PayScoreUserConfirmConsumeData;
|
import cn.felord.payment.wechat.v3.model.payscore.PayScoreUserConfirmConsumeData;
|
||||||
import cn.felord.payment.wechat.v3.model.payscore.PayScoreUserPaidConsumeData;
|
import cn.felord.payment.wechat.v3.model.payscore.PayScoreUserPaidConsumeData;
|
||||||
import cn.felord.payment.wechat.v3.model.payscore.PayScoreUserPermissionConsumeData;
|
import cn.felord.payment.wechat.v3.model.payscore.PayScoreUserPermissionConsumeData;
|
||||||
@@ -27,6 +27,8 @@ import java.util.function.Consumer;
|
|||||||
/**
|
/**
|
||||||
* 微信支付回调工具.
|
* 微信支付回调工具.
|
||||||
* <p>
|
* <p>
|
||||||
|
* 注意:<strong>开发者应该保证回调调用的幂等性</strong>
|
||||||
|
* <p>
|
||||||
* 支付通知http应答码为200或204才会当作正常接收,当回调处理异常时,应答的HTTP状态码应为500,或者4xx。
|
* 支付通知http应答码为200或204才会当作正常接收,当回调处理异常时,应答的HTTP状态码应为500,或者4xx。
|
||||||
*
|
*
|
||||||
* @author felord.cn
|
* @author felord.cn
|
||||||
@@ -123,40 +125,34 @@ public class WechatPayCallback {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 微信支付分确认订单回调通知.
|
* 微信支付分确认订单、支付成功回调通知.
|
||||||
* <p>
|
* <p>
|
||||||
* 该链接是通过商户[创建支付分订单]提交notify_url参数,必须为https协议。如果链接无法访问,商户将无法接收到微信通知。 通知url必须为直接可访问的url,不能携带参数。示例: “https://pay.weixin.qq.com/wxpay/pay.action”
|
* 该链接是通过商户 <a target= "_blank" href= "https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/payscore/chapter3_1.shtml">创建支付分订单</a> 提交notify_url参数,必须为https协议。如果链接无法访问,商户将无法接收到微信通知。 通知url必须为直接可访问的url,不能携带参数。示例: “https://pay.weixin.qq.com/wxpay/pay.action”
|
||||||
*
|
*
|
||||||
* @param params the params
|
* @param params the params
|
||||||
* @param consumeDataConsumer the consume data consumer
|
* @param payScoreConsumer the pay score consumer
|
||||||
* @return the map
|
* @return the map
|
||||||
* @since 1.0.2.RELEASE
|
* @since 1.0.2.RELEASE
|
||||||
*/
|
*/
|
||||||
@SneakyThrows
|
@SneakyThrows
|
||||||
public Map<String, ?> payscoreUserConfirmCallback(ResponseSignVerifyParams params, Consumer<PayScoreUserConfirmConsumeData> consumeDataConsumer) {
|
public Map<String, ?> payscoreUserOrderCallback(ResponseSignVerifyParams params, PayScoreConsumer payScoreConsumer) {
|
||||||
String data = this.callback(params, EventType.PAYSCORE_USER_CONFIRM);
|
CallbackParams callbackParams = resolve(params);
|
||||||
PayScoreUserConfirmConsumeData consumeData = MAPPER.readValue(data, PayScoreUserConfirmConsumeData.class);
|
String eventType = callbackParams.getEventType();
|
||||||
consumeDataConsumer.accept(consumeData);
|
|
||||||
return Collections.singletonMap("code", "SUCCESS");
|
if (Objects.equals(eventType, EventType.PAYSCORE_USER_CONFIRM.event)) {
|
||||||
}
|
String data = this.decrypt(callbackParams);
|
||||||
|
PayScoreUserConfirmConsumeData confirmConsumeData = MAPPER.readValue(data, PayScoreUserConfirmConsumeData.class);
|
||||||
|
payScoreConsumer.getConfirmConsumeDataConsumer().accept(confirmConsumeData);
|
||||||
|
} else if (Objects.equals(eventType, EventType.PAYSCORE_USER_PAID.event)) {
|
||||||
|
String data = this.decrypt(callbackParams);
|
||||||
|
PayScoreUserPaidConsumeData paidConsumeData = MAPPER.readValue(data, PayScoreUserPaidConsumeData.class);
|
||||||
|
payScoreConsumer.getPaidConsumeDataConsumer().accept(paidConsumeData);
|
||||||
|
} else {
|
||||||
|
log.error("wechat pay event type is not matched, callbackParams {}", callbackParams);
|
||||||
|
throw new PayException(" wechat pay event type is not matched");
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 微信支付分支付成功回调通知API.
|
|
||||||
* <p>
|
|
||||||
* 请求URL:该链接是通过商户[创建支付分订单]提交notify_url参数,必须为https协议。如果链接无法访问,商户将无法接收到微信通知。 通知url必须为直接可访问的url,不能携带参数。示例: “https://pay.weixin.qq.com/wxpay/pay.action”
|
|
||||||
*
|
|
||||||
* @param params the params
|
|
||||||
* @param consumeDataConsumer the consume data consumer
|
|
||||||
* @return the map
|
|
||||||
* @since 1.0.2.RELEASE
|
|
||||||
*/
|
|
||||||
@SneakyThrows
|
|
||||||
public Map<String, ?> payscoreUserPaidCallback(ResponseSignVerifyParams params, Consumer<PayScoreUserPaidConsumeData> consumeDataConsumer) {
|
|
||||||
String data = this.callback(params, EventType.PAYSCORE_USER_PAID);
|
|
||||||
PayScoreUserPaidConsumeData consumeData = MAPPER.readValue(data, PayScoreUserPaidConsumeData.class);
|
|
||||||
consumeDataConsumer.accept(consumeData);
|
|
||||||
return Collections.singletonMap("code", "SUCCESS");
|
return Collections.singletonMap("code", "SUCCESS");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -192,20 +188,42 @@ public class WechatPayCallback {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Discount card user accepted callback map.
|
* 用户领卡、守约状态变化、扣费状态变化通知API
|
||||||
|
* <p>
|
||||||
|
* 用户领取优惠卡后或者用户守约状态发生变更后或扣费状态变化后,微信会把对应信息发送给商户。
|
||||||
|
* <p>
|
||||||
|
* 该链接是通过商户<a target= "_blank" href= "https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/discount-card/chapter3_1.shtml">预受理领卡请求</a>中提交notify_url参数,必须为https协议。如果链接无法访问,商户将无法接收到微信通知。 通知url必须为直接可访问的url,不能携带参数。示例: “https://pay.weixin.qq.com/wxpay/pay.action”
|
||||||
*
|
*
|
||||||
* @param params the params
|
* @param params the params
|
||||||
* @param consumeDataConsumer the consume data consumer
|
* @param discountCardConsumer the discount card consumer
|
||||||
* @return the map
|
* @return the map
|
||||||
*/
|
*/
|
||||||
@SneakyThrows
|
@SneakyThrows
|
||||||
public Map<String, ?> discountCardUserAcceptedCallback(ResponseSignVerifyParams params, Consumer<DiscountCardAcceptedConsumeData> consumeDataConsumer) {
|
public Map<String, ?> discountCardCallback(ResponseSignVerifyParams params, DiscountCardConsumer discountCardConsumer) {
|
||||||
String data = this.callback(params, EventType.DISCOUNT_CARD_USER_ACCEPTED);
|
|
||||||
DiscountCardAcceptedConsumeData consumeData = MAPPER.readValue(data, DiscountCardAcceptedConsumeData.class);
|
CallbackParams callbackParams = resolve(params);
|
||||||
consumeDataConsumer.accept(consumeData);
|
String eventType = callbackParams.getEventType();
|
||||||
|
|
||||||
|
if (Objects.equals(eventType, EventType.DISCOUNT_CARD_AGREEMENT_ENDED.event)) {
|
||||||
|
String data = this.decrypt(callbackParams);
|
||||||
|
DiscountCardAgreementEndConsumeData agreementEndConsumeData = MAPPER.readValue(data, DiscountCardAgreementEndConsumeData.class);
|
||||||
|
discountCardConsumer.getAgreementEndConsumeDataConsumer().accept(agreementEndConsumeData);
|
||||||
|
} else if (Objects.equals(eventType, EventType.DISCOUNT_CARD_USER_ACCEPTED.event)) {
|
||||||
|
String data = this.decrypt(callbackParams);
|
||||||
|
DiscountCardAcceptedConsumeData acceptedConsumeData = MAPPER.readValue(data, DiscountCardAcceptedConsumeData.class);
|
||||||
|
discountCardConsumer.getAcceptedConsumeDataConsumer().accept(acceptedConsumeData);
|
||||||
|
} else if (Objects.equals(eventType, EventType.DISCOUNT_CARD_USER_PAID.event)) {
|
||||||
|
String data = this.decrypt(callbackParams);
|
||||||
|
DiscountCardUserPaidConsumeData paidConsumeData = MAPPER.readValue(data, DiscountCardUserPaidConsumeData.class);
|
||||||
|
discountCardConsumer.getCardUserPaidConsumeDataConsumer().accept(paidConsumeData);
|
||||||
|
} else {
|
||||||
|
log.error("wechat pay event type is not matched, callbackParams {}", callbackParams);
|
||||||
|
throw new PayException(" wechat pay event type is not matched");
|
||||||
|
}
|
||||||
return Collections.singletonMap("code", "SUCCESS");
|
return Collections.singletonMap("code", "SUCCESS");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Callback.
|
* Callback.
|
||||||
*
|
*
|
||||||
@@ -301,14 +319,14 @@ public class WechatPayCallback {
|
|||||||
DISCOUNT_CARD_USER_ACCEPTED("DISCOUNT_CARD.USER_ACCEPTED"),
|
DISCOUNT_CARD_USER_ACCEPTED("DISCOUNT_CARD.USER_ACCEPTED"),
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TODO 微信先享卡守约状态变化事件.
|
* 微信先享卡守约状态变化事件.
|
||||||
*
|
*
|
||||||
* @since 1.0.2.RELEASE
|
* @since 1.0.2.RELEASE
|
||||||
*/
|
*/
|
||||||
DISCOUNT_CARD_AGREEMENT_ENDED("DISCOUNT_CARD.AGREEMENT_ENDED"),
|
DISCOUNT_CARD_AGREEMENT_ENDED("DISCOUNT_CARD.AGREEMENT_ENDED"),
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TODO 微信先享卡扣费状态变化事件.
|
* 微信先享卡扣费状态变化事件.
|
||||||
*
|
*
|
||||||
* @since 1.0.2.RELEASE
|
* @since 1.0.2.RELEASE
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -181,8 +181,7 @@ public class WechatPayClient {
|
|||||||
Assert.notNull(httpMethod, "httpMethod is required");
|
Assert.notNull(httpMethod, "httpMethod is required");
|
||||||
HttpHeaders headers = requestEntity.getHeaders();
|
HttpHeaders headers = requestEntity.getHeaders();
|
||||||
|
|
||||||
T entityBody = requestEntity.getBody();
|
String body = requestEntity.hasBody() ? Objects.requireNonNull(requestEntity.getBody()).toString() : "";
|
||||||
String body = requestEntity.hasBody() ? Objects.requireNonNull(entityBody).toString() : "";
|
|
||||||
if (WechatPayV3Type.MARKETING_IMAGE_UPLOAD.pattern().contains(canonicalUrl)) {
|
if (WechatPayV3Type.MARKETING_IMAGE_UPLOAD.pattern().contains(canonicalUrl)) {
|
||||||
body = Objects.requireNonNull(headers.get("Meta-Info")).get(0);
|
body = Objects.requireNonNull(headers.get("Meta-Info")).get(0);
|
||||||
}
|
}
|
||||||
@@ -193,7 +192,7 @@ public class WechatPayClient {
|
|||||||
HttpHeaders httpHeaders = new HttpHeaders();
|
HttpHeaders httpHeaders = new HttpHeaders();
|
||||||
httpHeaders.addAll(headers);
|
httpHeaders.addAll(headers);
|
||||||
httpHeaders.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
|
httpHeaders.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
|
||||||
// 兼容图片上传,自定义优先级最高
|
// for upload
|
||||||
if (Objects.isNull(httpHeaders.getContentType())) {
|
if (Objects.isNull(httpHeaders.getContentType())) {
|
||||||
httpHeaders.setContentType(MediaType.APPLICATION_JSON);
|
httpHeaders.setContentType(MediaType.APPLICATION_JSON);
|
||||||
}
|
}
|
||||||
@@ -218,13 +217,13 @@ public class WechatPayClient {
|
|||||||
HttpHeaders headers = responseEntity.getHeaders();
|
HttpHeaders headers = responseEntity.getHeaders();
|
||||||
ObjectNode body = responseEntity.getBody();
|
ObjectNode body = responseEntity.getBody();
|
||||||
HttpStatus statusCode = responseEntity.getStatusCode();
|
HttpStatus statusCode = responseEntity.getStatusCode();
|
||||||
|
// 微信请求id
|
||||||
|
String requestId = headers.getFirst("Request-ID");
|
||||||
if (!statusCode.is2xxSuccessful()) {
|
if (!statusCode.is2xxSuccessful()) {
|
||||||
throw new PayException("wechat pay server error,statusCode " + statusCode + ",result : " + body);
|
throw new PayException("wechat pay server error, Request-ID "+requestId+" , statusCode " + statusCode + ",result : " + body);
|
||||||
}
|
}
|
||||||
|
|
||||||
ResponseSignVerifyParams params = new ResponseSignVerifyParams();
|
ResponseSignVerifyParams params = new ResponseSignVerifyParams();
|
||||||
// 微信请求回调id
|
|
||||||
// String RequestId = response.header("Request-ID");
|
|
||||||
// 微信平台证书序列号 用来取微信平台证书
|
// 微信平台证书序列号 用来取微信平台证书
|
||||||
params.setWechatpaySerial(headers.getFirst("Wechatpay-Serial"));
|
params.setWechatpaySerial(headers.getFirst("Wechatpay-Serial"));
|
||||||
//获取应答签名
|
//获取应答签名
|
||||||
@@ -244,7 +243,7 @@ public class WechatPayClient {
|
|||||||
responseConsumer.accept(responseEntity);
|
responseConsumer.accept(responseEntity);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
throw new PayException("wechat pay signature failed");
|
throw new PayException("wechat pay signature failed, Request-ID "+requestId );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -261,11 +260,13 @@ public class WechatPayClient {
|
|||||||
|
|
||||||
String body = responseEntity.getBody();
|
String body = responseEntity.getBody();
|
||||||
HttpStatus statusCode = responseEntity.getStatusCode();
|
HttpStatus statusCode = responseEntity.getStatusCode();
|
||||||
|
// 微信请求id
|
||||||
|
String requestId = requestEntity.getHeaders().getFirst("Request-ID");
|
||||||
if (!statusCode.is2xxSuccessful()) {
|
if (!statusCode.is2xxSuccessful()) {
|
||||||
throw new PayException("wechat pay server error,statusCode " + statusCode + ",result : " + body);
|
throw new PayException("wechat pay server error, Request-ID "+requestId+" , statusCode " + statusCode + ",result : " + body);
|
||||||
}
|
}
|
||||||
if (Objects.isNull(body)) {
|
if (Objects.isNull(body)) {
|
||||||
throw new PayException("cant obtain wechat response body");
|
throw new PayException("cant obtain wechat response body, Request-ID "+requestId);
|
||||||
}
|
}
|
||||||
return body;
|
return body;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,165 @@
|
|||||||
|
package cn.felord.payment.wechat.v3.model.discountcard;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 微信支付先享卡用户守约状态变化通知解密
|
||||||
|
*
|
||||||
|
* @author felord.cn
|
||||||
|
* @since 1.0.2.RELEASE
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class DiscountCardAgreementEndConsumeData {
|
||||||
|
/**
|
||||||
|
* The Appid.
|
||||||
|
*/
|
||||||
|
private String appid;
|
||||||
|
/**
|
||||||
|
* The Card id.
|
||||||
|
*/
|
||||||
|
private String cardId;
|
||||||
|
/**
|
||||||
|
* The Card template id.
|
||||||
|
*/
|
||||||
|
private String cardTemplateId;
|
||||||
|
/**
|
||||||
|
* The Create time.
|
||||||
|
*/
|
||||||
|
private String createTime;
|
||||||
|
/**
|
||||||
|
* The Mchid.
|
||||||
|
*/
|
||||||
|
private String mchid;
|
||||||
|
/**
|
||||||
|
* The Objectives.
|
||||||
|
*/
|
||||||
|
private List<Objective> objectives;
|
||||||
|
/**
|
||||||
|
* The Openid.
|
||||||
|
*/
|
||||||
|
private String openid;
|
||||||
|
/**
|
||||||
|
* The Out card code.
|
||||||
|
*/
|
||||||
|
private String outCardCode;
|
||||||
|
/**
|
||||||
|
* The Rewards.
|
||||||
|
*/
|
||||||
|
private List<Reward> rewards;
|
||||||
|
/**
|
||||||
|
* The State.
|
||||||
|
*/
|
||||||
|
private String state;
|
||||||
|
/**
|
||||||
|
* The Time range.
|
||||||
|
*/
|
||||||
|
private TimeRange timeRange;
|
||||||
|
/**
|
||||||
|
* The Total amount.
|
||||||
|
*/
|
||||||
|
private Long totalAmount;
|
||||||
|
/**
|
||||||
|
* The Unfinished reason.
|
||||||
|
*/
|
||||||
|
private String unfinishedReason;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The type Objective.
|
||||||
|
*
|
||||||
|
* @author felord.cn
|
||||||
|
* @since 1.0.2.RELEASE
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public static class Objective {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The Count.
|
||||||
|
*/
|
||||||
|
private Long count;
|
||||||
|
/**
|
||||||
|
* The Description.
|
||||||
|
*/
|
||||||
|
private String description;
|
||||||
|
/**
|
||||||
|
* The Name.
|
||||||
|
*/
|
||||||
|
private String name;
|
||||||
|
/**
|
||||||
|
* The Objective completion records.
|
||||||
|
*/
|
||||||
|
private List<ObjectiveCompletionRecord> objectiveCompletionRecords;
|
||||||
|
/**
|
||||||
|
* The Objective id.
|
||||||
|
*/
|
||||||
|
private String objectiveId;
|
||||||
|
/**
|
||||||
|
* The Unit.
|
||||||
|
*/
|
||||||
|
private String unit;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The type Time range.
|
||||||
|
*
|
||||||
|
* @author felord.cn
|
||||||
|
* @since 1.0.2.RELEASE
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public static class TimeRange {
|
||||||
|
/**
|
||||||
|
* The Betin time.
|
||||||
|
*/
|
||||||
|
private String betinTime;
|
||||||
|
/**
|
||||||
|
* The End time.
|
||||||
|
*/
|
||||||
|
private String endTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The type Reward.
|
||||||
|
*
|
||||||
|
* @author felord.cn
|
||||||
|
* @since 1.0.2.RELEASE
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public static class Reward {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The Amount.
|
||||||
|
*/
|
||||||
|
private Long amount;
|
||||||
|
/**
|
||||||
|
* The Count.
|
||||||
|
*/
|
||||||
|
private Long count;
|
||||||
|
/**
|
||||||
|
* The Count type.
|
||||||
|
*/
|
||||||
|
private String countType;
|
||||||
|
/**
|
||||||
|
* The Description.
|
||||||
|
*/
|
||||||
|
private String description;
|
||||||
|
/**
|
||||||
|
* The Name.
|
||||||
|
*/
|
||||||
|
private String name;
|
||||||
|
/**
|
||||||
|
* The Reward id.
|
||||||
|
*/
|
||||||
|
private String rewardId;
|
||||||
|
/**
|
||||||
|
* The Reward usage records.
|
||||||
|
*/
|
||||||
|
private List<RewardUsageRecord> rewardUsageRecords;
|
||||||
|
/**
|
||||||
|
* The Unit.
|
||||||
|
*/
|
||||||
|
private String unit;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
package cn.felord.payment.wechat.v3.model.discountcard;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 先享卡回调消费复合消费器
|
||||||
|
*
|
||||||
|
* @author felord.cn
|
||||||
|
* @since 1.0.2.RELEASE
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class DiscountCardConsumer {
|
||||||
|
/**
|
||||||
|
* The Accepted consume data consumer.
|
||||||
|
*/
|
||||||
|
private Consumer<DiscountCardAcceptedConsumeData> acceptedConsumeDataConsumer;
|
||||||
|
/**
|
||||||
|
* The Agreement end consume data consumer.
|
||||||
|
*/
|
||||||
|
private Consumer<DiscountCardAgreementEndConsumeData> agreementEndConsumeDataConsumer;
|
||||||
|
/**
|
||||||
|
* The Card user paid consume data consumer.
|
||||||
|
*/
|
||||||
|
private Consumer<DiscountCardUserPaidConsumeData> cardUserPaidConsumeDataConsumer;
|
||||||
|
}
|
||||||
@@ -0,0 +1,79 @@
|
|||||||
|
package cn.felord.payment.wechat.v3.model.discountcard;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 先享卡扣费状态变化通知解密.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @author felord.cn
|
||||||
|
* @since 1.0.2.RELEASE
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class DiscountCardUserPaidConsumeData {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The Appid.
|
||||||
|
*/
|
||||||
|
private String appid;
|
||||||
|
/**
|
||||||
|
* The Card id.
|
||||||
|
*/
|
||||||
|
private String cardId;
|
||||||
|
/**
|
||||||
|
* The Card template id.
|
||||||
|
*/
|
||||||
|
private String cardTemplateId;
|
||||||
|
/**
|
||||||
|
* The Mchid.
|
||||||
|
*/
|
||||||
|
private String mchid;
|
||||||
|
/**
|
||||||
|
* The Openid.
|
||||||
|
*/
|
||||||
|
private String openid;
|
||||||
|
/**
|
||||||
|
* The Out card code.
|
||||||
|
*/
|
||||||
|
private String outCardCode;
|
||||||
|
/**
|
||||||
|
* The Pay information.
|
||||||
|
*/
|
||||||
|
private PayInformation payInformation;
|
||||||
|
/**
|
||||||
|
* The State.
|
||||||
|
*/
|
||||||
|
private String state;
|
||||||
|
/**
|
||||||
|
* The Total amount.
|
||||||
|
*/
|
||||||
|
private Long totalAmount;
|
||||||
|
/**
|
||||||
|
* The Unfinished reason.
|
||||||
|
*/
|
||||||
|
private String unfinishedReason;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The type Pay information.
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public static class PayInformation {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The Pay amount.
|
||||||
|
*/
|
||||||
|
private Long payAmount;
|
||||||
|
/**
|
||||||
|
* The Pay state.
|
||||||
|
*/
|
||||||
|
private String payState;
|
||||||
|
/**
|
||||||
|
* The Pay time.
|
||||||
|
*/
|
||||||
|
private String payTime;
|
||||||
|
/**
|
||||||
|
* The Transaction id.
|
||||||
|
*/
|
||||||
|
private String transactionId;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
package cn.felord.payment.wechat.v3.model.discountcard;
|
||||||
|
|
||||||
|
import cn.felord.payment.wechat.enumeration.StrategyType;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The type Objective completion record.
|
||||||
|
*
|
||||||
|
* @author felord.cn
|
||||||
|
* @since 1.0.2.RELEASE
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class ObjectiveCompletionRecord {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The Completion count.
|
||||||
|
*/
|
||||||
|
private Long completionCount;
|
||||||
|
/**
|
||||||
|
* The Completion time.
|
||||||
|
*/
|
||||||
|
private String completionTime;
|
||||||
|
/**
|
||||||
|
* The Completion type.
|
||||||
|
*/
|
||||||
|
private StrategyType completionType;
|
||||||
|
/**
|
||||||
|
* The Description.
|
||||||
|
*/
|
||||||
|
private String description;
|
||||||
|
/**
|
||||||
|
* The Objective completion serial no.
|
||||||
|
*/
|
||||||
|
private String objectiveCompletionSerialNo;
|
||||||
|
/**
|
||||||
|
* The Objective id.
|
||||||
|
*/
|
||||||
|
private String objectiveId;
|
||||||
|
/**
|
||||||
|
* The Remark.
|
||||||
|
*/
|
||||||
|
private String remark;
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
package cn.felord.payment.wechat.v3.model.discountcard;
|
||||||
|
|
||||||
|
import cn.felord.payment.wechat.v3.model.payscore.PayScoreUserConfirmConsumeData;
|
||||||
|
import cn.felord.payment.wechat.v3.model.payscore.PayScoreUserPaidConsumeData;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 支付分回调复合消费器
|
||||||
|
*
|
||||||
|
* @author felord.cn
|
||||||
|
* @since 1.0.2.RELEASE
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class PayScoreConsumer {
|
||||||
|
/**
|
||||||
|
* The Confirm consume data consumer.
|
||||||
|
*/
|
||||||
|
private Consumer<PayScoreUserConfirmConsumeData> confirmConsumeDataConsumer;
|
||||||
|
/**
|
||||||
|
* The Paid consume data consumer.
|
||||||
|
*/
|
||||||
|
private Consumer<PayScoreUserPaidConsumeData> paidConsumeDataConsumer;
|
||||||
|
}
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
package cn.felord.payment.wechat.v3.model.discountcard;
|
||||||
|
|
||||||
|
import cn.felord.payment.wechat.enumeration.StrategyType;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The type Reward usage record.
|
||||||
|
*
|
||||||
|
* @author felord.cn
|
||||||
|
* @since 1.0.2.RELEASE
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class RewardUsageRecord {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The Amount.
|
||||||
|
*/
|
||||||
|
private Long amount;
|
||||||
|
/**
|
||||||
|
* The Description.
|
||||||
|
*/
|
||||||
|
private String description;
|
||||||
|
/**
|
||||||
|
* The Remark.
|
||||||
|
*/
|
||||||
|
private String remark;
|
||||||
|
/**
|
||||||
|
* The Reward id.
|
||||||
|
*/
|
||||||
|
private String rewardId;
|
||||||
|
/**
|
||||||
|
* The Reward usage serial no.
|
||||||
|
*/
|
||||||
|
private String rewardUsageSerialNo;
|
||||||
|
/**
|
||||||
|
* The Usage count.
|
||||||
|
*/
|
||||||
|
private Long usageCount;
|
||||||
|
/**
|
||||||
|
* The Usage time.
|
||||||
|
*/
|
||||||
|
private String usageTime;
|
||||||
|
/**
|
||||||
|
* The Usage type.
|
||||||
|
*/
|
||||||
|
private StrategyType usageType;
|
||||||
|
|
||||||
|
}
|
||||||
@@ -31,104 +31,4 @@ public class UserRecordsParams {
|
|||||||
*/
|
*/
|
||||||
private List<RewardUsageRecord> rewardUsageRecords;
|
private List<RewardUsageRecord> rewardUsageRecords;
|
||||||
|
|
||||||
/**
|
|
||||||
* The type Objective completion record.
|
|
||||||
*
|
|
||||||
* @author felord.cn
|
|
||||||
* @since 1.0.2.RELEASE
|
|
||||||
*/
|
|
||||||
@Data
|
|
||||||
public static class ObjectiveCompletionRecord {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The Completion count.
|
|
||||||
*/
|
|
||||||
private Long completionCount;
|
|
||||||
/**
|
|
||||||
* The Completion time.
|
|
||||||
*/
|
|
||||||
private String completionTime;
|
|
||||||
/**
|
|
||||||
* The Completion type.
|
|
||||||
*/
|
|
||||||
private StrategyType completionType;
|
|
||||||
/**
|
|
||||||
* The Description.
|
|
||||||
*/
|
|
||||||
private String description;
|
|
||||||
/**
|
|
||||||
* The Objective completion serial no.
|
|
||||||
*/
|
|
||||||
private String objectiveCompletionSerialNo;
|
|
||||||
/**
|
|
||||||
* The Objective id.
|
|
||||||
*/
|
|
||||||
private String objectiveId;
|
|
||||||
/**
|
|
||||||
* The Remark.
|
|
||||||
*/
|
|
||||||
private String remark;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The type Reward usage record.
|
|
||||||
*
|
|
||||||
* @author felord.cn
|
|
||||||
* @since 1.0.2.RELEASE
|
|
||||||
*/
|
|
||||||
@Data
|
|
||||||
public static class RewardUsageRecord {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The Amount.
|
|
||||||
*/
|
|
||||||
private Long amount;
|
|
||||||
/**
|
|
||||||
* The Description.
|
|
||||||
*/
|
|
||||||
private String description;
|
|
||||||
/**
|
|
||||||
* The Remark.
|
|
||||||
*/
|
|
||||||
private String remark;
|
|
||||||
/**
|
|
||||||
* The Reward id.
|
|
||||||
*/
|
|
||||||
private String rewardId;
|
|
||||||
/**
|
|
||||||
* The Reward usage serial no.
|
|
||||||
*/
|
|
||||||
private String rewardUsageSerialNo;
|
|
||||||
/**
|
|
||||||
* The Usage count.
|
|
||||||
*/
|
|
||||||
private Long usageCount;
|
|
||||||
/**
|
|
||||||
* The Usage time.
|
|
||||||
*/
|
|
||||||
private String usageTime;
|
|
||||||
/**
|
|
||||||
* The Usage type.
|
|
||||||
*/
|
|
||||||
private StrategyType usageType;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 目标完成类型、优惠使用类型
|
|
||||||
*
|
|
||||||
* @author felord.cn
|
|
||||||
* @since 1.0.2.RELEASE
|
|
||||||
*/
|
|
||||||
public enum StrategyType {
|
|
||||||
/**
|
|
||||||
* 增加数量,表示用户发生了履约行为
|
|
||||||
*/
|
|
||||||
INCREASE,
|
|
||||||
/**
|
|
||||||
* 减少数量,表示取消用户的履约行为(例如用户取消购买、退货退款等)
|
|
||||||
*/
|
|
||||||
DECREASE
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user