【单券-全场-满减券】API请求示例
更新时间:2025.12.02||
curl
Java
Go
1## 场景2: 单券-全场-满减券 (usage_mode=SINGLE, scope=ALL, type=NORMAL) 2 3```bash 4curl -X POST \ 5 https://api.mch.weixin.qq.com/v3/marketing/partner/product-coupon/product-coupons \ 6 -H "Authorization: WECHATPAY2-SHA256-RSA2048 mchid=\"服务商商户号\",..." \ 7 -H "Accept: application/json" \ 8 -H "Content-Type: application/json" \ 9 -d '{ 10 "out_request_no": "SINGLE_ALL_NORMAL_20250101_002", # 必填,创建请求单号 11 "brand_id": "120344", # 必填,品牌ID 12 "scope": "ALL", # 必填,优惠范围:ALL=全场券 13 "type": "NORMAL", # 必填,商品券类型:NORMAL=满减券 14 "usage_mode": "SINGLE", # 必填,使用模式:SINGLE=单券模式 15 16 "single_usage_info": { # 当usage_mode=SINGLE且scope=ALL时,在此配置优惠规则 17 "normal_coupon": { # 当type=NORMAL且scope=ALL时必填,满减券使用规则 18 "threshold": 10000, # 必填,门槛金额,单位为分,满100元可用填10000 19 "discount_amount": 1500 # 必填,固定减免金额,单位为分,减15元填1500 20 } 21 }, 22 23 "display_info": { # 必填,商品券展示信息 24 "name": "全场满100减15", # 必填,商品券名称 25 "image_url": "https://wxpaylogo.qpic.cn/wxpaylogo/xxxxx/xxx", # 必填,商品图片URL 26 "background_url": "https://wxpaylogo.qpic.cn/wxpaylogo/xxxxx/xxx", # 必填,背景图URL 27 "detail_image_url_list": [ # 选填,详情图URL列表 28 "https://wxpaylogo.qpic.cn/wxpaylogo/xxxxx/xxx" 29 ] 30 }, 31 32 "out_product_no": "Product_SINGLE_002", # 选填,外部商品ID 33 34 "stock": { # 必填,批次信息 35 "remark": "8月工作日有效批次", # 选填,备注 36 "coupon_code_mode": "WECHATPAY", # 必填,券Code分配模式 37 38 "stock_send_rule": { # 必填,发放规则 39 "max_count": 10000000, # 必填,总发放次数上限 40 "max_count_per_day": 100000, # 选填,每日发放上限 41 "max_count_per_user": 1 # 必填,每用户领取上限 42 }, 43 44 "single_usage_rule": { # 当usage_mode=SINGLE时必填,单券使用规则 45 "coupon_available_period": { # 必填,券可核销时间 46 "available_begin_time": "2025-08-01T00:00:00+08:00", # 必填,开始时间 47 "available_end_time": "2025-08-31T23:59:59+08:00", # 必填,结束时间 48 "available_days": 30, # 选填,生效后N天有效 49 "wait_days_after_receive": 0, # 选填,领取后N天生效 50 "weekly_available_period": { # 选填,每周可用时间 51 "day_list": ["MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY"] # 当配置weekly_available_period时必填 52 }, 53 "irregular_available_period_list": [ # 选填,无规律可用时间段 54 { 55 "begin_time": "2025-08-15T00:00:00+08:00", # 当配置此列表时必填 56 "end_time": "2025-08-15T23:59:59+08:00" # 当配置此列表时必填 57 } 58 ] 59 } 60 # 注意:scope=ALL时,优惠规则在single_usage_info中配置,此处不配置normal_coupon 61 }, 62 63 "usage_rule_display_info": { # 必填,使用规则展示信息 64 "coupon_usage_method_list": ["OFFLINE", "MINI_PROGRAM", "PAYMENT_CODE"], # 必填,使用方式 65 "mini_program_appid": "wx1234567890", # 当coupon_usage_method_list包含MINI_PROGRAM时必填 66 "mini_program_path": "/pages/index/product", # 当coupon_usage_method_list包含MINI_PROGRAM时必填 67 "usage_description": "工作日可用", # 必填,使用说明 68 "coupon_available_store_info": { # 选填,可用门店信息 69 "description": "所有门店可用", # 当配置此对象时必填 70 "mini_program_appid": "wx1234567890", # 选填 71 "mini_program_path": "/pages/index/store-list" # 选填 72 } 73 }, 74 75 "coupon_display_info": { # 必填,用户券展示信息 76 "code_display_mode": "QRCODE", # 必填,Code展示模式 77 "background_color": "Color010", # 选填,背景颜色 78 "entrance_mini_program": { # 选填,小程序入口 79 "appid": "wx1234567890", # 当配置此对象时必填 80 "path": "/pages/index/product", # 当配置此对象时必填 81 "entrance_wording": "欢迎选购", # 当配置此对象时必填 82 "guidance_wording": "获取更多优惠" # 当配置此对象时必填 83 }, 84 "entrance_official_account": { # 选填,公众号入口 85 "appid": "wx1234567890" # 当配置此对象时必填 86 }, 87 "entrance_finder": { # 选填,视频号入口 88 "finder_id": "gh_12345678", # 当配置此对象时必填 89 "finder_video_id": "UDFsdf24df34dD456Hdf34", # 当配置此对象时必填 90 "finder_video_cover_image_url": "https://wxpaylogo.qpic.cn/wxpaylogo/xxxxx/xxx" # 当配置此对象时必填 91 } 92 }, 93 94 "notify_config": { # 必填,事件通知配置 95 "notify_appid": "wx4fd12345678" # 必填 96 }, 97 98 "store_scope": "NONE" # 必填,可用门店范围 99 } 100 }' 101```
需配合微信支付工具库 WXPayUtility 使用,请参考 Java
1package com.java.demo; 2 3import com.java.utils.WXPayUtility; // 引用微信支付工具库,参考:https://pay.weixin.qq.com/doc/v3/partner/4014985777 4import com.google.gson.annotations.SerializedName; 5import com.google.gson.annotations.Expose; 6import okhttp3.MediaType; 7import okhttp3.OkHttpClient; 8import okhttp3.Request; 9import okhttp3.RequestBody; 10import okhttp3.Response; 11 12import java.io.IOException; 13import java.io.UncheckedIOException; 14import java.security.PrivateKey; 15import java.security.PublicKey; 16import java.util.ArrayList; 17import java.util.HashMap; 18import java.util.List; 19import java.util.Map; 20 21/** 22 * 场景2:创建商品券 - 单券-全场-满减券 23 * 24 * 场景说明: 25 * - usage_mode: SINGLE(单券模式) 26 * - scope: ALL(全场券) 27 * - type: NORMAL(满减券) 28 * 29 * 优惠规则配置位置:single_usage_info.normal_coupon(全场券在single_usage_info中配置) 30 */ 31public class AllNormalSingleJava { 32 private static String HOST = "https://api.mch.weixin.qq.com"; 33 private static String METHOD = "POST"; 34 private static String PATH = "/v3/marketing/partner/product-coupon/product-coupons"; 35 36 public static void main(String[] args) { 37 // TODO: 请准备商户开发必要参数,参考:https://pay.weixin.qq.com/doc/v3/partner/4013080340 38 AllNormalSingleJava client = new AllNormalSingleJava( 39 "19xxxxxxxx", // 商户号,是由微信支付系统生成并分配给每个商户的唯一标识符,商户号获取方式参考 https://pay.weixin.qq.com/doc/v3/partner/4013080340 40 "1DDE55AD98Exxxxxxxxxx", // 商户API证书序列号,如何获取请参考 https://pay.weixin.qq.com/doc/v3/partner/4013058924 41 "/path/to/apiclient_key.pem", // 商户API证书私钥文件路径,本地文件路径 42 "PUB_KEY_ID_xxxxxxxxxxxxx", // 微信支付公钥ID,如何获取请参考 https://pay.weixin.qq.com/doc/v3/partner/4013038589 43 "/path/to/wxp_pub.pem" // 微信支付公钥文件路径,本地文件路径 44 ); 45 46 CreateProductCouponRequest request = new CreateProductCouponRequest(); 47 // 必填,创建请求单号,6-40个字符,品牌侧需保持唯一性 48 request.outRequestNo = "SINGLE_ALL_NORMAL_20250101_002"; 49 // 必填,品牌ID,由微信支付分配 50 request.brandId = "120344"; 51 // 必填,优惠范围:ALL-全场券(仅支持NORMAL/DISCOUNT), SINGLE-单品券(支持NORMAL/DISCOUNT/EXCHANGE) 52 request.scope = ProductCouponScope.ALL; 53 // 必填,商品券类型:NORMAL-满减券, DISCOUNT-折扣券, EXCHANGE-兑换券(仅单品券) 54 request.type = ProductCouponType.NORMAL; 55 // 必填,使用模式:SINGLE-单券, PROGRESSIVE_BUNDLE-多次优惠 56 request.usageMode = UsageMode.SINGLE; 57 // 选填,商户侧商品券唯一标识 58 request.outProductNo = "Product_SINGLE_002"; 59 60 // 条件必填,单券模式优惠信息(当usage_mode=SINGLE且scope=ALL时选填,配置优惠规则) 61 request.singleUsageInfo = new SingleUsageInfo(); 62 // 条件必填,满减券使用规则(当type=NORMAL且scope=ALL时必填) 63 request.singleUsageInfo.normalCoupon = new NormalCouponUsageRule(); 64 // 必填,门槛金额(单位:分),0表示无门槛 65 request.singleUsageInfo.normalCoupon.threshold = 10000L; 66 // 必填,减免金额(单位:分) 67 request.singleUsageInfo.normalCoupon.discountAmount = 1500L; 68 69 // 必填,商品券展示信息 70 request.displayInfo = new ProductCouponDisplayInfo(); 71 // 必填,商品券名称,最多12个字符 72 request.displayInfo.name = "全场满100减15"; 73 // 必填,商品券图片URL 74 request.displayInfo.imageUrl = "https://wxpaylogo.qpic.cn/wxpaylogo/xxxxx/xxx"; 75 // 选填,背景图URL 76 request.displayInfo.backgroundUrl = "https://wxpaylogo.qpic.cn/wxpaylogo/xxxxx/xxx"; 77 // 选填,详情图URL列表,最多6张 78 request.displayInfo.detailImageUrlList = new ArrayList<>(); 79 { 80 request.displayInfo.detailImageUrlList.add("https://wxpaylogo.qpic.cn/wxpaylogo/xxxxx/xxx"); 81 }; 82 83 // 条件必填,批次信息(当usage_mode=SINGLE时必填) 84 request.stock = new StockForCreate(); 85 request.stock.remark = "8月工作日有效批次"; 86 request.stock.couponCodeMode = CouponCodeMode.WECHATPAY; 87 request.stock.stockSendRule = new StockSendRule(); 88 request.stock.stockSendRule.maxCount = 10000000L; 89 request.stock.stockSendRule.maxCountPerDay = 100000L; 90 request.stock.stockSendRule.maxCountPerUser = 1L; 91 92 // 单券使用规则(scope=ALL时只配置券可核销时间,优惠规则在single_usage_info中) 93 request.stock.singleUsageRule = new SingleUsageRule(); 94 request.stock.singleUsageRule.couponAvailablePeriod = new CouponAvailablePeriod(); 95 request.stock.singleUsageRule.couponAvailablePeriod.availableBeginTime = "2025-08-01T00:00:00+08:00"; 96 request.stock.singleUsageRule.couponAvailablePeriod.availableEndTime = "2025-08-31T23:59:59+08:00"; 97 request.stock.singleUsageRule.couponAvailablePeriod.availableDays = 30L; 98 request.stock.singleUsageRule.couponAvailablePeriod.waitDaysAfterReceive = 0L; 99 request.stock.singleUsageRule.couponAvailablePeriod.weeklyAvailablePeriod = new FixedWeekPeriod(); 100 request.stock.singleUsageRule.couponAvailablePeriod.weeklyAvailablePeriod.dayList = new ArrayList<>(); 101 { 102 request.stock.singleUsageRule.couponAvailablePeriod.weeklyAvailablePeriod.dayList.add(WeekEnum.MONDAY); 103 request.stock.singleUsageRule.couponAvailablePeriod.weeklyAvailablePeriod.dayList.add(WeekEnum.TUESDAY); 104 request.stock.singleUsageRule.couponAvailablePeriod.weeklyAvailablePeriod.dayList.add(WeekEnum.WEDNESDAY); 105 request.stock.singleUsageRule.couponAvailablePeriod.weeklyAvailablePeriod.dayList.add(WeekEnum.THURSDAY); 106 request.stock.singleUsageRule.couponAvailablePeriod.weeklyAvailablePeriod.dayList.add(WeekEnum.FRIDAY); 107 }; 108 109 // 使用规则展示信息 110 request.stock.usageRuleDisplayInfo = new UsageRuleDisplayInfo(); 111 request.stock.usageRuleDisplayInfo.couponUsageMethodList = new ArrayList<>(); 112 { 113 request.stock.usageRuleDisplayInfo.couponUsageMethodList.add(CouponUsageMethod.OFFLINE); 114 request.stock.usageRuleDisplayInfo.couponUsageMethodList.add(CouponUsageMethod.MINI_PROGRAM); 115 request.stock.usageRuleDisplayInfo.couponUsageMethodList.add(CouponUsageMethod.PAYMENT_CODE); 116 }; 117 request.stock.usageRuleDisplayInfo.miniProgramAppid = "wx1234567890"; 118 request.stock.usageRuleDisplayInfo.miniProgramPath = "/pages/index/product"; 119 request.stock.usageRuleDisplayInfo.usageDescription = "工作日可用"; 120 request.stock.usageRuleDisplayInfo.couponAvailableStoreInfo = new CouponAvailableStoreInfo(); 121 request.stock.usageRuleDisplayInfo.couponAvailableStoreInfo.description = "所有门店可用,可使用小程序查看门店列表"; 122 request.stock.usageRuleDisplayInfo.couponAvailableStoreInfo.miniProgramAppid = "wx1234567890"; 123 request.stock.usageRuleDisplayInfo.couponAvailableStoreInfo.miniProgramPath = "/pages/index/store-list"; 124 125 // 用户券展示信息 126 request.stock.couponDisplayInfo = new CouponDisplayInfo(); 127 request.stock.couponDisplayInfo.codeDisplayMode = CouponCodeDisplayMode.QRCODE; 128 request.stock.couponDisplayInfo.backgroundColor = "Color010"; 129 request.stock.couponDisplayInfo.entranceMiniProgram = new EntranceMiniProgram(); 130 request.stock.couponDisplayInfo.entranceMiniProgram.appid = "wx1234567890"; 131 request.stock.couponDisplayInfo.entranceMiniProgram.path = "/pages/index/product"; 132 request.stock.couponDisplayInfo.entranceMiniProgram.entranceWording = "欢迎选购"; 133 request.stock.couponDisplayInfo.entranceMiniProgram.guidanceWording = "获取更多优惠"; 134 request.stock.couponDisplayInfo.entranceOfficialAccount = new EntranceOfficialAccount(); 135 request.stock.couponDisplayInfo.entranceOfficialAccount.appid = "wx1234567890"; 136 request.stock.couponDisplayInfo.entranceFinder = new EntranceFinder(); 137 request.stock.couponDisplayInfo.entranceFinder.finderId = "gh_12345678"; 138 request.stock.couponDisplayInfo.entranceFinder.finderVideoId = "UDFsdf24df34dD456Hdf34"; 139 request.stock.couponDisplayInfo.entranceFinder.finderVideoCoverImageUrl = "https://wxpaylogo.qpic.cn/wxpaylogo/xxxxx/xxx"; 140 141 // 事件通知配置 142 request.stock.notifyConfig = new NotifyConfig(); 143 request.stock.notifyConfig.notifyAppid = "wx4fd12345678"; 144 request.stock.storeScope = StockStoreScope.NONE; 145 146 try { 147 CreateProductCouponResponse response = client.run(request); 148 // TODO: 请求成功,继续业务逻辑 149 System.out.println(response); 150 } catch (WXPayUtility.ApiException e) { 151 // TODO: 请求失败,根据状态码执行不同的逻辑 152 e.printStackTrace(); 153 } 154 } 155 156 public CreateProductCouponResponse run(CreateProductCouponRequest request) { 157 String uri = PATH; 158 String reqBody = WXPayUtility.toJson(request); 159 160 Request.Builder reqBuilder = new Request.Builder().url(HOST + uri); 161 reqBuilder.addHeader("Accept", "application/json"); 162 reqBuilder.addHeader("Wechatpay-Serial", wechatPayPublicKeyId); 163 reqBuilder.addHeader("Authorization", WXPayUtility.buildAuthorization(mchid, certificateSerialNo, privateKey, METHOD, uri, reqBody)); 164 reqBuilder.addHeader("Content-Type", "application/json"); 165 RequestBody requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), reqBody); 166 reqBuilder.method(METHOD, requestBody); 167 Request httpRequest = reqBuilder.build(); 168 169 // 发送HTTP请求 170 OkHttpClient client = new OkHttpClient.Builder().build(); 171 try (Response httpResponse = client.newCall(httpRequest).execute()) { 172 String respBody = WXPayUtility.extractBody(httpResponse); 173 if (httpResponse.code() >= 200 && httpResponse.code() < 300) { 174 // 2XX 成功,验证应答签名 175 WXPayUtility.validateResponse(this.wechatPayPublicKeyId, this.wechatPayPublicKey, 176 httpResponse.headers(), respBody); 177 178 // 从HTTP应答报文构建返回数据 179 return WXPayUtility.fromJson(respBody, CreateProductCouponResponse.class); 180 } else { 181 throw new WXPayUtility.ApiException(httpResponse.code(), respBody, httpResponse.headers()); 182 } 183 } catch (IOException e) { 184 throw new UncheckedIOException("Sending request to " + uri + " failed.", e); 185 } 186 } 187 188 private final String mchid; 189 private final String certificateSerialNo; 190 private final PrivateKey privateKey; 191 private final String wechatPayPublicKeyId; 192 private final PublicKey wechatPayPublicKey; 193 194 public AllNormalSingleJava(String mchid, String certificateSerialNo, String privateKeyFilePath, String wechatPayPublicKeyId, String wechatPayPublicKeyFilePath) { 195 this.mchid = mchid; 196 this.certificateSerialNo = certificateSerialNo; 197 this.privateKey = WXPayUtility.loadPrivateKeyFromPath(privateKeyFilePath); 198 this.wechatPayPublicKeyId = wechatPayPublicKeyId; 199 this.wechatPayPublicKey = WXPayUtility.loadPublicKeyFromPath(wechatPayPublicKeyFilePath); 200 } 201 202 public static class CreateProductCouponRequest { 203 @SerializedName("out_request_no") 204 public String outRequestNo; 205 206 @SerializedName("scope") 207 public ProductCouponScope scope; 208 209 @SerializedName("type") 210 public ProductCouponType type; 211 212 @SerializedName("usage_mode") 213 public UsageMode usageMode; 214 215 @SerializedName("single_usage_info") 216 public SingleUsageInfo singleUsageInfo; 217 218 @SerializedName("progressive_bundle_usage_info") 219 public ProgressiveBundleUsageInfo progressiveBundleUsageInfo; 220 221 @SerializedName("display_info") 222 public ProductCouponDisplayInfo displayInfo; 223 224 @SerializedName("out_product_no") 225 public String outProductNo; 226 227 @SerializedName("stock") 228 public StockForCreate stock; 229 230 @SerializedName("stock_bundle") 231 public StockBundleForCreate stockBundle; 232 233 @SerializedName("brand_id") 234 public String brandId; 235 } 236 237 public static class CreateProductCouponResponse { 238 @SerializedName("product_coupon_id") 239 public String productCouponId; 240 241 @SerializedName("scope") 242 public ProductCouponScope scope; 243 244 @SerializedName("type") 245 public ProductCouponType type; 246 247 @SerializedName("usage_mode") 248 public UsageMode usageMode; 249 250 @SerializedName("single_usage_info") 251 public SingleUsageInfo singleUsageInfo; 252 253 @SerializedName("progressive_bundle_usage_info") 254 public ProgressiveBundleUsageInfo progressiveBundleUsageInfo; 255 256 @SerializedName("display_info") 257 public ProductCouponDisplayInfo displayInfo; 258 259 @SerializedName("out_product_no") 260 public String outProductNo; 261 262 @SerializedName("state") 263 public ProductCouponState state; 264 265 @SerializedName("stock") 266 public StockEntity stock; 267 268 @SerializedName("stock_bundle") 269 public StockBundleEntity stockBundle; 270 271 @SerializedName("brand_id") 272 public String brandId; 273 } 274 275 public enum ProductCouponScope { 276 @SerializedName("ALL") 277 ALL, 278 @SerializedName("SINGLE") 279 SINGLE 280 } 281 282 public enum ProductCouponType { 283 @SerializedName("NORMAL") 284 NORMAL, 285 @SerializedName("DISCOUNT") 286 DISCOUNT, 287 @SerializedName("EXCHANGE") 288 EXCHANGE 289 } 290 291 public enum UsageMode { 292 @SerializedName("SINGLE") 293 SINGLE, 294 @SerializedName("PROGRESSIVE_BUNDLE") 295 PROGRESSIVE_BUNDLE 296 } 297 298 public static class SingleUsageInfo { 299 @SerializedName("normal_coupon") 300 public NormalCouponUsageRule normalCoupon; 301 302 @SerializedName("discount_coupon") 303 public DiscountCouponUsageRule discountCoupon; 304 } 305 306 public static class ProgressiveBundleUsageInfo { 307 @SerializedName("count") 308 public Long count; 309 310 @SerializedName("interval_days") 311 public Long intervalDays; 312 } 313 314 public static class ProductCouponDisplayInfo { 315 @SerializedName("name") 316 public String name; 317 318 @SerializedName("image_url") 319 public String imageUrl; 320 321 @SerializedName("background_url") 322 public String backgroundUrl; 323 324 @SerializedName("detail_image_url_list") 325 public List<String> detailImageUrlList; 326 327 @SerializedName("original_price") 328 public Long originalPrice; 329 330 @SerializedName("combo_package_list") 331 public List<ComboPackage> comboPackageList; 332 } 333 334 public static class StockForCreate { 335 @SerializedName("remark") 336 public String remark; 337 338 @SerializedName("coupon_code_mode") 339 public CouponCodeMode couponCodeMode; 340 341 @SerializedName("stock_send_rule") 342 public StockSendRule stockSendRule; 343 344 @SerializedName("single_usage_rule") 345 public SingleUsageRule singleUsageRule; 346 347 @SerializedName("usage_rule_display_info") 348 public UsageRuleDisplayInfo usageRuleDisplayInfo; 349 350 @SerializedName("coupon_display_info") 351 public CouponDisplayInfo couponDisplayInfo; 352 353 @SerializedName("notify_config") 354 public NotifyConfig notifyConfig; 355 356 @SerializedName("store_scope") 357 public StockStoreScope storeScope; 358 } 359 360 public static class StockBundleForCreate { 361 @SerializedName("remark") 362 public String remark; 363 364 @SerializedName("coupon_code_mode") 365 public CouponCodeMode couponCodeMode; 366 367 @SerializedName("stock_send_rule") 368 public StockSendRule stockSendRule; 369 370 @SerializedName("progressive_bundle_usage_rule") 371 public StockBundleUsageRule progressiveBundleUsageRule; 372 373 @SerializedName("usage_rule_display_info") 374 public UsageRuleDisplayInfo usageRuleDisplayInfo; 375 376 @SerializedName("coupon_display_info") 377 public CouponDisplayInfo couponDisplayInfo; 378 379 @SerializedName("notify_config") 380 public NotifyConfig notifyConfig; 381 382 @SerializedName("store_scope") 383 public StockStoreScope storeScope; 384 } 385 386 public enum ProductCouponState { 387 @SerializedName("AUDITING") 388 AUDITING, 389 @SerializedName("EFFECTIVE") 390 EFFECTIVE, 391 @SerializedName("DEACTIVATED") 392 DEACTIVATED 393 } 394 395 public static class StockEntity { 396 @SerializedName("product_coupon_id") 397 public String productCouponId; 398 399 @SerializedName("stock_id") 400 public String stockId; 401 402 @SerializedName("remark") 403 public String remark; 404 405 @SerializedName("coupon_code_mode") 406 public CouponCodeMode couponCodeMode; 407 408 @SerializedName("coupon_code_count_info") 409 public CouponCodeCountInfo couponCodeCountInfo; 410 411 @SerializedName("stock_send_rule") 412 public StockSendRule stockSendRule; 413 414 @SerializedName("single_usage_rule") 415 public SingleUsageRule singleUsageRule; 416 417 @SerializedName("usage_rule_display_info") 418 public UsageRuleDisplayInfo usageRuleDisplayInfo; 419 420 @SerializedName("coupon_display_info") 421 public CouponDisplayInfo couponDisplayInfo; 422 423 @SerializedName("notify_config") 424 public NotifyConfig notifyConfig; 425 426 @SerializedName("store_scope") 427 public StockStoreScope storeScope; 428 429 @SerializedName("sent_count_info") 430 public StockSentCountInfo sentCountInfo; 431 432 @SerializedName("state") 433 public StockState state; 434 435 @SerializedName("deactivate_request_no") 436 public String deactivateRequestNo; 437 438 @SerializedName("deactivate_time") 439 public String deactivateTime; 440 441 @SerializedName("deactivate_reason") 442 public String deactivateReason; 443 444 @SerializedName("brand_id") 445 public String brandId; 446 } 447 448 public static class StockBundleEntity { 449 @SerializedName("stock_bundle_id") 450 public String stockBundleId; 451 452 @SerializedName("stock_list") 453 public List<StockEntityInBundle> stockList = new ArrayList<StockEntityInBundle>(); 454 } 455 456 public static class NormalCouponUsageRule { 457 @SerializedName("threshold") 458 public Long threshold; 459 460 @SerializedName("discount_amount") 461 public Long discountAmount; 462 } 463 464 public static class DiscountCouponUsageRule { 465 @SerializedName("threshold") 466 public Long threshold; 467 468 @SerializedName("percent_off") 469 public Long percentOff; 470 } 471 472 public static class ComboPackage { 473 @SerializedName("name") 474 public String name; 475 476 @SerializedName("pick_count") 477 public Long pickCount; 478 479 @SerializedName("choice_list") 480 public List<ComboPackageChoice> choiceList = new ArrayList<ComboPackageChoice>(); 481 } 482 483 public enum CouponCodeMode { 484 @SerializedName("WECHATPAY") 485 WECHATPAY, 486 @SerializedName("UPLOAD") 487 UPLOAD, 488 @SerializedName("API_ASSIGN") 489 API_ASSIGN 490 } 491 492 public static class StockSendRule { 493 @SerializedName("max_count") 494 public Long maxCount; 495 496 @SerializedName("max_count_per_day") 497 public Long maxCountPerDay; 498 499 @SerializedName("max_count_per_user") 500 public Long maxCountPerUser; 501 } 502 503 public static class SingleUsageRule { 504 @SerializedName("coupon_available_period") 505 public CouponAvailablePeriod couponAvailablePeriod; 506 507 @SerializedName("normal_coupon") 508 public NormalCouponUsageRule normalCoupon; 509 510 @SerializedName("discount_coupon") 511 public DiscountCouponUsageRule discountCoupon; 512 513 @SerializedName("exchange_coupon") 514 public ExchangeCouponUsageRule exchangeCoupon; 515 } 516 517 public static class UsageRuleDisplayInfo { 518 @SerializedName("coupon_usage_method_list") 519 public List<CouponUsageMethod> couponUsageMethodList = new ArrayList<CouponUsageMethod>(); 520 521 @SerializedName("mini_program_appid") 522 public String miniProgramAppid; 523 524 @SerializedName("mini_program_path") 525 public String miniProgramPath; 526 527 @SerializedName("app_path") 528 public String appPath; 529 530 @SerializedName("usage_description") 531 public String usageDescription; 532 533 @SerializedName("coupon_available_store_info") 534 public CouponAvailableStoreInfo couponAvailableStoreInfo; 535 } 536 537 public static class CouponDisplayInfo { 538 @SerializedName("code_display_mode") 539 public CouponCodeDisplayMode codeDisplayMode; 540 541 @SerializedName("background_color") 542 public String backgroundColor; 543 544 @SerializedName("entrance_mini_program") 545 public EntranceMiniProgram entranceMiniProgram; 546 547 @SerializedName("entrance_official_account") 548 public EntranceOfficialAccount entranceOfficialAccount; 549 550 @SerializedName("entrance_finder") 551 public EntranceFinder entranceFinder; 552 } 553 554 public static class NotifyConfig { 555 @SerializedName("notify_appid") 556 public String notifyAppid; 557 } 558 559 public enum StockStoreScope { 560 @SerializedName("NONE") 561 NONE, 562 @SerializedName("ALL") 563 ALL, 564 @SerializedName("SPECIFIC") 565 SPECIFIC 566 } 567 568 public static class StockBundleUsageRule { 569 @SerializedName("coupon_available_period") 570 public CouponAvailablePeriod couponAvailablePeriod; 571 572 @SerializedName("normal_coupon_list") 573 public List<NormalCouponUsageRule> normalCouponList; 574 575 @SerializedName("discount_coupon_list") 576 public List<DiscountCouponUsageRule> discountCouponList; 577 578 @SerializedName("exchange_coupon_list") 579 public List<ExchangeCouponUsageRule> exchangeCouponList; 580 } 581 582 public static class CouponCodeCountInfo { 583 @SerializedName("total_count") 584 public Long totalCount; 585 586 @SerializedName("available_count") 587 public Long availableCount; 588 } 589 590 public static class StockSentCountInfo { 591 @SerializedName("total_count") 592 public Long totalCount; 593 594 @SerializedName("today_count") 595 public Long todayCount; 596 } 597 598 public enum StockState { 599 @SerializedName("AUDITING") 600 AUDITING, 601 @SerializedName("SENDING") 602 SENDING, 603 @SerializedName("PAUSED") 604 PAUSED, 605 @SerializedName("STOPPED") 606 STOPPED, 607 @SerializedName("DEACTIVATED") 608 DEACTIVATED 609 } 610 611 public static class StockEntityInBundle { 612 @SerializedName("product_coupon_id") 613 public String productCouponId; 614 615 @SerializedName("stock_id") 616 public String stockId; 617 618 @SerializedName("remark") 619 public String remark; 620 621 @SerializedName("coupon_code_mode") 622 public CouponCodeMode couponCodeMode; 623 624 @SerializedName("coupon_code_count_info") 625 public CouponCodeCountInfo couponCodeCountInfo; 626 627 @SerializedName("stock_send_rule") 628 public StockSendRule stockSendRule; 629 630 @SerializedName("progressive_bundle_usage_rule") 631 public StockUsageRule progressiveBundleUsageRule; 632 633 @SerializedName("stock_bundle_info") 634 public StockBundleInfo stockBundleInfo; 635 636 @SerializedName("usage_rule_display_info") 637 public UsageRuleDisplayInfo usageRuleDisplayInfo; 638 639 @SerializedName("coupon_display_info") 640 public CouponDisplayInfo couponDisplayInfo; 641 642 @SerializedName("notify_config") 643 public NotifyConfig notifyConfig; 644 645 @SerializedName("store_scope") 646 public StockStoreScope storeScope; 647 648 @SerializedName("sent_count_info") 649 public StockSentCountInfo sentCountInfo; 650 651 @SerializedName("state") 652 public StockState state; 653 654 @SerializedName("deactivate_request_no") 655 public String deactivateRequestNo; 656 657 @SerializedName("deactivate_time") 658 public String deactivateTime; 659 660 @SerializedName("deactivate_reason") 661 public String deactivateReason; 662 663 @SerializedName("brand_id") 664 public String brandId; 665 } 666 667 public static class ComboPackageChoice { 668 @SerializedName("name") 669 public String name; 670 671 @SerializedName("price") 672 public Long price; 673 674 @SerializedName("count") 675 public Long count; 676 677 @SerializedName("image_url") 678 public String imageUrl; 679 680 @SerializedName("mini_program_appid") 681 public String miniProgramAppid; 682 683 @SerializedName("mini_program_path") 684 public String miniProgramPath; 685 } 686 687 public static class CouponAvailablePeriod { 688 @SerializedName("available_begin_time") 689 public String availableBeginTime; 690 691 @SerializedName("available_end_time") 692 public String availableEndTime; 693 694 @SerializedName("available_days") 695 public Long availableDays; 696 697 @SerializedName("wait_days_after_receive") 698 public Long waitDaysAfterReceive; 699 700 @SerializedName("weekly_available_period") 701 public FixedWeekPeriod weeklyAvailablePeriod; 702 703 @SerializedName("irregular_available_period_list") 704 public List<TimePeriod> irregularAvailablePeriodList; 705 } 706 707 public static class ExchangeCouponUsageRule { 708 @SerializedName("threshold") 709 public Long threshold; 710 711 @SerializedName("exchange_price") 712 public Long exchangePrice; 713 } 714 715 public enum CouponUsageMethod { 716 @SerializedName("OFFLINE") 717 OFFLINE, 718 @SerializedName("MINI_PROGRAM") 719 MINI_PROGRAM, 720 @SerializedName("APP") 721 APP, 722 @SerializedName("PAYMENT_CODE") 723 PAYMENT_CODE 724 } 725 726 public static class CouponAvailableStoreInfo { 727 @SerializedName("description") 728 public String description; 729 730 @SerializedName("mini_program_appid") 731 public String miniProgramAppid; 732 733 @SerializedName("mini_program_path") 734 public String miniProgramPath; 735 } 736 737 public enum CouponCodeDisplayMode { 738 @SerializedName("INVISIBLE") 739 INVISIBLE, 740 @SerializedName("BARCODE") 741 BARCODE, 742 @SerializedName("QRCODE") 743 QRCODE 744 } 745 746 public static class EntranceMiniProgram { 747 @SerializedName("appid") 748 public String appid; 749 750 @SerializedName("path") 751 public String path; 752 753 @SerializedName("entrance_wording") 754 public String entranceWording; 755 756 @SerializedName("guidance_wording") 757 public String guidanceWording; 758 } 759 760 public static class EntranceOfficialAccount { 761 @SerializedName("appid") 762 public String appid; 763 } 764 765 public static class EntranceFinder { 766 @SerializedName("finder_id") 767 public String finderId; 768 769 @SerializedName("finder_video_id") 770 public String finderVideoId; 771 772 @SerializedName("finder_video_cover_image_url") 773 public String finderVideoCoverImageUrl; 774 } 775 776 public static class StockUsageRule { 777 @SerializedName("coupon_available_period") 778 public CouponAvailablePeriod couponAvailablePeriod; 779 780 @SerializedName("normal_coupon") 781 public NormalCouponUsageRule normalCoupon; 782 783 @SerializedName("discount_coupon") 784 public DiscountCouponUsageRule discountCoupon; 785 786 @SerializedName("exchange_coupon") 787 public ExchangeCouponUsageRule exchangeCoupon; 788 } 789 790 public static class StockBundleInfo { 791 @SerializedName("stock_bundle_id") 792 public String stockBundleId; 793 794 @SerializedName("stock_bundle_index") 795 public Long stockBundleIndex; 796 } 797 798 public static class FixedWeekPeriod { 799 @SerializedName("day_list") 800 public List<WeekEnum> dayList; 801 802 @SerializedName("day_period_list") 803 public List<PeriodOfTheDay> dayPeriodList; 804 } 805 806 public static class TimePeriod { 807 @SerializedName("begin_time") 808 public String beginTime; 809 810 @SerializedName("end_time") 811 public String endTime; 812 } 813 814 public enum WeekEnum { 815 @SerializedName("MONDAY") 816 MONDAY, 817 @SerializedName("TUESDAY") 818 TUESDAY, 819 @SerializedName("WEDNESDAY") 820 WEDNESDAY, 821 @SerializedName("THURSDAY") 822 THURSDAY, 823 @SerializedName("FRIDAY") 824 FRIDAY, 825 @SerializedName("SATURDAY") 826 SATURDAY, 827 @SerializedName("SUNDAY") 828 SUNDAY 829 } 830 831 public static class PeriodOfTheDay { 832 @SerializedName("begin_time") 833 public Long beginTime; 834 835 @SerializedName("end_time") 836 public Long endTime; 837 } 838 839}
需配合微信支付工具库 wxpay_utility 使用,请参考 Go
1package main 2 3import ( 4 "bytes" 5 "demo/wxpay_utility" 6 "encoding/json" 7 "fmt" 8 "net/http" 9 "net/url" 10) 11 12// 场景2:创建商品券 - 单券-全场-满减券 13// 14// 场景说明: 15// - usage_mode: SINGLE(单券模式) 16// - scope: ALL(全场券) 17// - type: NORMAL(满减券) 18// 19// 优惠规则配置位置:single_usage_info.normal_coupon(全场券在single_usage_info中配置) 20// 21// 接口文档:https://pay.weixin.qq.com/doc/v3/partner/4015781289 22 23func main() { 24 config, err := wxpay_utility.CreateMchConfig( 25 "19xxxxxxxx", "1DDE55AD98Exxxxxxxxxx", "/path/to/apiclient_key.pem", 26 "PUB_KEY_ID_xxxxxxxxxxxxx", "/path/to/wxp_pub.pem", 27 ) 28 if err != nil { 29 fmt.Println(err) 30 return 31 } 32 33 request := &CreateProductCouponRequest{ 34 // ==================== 一级参数 ==================== 35 // 必填:创建请求单号,品牌侧需保持唯一性,6-40个字符 36 OutRequestNo: wxpay_utility.String("SINGLE_ALL_NORMAL_20250101_002"), 37 // 必填:品牌ID,由微信支付分配 38 BrandId: wxpay_utility.String("120344"), 39 // 必填:优惠范围,ALL=全场券(仅支持NORMAL/DISCOUNT) 40 Scope: PRODUCTCOUPONSCOPE_ALL.Ptr(), 41 // 必填:商品券类型,NORMAL=满减券 42 Type: PRODUCTCOUPONTYPE_NORMAL.Ptr(), 43 // 必填:使用模式,SINGLE=单券模式 44 UsageMode: USAGEMODE_SINGLE.Ptr(), 45 // 选填:商户侧商品券唯一标识 46 OutProductNo: wxpay_utility.String("Product_SINGLE_002"), 47 48 // ==================== 条件必填:单券模式优惠信息(当usage_mode=SINGLE且scope=ALL时选填) ==================== 49 SingleUsageInfo: &SingleUsageInfo{ 50 // 条件必填:满减券使用规则(当type=NORMAL且scope=ALL时必填) 51 NormalCoupon: &NormalCouponUsageRule{ 52 // 必填:门槛金额,单位为分,0表示无门槛。满100元可用填10000 53 Threshold: wxpay_utility.Int64(10000), 54 // 必填:固定减免金额,单位为分,减15元填1500 55 DiscountAmount: wxpay_utility.Int64(1500), 56 }, 57 }, 58 59 // ==================== 必填:商品券展示信息 ==================== 60 DisplayInfo: &ProductCouponDisplayInfo{ 61 // 必填:商品券名称,最多20个字符 62 Name: wxpay_utility.String("全场满100减15"), 63 // 必填:商品图片URL,需通过图片上传接口获取 64 ImageUrl: wxpay_utility.String("https://wxpaylogo.qpic.cn/wxpaylogo/xxxxx/xxx"), 65 // 选填:背景图URL 66 BackgroundUrl: wxpay_utility.String("https://wxpaylogo.qpic.cn/wxpaylogo/xxxxx/xxx"), 67 // 选填:详情图URL列表,最多6张 68 DetailImageUrlList: []string{"https://wxpaylogo.qpic.cn/wxpaylogo/xxxxx/xxx"}, 69 }, 70 71 // ==================== 批次信息(必填) ==================== 72 Stock: &StockForCreate{ 73 Remark: wxpay_utility.String("8月工作日有效批次"), 74 CouponCodeMode: COUPONCODEMODE_WECHATPAY.Ptr(), 75 StockSendRule: &StockSendRule{ 76 MaxCount: wxpay_utility.Int64(10000000), MaxCountPerDay: wxpay_utility.Int64(100000), MaxCountPerUser: wxpay_utility.Int64(1), 77 }, 78 // 单券使用规则(scope=ALL时只配置券可核销时间,优惠规则在single_usage_info中) 79 SingleUsageRule: &SingleUsageRule{ 80 CouponAvailablePeriod: &CouponAvailablePeriod{ 81 AvailableBeginTime: wxpay_utility.String("2025-08-01T00:00:00+08:00"), 82 AvailableEndTime: wxpay_utility.String("2025-08-31T23:59:59+08:00"), 83 AvailableDays: wxpay_utility.Int64(30), 84 WaitDaysAfterReceive: wxpay_utility.Int64(0), 85 WeeklyAvailablePeriod: &FixedWeekPeriod{ 86 DayList: []WeekEnum{WEEKENUM_MONDAY, WEEKENUM_TUESDAY, WEEKENUM_WEDNESDAY, WEEKENUM_THURSDAY, WEEKENUM_FRIDAY}, 87 }, 88 }, 89 }, 90 UsageRuleDisplayInfo: &UsageRuleDisplayInfo{ 91 CouponUsageMethodList: []CouponUsageMethod{COUPONUSAGEMETHOD_OFFLINE, COUPONUSAGEMETHOD_MINI_PROGRAM, COUPONUSAGEMETHOD_PAYMENT_CODE}, 92 MiniProgramAppid: wxpay_utility.String("wx1234567890"), 93 MiniProgramPath: wxpay_utility.String("/pages/index/product"), 94 UsageDescription: wxpay_utility.String("工作日可用"), 95 CouponAvailableStoreInfo: &CouponAvailableStoreInfo{ 96 Description: wxpay_utility.String("所有门店可用"), MiniProgramAppid: wxpay_utility.String("wx1234567890"), MiniProgramPath: wxpay_utility.String("/pages/index/store-list"), 97 }, 98 }, 99 CouponDisplayInfo: &CouponDisplayInfo{ 100 CodeDisplayMode: COUPONCODEDISPLAYMODE_QRCODE.Ptr(), 101 BackgroundColor: wxpay_utility.String("Color010"), 102 EntranceMiniProgram: &EntranceMiniProgram{ 103 Appid: wxpay_utility.String("wx1234567890"), Path: wxpay_utility.String("/pages/index/product"), 104 EntranceWording: wxpay_utility.String("欢迎选购"), GuidanceWording: wxpay_utility.String("获取更多优惠"), 105 }, 106 EntranceOfficialAccount: &EntranceOfficialAccount{Appid: wxpay_utility.String("wx1234567890")}, 107 EntranceFinder: &EntranceFinder{ 108 FinderId: wxpay_utility.String("gh_12345678"), FinderVideoId: wxpay_utility.String("UDFsdf24df34dD456Hdf34"), 109 FinderVideoCoverImageUrl: wxpay_utility.String("https://wxpaylogo.qpic.cn/wxpaylogo/xxxxx/xxx"), 110 }, 111 }, 112 NotifyConfig: &NotifyConfig{NotifyAppid: wxpay_utility.String("wx4fd12345678")}, 113 StoreScope: STOCKSTORESCOPE_NONE.Ptr(), 114 }, 115 } 116 117 response, err := CreateProductCoupon(config, request) 118 if err != nil { 119 fmt.Printf("请求失败: %+v\n", err) 120 return 121 } 122 fmt.Printf("请求成功: %+v\n", response) 123} 124 125func CreateProductCoupon(config *wxpay_utility.MchConfig, request *CreateProductCouponRequest) (*CreateProductCouponResponse, error) { 126 const ( 127 host = "https://api.mch.weixin.qq.com"; method = "POST"; path = "/v3/marketing/partner/product-coupon/product-coupons" 128 ) 129 reqUrl, _ := url.Parse(fmt.Sprintf("%s%s", host, path)) 130 reqBody, _ := json.Marshal(request) 131 httpRequest, _ := http.NewRequest(method, reqUrl.String(), bytes.NewReader(reqBody)) 132 httpRequest.Header.Set("Accept", "application/json") 133 httpRequest.Header.Set("Wechatpay-Serial", config.WechatPayPublicKeyId()) 134 httpRequest.Header.Set("Content-Type", "application/json") 135 authorization, _ := wxpay_utility.BuildAuthorization(config.MchId(), config.CertificateSerialNo(), config.PrivateKey(), method, reqUrl.RequestURI(), reqBody) 136 httpRequest.Header.Set("Authorization", authorization) 137 client := &http.Client{} 138 httpResponse, err := client.Do(httpRequest) 139 if err != nil { 140 return nil, err 141 } 142 respBody, _ := wxpay_utility.ExtractResponseBody(httpResponse) 143 if httpResponse.StatusCode >= 200 && httpResponse.StatusCode < 300 { 144 wxpay_utility.ValidateResponse(config.WechatPayPublicKeyId(), config.WechatPayPublicKey(), &httpResponse.Header, respBody) 145 response := &CreateProductCouponResponse{} 146 json.Unmarshal(respBody, response) 147 return response, nil 148 } 149 return nil, wxpay_utility.NewApiException(httpResponse.StatusCode, httpResponse.Header, respBody) 150} 151 152// ==================== 请求/响应结构体定义 ==================== 153 154type CreateProductCouponRequest struct { 155 OutRequestNo *string `json:"out_request_no,omitempty"` 156 BrandId *string `json:"brand_id,omitempty"` 157 Scope *ProductCouponScope `json:"scope,omitempty"` 158 Type *ProductCouponType `json:"type,omitempty"` 159 UsageMode *UsageMode `json:"usage_mode,omitempty"` 160 SingleUsageInfo *SingleUsageInfo `json:"single_usage_info,omitempty"` 161 DisplayInfo *ProductCouponDisplayInfo `json:"display_info,omitempty"` 162 OutProductNo *string `json:"out_product_no,omitempty"` 163 Stock *StockForCreate `json:"stock,omitempty"` 164} 165 166type CreateProductCouponResponse struct { 167 ProductCouponId *string `json:"product_coupon_id,omitempty"` 168 Scope *ProductCouponScope `json:"scope,omitempty"` 169 Type *ProductCouponType `json:"type,omitempty"` 170 UsageMode *UsageMode `json:"usage_mode,omitempty"` 171 SingleUsageInfo *SingleUsageInfo `json:"single_usage_info,omitempty"` 172 DisplayInfo *ProductCouponDisplayInfo `json:"display_info,omitempty"` 173 OutProductNo *string `json:"out_product_no,omitempty"` 174 State *ProductCouponState `json:"state,omitempty"` 175 Stock *StockEntity `json:"stock,omitempty"` 176 BrandId *string `json:"brand_id,omitempty"` 177} 178 179// ==================== 枚举类型定义 ==================== 180 181type ProductCouponScope string 182 183func (e ProductCouponScope) Ptr() *ProductCouponScope { return &e } 184 185const (PRODUCTCOUPONSCOPE_ALL ProductCouponScope = "ALL"; PRODUCTCOUPONSCOPE_SINGLE ProductCouponScope = "SINGLE") 186 187type ProductCouponType string 188 189func (e ProductCouponType) Ptr() *ProductCouponType { return &e } 190 191const (PRODUCTCOUPONTYPE_NORMAL ProductCouponType = "NORMAL"; PRODUCTCOUPONTYPE_DISCOUNT ProductCouponType = "DISCOUNT"; PRODUCTCOUPONTYPE_EXCHANGE ProductCouponType = "EXCHANGE") 192 193type UsageMode string 194 195func (e UsageMode) Ptr() *UsageMode { return &e } 196 197const (USAGEMODE_SINGLE UsageMode = "SINGLE"; USAGEMODE_PROGRESSIVE_BUNDLE UsageMode = "PROGRESSIVE_BUNDLE") 198 199type ProductCouponState string 200 201func (e ProductCouponState) Ptr() *ProductCouponState { return &e } 202 203const (PRODUCTCOUPONSTATE_AUDITING ProductCouponState = "AUDITING"; PRODUCTCOUPONSTATE_EFFECTIVE ProductCouponState = "EFFECTIVE"; PRODUCTCOUPONSTATE_DEACTIVATED ProductCouponState = "DEACTIVATED") 204 205type CouponCodeMode string 206 207func (e CouponCodeMode) Ptr() *CouponCodeMode { return &e } 208 209const (COUPONCODEMODE_WECHATPAY CouponCodeMode = "WECHATPAY"; COUPONCODEMODE_UPLOAD CouponCodeMode = "UPLOAD"; COUPONCODEMODE_API_ASSIGN CouponCodeMode = "API_ASSIGN") 210 211type StockStoreScope string 212 213func (e StockStoreScope) Ptr() *StockStoreScope { return &e } 214 215const (STOCKSTORESCOPE_NONE StockStoreScope = "NONE"; STOCKSTORESCOPE_ALL StockStoreScope = "ALL"; STOCKSTORESCOPE_SPECIFIC StockStoreScope = "SPECIFIC") 216 217type CouponUsageMethod string 218 219func (e CouponUsageMethod) Ptr() *CouponUsageMethod { return &e } 220 221const (COUPONUSAGEMETHOD_OFFLINE CouponUsageMethod = "OFFLINE"; COUPONUSAGEMETHOD_MINI_PROGRAM CouponUsageMethod = "MINI_PROGRAM"; COUPONUSAGEMETHOD_APP CouponUsageMethod = "APP"; COUPONUSAGEMETHOD_PAYMENT_CODE CouponUsageMethod = "PAYMENT_CODE") 222 223type CouponCodeDisplayMode string 224 225func (e CouponCodeDisplayMode) Ptr() *CouponCodeDisplayMode { return &e } 226 227const (COUPONCODEDISPLAYMODE_INVISIBLE CouponCodeDisplayMode = "INVISIBLE"; COUPONCODEDISPLAYMODE_BARCODE CouponCodeDisplayMode = "BARCODE"; COUPONCODEDISPLAYMODE_QRCODE CouponCodeDisplayMode = "QRCODE") 228 229type WeekEnum string 230 231func (e WeekEnum) Ptr() *WeekEnum { return &e } 232 233const (WEEKENUM_MONDAY WeekEnum = "MONDAY"; WEEKENUM_TUESDAY WeekEnum = "TUESDAY"; WEEKENUM_WEDNESDAY WeekEnum = "WEDNESDAY"; WEEKENUM_THURSDAY WeekEnum = "THURSDAY"; WEEKENUM_FRIDAY WeekEnum = "FRIDAY"; WEEKENUM_SATURDAY WeekEnum = "SATURDAY"; WEEKENUM_SUNDAY WeekEnum = "SUNDAY") 234 235type StockState string 236 237func (e StockState) Ptr() *StockState { return &e } 238 239const (STOCKSTATE_AUDITING StockState = "AUDITING"; STOCKSTATE_SENDING StockState = "SENDING"; STOCKSTATE_PAUSED StockState = "PAUSED"; STOCKSTATE_STOPPED StockState = "STOPPED"; STOCKSTATE_DEACTIVATED StockState = "DEACTIVATED") 240 241// ==================== 数据模型结构体定义 ==================== 242 243type SingleUsageInfo struct { 244 NormalCoupon *NormalCouponUsageRule `json:"normal_coupon,omitempty"` 245 DiscountCoupon *DiscountCouponUsageRule `json:"discount_coupon,omitempty"` 246} 247type ProductCouponDisplayInfo struct { 248 Name *string `json:"name,omitempty"`; ImageUrl *string `json:"image_url,omitempty"`; BackgroundUrl *string `json:"background_url,omitempty"` 249 DetailImageUrlList []string `json:"detail_image_url_list,omitempty"`; OriginalPrice *int64 `json:"original_price,omitempty"`; ComboPackageList []ComboPackage `json:"combo_package_list,omitempty"` 250} 251type StockForCreate struct { 252 Remark *string `json:"remark,omitempty"`; CouponCodeMode *CouponCodeMode `json:"coupon_code_mode,omitempty"`; StockSendRule *StockSendRule `json:"stock_send_rule,omitempty"` 253 SingleUsageRule *SingleUsageRule `json:"single_usage_rule,omitempty"`; UsageRuleDisplayInfo *UsageRuleDisplayInfo `json:"usage_rule_display_info,omitempty"` 254 CouponDisplayInfo *CouponDisplayInfo `json:"coupon_display_info,omitempty"`; NotifyConfig *NotifyConfig `json:"notify_config,omitempty"`; StoreScope *StockStoreScope `json:"store_scope,omitempty"` 255} 256type StockEntity struct { 257 ProductCouponId *string `json:"product_coupon_id,omitempty"`; StockId *string `json:"stock_id,omitempty"`; Remark *string `json:"remark,omitempty"` 258 CouponCodeMode *CouponCodeMode `json:"coupon_code_mode,omitempty"`; StockSendRule *StockSendRule `json:"stock_send_rule,omitempty"` 259 SingleUsageRule *SingleUsageRule `json:"single_usage_rule,omitempty"`; UsageRuleDisplayInfo *UsageRuleDisplayInfo `json:"usage_rule_display_info,omitempty"` 260 CouponDisplayInfo *CouponDisplayInfo `json:"coupon_display_info,omitempty"`; NotifyConfig *NotifyConfig `json:"notify_config,omitempty"` 261 StoreScope *StockStoreScope `json:"store_scope,omitempty"`; State *StockState `json:"state,omitempty"`; BrandId *string `json:"brand_id,omitempty"` 262} 263type NormalCouponUsageRule struct { Threshold *int64 `json:"threshold,omitempty"`; DiscountAmount *int64 `json:"discount_amount,omitempty"` } 264type DiscountCouponUsageRule struct { Threshold *int64 `json:"threshold,omitempty"`; PercentOff *int64 `json:"percent_off,omitempty"` } 265type ExchangeCouponUsageRule struct { Threshold *int64 `json:"threshold,omitempty"`; ExchangePrice *int64 `json:"exchange_price,omitempty"` } 266type ComboPackage struct { Name *string `json:"name,omitempty"`; PickCount *int64 `json:"pick_count,omitempty"`; ChoiceList []ComboPackageChoice `json:"choice_list,omitempty"` } 267type ComboPackageChoice struct { Name *string `json:"name,omitempty"`; Price *int64 `json:"price,omitempty"`; Count *int64 `json:"count,omitempty"`; ImageUrl *string `json:"image_url,omitempty"`; MiniProgramAppid *string `json:"mini_program_appid,omitempty"`; MiniProgramPath *string `json:"mini_program_path,omitempty"` } 268type StockSendRule struct { MaxCount *int64 `json:"max_count,omitempty"`; MaxCountPerDay *int64 `json:"max_count_per_day,omitempty"`; MaxCountPerUser *int64 `json:"max_count_per_user,omitempty"` } 269type SingleUsageRule struct { 270 CouponAvailablePeriod *CouponAvailablePeriod `json:"coupon_available_period,omitempty"` 271 NormalCoupon *NormalCouponUsageRule `json:"normal_coupon,omitempty"` 272 DiscountCoupon *DiscountCouponUsageRule `json:"discount_coupon,omitempty"` 273 ExchangeCoupon *ExchangeCouponUsageRule `json:"exchange_coupon,omitempty"` 274} 275type CouponAvailablePeriod struct { AvailableBeginTime *string `json:"available_begin_time,omitempty"`; AvailableEndTime *string `json:"available_end_time,omitempty"`; AvailableDays *int64 `json:"available_days,omitempty"`; WaitDaysAfterReceive *int64 `json:"wait_days_after_receive,omitempty"`; WeeklyAvailablePeriod *FixedWeekPeriod `json:"weekly_available_period,omitempty"`; IrregularAvailablePeriodList []TimePeriod `json:"irregular_available_period_list,omitempty"` } 276type FixedWeekPeriod struct { DayList []WeekEnum `json:"day_list,omitempty"` } 277type TimePeriod struct { BeginTime *string `json:"begin_time,omitempty"`; EndTime *string `json:"end_time,omitempty"` } 278type UsageRuleDisplayInfo struct { CouponUsageMethodList []CouponUsageMethod `json:"coupon_usage_method_list,omitempty"`; MiniProgramAppid *string `json:"mini_program_appid,omitempty"`; MiniProgramPath *string `json:"mini_program_path,omitempty"`; UsageDescription *string `json:"usage_description,omitempty"`; CouponAvailableStoreInfo *CouponAvailableStoreInfo `json:"coupon_available_store_info,omitempty"` } 279type CouponAvailableStoreInfo struct { Description *string `json:"description,omitempty"`; MiniProgramAppid *string `json:"mini_program_appid,omitempty"`; MiniProgramPath *string `json:"mini_program_path,omitempty"` } 280type CouponDisplayInfo struct { CodeDisplayMode *CouponCodeDisplayMode `json:"code_display_mode,omitempty"`; BackgroundColor *string `json:"background_color,omitempty"`; EntranceMiniProgram *EntranceMiniProgram `json:"entrance_mini_program,omitempty"`; EntranceOfficialAccount *EntranceOfficialAccount `json:"entrance_official_account,omitempty"`; EntranceFinder *EntranceFinder `json:"entrance_finder,omitempty"` } 281type EntranceMiniProgram struct { Appid *string `json:"appid,omitempty"`; Path *string `json:"path,omitempty"`; EntranceWording *string `json:"entrance_wording,omitempty"`; GuidanceWording *string `json:"guidance_wording,omitempty"` } 282type EntranceOfficialAccount struct { Appid *string `json:"appid,omitempty"` } 283type EntranceFinder struct { FinderId *string `json:"finder_id,omitempty"`; FinderVideoId *string `json:"finder_video_id,omitempty"`; FinderVideoCoverImageUrl *string `json:"finder_video_cover_image_url,omitempty"` } 284type NotifyConfig struct { NotifyAppid *string `json:"notify_appid,omitempty"` } 285
文档是否有帮助

