diff --git a/payment-spring-boot-autoconfigure/src/main/java/com/enongm/dianji/payment/wechat/enumeration/CouponBgColor.java b/payment-spring-boot-autoconfigure/src/main/java/com/enongm/dianji/payment/wechat/enumeration/CouponBgColor.java
new file mode 100644
index 0000000..338ec36
--- /dev/null
+++ b/payment-spring-boot-autoconfigure/src/main/java/com/enongm/dianji/payment/wechat/enumeration/CouponBgColor.java
@@ -0,0 +1,32 @@
+package com.enongm.dianji.payment.wechat.enumeration;
+
+/**
+ * 优惠券背景色
+ *
+ * https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/marketing/convention/chapter3_1.shtml#menu1
+ *
+ * @author Dax
+ * @since 14:50
+ */
+public enum CouponBgColor {
+ COLOR010("#63B359"),
+ COLOR020("#2C9F67"),
+ COLOR030("#509FC9"),
+ COLOR040("#5885CF"),
+ COLOR050("#9062C0"),
+ COLOR060("#D09A45"),
+ COLOR070("#E4B138"),
+ COLOR080("#EE903C"),
+ COLOR090("#DD6549"),
+ COLOR100("#CC463D");
+
+ private final String color;
+
+ CouponBgColor(String color) {
+ this.color = color;
+ }
+
+ public String color() {
+ return this.color;
+ }
+}
diff --git a/payment-spring-boot-autoconfigure/src/main/java/com/enongm/dianji/payment/wechat/enumeration/WechatPayV3Type.java b/payment-spring-boot-autoconfigure/src/main/java/com/enongm/dianji/payment/wechat/enumeration/WechatPayV3Type.java
index d350b53..54c05b2 100644
--- a/payment-spring-boot-autoconfigure/src/main/java/com/enongm/dianji/payment/wechat/enumeration/WechatPayV3Type.java
+++ b/payment-spring-boot-autoconfigure/src/main/java/com/enongm/dianji/payment/wechat/enumeration/WechatPayV3Type.java
@@ -35,6 +35,10 @@ public enum WechatPayV3Type {
MWEB(HttpMethod.POST, "%s/v3/pay/transactions/h5"),
+ /**
+ * 创建代金券批次API.
+ */
+ MARKETING_FAVOR_STOCKS_COUPON_STOCKS(HttpMethod.POST,"%s/v3/marketing/favor/coupon-stocks"),
/**
* 激活代金券批次API
*/
diff --git a/payment-spring-boot-autoconfigure/src/main/java/com/enongm/dianji/payment/wechat/v3/WechatPayV3Api.java b/payment-spring-boot-autoconfigure/src/main/java/com/enongm/dianji/payment/wechat/v3/WechatPayV3Api.java
index b6ecb8c..5d49e2e 100644
--- a/payment-spring-boot-autoconfigure/src/main/java/com/enongm/dianji/payment/wechat/v3/WechatPayV3Api.java
+++ b/payment-spring-boot-autoconfigure/src/main/java/com/enongm/dianji/payment/wechat/v3/WechatPayV3Api.java
@@ -6,6 +6,7 @@ import com.enongm.dianji.payment.wechat.enumeration.StockStatus;
import com.enongm.dianji.payment.wechat.enumeration.WeChatServer;
import com.enongm.dianji.payment.wechat.enumeration.WechatPayV3Type;
import com.enongm.dianji.payment.wechat.v3.model.AppPayParams;
+import com.enongm.dianji.payment.wechat.v3.model.StocksCreateParams;
import com.enongm.dianji.payment.wechat.v3.model.StocksQueryParams;
import com.enongm.dianji.payment.wechat.v3.model.StocksSendParams;
import com.fasterxml.jackson.annotation.JsonInclude;
@@ -57,6 +58,36 @@ public class WechatPayV3Api {
}
+ /**
+ * 创建代金券批次API.
+ *
+ * @param params the params
+ * @return the wechat response entity
+ */
+ public WechatResponseEntity createStocks(StocksCreateParams params) {
+ WechatResponseEntity wechatResponseEntity = new WechatResponseEntity<>();
+ wechatPayV3Client.withType(WechatPayV3Type.MARKETING_FAVOR_STOCKS_COUPON_STOCKS, params)
+ .function(this::createStocksFunction)
+ .consumer(wechatResponseEntity::convert)
+ .request();
+ return wechatResponseEntity;
+ }
+
+ private RequestEntity> createStocksFunction(WechatPayV3Type type, StocksCreateParams params) {
+ WechatPayProperties.V3 v3 = wechatMetaBean.getWechatPayProperties().getV3();
+ String mchId = v3.getMchId();
+ String httpUrl = type.uri(WeChatServer.CHINA);
+ URI uri = UriComponentsBuilder.fromHttpUrl(httpUrl).build().toUri();
+ params.setBelongMerchant(mchId);
+ try {
+ return RequestEntity.post(uri)
+ .body(MAPPER.writeValueAsString(params));
+ } catch (JsonProcessingException e) {
+ e.printStackTrace();
+ }
+ throw new PayException("wechat app pay json failed");
+ }
+
/**
* 激活代金券批次API
*
diff --git a/payment-spring-boot-autoconfigure/src/main/java/com/enongm/dianji/payment/wechat/v3/model/CouponAvailableTime.java b/payment-spring-boot-autoconfigure/src/main/java/com/enongm/dianji/payment/wechat/v3/model/CouponAvailableTime.java
new file mode 100644
index 0000000..5f0f9a8
--- /dev/null
+++ b/payment-spring-boot-autoconfigure/src/main/java/com/enongm/dianji/payment/wechat/v3/model/CouponAvailableTime.java
@@ -0,0 +1,11 @@
+
+package com.enongm.dianji.payment.wechat.v3.model;
+
+import lombok.Data;
+
+@Data
+public class CouponAvailableTime {
+ private Long availableTimeAfterReceive;
+ private FixAvailableTime fixAvailableTime;
+ private Boolean secondDayAvailable;
+}
diff --git a/payment-spring-boot-autoconfigure/src/main/java/com/enongm/dianji/payment/wechat/v3/model/CouponUseRule.java b/payment-spring-boot-autoconfigure/src/main/java/com/enongm/dianji/payment/wechat/v3/model/CouponUseRule.java
new file mode 100644
index 0000000..fc58dc6
--- /dev/null
+++ b/payment-spring-boot-autoconfigure/src/main/java/com/enongm/dianji/payment/wechat/v3/model/CouponUseRule.java
@@ -0,0 +1,28 @@
+
+package com.enongm.dianji.payment.wechat.v3.model;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 核销规则.
+ */
+@Data
+public class CouponUseRule {
+
+
+ private List availableItems;
+
+ private List availableMerchants;
+
+ private Boolean combineUse;
+
+ private CouponAvailableTime couponAvailableTime;
+
+ private FixedNormalCoupon fixedNormalCoupon;
+
+ private List goodsTag;
+
+ private String tradeType;
+}
diff --git a/payment-spring-boot-autoconfigure/src/main/java/com/enongm/dianji/payment/wechat/v3/model/FixAvailableTime.java b/payment-spring-boot-autoconfigure/src/main/java/com/enongm/dianji/payment/wechat/v3/model/FixAvailableTime.java
new file mode 100644
index 0000000..87db05b
--- /dev/null
+++ b/payment-spring-boot-autoconfigure/src/main/java/com/enongm/dianji/payment/wechat/v3/model/FixAvailableTime.java
@@ -0,0 +1,15 @@
+
+package com.enongm.dianji.payment.wechat.v3.model;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class FixAvailableTime {
+
+ private List availableWeekDay;
+ private Long beginTime;
+ private Long endTime;
+
+}
diff --git a/payment-spring-boot-autoconfigure/src/main/java/com/enongm/dianji/payment/wechat/v3/model/FixedNormalCoupon.java b/payment-spring-boot-autoconfigure/src/main/java/com/enongm/dianji/payment/wechat/v3/model/FixedNormalCoupon.java
new file mode 100644
index 0000000..1a79147
--- /dev/null
+++ b/payment-spring-boot-autoconfigure/src/main/java/com/enongm/dianji/payment/wechat/v3/model/FixedNormalCoupon.java
@@ -0,0 +1,13 @@
+
+package com.enongm.dianji.payment.wechat.v3.model;
+
+import lombok.Data;
+
+@Data
+public class FixedNormalCoupon {
+
+
+ private Long couponAmount;
+ private Long transactionMinimum;
+
+}
diff --git a/payment-spring-boot-autoconfigure/src/main/java/com/enongm/dianji/payment/wechat/v3/model/PatternInfo.java b/payment-spring-boot-autoconfigure/src/main/java/com/enongm/dianji/payment/wechat/v3/model/PatternInfo.java
new file mode 100644
index 0000000..cfe13b7
--- /dev/null
+++ b/payment-spring-boot-autoconfigure/src/main/java/com/enongm/dianji/payment/wechat/v3/model/PatternInfo.java
@@ -0,0 +1,34 @@
+package com.enongm.dianji.payment.wechat.v3.model;
+
+
+import com.enongm.dianji.payment.wechat.enumeration.CouponBgColor;
+
+/**
+ * 优惠券样式
+ *
+ * @author Dax
+ * @since 15:09
+ */
+public class PatternInfo {
+ /**
+ * 背景色
+ */
+ private CouponBgColor backgroundColor;
+ /**
+ * 券详情图片
+ */
+ private String couponImage;
+ /**
+ * 使用说明
+ */
+ private String description;
+ /**
+ * 商户logo
+ */
+ private String merchantLogo;
+ /**
+ * 商户名称
+ */
+ private String merchantName;
+
+}
diff --git a/payment-spring-boot-autoconfigure/src/main/java/com/enongm/dianji/payment/wechat/v3/model/StockUseRule.java b/payment-spring-boot-autoconfigure/src/main/java/com/enongm/dianji/payment/wechat/v3/model/StockUseRule.java
new file mode 100644
index 0000000..0b2de77
--- /dev/null
+++ b/payment-spring-boot-autoconfigure/src/main/java/com/enongm/dianji/payment/wechat/v3/model/StockUseRule.java
@@ -0,0 +1,39 @@
+package com.enongm.dianji.payment.wechat.v3.model;
+
+import lombok.Data;
+
+/**
+ * 批次使用规则
+ *
+ * @author Dax
+ * @since 15:08
+ */
+@Data
+public class StockUseRule {
+
+ /**
+ * 总消耗金额,单位:分。
+ * max_amount需要等于coupon_amount(面额) * max_coupons(发放总上限)
+ */
+ private Long maxAmount;
+ /**
+ * 单天最高消耗金额,单位:分
+ */
+ private Long maxAmountByDay;
+ /**
+ * 最大发券数
+ */
+ private Long maxCoupons;
+ /**
+ * 单个用户可领个数,每个用户最多60张券
+ */
+ private Long maxCouponsPerUser;
+ /**
+ * 是否开启自然人限制
+ */
+ private Boolean naturalPersonLimit;
+ /**
+ * api发券防刷
+ */
+ private Boolean preventApiAbuse;
+}
diff --git a/payment-spring-boot-autoconfigure/src/main/java/com/enongm/dianji/payment/wechat/v3/model/StocksCreateParams.java b/payment-spring-boot-autoconfigure/src/main/java/com/enongm/dianji/payment/wechat/v3/model/StocksCreateParams.java
new file mode 100644
index 0000000..95b4641
--- /dev/null
+++ b/payment-spring-boot-autoconfigure/src/main/java/com/enongm/dianji/payment/wechat/v3/model/StocksCreateParams.java
@@ -0,0 +1,60 @@
+package com.enongm.dianji.payment.wechat.v3.model;
+
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * 创建优惠券批次参数.
+ *
+ * @author Dax
+ * @since 14 :19
+ */
+@Data
+public class StocksCreateParams {
+ /**
+ * 批次名称
+ */
+ private String stockName;
+ /**
+ * 仅配置商户可见,用于自定义信息
+ */
+ private String comment;
+ /**
+ * 批次归属商户号
+ */
+ private String belongMerchant;
+ /**
+ * 批次开始时间
+ */
+ private LocalDateTime availableBeginTime;
+ /**
+ * 批次结束时间
+ */
+ private LocalDateTime availableEndTime;
+ /**
+ * 是否无资金流
+ */
+ private Boolean noCash;
+ /**
+ * 批次类型
+ */
+ private String stockType = "NORMAL";
+ /**
+ * 商户单据号
+ */
+ private String outRequestNo;
+ /**
+ * 扩展属性
+ */
+ private String ext_info;
+ /**
+ * 批次使用规则
+ */
+ private StockUseRule stockUseRule;
+ /**
+ * 核销规则
+ */
+ private CouponUseRule couponUseRule;
+
+}