查询用户券详情
更新时间:2024.11.18商户可通过该接口查询微信用户卡包中某一张商家券的详情信息。
接口说明
支持商户:【普通服务商】 【渠道商】
请求方式:【GET】/v3/marketing/busifavor/users/{openid}/coupons/{coupon_code}/appids/{appid}
请求域名:【主域名】https://api.mch.weixin.qq.com 使用该域名将访问就近的接入点
【备域名】https://api2.mch.weixin.qq.com 使用该域名将访问异地的接入点 ,指引点击查看
请求参数
Header HTTP头参数
Authorization 必填 string
请参考签名认证生成认证信息
Accept 必填 string
请设置为application/json
path 路径参数
coupon_code 必填 string
【券code】券的唯一标识
appid 必填 string
【公众账号ID】支持传入与当前调用接口商户号有绑定关系的AppID。支持小程序AppID与公众号AppID。
校验规则:传入的AppID得是与调用方商户号(即请求头里面的商户号)有绑定关系的AppID或传入的AppID得是归属商户号有绑定关系的AppID
openid 必填 string
【用户OpenID】OpenID信息,用户在AppID下的唯一标识。
校验规则:传入的OpenID得是调用方商户号(即请求头里面的商户号)有绑定关系的AppID获取的OpenID或传入的OpenID得是归属商户号有绑定关系的AppID获取的OpenID。获取OpenID文档
请求示例
GET
1curl -X GET \ 2 https://api.mch.weixin.qq.com/v3/marketing/busifavor/users/2323dfsdf342342/coupons/123446565767/appids/wx233544546545989 \ 3 -H "Authorization: WECHATPAY2-SHA256-RSA2048 mchid=\"1900000001\",..." \ 4 -H "Accept: application/json" 5
需配合微信支付工具库 WXPayUtility 使用,请参考Java
1package com.java.demo; 2 3import com.java.utils.WXPayUtility; // 引用微信支付工具库,参考:https://pay.weixin.qq.com/doc/v3/partner/4014985777 4 5import com.google.gson.annotations.SerializedName; 6import com.google.gson.annotations.Expose; 7import okhttp3.MediaType; 8import okhttp3.OkHttpClient; 9import okhttp3.Request; 10import okhttp3.RequestBody; 11import okhttp3.Response; 12 13import java.io.IOException; 14import java.io.UncheckedIOException; 15import java.security.PrivateKey; 16import java.security.PublicKey; 17import java.util.ArrayList; 18import java.util.HashMap; 19import java.util.List; 20import java.util.Map; 21 22/** 23 * 查询用户券详情 24 */ 25public class QueryCoupon { 26 private static String HOST = "https://api.mch.weixin.qq.com"; 27 private static String METHOD = "GET"; 28 private static String PATH = "/v3/marketing/busifavor/users/{openid}/coupons/{coupon_code}/appids/{appid}"; 29 30 public static void main(String[] args) { 31 // TODO: 请准备商户开发必要参数,参考:https://pay.weixin.qq.com/doc/v3/partner/4013080340 32 QueryCoupon client = new QueryCoupon( 33 "19xxxxxxxx", // 商户号,是由微信支付系统生成并分配给每个商户的唯一标识符,商户号获取方式参考 https://pay.weixin.qq.com/doc/v3/partner/4013080340 34 "1DDE55AD98Exxxxxxxxxx", // 商户API证书序列号,如何获取请参考 https://pay.weixin.qq.com/doc/v3/partner/4013058924 35 "/path/to/apiclient_key.pem", // 商户API证书私钥文件路径,本地文件路径 36 "PUB_KEY_ID_xxxxxxxxxxxxx", // 微信支付公钥ID,如何获取请参考 https://pay.weixin.qq.com/doc/v3/partner/4013038589 37 "/path/to/wxp_pub.pem" // 微信支付公钥文件路径,本地文件路径 38 ); 39 40 QueryCouponRequest request = new QueryCouponRequest(); 41 request.couponCode = "123446565767"; 42 request.appid = "wx233544546545989"; 43 request.openid = "2323dfsdf342342"; 44 try { 45 CouponEntity response = client.run(request); 46 // TODO: 请求成功,继续业务逻辑 47 System.out.println(response); 48 } catch (WXPayUtility.ApiException e) { 49 // TODO: 请求失败,根据状态码执行不同的逻辑 50 e.printStackTrace(); 51 } 52 } 53 54 public CouponEntity run(QueryCouponRequest request) { 55 String uri = PATH; 56 uri = uri.replace("{coupon_code}", WXPayUtility.urlEncode(request.couponCode)); 57 uri = uri.replace("{appid}", WXPayUtility.urlEncode(request.appid)); 58 uri = uri.replace("{openid}", WXPayUtility.urlEncode(request.openid)); 59 60 Request.Builder reqBuilder = new Request.Builder().url(HOST + uri); 61 reqBuilder.addHeader("Accept", "application/json"); 62 reqBuilder.addHeader("Wechatpay-Serial", wechatPayPublicKeyId); 63 reqBuilder.addHeader("Authorization", WXPayUtility.buildAuthorization(mchid, certificateSerialNo, privateKey, METHOD, uri, null)); 64 reqBuilder.method(METHOD, null); 65 Request httpRequest = reqBuilder.build(); 66 67 // 发送HTTP请求 68 OkHttpClient client = new OkHttpClient.Builder().build(); 69 try (Response httpResponse = client.newCall(httpRequest).execute()) { 70 String respBody = WXPayUtility.extractBody(httpResponse); 71 if (httpResponse.code() >= 200 && httpResponse.code() < 300) { 72 // 2XX 成功,验证应答签名 73 WXPayUtility.validateResponse(this.wechatPayPublicKeyId, this.wechatPayPublicKey, 74 httpResponse.headers(), respBody); 75 76 // 从HTTP应答报文构建返回数据 77 return WXPayUtility.fromJson(respBody, CouponEntity.class); 78 } else { 79 throw new WXPayUtility.ApiException(httpResponse.code(), respBody, httpResponse.headers()); 80 } 81 } catch (IOException e) { 82 throw new UncheckedIOException("Sending request to " + uri + " failed.", e); 83 } 84 } 85 86 private final String mchid; 87 private final String certificateSerialNo; 88 private final PrivateKey privateKey; 89 private final String wechatPayPublicKeyId; 90 private final PublicKey wechatPayPublicKey; 91 92 public QueryCoupon(String mchid, String certificateSerialNo, String privateKeyFilePath, String wechatPayPublicKeyId, String wechatPayPublicKeyFilePath) { 93 this.mchid = mchid; 94 this.certificateSerialNo = certificateSerialNo; 95 this.privateKey = WXPayUtility.loadPrivateKeyFromPath(privateKeyFilePath); 96 this.wechatPayPublicKeyId = wechatPayPublicKeyId; 97 this.wechatPayPublicKey = WXPayUtility.loadPublicKeyFromPath(wechatPayPublicKeyFilePath); 98 } 99 100 public static class QueryCouponRequest { 101 @SerializedName("coupon_code") 102 @Expose(serialize = false) 103 public String couponCode; 104 105 @SerializedName("appid") 106 @Expose(serialize = false) 107 public String appid; 108 109 @SerializedName("openid") 110 @Expose(serialize = false) 111 public String openid; 112 } 113 114 public static class CouponEntity { 115 @SerializedName("belong_merchant") 116 public String belongMerchant; 117 118 @SerializedName("stock_name") 119 public String stockName; 120 121 @SerializedName("comment") 122 public String comment; 123 124 @SerializedName("goods_name") 125 public String goodsName; 126 127 @SerializedName("stock_type") 128 public BusiFavorStockType stockType; 129 130 @SerializedName("transferable") 131 public Boolean transferable; 132 133 @SerializedName("shareable") 134 public Boolean shareable; 135 136 @SerializedName("coupon_state") 137 public CouponStatus couponState; 138 139 @SerializedName("display_pattern_info") 140 public DisplayPatternInfo displayPatternInfo; 141 142 @SerializedName("coupon_use_rule") 143 public CouponUseRule couponUseRule; 144 145 @SerializedName("custom_entrance") 146 public CustomEntrance customEntrance; 147 148 @SerializedName("coupon_code") 149 public String couponCode; 150 151 @SerializedName("stock_id") 152 public String stockId; 153 154 @SerializedName("available_start_time") 155 public String availableStartTime; 156 157 @SerializedName("expire_time") 158 public String expireTime; 159 160 @SerializedName("receive_time") 161 public String receiveTime; 162 163 @SerializedName("send_request_no") 164 public String sendRequestNo; 165 166 @SerializedName("use_request_no") 167 public String useRequestNo; 168 169 @SerializedName("use_time") 170 public String useTime; 171 172 @SerializedName("associate_out_trade_no") 173 public String associateOutTradeNo; 174 175 @SerializedName("return_request_no") 176 public String returnRequestNo; 177 178 @SerializedName("return_time") 179 public String returnTime; 180 181 @SerializedName("deactivate_request_no") 182 public String deactivateRequestNo; 183 184 @SerializedName("deactivate_time") 185 public String deactivateTime; 186 187 @SerializedName("deactivate_reason") 188 public String deactivateReason; 189 } 190 191 public enum BusiFavorStockType { 192 @SerializedName("NORMAL") 193 NORMAL, 194 @SerializedName("DISCOUNT") 195 DISCOUNT, 196 @SerializedName("EXCHANGE") 197 EXCHANGE 198 } 199 200 public enum CouponStatus { 201 @SerializedName("SENDED") 202 SENDED, 203 @SerializedName("USED") 204 USED, 205 @SerializedName("EXPIRED") 206 EXPIRED, 207 @SerializedName("DELETED") 208 DELETED, 209 @SerializedName("DEACTIVATED") 210 DEACTIVATED 211 } 212 213 public static class DisplayPatternInfo { 214 @SerializedName("description") 215 public String description; 216 217 @SerializedName("merchant_logo_url") 218 public String merchantLogoUrl; 219 220 @SerializedName("merchant_name") 221 public String merchantName; 222 223 @SerializedName("background_color") 224 public String backgroundColor; 225 226 @SerializedName("coupon_image_url") 227 public String couponImageUrl; 228 229 @SerializedName("finder_info") 230 public FinderInfo finderInfo; 231 } 232 233 public static class CouponUseRule { 234 @SerializedName("coupon_available_time") 235 public FavorAvailableTime couponAvailableTime; 236 237 @SerializedName("fixed_normal_coupon") 238 public FixedValueStockMsg fixedNormalCoupon; 239 240 @SerializedName("discount_coupon") 241 public DiscountMsg discountCoupon; 242 243 @SerializedName("exchange_coupon") 244 public ExchangeMsg exchangeCoupon; 245 246 @SerializedName("use_method") 247 public CouponUseMethod useMethod; 248 249 @SerializedName("mini_programs_appid") 250 public String miniProgramsAppid; 251 252 @SerializedName("mini_programs_path") 253 public String miniProgramsPath; 254 } 255 256 public static class CustomEntrance { 257 @SerializedName("mini_programs_info") 258 public MiniAppInfo miniProgramsInfo; 259 260 @SerializedName("appid") 261 public String appid; 262 263 @SerializedName("hall_id") 264 public String hallId; 265 266 @SerializedName("store_id") 267 public String storeId; 268 269 @SerializedName("code_display_mode") 270 public CodeDisplayMode codeDisplayMode; 271 } 272 273 public static class FinderInfo { 274 @SerializedName("finder_id") 275 public String finderId; 276 277 @SerializedName("finder_video_id") 278 public String finderVideoId; 279 280 @SerializedName("finder_video_cover_image_url") 281 public String finderVideoCoverImageUrl; 282 } 283 284 public static class FavorAvailableTime { 285 @SerializedName("available_begin_time") 286 public String availableBeginTime; 287 288 @SerializedName("available_end_time") 289 public String availableEndTime; 290 291 @SerializedName("available_day_after_receive") 292 public Long availableDayAfterReceive; 293 294 @SerializedName("available_week") 295 public AvailableWeek availableWeek; 296 297 @SerializedName("irregulary_avaliable_time") 298 public List<IrregularAvailableTime> irregularyAvaliableTime; 299 300 @SerializedName("wait_days_after_receive") 301 public Long waitDaysAfterReceive; 302 } 303 304 public static class FixedValueStockMsg { 305 @SerializedName("discount_amount") 306 public Long discountAmount; 307 308 @SerializedName("transaction_minimum") 309 public Long transactionMinimum; 310 } 311 312 public static class DiscountMsg { 313 @SerializedName("discount_percent") 314 public Long discountPercent; 315 316 @SerializedName("transaction_minimum") 317 public Long transactionMinimum; 318 } 319 320 public static class ExchangeMsg { 321 @SerializedName("exchange_price") 322 public Long exchangePrice; 323 324 @SerializedName("transaction_minimum") 325 public Long transactionMinimum; 326 } 327 328 public enum CouponUseMethod { 329 @SerializedName("OFF_LINE") 330 OFF_LINE, 331 @SerializedName("MINI_PROGRAMS") 332 MINI_PROGRAMS, 333 @SerializedName("SELF_CONSUME") 334 SELF_CONSUME, 335 @SerializedName("PAYMENT_CODE") 336 PAYMENT_CODE 337 } 338 339 public static class MiniAppInfo { 340 @SerializedName("mini_programs_appid") 341 public String miniProgramsAppid; 342 343 @SerializedName("mini_programs_path") 344 public String miniProgramsPath; 345 346 @SerializedName("entrance_words") 347 public String entranceWords; 348 349 @SerializedName("guiding_words") 350 public String guidingWords; 351 } 352 353 public enum CodeDisplayMode { 354 @SerializedName("NOT_SHOW") 355 NOT_SHOW, 356 @SerializedName("BARCODE") 357 BARCODE, 358 @SerializedName("QRCODE") 359 QRCODE 360 } 361 362 public static class AvailableWeek { 363 @SerializedName("week_day") 364 public List<Long> weekDay; 365 366 @SerializedName("available_day_time") 367 public List<AvailableCurrentDayTime> availableDayTime; 368 } 369 370 public static class IrregularAvailableTime { 371 @SerializedName("begin_time") 372 public String beginTime; 373 374 @SerializedName("end_time") 375 public String endTime; 376 } 377 378 public static class AvailableCurrentDayTime { 379 @SerializedName("begin_time") 380 public Long beginTime; 381 382 @SerializedName("end_time") 383 public Long endTime; 384 } 385 386} 387
需配合微信支付工具库 wxpay_utility 使用,请参考Go
1package main 2 3import ( 4 "demo/wxpay_utility" // 引用微信支付工具库,参考 https://pay.weixin.qq.com/doc/v3/partner/4015119446 5 "encoding/json" 6 "fmt" 7 "net/http" 8 "net/url" 9 "strings" 10 "time" 11) 12 13func main() { 14 // TODO: 请准备商户开发必要参数,参考:https://pay.weixin.qq.com/doc/v3/partner/4013080340 15 config, err := wxpay_utility.CreateMchConfig( 16 "19xxxxxxxx", // 商户号,是由微信支付系统生成并分配给每个商户的唯一标识符,商户号获取方式参考 https://pay.weixin.qq.com/doc/v3/partner/4013080340 17 "1DDE55AD98Exxxxxxxxxx", // 商户API证书序列号,如何获取请参考 https://pay.weixin.qq.com/doc/v3/partner/4013058924 18 "/path/to/apiclient_key.pem", // 商户API证书私钥文件路径,本地文件路径 19 "PUB_KEY_ID_xxxxxxxxxxxxx", // 微信支付公钥ID,如何获取请参考 https://pay.weixin.qq.com/doc/v3/partner/4013038589 20 "/path/to/wxp_pub.pem", // 微信支付公钥文件路径,本地文件路径 21 ) 22 if err != nil { 23 fmt.Println(err) 24 return 25 } 26 27 request := &QueryCouponRequest{ 28 CouponCode: wxpay_utility.String("123446565767"), 29 Appid: wxpay_utility.String("wx233544546545989"), 30 Openid: wxpay_utility.String("2323dfsdf342342"), 31 } 32 33 response, err := QueryCoupon(config, request) 34 if err != nil { 35 fmt.Printf("请求失败: %+v\n", err) 36 // TODO: 请求失败,根据状态码执行不同的处理 37 return 38 } 39 40 // TODO: 请求成功,继续业务逻辑 41 fmt.Printf("请求成功: %+v\n", response) 42} 43 44func QueryCoupon(config *wxpay_utility.MchConfig, request *QueryCouponRequest) (response *CouponEntity, err error) { 45 const ( 46 host = "https://api.mch.weixin.qq.com" 47 method = "GET" 48 path = "/v3/marketing/busifavor/users/{openid}/coupons/{coupon_code}/appids/{appid}" 49 ) 50 51 reqUrl, err := url.Parse(fmt.Sprintf("%s%s", host, path)) 52 if err != nil { 53 return nil, err 54 } 55 reqUrl.Path = strings.Replace(reqUrl.Path, "{coupon_code}", url.PathEscape(*request.CouponCode), -1) 56 reqUrl.Path = strings.Replace(reqUrl.Path, "{appid}", url.PathEscape(*request.Appid), -1) 57 reqUrl.Path = strings.Replace(reqUrl.Path, "{openid}", url.PathEscape(*request.Openid), -1) 58 httpRequest, err := http.NewRequest(method, reqUrl.String(), nil) 59 if err != nil { 60 return nil, err 61 } 62 httpRequest.Header.Set("Accept", "application/json") 63 httpRequest.Header.Set("Wechatpay-Serial", config.WechatPayPublicKeyId()) 64 authorization, err := wxpay_utility.BuildAuthorization(config.MchId(), config.CertificateSerialNo(), config.PrivateKey(), method, reqUrl.RequestURI(), nil) 65 if err != nil { 66 return nil, err 67 } 68 httpRequest.Header.Set("Authorization", authorization) 69 70 client := &http.Client{} 71 httpResponse, err := client.Do(httpRequest) 72 if err != nil { 73 return nil, err 74 } 75 respBody, err := wxpay_utility.ExtractResponseBody(httpResponse) 76 if err != nil { 77 return nil, err 78 } 79 if httpResponse.StatusCode >= 200 && httpResponse.StatusCode < 300 { 80 // 2XX 成功,验证应答签名 81 err = wxpay_utility.ValidateResponse( 82 config.WechatPayPublicKeyId(), 83 config.WechatPayPublicKey(), 84 &httpResponse.Header, 85 respBody, 86 ) 87 if err != nil { 88 return nil, err 89 } 90 response := &CouponEntity{} 91 if err := json.Unmarshal(respBody, response); err != nil { 92 return nil, err 93 } 94 95 return response, nil 96 } else { 97 return nil, wxpay_utility.NewApiException( 98 httpResponse.StatusCode, 99 httpResponse.Header, 100 respBody, 101 ) 102 } 103} 104 105type QueryCouponRequest struct { 106 CouponCode *string `json:"coupon_code,omitempty"` 107 Appid *string `json:"appid,omitempty"` 108 Openid *string `json:"openid,omitempty"` 109} 110 111func (o *QueryCouponRequest) MarshalJSON() ([]byte, error) { 112 type Alias QueryCouponRequest 113 a := &struct { 114 CouponCode *string `json:"coupon_code,omitempty"` 115 Appid *string `json:"appid,omitempty"` 116 Openid *string `json:"openid,omitempty"` 117 *Alias 118 }{ 119 // 序列化时移除非 Body 字段 120 CouponCode: nil, 121 Appid: nil, 122 Openid: nil, 123 Alias: (*Alias)(o), 124 } 125 return json.Marshal(a) 126} 127 128type CouponEntity struct { 129 BelongMerchant *string `json:"belong_merchant,omitempty"` 130 StockName *string `json:"stock_name,omitempty"` 131 Comment *string `json:"comment,omitempty"` 132 GoodsName *string `json:"goods_name,omitempty"` 133 StockType *BusiFavorStockType `json:"stock_type,omitempty"` 134 Transferable *bool `json:"transferable,omitempty"` 135 Shareable *bool `json:"shareable,omitempty"` 136 CouponState *CouponStatus `json:"coupon_state,omitempty"` 137 DisplayPatternInfo *DisplayPatternInfo `json:"display_pattern_info,omitempty"` 138 CouponUseRule *CouponUseRule `json:"coupon_use_rule,omitempty"` 139 CustomEntrance *CustomEntrance `json:"custom_entrance,omitempty"` 140 CouponCode *string `json:"coupon_code,omitempty"` 141 StockId *string `json:"stock_id,omitempty"` 142 AvailableStartTime *time.Time `json:"available_start_time,omitempty"` 143 ExpireTime *time.Time `json:"expire_time,omitempty"` 144 ReceiveTime *time.Time `json:"receive_time,omitempty"` 145 SendRequestNo *string `json:"send_request_no,omitempty"` 146 UseRequestNo *string `json:"use_request_no,omitempty"` 147 UseTime *time.Time `json:"use_time,omitempty"` 148 AssociateOutTradeNo *time.Time `json:"associate_out_trade_no,omitempty"` 149 ReturnRequestNo *string `json:"return_request_no,omitempty"` 150 ReturnTime *time.Time `json:"return_time,omitempty"` 151 DeactivateRequestNo *string `json:"deactivate_request_no,omitempty"` 152 DeactivateTime *time.Time `json:"deactivate_time,omitempty"` 153 DeactivateReason *string `json:"deactivate_reason,omitempty"` 154} 155 156type BusiFavorStockType string 157 158func (e BusiFavorStockType) Ptr() *BusiFavorStockType { 159 return &e 160} 161 162const ( 163 BUSIFAVORSTOCKTYPE_NORMAL BusiFavorStockType = "NORMAL" 164 BUSIFAVORSTOCKTYPE_DISCOUNT BusiFavorStockType = "DISCOUNT" 165 BUSIFAVORSTOCKTYPE_EXCHANGE BusiFavorStockType = "EXCHANGE" 166) 167 168type CouponStatus string 169 170func (e CouponStatus) Ptr() *CouponStatus { 171 return &e 172} 173 174const ( 175 COUPONSTATUS_SENDED CouponStatus = "SENDED" 176 COUPONSTATUS_USED CouponStatus = "USED" 177 COUPONSTATUS_EXPIRED CouponStatus = "EXPIRED" 178 COUPONSTATUS_DELETED CouponStatus = "DELETED" 179 COUPONSTATUS_DEACTIVATED CouponStatus = "DEACTIVATED" 180) 181 182type DisplayPatternInfo struct { 183 Description *string `json:"description,omitempty"` 184 MerchantLogoUrl *string `json:"merchant_logo_url,omitempty"` 185 MerchantName *string `json:"merchant_name,omitempty"` 186 BackgroundColor *string `json:"background_color,omitempty"` 187 CouponImageUrl *string `json:"coupon_image_url,omitempty"` 188 FinderInfo *FinderInfo `json:"finder_info,omitempty"` 189} 190 191type CouponUseRule struct { 192 CouponAvailableTime *FavorAvailableTime `json:"coupon_available_time,omitempty"` 193 FixedNormalCoupon *FixedValueStockMsg `json:"fixed_normal_coupon,omitempty"` 194 DiscountCoupon *DiscountMsg `json:"discount_coupon,omitempty"` 195 ExchangeCoupon *ExchangeMsg `json:"exchange_coupon,omitempty"` 196 UseMethod *CouponUseMethod `json:"use_method,omitempty"` 197 MiniProgramsAppid *string `json:"mini_programs_appid,omitempty"` 198 MiniProgramsPath *string `json:"mini_programs_path,omitempty"` 199} 200 201type CustomEntrance struct { 202 MiniProgramsInfo *MiniAppInfo `json:"mini_programs_info,omitempty"` 203 Appid *string `json:"appid,omitempty"` 204 HallId *string `json:"hall_id,omitempty"` 205 StoreId *string `json:"store_id,omitempty"` 206 CodeDisplayMode *CodeDisplayMode `json:"code_display_mode,omitempty"` 207} 208 209type FinderInfo struct { 210 FinderId *string `json:"finder_id,omitempty"` 211 FinderVideoId *string `json:"finder_video_id,omitempty"` 212 FinderVideoCoverImageUrl *string `json:"finder_video_cover_image_url,omitempty"` 213} 214 215type FavorAvailableTime struct { 216 AvailableBeginTime *time.Time `json:"available_begin_time,omitempty"` 217 AvailableEndTime *time.Time `json:"available_end_time,omitempty"` 218 AvailableDayAfterReceive *int64 `json:"available_day_after_receive,omitempty"` 219 AvailableWeek *AvailableWeek `json:"available_week,omitempty"` 220 IrregularyAvaliableTime []IrregularAvailableTime `json:"irregulary_avaliable_time,omitempty"` 221 WaitDaysAfterReceive *int64 `json:"wait_days_after_receive,omitempty"` 222} 223 224type FixedValueStockMsg struct { 225 DiscountAmount *int64 `json:"discount_amount,omitempty"` 226 TransactionMinimum *int64 `json:"transaction_minimum,omitempty"` 227} 228 229type DiscountMsg struct { 230 DiscountPercent *int64 `json:"discount_percent,omitempty"` 231 TransactionMinimum *int64 `json:"transaction_minimum,omitempty"` 232} 233 234type ExchangeMsg struct { 235 ExchangePrice *int64 `json:"exchange_price,omitempty"` 236 TransactionMinimum *int64 `json:"transaction_minimum,omitempty"` 237} 238 239type CouponUseMethod string 240 241func (e CouponUseMethod) Ptr() *CouponUseMethod { 242 return &e 243} 244 245const ( 246 COUPONUSEMETHOD_OFF_LINE CouponUseMethod = "OFF_LINE" 247 COUPONUSEMETHOD_MINI_PROGRAMS CouponUseMethod = "MINI_PROGRAMS" 248 COUPONUSEMETHOD_SELF_CONSUME CouponUseMethod = "SELF_CONSUME" 249 COUPONUSEMETHOD_PAYMENT_CODE CouponUseMethod = "PAYMENT_CODE" 250) 251 252type MiniAppInfo struct { 253 MiniProgramsAppid *string `json:"mini_programs_appid,omitempty"` 254 MiniProgramsPath *string `json:"mini_programs_path,omitempty"` 255 EntranceWords *string `json:"entrance_words,omitempty"` 256 GuidingWords *string `json:"guiding_words,omitempty"` 257} 258 259type CodeDisplayMode string 260 261func (e CodeDisplayMode) Ptr() *CodeDisplayMode { 262 return &e 263} 264 265const ( 266 CODEDISPLAYMODE_NOT_SHOW CodeDisplayMode = "NOT_SHOW" 267 CODEDISPLAYMODE_BARCODE CodeDisplayMode = "BARCODE" 268 CODEDISPLAYMODE_QRCODE CodeDisplayMode = "QRCODE" 269) 270 271type AvailableWeek struct { 272 WeekDay []int64 `json:"week_day,omitempty"` 273 AvailableDayTime []AvailableCurrentDayTime `json:"available_day_time,omitempty"` 274} 275 276type IrregularAvailableTime struct { 277 BeginTime *time.Time `json:"begin_time,omitempty"` 278 EndTime *time.Time `json:"end_time,omitempty"` 279} 280 281type AvailableCurrentDayTime struct { 282 BeginTime *int64 `json:"begin_time,omitempty"` 283 EndTime *int64 `json:"end_time,omitempty"` 284} 285
应答参数
200 OK
belong_merchant 必填 string
【批次归属商户号】代金券的所属商户号
stock_name 必填 string
【商家券批次名称】批次名称,字数上限为21个,一个中文汉字/英文字母/数字均占用一个字数。
comment 选填 string
【批次备注】仅配置商户可见,用于自定义信息。字数上限为20个,一个中文汉字/英文字母/数字均占用一个字数。
goods_name 必填 string
【适用商品范围】适用商品范围,字数上限为15个,一个中文汉字/英文字母/数字均占用一个字数。
stock_type 必填 string
【批次类型】批次类型
可选取值::
NORMAL
: 固定面额满减券批次DISCOUNT
: 折扣券批次EXCHANGE
: 换购券批次
transferable 选填 boolean
【是否允许转赠】不填默认否,枚举值:
true:是
false:否
该字段暂未开放
shareable 选填 boolean
【是否允许分享领券链接】不填默认否,枚举值:
true:是
false:否
该字段暂未开放
coupon_state 选填 string
【券状态】商家券状态
可选取值::
SENDED
: 可用USED
: 已核销EXPIRED
: 已过期DELETED
: 已删除DEACTIVATED
: 已失效
display_pattern_info 选填 object
【样式信息】
属性 | |||||
description 选填 string(1000) 【使用须知】用于说明详细的活动规则,会展示在代金券详情页。 merchant_logo_url 选填 string 【商户logo】若券归属商户号有认证品牌,则系统将自动拉取对应品牌logo;若券归属商户号不在认证品牌下,需自定义上传logo,未上传时将展示兜底灰色logo样式,影响券详情页用户体验,请及时上传。 商户logo的URL地址,仅支持通过《图片上传API》接口获取的图片URL地址。 1、商户logo大小需为120像素*120像素。 2、支持JPG/JPEG/PNG格式,且图片小于1M。 注:该字段暂不支持修改 merchant_name 选填 string(16) 【商户名称】不支持商户自定义。若券归属商户号有认证品牌,系统将自动拉取认证品牌号下的品牌名称;若券归属商户号不在认证品牌下,则拉取本商户号的商户简称。展示上限12个字符。 background_color 选填 string 【背景颜色】券的背景颜色,可设置10种颜色,色值请参考下方说明。颜色取值为颜色图中的颜色名称。
coupon_image_url 选填 string 【券详情图片】券详情图片,1074像素(宽)*603像素(高),图片大小不超过2M,支持JPG/PNG格式。仅支持通过《图片上传API》接口获取的图片URL地址。* finder_info 选填 object 【视频号相关信息】视频号相关信息
|
coupon_use_rule 必填 object
【券核销规则】
属性 | |||||||||||||||||||||||||||||
coupon_available_time 必填 object 【券可核销时间】日期区间内可以使用优惠
fixed_normal_coupon 选填 object 【固定面额满减券使用规则】固定面额满减,折扣券,换购券使用规则三选一,stock_type为NORMAL时必填。
discount_coupon 选填 object 【折扣券使用规则】固定面额满减,折扣券,换购券使用规则三选一,stock_type为DISCOUNT时必填。
exchange_coupon 选填 object 【换购券使用规则】固定面额满减,折扣券,换购券使用规则三选一,stock_type为EXCHANGE时必填。
use_method 必填 string 【核销方式】核销方式 可选取值::
mini_programs_appid 选填 string 【小程序AppID】核销方式为线上小程序核销才有效 mini_programs_path 选填 string 【小程序path】核销方式为线上小程序核销才有效 |
custom_entrance 选填 object
【自定义入口】
属性 | |||||
mini_programs_info 选填 object 【小程序入口】需要小程序APPID、path、入口文案、引导文案。如果需要跳转小程序,APPID、path、入口文案为必填,引导文案非必填。
appid 选填 string 【商户公众号AppID】可配置商户公众号,从券详情可跳转至公众号,用户自定义字段。 hall_id 选填 string 【更多优惠入口;营销馆创建地址:https://pay.weixin.qq.com/index.php/xphp/cfav_market/hall#/pages/list/list】 填写微信支付营销馆的馆ID,用户自定义字段。营销馆需在商户平台创建。 store_id 选填 string 【可用门店ID】填写代金券可用门店ID code_display_mode 选填 string 【code展示模式】code展示模式 可选取值::
|
coupon_code 选填 string
【券code】券的唯一标识
stock_id 选填 string
【批次号】批次号
available_start_time 选填 string
【券可使用开始时间】用户领取到的这张券实际可使用的开始时间:如批次设置的领取后可用,则开始时间即为券的领取时间; 如批次设置的领取后第X天可用,则为领取时间后第X天00:00:00
expire_time 选填 string
【券过期时间】用户领取到这张券的过期时间
receive_time 选填 string
【券领取时间】用户领取到这张券的时间
send_request_no 选填 string
【发券请求单号】发券时传入的唯一凭证
use_request_no 选填 string
【核销请求单号】核销时传入的唯一凭证(如券已被核销,将返回此字段)
use_time 选填 string
【券核销时间】券被核销的时间(如券已被核销,将返回此字段)
associate_out_trade_no 选填 string
【关联的商户订单号】若商家券操作过关联商户订单信息,则该字段返回商家券已关联的商户订单号。
return_request_no 选填 string
【回退请求单号】回退时传入的唯一凭证(如券发生了退回,将返回此字段)
return_time 选填 string
【券回退时间】券被回退的时间(如券发生了退回,将返回此字段)
deactivate_request_no 选填 string
【失效请求单号】失效时传入的唯一凭证(如果一张券已失效,将返回此字段)
deactivate_time 选填 string
【券失效时间】券被失效的时间(如果一张券已失效,将返回此字段)
deactivate_reason 选填 string
【失效原因】失效一张券的原因(如果一张券已失效,可能返回此字段)
应答示例
200 OK
1{ 2 "belong_merchant" : "100000222", 3 "stock_name" : "商家券", 4 "comment" : "xxx可用", 5 "goods_name" : "xxx商品可用", 6 "stock_type" : "NORMAL", 7 "transferable" : false, 8 "shareable" : false, 9 "coupon_state" : "SENDED", 10 "display_pattern_info" : { 11 "description" : "xxx门店可用", 12 "merchant_logo_url" : "https://xxx", 13 "merchant_name" : "微信支付", 14 "background_color" : "xxxxx", 15 "coupon_image_url" : "图片cdn地址", 16 "finder_info" : { 17 "finder_id" : "sph6Rngt2T4RlUf", 18 "finder_video_id" : "export/UzFfAgtgekIEAQAAAAAAb4MgnPInmAAAAAstQy6ubaLX4KHWvLEZgBPEwIEgVnk9HIP-zNPgMJofG6tpdGPJNg_ojtEjoT94", 19 "finder_video_cover_image_url" : "https://wxpaylogo.qpic.cn/xxx" 20 } 21 }, 22 "coupon_use_rule" : { 23 "coupon_available_time" : { 24 "available_begin_time" : "2015-05-20T13:29:35+08:00", 25 "available_end_time" : "2015-05-20T13:29:35+08:00", 26 "available_day_after_receive" : 3, 27 "available_week" : { 28 "week_day" : [ 29 1 30 ], 31 "available_day_time" : [ 32 { 33 "begin_time" : 3600, 34 "end_time" : 86399 35 } 36 ] 37 }, 38 "irregulary_avaliable_time" : [ 39 { 40 "begin_time" : "2015-05-20T13:29:35+08:00", 41 "end_time" : "2015-05-20T13:29:35+08:00" 42 } 43 ], 44 "wait_days_after_receive" : 7 45 }, 46 "fixed_normal_coupon" : { 47 "discount_amount" : 5, 48 "transaction_minimum" : 100 49 }, 50 "discount_coupon" : { 51 "discount_percent" : 88, 52 "transaction_minimum" : 100 53 }, 54 "exchange_coupon" : { 55 "exchange_price" : 100, 56 "transaction_minimum" : 100 57 }, 58 "use_method" : "OFF_LINE", 59 "mini_programs_appid" : "wx23232232323", 60 "mini_programs_path" : "/path/index/index" 61 }, 62 "custom_entrance" : { 63 "mini_programs_info" : { 64 "mini_programs_appid" : "wx234545656765876", 65 "mini_programs_path" : "/path/index/index", 66 "entrance_words" : "欢迎选购", 67 "guiding_words" : "获取更多优惠" 68 }, 69 "appid" : "wx324345hgfhfghfg", 70 "hall_id" : "233455656", 71 "store_id" : "233554655", 72 "code_display_mode" : "NOT_SHOW" 73 }, 74 "coupon_code" : "123446565767", 75 "stock_id" : "1002323", 76 "available_start_time" : "2019-12-30T13:29:35+08:00", 77 "expire_time" : "2019-12-31T13:29:35+08:00", 78 "receive_time" : "2019-12-30T13:29:35+08:00", 79 "send_request_no" : "MCHSEND202003101234", 80 "use_request_no" : "MCHUSE202003101234", 81 "use_time" : "2019-12-31T13:29:35+08:00", 82 "associate_out_trade_no" : "2000-01-01T00:00:00+08:00", 83 "return_request_no" : "MCHRETURN202003101234", 84 "return_time" : "2020-07-31T13:29:35+08:00", 85 "deactivate_request_no" : "MCHRETURN202003101234", 86 "deactivate_time" : "2020-07-31T13:29:35+08:00", 87 "deactivate_reason" : "此券使用时间错误" 88} 89
错误码
公共错误码
状态码 | 错误码 | 描述 | 解决方案 |
---|---|---|---|
400 | PARAM_ERROR | 参数错误 | 请根据错误提示正确传入参数 |
400 | INVALID_REQUEST | HTTP 请求不符合微信支付 APIv3 接口规则 | 请参阅 接口规则 |
401 | SIGN_ERROR | 验证不通过 | 请参阅 签名常见问题 |
500 | SYSTEM_ERROR | 系统异常,请稍后重试 | 请稍后重试 |
业务错误码
状态码 | 错误码 | 描述 | 解决方案 |
---|---|---|---|
400 | APPID_MCHID_NOT_MATCH | AppID与请求方商户无关联关系 | AppID与请求方商户不匹配,请确认AppID与请求方商户是否有关联关系 |
400 | INVALID_REQUEST | 发券模式不合法 | 请更换支持预上传code的批次后重试 |
400 | INVALID_REQUEST | 上传的自定义code已达上限 | 请更换一个新的批次后重试 |
400 | MCH_NOT_EXISTS | 商户号不存在 | 请确认传入的商户号是否正确 |
400 | RESOURCE_ALREADY_EXISTS | 批次已存在 | 查看out_request_no字段是否重复使用 |
400 | RESOURCE_ALREADY_EXISTS | 券已被其他订单核销 | 请通过查询券API确认券是否已被其他订单核销 |
400 | SYSTEM_ERROR | 系统错误 | 请使用相同参数稍后重新调用 |
403 | NO_AUTH | 无权限 | 查看具体错误信息,确认是否有权限 |
403 | RULE_LIMIT | 券不在有效期内 | 请确认券是否能在当前时间核销 |
404 | RESOURCE_NOT_EXISTS | 查询的资源不存在 | 请检查查询资源的对应ID是否填写正确 |
404 | USER_NOT_EXISTS | OpenID不正确 | 请确认传入的OpenID是否正确 |
429 | FREQUENCY_LIMITED | 频率限制 | 调用太频繁,请降低调用接口频率 |
500 | SYSTEM_ERROR | 系统失败 | 多为网络超时引起,重试 |