视频一区二区三区自拍_千金肉奴隷1985未删减版在线观看_国产成人黄色视频在线播放_少女免费播放片高清在线观看_国产精品v欧美精品v

商戶進(jìn)件
特約商戶進(jìn)件
基礎(chǔ)支付
JSAPI支付
APP支付
H5支付
Native支付
小程序支付
合單支付
付款碼支付
經(jīng)營(yíng)能力
支付即服務(wù)
點(diǎn)金計(jì)劃
行業(yè)方案
平臺(tái)收付通
智慧商圈
微信支付分停車服務(wù)
電子發(fā)票
營(yíng)銷工具
代金券
商家券
委托營(yíng)銷
支付有禮
小程序發(fā)券插件
H5發(fā)券
圖片上傳(營(yíng)銷專用)
現(xiàn)金紅包
資金應(yīng)用
分賬
連鎖品牌分賬
風(fēng)險(xiǎn)合規(guī)
商戶開(kāi)戶意愿確認(rèn)
消費(fèi)者投訴2.0
商戶平臺(tái)處置通知
其他能力
圖片上傳
視頻上傳
微信支付平臺(tái)證書(shū)

代金券開(kāi)發(fā)指引

1. 接口規(guī)則

為了在保證支付安全的前提下,帶給商戶簡(jiǎn)單、一致且易用的開(kāi)發(fā)體驗(yàn),我們推出了全新的微信支付APIv3接口。該版本API的具體規(guī)則請(qǐng)參考“APIv3接口規(guī)則

2. 開(kāi)發(fā)準(zhǔn)備

2.1. 搭建和配置開(kāi)發(fā)環(huán)境

為了幫助開(kāi)發(fā)者調(diào)用開(kāi)放接口,我們提供了JAVA、PHP、GO三種語(yǔ)言版本的開(kāi)發(fā)庫(kù),封裝了簽名生成、簽名驗(yàn)證、敏感信息加/解密、媒體文件上傳等基礎(chǔ)功能(更多語(yǔ)言版本的開(kāi)發(fā)庫(kù)將在近期陸續(xù)提供

測(cè)試步驟

1、根據(jù)自身開(kāi)發(fā)語(yǔ)言,選擇對(duì)應(yīng)的開(kāi)發(fā)庫(kù)并構(gòu)建項(xiàng)目,具體配置請(qǐng)參考下面鏈接的詳細(xì)說(shuō)明:

    ? wechatpay-java(推薦)wechatpay-apache-httpclient,適用于Java開(kāi)發(fā)者。

    ? wechatpay-php(推薦)、wechatpay-guzzle-middleware,適用于PHP開(kāi)發(fā)者

    注:當(dāng)前開(kāi)發(fā)指引接口PHP示例代碼采用wechatpay-guzzle-middleware版本

    ? wechatpay-go,適用于Go開(kāi)發(fā)者

更多資源可前往微信支付開(kāi)發(fā)者社區(qū)搜索查看

2、創(chuàng)建加載商戶私鑰、加載平臺(tái)證書(shū)、初始化httpClient的通用方法


@Before
public void setup() throws IOException {
    // 加載商戶私鑰(privateKey:私鑰字符串)
    PrivateKey merchantPrivateKey = PemUtil
            .loadPrivateKey(new ByteArrayInputStream(privateKey.getBytes("utf-8")));
 
    // 加載平臺(tái)證書(shū)(mchId:商戶號(hào),mchSerialNo:商戶證書(shū)序列號(hào),apiV3Key:V3密鑰)
    AutoUpdateCertificatesVerifier verifier = new AutoUpdateCertificatesVerifier(
            new WechatPay2Credentials(mchId, new PrivateKeySigner(mchSerialNo, merchantPrivateKey)),apiV3Key.getBytes("utf-8"));
 
    // 初始化httpClient
    httpClient = WechatPayHttpClientBuilder.create()
            .withMerchant(mchId, mchSerialNo, merchantPrivateKey)
            .withValidator(new WechatPay2Validator(verifier)).build();
}
 
@After
public void after() throws IOException {
    httpClient.close();
}

use GuzzleHttp\Exception\RequestException;
use WechatPay\GuzzleMiddleware\WechatPayMiddleware;
use WechatPay\GuzzleMiddleware\Util\PemUtil;
use GuzzleHttp\HandlerStack;
 
// 商戶相關(guān)配置,
$merchantId = '1000100'; // 商戶號(hào)
$merchantSerialNumber = 'XXXXXXXXXX'; // 商戶API證書(shū)序列號(hào)
$merchantPrivateKey = PemUtil::loadPrivateKey('./path/to/mch/private/key.pem'); // 商戶私鑰文件路徑
 
// 微信支付平臺(tái)配置
$wechatpayCertificate = PemUtil::loadCertificate('./path/to/wechatpay/cert.pem'); // 微信支付平臺(tái)證書(shū)文件路徑
 
// 構(gòu)造一個(gè)WechatPayMiddleware
$wechatpayMiddleware = WechatPayMiddleware::builder()
    ->withMerchant($merchantId, $merchantSerialNumber, $merchantPrivateKey) // 傳入商戶相關(guān)配置
    ->withWechatPay([ $wechatpayCertificate ]) // 可傳入多個(gè)微信支付平臺(tái)證書(shū),參數(shù)類型為array
    ->build();
 
// 將WechatPayMiddleware添加到Guzzle的HandlerStack中
$stack = GuzzleHttp\HandlerStack::create();
$stack->push($wechatpayMiddleware, 'wechatpay');
 
// 創(chuàng)建Guzzle HTTP Client時(shí),將HandlerStack傳入,接下來(lái),正常使用Guzzle發(fā)起API請(qǐng)求,WechatPayMiddleware會(huì)自動(dòng)地處理簽名和驗(yàn)簽
$client = new GuzzleHttp\Client(['handler' => $stack]);

/*
    Package core 微信支付api v3 go http-client 基礎(chǔ)庫(kù),你可以使用它來(lái)創(chuàng)建一個(gè)client,并向微信支付發(fā)送http請(qǐng)求
    只需要你在初始化客戶端的時(shí)候,傳遞credential以及validator
    credential用來(lái)生成http header中的authorization信息
    validator則用來(lái)校驗(yàn)回包是否被篡改
    如果http請(qǐng)求返回的err為nil,一般response.Body 都不為空,你可以嘗試對(duì)其進(jìn)行序列化
    請(qǐng)注意及時(shí)關(guān)閉response.Body
    注意:使用微信支付apiv3 go庫(kù)需要引入相關(guān)的包,該示例代碼必須引入的包名有以下信息

    "context"
    "crypto/x509"
    "fmt"
    "io/ioutil"
    "log"
    "github.com/wechatpay-apiv3/wechatpay-go/core"
    "github.com/wechatpay-apiv3/wechatpay-go/core/option"
    "github.com/wechatpay-apiv3/wechatpay-go/utils"

    */
func SetUp() (opt []option.ClientOption, err error) {
    //商戶號(hào)
    mchID := ""
    //商戶證書(shū)序列號(hào)
    mchCertSerialNumber := ""
    //商戶私鑰文件路徑
    privateKeyPath := ""
    //平臺(tái)證書(shū)文件路徑
    wechatCertificatePath := ""

    // 加載商戶私鑰
    privateKey, err := utils.LoadPrivateKeyWithPath(privateKeyPath)
    if err != nil {
        log.Printf("load private err:%s", err.Error())
        return nil, err
    }
    // 加載微信支付平臺(tái)證書(shū)
    wechatPayCertificate, err := utils.LoadCertificateWithPath(wechatCertificatePath)
    if err != nil {
        log.Printf("load certificate err:%s",err)
        return nil, err
    }
    //設(shè)置header頭中authorization信息
    opts := []option.ClientOption{
        option.WithMerchant(mchID, mchCertSerialNumber, privateKey), // 設(shè)置商戶相關(guān)配置
        option.WithWechatPay([]*x509.Certificate{wechatPayCertificate}), // 設(shè)置微信支付平臺(tái)證書(shū),用于校驗(yàn)回包信息用
    }
    return opts, nil
}

3、基于接口的示例代碼,替換請(qǐng)求參數(shù)后可發(fā)起測(cè)試

說(shuō)明:

? 上面的開(kāi)發(fā)庫(kù)為微信支付官方開(kāi)發(fā)庫(kù),其它沒(méi)有審核或者控制下的第三方工具和庫(kù),微信支付不保證它們的安全性和可靠性

通過(guò)包管理工具引入SDK后,可根據(jù)下面每個(gè)接口的示例代碼替換相關(guān)參數(shù)后進(jìn)行快速測(cè)試

? 開(kāi)發(fā)者如果想詳細(xì)了解簽名生成、簽名驗(yàn)證、敏感信息加/解密、媒體文件上傳等常用方法的具體代碼實(shí)現(xiàn),可閱讀下面的詳細(xì)說(shuō)明:

    1.簽名生成

    2.簽名驗(yàn)證

    3.敏感信息加解密

    4.merchantPrivateKey(私鑰)

    5.wechatpayCertificates(平臺(tái)證書(shū))

    6.APIV3Key(V3 key)

? 如想更詳細(xì)的了解我們的接口規(guī)則,可查看我們的接口規(guī)則指引文檔

3. 快速接入

3.1. 業(yè)務(wù)流程圖

業(yè)務(wù)流程時(shí)序圖:


重點(diǎn)步驟說(shuō)明:

步驟2 創(chuàng)建代金券:商戶可通過(guò)《創(chuàng)建代金券批次》接口創(chuàng)建代金券,微信支付生成代金券批次后并返回代金券批次號(hào)給到商戶。

步驟7 激活代金券:商戶獲取到代金券批次號(hào),需要確認(rèn)并激活代金券,該批次代金券才能發(fā)放,需要調(diào)用《激活代金券批次》接口來(lái)激活創(chuàng)建的代金券。

步驟12 發(fā)放代金券:已經(jīng)激活的代金券,商戶可調(diào)用微信支付《發(fā)放代金券批次》接口來(lái)進(jìn)行代金券發(fā)放,并獲取微信支付返回代金券發(fā)放結(jié)果。

步驟17 管理代金券:商戶發(fā)券成功后,商戶可通過(guò)《查詢批次詳情》、《查詢代金券詳情》等代金券管理接口進(jìn)行券管理。

3.2. API接入(含示例代碼)

文檔展示了如何使用微信支付服務(wù)端 SDK 快速接入代金券產(chǎn)品,完成與微信支付對(duì)接的部分。

注意

  • 文檔中的代碼示例是用來(lái)闡述 API 基本使用方法,代碼中的示例參數(shù)需替換成商戶自己賬號(hào)及請(qǐng)求參數(shù)才能跑通
  • 以下接入步驟僅提供參考,請(qǐng)商戶結(jié)合自身業(yè)務(wù)需求進(jìn)行評(píng)估、修改。
3.2.1. 【服務(wù)端】創(chuàng)建代金券批次

步驟說(shuō)明:通過(guò)創(chuàng)建代金券批次接口,可創(chuàng)建代金券的類型包含預(yù)充值和免充值兩種類型。

  • 預(yù)充值代金券適用于第三方出資策劃的活動(dòng),例如:滿100減10. 指訂單金額100元,用戶實(shí)付90元,商戶實(shí)收100元。
  • 免充值適用于商戶策劃的活動(dòng),例如:滿100減10。 指訂單金額100元,用戶實(shí)付90元(用戶領(lǐng)券后,在支付中直接核銷10元),商戶實(shí)收90元。

示例代碼


public void CreateCoupon() throws Exception{
    //請(qǐng)求URL
    HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/v3/marketing/favor/coupon-stocks");
    // 請(qǐng)求body參數(shù)
    String reqdata = "{"
            + "\"stock_name\":\"GD測(cè)批次4\","
            + "\"comment\":\"驗(yàn)證活動(dòng)\","
            + "\"belong_merchant\":\"xx98568865\","
            + "\"available_begin_time\":\"2020-02-13T18:00:00.120+08:00\","
            + "\"available_end_time\":\"2020-02-20T23:59:59.120+08:00\","
            + "\"stock_use_rule\": {"
            + "\"max_coupons\":10,"
            + "\"max_amount\":100,"
            + "\"max_coupons_per_user\":10,"
            + "\"natural_person_limit\":false,"
            + "\"prevent_api_abuse\":false"
            + "},"
            + "\"coupon_use_rule\": {"
            + "\"fixed_normal_coupon\": {"
            + "\"coupon_amount\":10,"
            + "\"transaction_minimum\":10"
            + "},"
            + "\"available_merchants\": ["
            + "\"0\":\"209784532\","
            + "\"1\":\"221003827\""
            + "]"
            + "},"
            + "\"no_cash\":false,"
            + "\"stock_type\":\"NORMAL\","
            + "\"out_request_no\":\"207662xxxxxx\""
            + "}";
    StringEntity entity = new StringEntity(reqdata,"utf-8");
    entity.setContentType("application/json");
    httpPost.setEntity(entity);
    httpPost.setHeader("Accept", "application/json");

    //完成簽名并執(zhí)行請(qǐng)求
    CloseableHttpResponse response = httpClient.execute(httpPost);

    try {
        int statusCode = response.getStatusLine().getStatusCode();
        if (statusCode == 200) { //處理成功
            System.out.println("success,return body = " + EntityUtils.toString(response.getEntity()));
        } else if (statusCode == 204) { //處理成功,無(wú)返回Body
            System.out.println("success");
        } else {
            System.out.println("failed,resp code = " + statusCode+ ",return body = " + EntityUtils.toString(response.getEntity()));
            throw new IOException("request failed");
        }
    } finally {
        response.close();
    }
}
    

try {
    $resp = $client->request(
        'POST',
        'https://api.mch.weixin.qq.com/v3/marketing/favor/coupon-stocks', //請(qǐng)求URL
        [
            // JSON請(qǐng)求體
            'json' => [
                "stock_name" => "GD測(cè)批次4",
                "comment" => "驗(yàn)證活動(dòng)",
                "belong_merchant" => "xx98568865",
                "available_begin_time" => "2020-02-13T18:00:00.120+08:00",
                "available_end_time" => "2020-02-20T23:59:59.120+08:00",
                "stock_use_rule" => [
                    "max_coupons" => 10,
                    "max_amount" => 100,
                    "max_coupons_per_user" => 10,
                    "natural_person_limit" => false,
                    "prevent_api_abuse" => false,
                ],
                "coupon_use_rule" => [
                    "fixed_normal_coupon" => [
                        "coupon_amount" => 10,
                        "transaction_minimum" => 10,
                    ],
                    "available_merchants" => [
                        "0" => "209784532",
                        "1" => "221003827",
                    ],
                ],
                "no_cash" => false,
                "stock_type" => "NORMAL",
                "out_request_no" => "207662xxxxxx",
            ],
            'headers' => [ 'Accept' => 'application/json' ]
        ]
    );
    $statusCode = $resp->getStatusCode();
    if ($statusCode == 200) { //處理成功
        echo "success,return body = " . $resp->getBody()->getContents()."\n";
    } else if ($statusCode == 204) { //處理成功,無(wú)返回Body
        echo "success";
    }
} catch (RequestException $e) {
    // 進(jìn)行錯(cuò)誤處理
    echo $e->getMessage()."\n";
    if ($e->hasResponse()) {
        echo "failed,resp code = " . $e->getResponse()->getStatusCode() . " return body = " . $e->getResponse()->getBody() . "\n";
    }
    return;
}
    

func CreateCoupon() {
       // 初始化客戶端
    ctx := context.TODO()
    opts, err := SetUp()
    if err != nil {
        return
    }
    client, err := core.NewClient(ctx, opts...,)
    if err != nil{
        log.Printf("init client err:%s",err)
        return
    }
    //設(shè)置請(qǐng)求地址
  URL := "https://api.mch.weixin.qq.com/v3/marketing/favor/coupon-stocks"
  //設(shè)置請(qǐng)求信息,此處也可以使用結(jié)構(gòu)體來(lái)進(jìn)行請(qǐng)求
  mapInfo := map[string]interface{}{
    "stock_name": "微信支付代金券批次",
    "comment": "零售批次",
    "belong_merchant": "xx98568865",
    "available_begin_time": "2015-05-20T13:29:35.120+08:00",
    "available_end_time": "2015-05-20T13:29:35.120+08:00",
    " stock_use_rule": map[string]interface{}{
      "max_coupons": 100,
      "max_amount": 5000,
      "max_amount_by_day": 400,
      "max_coupons_per_user": 3,
      "natural_person_limit": false,
      "prevent_api_abuse": false,
    },
    "pattern_info": map[string]interface{}{
      "description": "微信支付營(yíng)銷代金券",
      "merchant_logo": "https://qpic.cn/xxx",
      "merchant_name": "微信支付",
      "background_color": "COLOR020",
      "coupon_image": "https://qpic.cn/xxx",
    },
    "coupon_use_rule": map[string]interface{}{
      "fixed_normal_coupon": map[string]interface{}{
        "coupon_amount": 50,
        "transaction_minimum": 100,
     },
      "goods_tag": []map[string]interface{}{
        "123321",
        "123322",
     },
      "trade_type": []map[string]interface{}{
        "OTHER",
        "APPPAY",
     },
      "combine_use": false,
      "available_items": []map[string]interface{}{
        "123321",
        "123322",
     },
      "available_merchants": []map[string]interface{}{
        "9856000",
        "9856001",
     },
    },
    "no_cash": false,
    "stock_type": "NORMAL",
    "out_request_no": "89560002019101000121",
  }

  // 發(fā)起請(qǐng)求
  response, err := client.Post(ctx, URL, mapInfo)
  if err != nil{
    log.Printf("client post err:%s",err)
    return
  }
  // 校驗(yàn)回包內(nèi)容是否有邏輯錯(cuò)誤
  err = core.CheckResponse(response)
  if err != nil{
    log.Printf("check response err:%s",err)
    return
  }
  // 讀取回包信息
  body, err := ioutil.ReadAll(response.Body)
  if err != nil{
    log.Printf("read response body err:%s",err)
    return
  }
  fmt.Println(string(body))
}
}
    

重要入?yún)⒄f(shuō)明

? out_request_no:商戶創(chuàng)建批次憑據(jù)號(hào)(格式:商戶id+日期+流水號(hào)),可包含英文字母,數(shù)字,|,_,*,-等內(nèi)容,不允許出現(xiàn)其他不合法符號(hào),商戶側(cè)需保持商戶單據(jù)號(hào)全局唯一

? available_begin_time:批次開(kāi)始時(shí)間

1. 開(kāi)始時(shí)間不可早于當(dāng)前時(shí)間
2. 不能創(chuàng)建365天后開(kāi)始的批次
3. 批次可用時(shí)間范圍最長(zhǎng)為90天

? stock_name:批次名稱·

校驗(yàn)規(guī)則:

1. 批次名稱最多9個(gè)中文漢字

2. 批次名稱最多20個(gè)字母

3. 批次名稱中不能包含不當(dāng)內(nèi)容和特殊字符 _ , ; |

更多參數(shù)、響應(yīng)詳情及錯(cuò)誤碼請(qǐng)參見(jiàn)創(chuàng)建代金券批次接口文檔

3.2.2. 【服務(wù)端】激活代金券批次

步驟說(shuō)明:制券成功后,通過(guò)調(diào)用激活接口激活代金券批次。

  • 說(shuō)明:如果是預(yù)充值代金券,激活時(shí)從商戶賬戶余額中鎖定本批次的營(yíng)銷資金。

示例代碼


public void ActiveCoupon() throws Exception{
    //請(qǐng)求URL
    HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/v3/marketing/favor/stocks/9856000/start");
    // 請(qǐng)求body參數(shù)
    String reqdata = "{"
            + "\"stock_creator_mchid\":\"8956000\""
            + "}";
    StringEntity entity = new StringEntity(reqdata,"utf-8");
    entity.setContentType("application/json");
    httpPost.setEntity(entity);
    httpPost.setHeader("Accept", "application/json");

    //完成簽名并執(zhí)行請(qǐng)求
    CloseableHttpResponse response = httpClient.execute(httpPost);

    try {
        int statusCode = response.getStatusLine().getStatusCode();
        if (statusCode == 200) { //處理成功
            System.out.println("success,return body = " + EntityUtils.toString(response.getEntity()));
        } else if (statusCode == 204) { //處理成功,無(wú)返回Body
            System.out.println("success");
        } else {
            System.out.println("failed,resp code = " + statusCode+ ",return body = " + EntityUtils.toString(response.getEntity()));
            throw new IOException("request failed");
        }
    } finally {
        response.close();
    }
}
    

 try {
    $resp = $client->request(
        'POST',
        'https://api.mch.weixin.qq.com/v3/marketing/favor/stocks/9856000/start', //請(qǐng)求URL
        [
            // JSON請(qǐng)求體
            'json' => [
                "stock_creator_mchid" => "8956000",
            ],
            'headers' => [ 'Accept' => 'application/json' ]
        ]
    );
    $statusCode = $resp->getStatusCode();
    if ($statusCode == 200) { //處理成功
        echo "success,return body = " . $resp->getBody()->getContents()."\n";
    } else if ($statusCode == 204) { //處理成功,無(wú)返回Body
        echo "success";
    }
} catch (RequestException $e) {
    // 進(jìn)行錯(cuò)誤處理
    echo $e->getMessage()."\n";
    if ($e->hasResponse()) {
        echo "failed,resp code = " . $e->getResponse()->getStatusCode() . " return body = " . $e->getResponse()->getBody() . "\n";
    }
    return;
}
    

func ActiveCouponActiveCoupon() {
       // 初始化客戶端
    ctx := context.TODO()
    opts, err := SetUp()
    if err != nil {
        return
    }
    client, err := core.NewClient(ctx, opts...,)
    if err != nil{
        log.Printf("init client err:%s",err)
        return
    }
    //設(shè)置請(qǐng)求地址
  URL := "https://api.mch.weixin.qq.com/v3/marketing/favor/stocks/9856000/start"
  //設(shè)置請(qǐng)求信息,此處也可以使用結(jié)構(gòu)體來(lái)進(jìn)行請(qǐng)求
  mapInfo := map[string]interface{}{
    "stock_creator_mchid": "8956000",
  }

  // 發(fā)起請(qǐng)求
  response, err := client.Post(ctx, URL, mapInfo)
  if err != nil{
    log.Printf("client post err:%s",err)
    return
  }
  // 校驗(yàn)回包內(nèi)容是否有邏輯錯(cuò)誤
  err = core.CheckResponse(response)
  if err != nil{
    log.Printf("check response err:%s",err)
    return
  }
  // 讀取回包信息
  body, err := ioutil.ReadAll(response.Body)
  if err != nil{
    log.Printf("read response body err:%s",err)
    return
  }
  fmt.Println(string(body))
}
}
    

重要入?yún)⒄f(shuō)明

? stock_creator_mchid:批次創(chuàng)建方商戶號(hào)

? stock_id:微信為每個(gè)代金券批次分配的唯一id。

更多參數(shù)、響應(yīng)詳情及錯(cuò)誤碼請(qǐng)參見(jiàn)激活代金券批次接口文檔

3.2.3. 【服務(wù)端】發(fā)放代金券批次

步驟說(shuō)明:商戶平臺(tái)/API完成制券后,可使用發(fā)放代金券接口發(fā)券。通過(guò)調(diào)用此接口可發(fā)放指定批次給指定用戶,發(fā)券場(chǎng)景可以是小程序、H5、APP等。

注意

示例代碼


public void SendCoupon() throws Exception{
    //請(qǐng)求URL
    HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/v3/marketing/favor/users/o4GgauInH_RCEdvrrNGrntXDu6D4/coupons");
    // 請(qǐng)求body參數(shù)
    String reqdata = "{"
            + "\"stock_id\":\"9856000\","
            + "\"out_request_no\":\"89560002019101000121\","
            + "\"appid\":\"wx233544546545989\","
            + "\"stock_creator_mchid\":\"8956000\""
            + "}";
    StringEntity entity = new StringEntity(reqdata,"utf-8");
    entity.setContentType("application/json");
    httpPost.setEntity(entity);
    httpPost.setHeader("Accept", "application/json");

    //完成簽名并執(zhí)行請(qǐng)求
    CloseableHttpResponse response = httpClient.execute(httpPost);

    try {
        int statusCode = response.getStatusLine().getStatusCode();
        if (statusCode == 200) { //處理成功
            System.out.println("success,return body = " + EntityUtils.toString(response.getEntity()));
        } else if (statusCode == 204) { //處理成功,無(wú)返回Body
            System.out.println("success");
        } else {
            System.out.println("failed,resp code = " + statusCode+ ",return body = " + EntityUtils.toString(response.getEntity()));
            throw new IOException("request failed");
        }
    } finally {
        response.close();
    }
}
    

try {
    $resp = $client->request(
        'POST',
        'https://api.mch.weixin.qq.com/v3/marketing/favor/users/o4GgauInH_RCEdvrrNGrntXDu6D4/coupons', //請(qǐng)求URL
        [
            // JSON請(qǐng)求體
            'json' => [
                "stock_id" => "9856000",
                "out_request_no" => "89560002019101000121",
                "appid" => "wx233544546545989",
                "stock_creator_mchid" => "8956000",
            ],
            'headers' => [ 'Accept' => 'application/json' ]
        ]
    );
    $statusCode = $resp->getStatusCode();
    if ($statusCode == 200) { //處理成功
        echo "success,return body = " . $resp->getBody()->getContents()."\n";
    } else if ($statusCode == 204) { //處理成功,無(wú)返回Body
        echo "success";
    }
} catch (RequestException $e) {
    // 進(jìn)行錯(cuò)誤處理
    echo $e->getMessage()."\n";
    if ($e->hasResponse()) {
        echo "failed,resp code = " . $e->getResponse()->getStatusCode() . " return body = " . $e->getResponse()->getBody() . "\n";
    }
    return;
}
    

func SendCoupon() {
       // 初始化客戶端
    ctx := context.TODO()
    opts, err := SetUp()
    if err != nil {
        return
    }
    client, err := core.NewClient(ctx, opts...,)
    if err != nil{
        log.Printf("init client err:%s",err)
        return
    }
    //設(shè)置請(qǐng)求地址
  URL := "https://api.mch.weixin.qq.com/v3/marketing/favor/users/o4GgauInH_RCEdvrrNGrntXDu6D4/coupons"
  //設(shè)置請(qǐng)求信息,此處也可以使用結(jié)構(gòu)體來(lái)進(jìn)行請(qǐng)求
  mapInfo := map[string]interface{}{
    "stock_id": "9856000",
    "out_request_no": "89560002019101000121",
    "appid": "wx233544546545989",
    "stock_creator_mchid": "8956000",
  }

  // 發(fā)起請(qǐng)求
  response, err := client.Post(ctx, URL, mapInfo)
  if err != nil{
    log.Printf("client post err:%s",err)
    return
  }
  // 校驗(yàn)回包內(nèi)容是否有邏輯錯(cuò)誤
  err = core.CheckResponse(response)
  if err != nil{
    log.Printf("check response err:%s",err)
    return
  }
  // 讀取回包信息
  body, err := ioutil.ReadAll(response.Body)
  if err != nil{
    log.Printf("read response body err:%s",err)
    return
  }
  fmt.Println(string(body))
}
}
    

重要入?yún)⒄f(shuō)明

? out_request_no:商戶系統(tǒng)內(nèi)部訂單號(hào),只能是數(shù)字、大小寫(xiě)字母_-*且在同一個(gè)商戶號(hào)下唯一

? openid:openid是微信用戶在appid下的唯一用戶標(biāo)識(shí)(appid不同,則獲取到的openid就不同),可用于永久標(biāo)記一個(gè)用戶。openid獲取方式請(qǐng)參考以下文檔小程序獲取openid公眾號(hào)獲取openidAPP獲取openid

? stock_creator_mchid:批次創(chuàng)建方商戶號(hào)

? stock_id:微信為每個(gè)代金券批次分配的唯一id。

更多參數(shù)、響應(yīng)詳情及錯(cuò)誤碼請(qǐng)參見(jiàn)發(fā)放代金券批次接口文檔

3.2.4. 【服務(wù)端】暫停代金券批次

步驟說(shuō)明:通過(guò)此接口可暫停指定代金券批次。暫停后,該代金券批次暫停發(fā)放,用戶無(wú)法通過(guò)任何渠道再領(lǐng)取該批次的券。暫停接口的前提是批次處于激活狀態(tài)

示例代碼


public void PauseCoupon() throws Exception{
    //請(qǐng)求URL
    HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/v3/marketing/favor/stocks/9856000/pause");
    // 請(qǐng)求body參數(shù)
    String reqdata = "{"
            + "\"stock_creator_mchid\":\"8956000\""
            + "}";
    StringEntity entity = new StringEntity(reqdata,"utf-8");
    entity.setContentType("application/json");
    httpPost.setEntity(entity);
    httpPost.setHeader("Accept", "application/json");

    //完成簽名并執(zhí)行請(qǐng)求
    CloseableHttpResponse response = httpClient.execute(httpPost);

    try {
        int statusCode = response.getStatusLine().getStatusCode();
        if (statusCode == 200) { //處理成功
            System.out.println("success,return body = " + EntityUtils.toString(response.getEntity()));
        } else if (statusCode == 204) { //處理成功,無(wú)返回Body
            System.out.println("success");
        } else {
            System.out.println("failed,resp code = " + statusCode+ ",return body = " + EntityUtils.toString(response.getEntity()));
            throw new IOException("request failed");
        }
    } finally {
        response.close();
    }
}
    

try {
    $resp = $client->request(
        'POST',
        'https://api.mch.weixin.qq.com/v3/marketing/favor/stocks/9856000/pause', //請(qǐng)求URL
        [
            // JSON請(qǐng)求體
            'json' => [
                "stock_creator_mchid" => "8956000",
            ],
            'headers' => [ 'Accept' => 'application/json' ]
        ]
    );
    $statusCode = $resp->getStatusCode();
    if ($statusCode == 200) { //處理成功
        echo "success,return body = " . $resp->getBody()->getContents()."\n";
    } else if ($statusCode == 204) { //處理成功,無(wú)返回Body
        echo "success";
    }
} catch (RequestException $e) {
    // 進(jìn)行錯(cuò)誤處理
    echo $e->getMessage()."\n";
    if ($e->hasResponse()) {
        echo "failed,resp code = " . $e->getResponse()->getStatusCode() . " return body = " . $e->getResponse()->getBody() . "\n";
    }
    return;
}
    

func PauseCoupon() {
       // 初始化客戶端
    ctx := context.TODO()
    opts, err := SetUp()
    if err != nil {
        return
    }
    client, err := core.NewClient(ctx, opts...,)
    if err != nil{
        log.Printf("init client err:%s",err)
        return
    }
    //設(shè)置請(qǐng)求地址
  URL := "https://api.mch.weixin.qq.com/v3/marketing/favor/stocks/9856000/pause"
  //設(shè)置請(qǐng)求信息,此處也可以使用結(jié)構(gòu)體來(lái)進(jìn)行請(qǐng)求
  mapInfo := map[string]interface{}{
    "stock_creator_mchid": "8956000",
  }

  // 發(fā)起請(qǐng)求
  response, err := client.Post(ctx, URL, mapInfo)
  if err != nil{
    log.Printf("client post err:%s",err)
    return
  }
  // 校驗(yàn)回包內(nèi)容是否有邏輯錯(cuò)誤
  err = core.CheckResponse(response)
  if err != nil{
    log.Printf("check response err:%s",err)
    return
  }
  // 讀取回包信息
  body, err := ioutil.ReadAll(response.Body)
  if err != nil{
    log.Printf("read response body err:%s",err)
    return
  }
  fmt.Println(string(body))
}
}
    

重要入?yún)⒄f(shuō)明

? stock_creator_mchid:批次創(chuàng)建方商戶號(hào)

? stock_id:微信為每個(gè)代金券批次分配的唯一id

更多參數(shù)、響應(yīng)詳情及錯(cuò)誤碼請(qǐng)參見(jiàn)暫停代金券批次接口文檔

3.2.5. 【服務(wù)端】重啟代金券批次

步驟說(shuō)明:通過(guò)此接口可重啟指定代金券批次。重啟后,該代金券批次可以再次發(fā)放。重啟接口的前提是批次處于暫停狀態(tài)

示例代碼


public void RestartCoupon() throws Exception{
    //請(qǐng)求URL
    HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/v3/marketing/favor/stocks/9856000/restart");
    // 請(qǐng)求body參數(shù)
    String reqdata = "{"
            + "\"stock_creator_mchid\":\"8956000\""
            + "}";
    StringEntity entity = new StringEntity(reqdata,"utf-8");
    entity.setContentType("application/json");
    httpPost.setEntity(entity);
    httpPost.setHeader("Accept", "application/json");

    //完成簽名并執(zhí)行請(qǐng)求
    CloseableHttpResponse response = httpClient.execute(httpPost);

    try {
        int statusCode = response.getStatusLine().getStatusCode();
        if (statusCode == 200) { //處理成功
            System.out.println("success,return body = " + EntityUtils.toString(response.getEntity()));
        } else if (statusCode == 204) { //處理成功,無(wú)返回Body
            System.out.println("success");
        } else {
            System.out.println("failed,resp code = " + statusCode+ ",return body = " + EntityUtils.toString(response.getEntity()));
            throw new IOException("request failed");
        }
    } finally {
        response.close();
    }
}
    

 try {
    $resp = $client->request(
        'POST',
        'https://api.mch.weixin.qq.com/v3/marketing/favor/stocks/9856000/restart', //請(qǐng)求URL
        [
            // JSON請(qǐng)求體
            'json' => [
                "stock_creator_mchid" => "8956000",
            ],
            'headers' => [ 'Accept' => 'application/json' ]
        ]
    );
    $statusCode = $resp->getStatusCode();
    if ($statusCode == 200) { //處理成功
        echo "success,return body = " . $resp->getBody()->getContents()."\n";
    } else if ($statusCode == 204) { //處理成功,無(wú)返回Body
        echo "success";
    }
} catch (RequestException $e) {
    // 進(jìn)行錯(cuò)誤處理
    echo $e->getMessage()."\n";
    if ($e->hasResponse()) {
        echo "failed,resp code = " . $e->getResponse()->getStatusCode() . " return body = " . $e->getResponse()->getBody() . "\n";
    }
    return;
}
    

func RestartCoupon() {
       // 初始化客戶端
    ctx := context.TODO()
    opts, err := SetUp()
    if err != nil {
        return
    }
    client, err := core.NewClient(ctx, opts...,)
    if err != nil{
        log.Printf("init client err:%s",err)
        return
    }
     //設(shè)置請(qǐng)求地址
  URL := "https://api.mch.weixin.qq.com/v3/marketing/favor/stocks/9856000/restart"
  //設(shè)置請(qǐng)求信息,此處也可以使用結(jié)構(gòu)體來(lái)進(jìn)行請(qǐng)求
  mapInfo := map[string]interface{}{
    "stock_creator_mchid": "8956000",
  }

  // 發(fā)起請(qǐng)求
  response, err := client.Post(ctx, URL, mapInfo)
  if err != nil{
    log.Printf("client post err:%s",err)
    return
  }
  // 校驗(yàn)回包內(nèi)容是否有邏輯錯(cuò)誤
  err = core.CheckResponse(response)
  if err != nil{
    log.Printf("check response err:%s",err)
    return
  }
  // 讀取回包信息
  body, err := ioutil.ReadAll(response.Body)
  if err != nil{
    log.Printf("read response body err:%s",err)
    return
  }
  fmt.Println(string(body))
}
    

重要入?yún)⒄f(shuō)明

? stock_creator_mchid:批次創(chuàng)建方商戶號(hào)

? stock_id:微信為每個(gè)代金券批次分配的唯一id。

更多參數(shù)、響應(yīng)詳情及錯(cuò)誤碼請(qǐng)參見(jiàn)重啟代金券批次接口文檔

3.2.6. 【服務(wù)端】條件查詢批次列表

步驟說(shuō)明:通過(guò)此接口可查詢多個(gè)批次的信息,包括批次的配置信息以及批次概況數(shù)據(jù)。

示例代碼


public void GetStocksList() throws Exception{
    //請(qǐng)求URL
    HttpGet httpGet = new HttpGet("https://api.mch.weixin.qq.com/v3/marketing/favor/stocks?offset=1&limit=10&stock_creator_mchid=9856888&create_start_time%3D2015-05-20T13%3A29%3A35.120%2B08%3A00%26create_end_time%3D2015-05-20T13%3A29%3A35.120%2B08%3A00&status=paused");
    httpGet.setHeader("Accept", "application/json");

    //完成簽名并執(zhí)行請(qǐng)求
    CloseableHttpResponse response = httpClient.execute(httpGet);

    try {
        int statusCode = response.getStatusLine().getStatusCode();
        if (statusCode == 200) { //處理成功
            System.out.println("success,return body = " + EntityUtils.toString(response.getEntity()));
        } else if (statusCode == 204) { //處理成功,無(wú)返回Body
            System.out.println("success");
        } else {
            System.out.println("failed,resp code = " + statusCode+ ",return body = " + EntityUtils.toString(response.getEntity()));
            throw new IOException("request failed");
        }
    } finally {
        response.close();
    }
}
    

try {
    $resp = $client->request(
        'GET',
        'https://api.mch.weixin.qq.com/v3/marketing/favor/stocks?offset=1&limit=10&stock_creator_mchid=9856888&create_start_time%3D2015-05-20T13%3A29%3A35.120%2B08%3A00%26create_end_time%3D2015-05-20T13%3A29%3A35.120%2B08%3A00&status=paused', //請(qǐng)求URL
        [
            'headers' => [ 'Accept' => 'application/json']
        ]
    );
    $statusCode = $resp->getStatusCode();
    if ($statusCode == 200) { //處理成功
        echo "success,return body = " . $resp->getBody()->getContents()."\n";
    } else if ($statusCode == 204) { //處理成功,無(wú)返回Body
        echo "success";
    }
} catch (RequestException $e) {
    // 進(jìn)行錯(cuò)誤處理
    echo $e->getMessage()."\n";
    if ($e->hasResponse()) {
        echo "failed,resp code = " . $e->getResponse()->getStatusCode() . " return body = " . $e->getResponse()->getBody() . "\n";
    }
    return;
}
    

func GetStocksList() {
       // 初始化客戶端
    ctx := context.TODO()
    opts, err := SetUp()
    if err != nil {
        return
    }
    client, err := core.NewClient(ctx, opts...,)
    if err != nil{
        log.Printf("init client err:%s",err)
        return
    }
    //設(shè)置請(qǐng)求地址
    URL := "https://api.mch.weixin.qq.com/v3/marketing/favor/stocks?offset=1&limit=10&stock_creator_mchid=9856888&create_start_time%3D2015-05-20T13%3A29%3A35.120%2B08%3A00%26create_end_time%3D2015-05-20T13%3A29%3A35.120%2B08%3A00&status=paused"
  // 發(fā)起請(qǐng)求
  response, err := client.Get(ctx, URL)
  if err != nil{
    log.Printf("client get err:%s",err)
    return
  }
  // 校驗(yàn)回包內(nèi)容是否有邏輯錯(cuò)誤
  err = core.CheckResponse(response)
  if err != nil{
    log.Printf("check response err:%s",err)
    return
  }
  // 讀取回包信息
  body, err := ioutil.ReadAll(response.Body)
  if err != nil{
    log.Printf("read response body err:%s",err)
    return
  }
  fmt.Println(string(body))
}
}
    

重要入?yún)⒄f(shuō)明

? stock_creator_mchid:批次創(chuàng)建方商戶號(hào)

? status:批次狀態(tài)

更多參數(shù)、響應(yīng)詳情及錯(cuò)誤碼請(qǐng)參見(jiàn)條件查詢批次列表接口文檔

3.2.7. 【服務(wù)端】查詢批次詳情

步驟說(shuō)明:通過(guò)此接口可查詢批次信息,包括批次的配置信息以及批次概況數(shù)據(jù)。

示例代碼


public void GetStocksInfo() throws Exception{
    //請(qǐng)求URL
    HttpGet httpGet = new HttpGet("https://api.mch.weixin.qq.com/v3/marketing/favor/stocks/9856888?stock_creator_mchid=123456");
    httpGet.setHeader("Accept", "application/json");

    //完成簽名并執(zhí)行請(qǐng)求
    CloseableHttpResponse response = httpClient.execute(httpGet);

    try {
        int statusCode = response.getStatusLine().getStatusCode();
        if (statusCode == 200) { //處理成功
            System.out.println("success,return body = " + EntityUtils.toString(response.getEntity()));
        } else if (statusCode == 204) { //處理成功,無(wú)返回Body
            System.out.println("success");
        } else {
            System.out.println("failed,resp code = " + statusCode+ ",return body = " + EntityUtils.toString(response.getEntity()));
            throw new IOException("request failed");
        }
    } finally {
        response.close();
    }
}
    

try {
    $resp = $client->request(
        'GET',
        'https://api.mch.weixin.qq.com/v3/marketing/favor/stocks/9856888?stock_creator_mchid=123456', //請(qǐng)求URL
        [
            'headers' => [ 'Accept' => 'application/json']
        ]
    );
    $statusCode = $resp->getStatusCode();
    if ($statusCode == 200) { //處理成功
        echo "success,return body = " . $resp->getBody()->getContents()."\n";
    } else if ($statusCode == 204) { //處理成功,無(wú)返回Body
        echo "success";
    }
} catch (RequestException $e) {
    // 進(jìn)行錯(cuò)誤處理
    echo $e->getMessage()."\n";
    if ($e->hasResponse()) {
        echo "failed,resp code = " . $e->getResponse()->getStatusCode() . " return body = " . $e->getResponse()->getBody() . "\n";
    }
    return;
}
    

func GetStocksInfo() {
       // 初始化客戶端
    ctx := context.TODO()
    opts, err := SetUp()
    if err != nil {
        return
    }
    client, err := core.NewClient(ctx, opts...,)
    if err != nil{
        log.Printf("init client err:%s",err)
        return
    }
    //設(shè)置請(qǐng)求地址
    URL := "https://api.mch.weixin.qq.com/v3/marketing/favor/stocks/9856888?stock_creator_mchid=123456"
  // 發(fā)起請(qǐng)求
  response, err := client.Get(ctx, URL)
  if err != nil{
    log.Printf("client get err:%s",err)
    return
  }
  // 校驗(yàn)回包內(nèi)容是否有邏輯錯(cuò)誤
  err = core.CheckResponse(response)
  if err != nil{
    log.Printf("check response err:%s",err)
    return
  }
  // 讀取回包信息
  body, err := ioutil.ReadAll(response.Body)
  if err != nil{
    log.Printf("read response body err:%s",err)
    return
  }
  fmt.Println(string(body))
}
}
    

重要入?yún)⒄f(shuō)明

? stock_creator_mchid:批次創(chuàng)建方商戶號(hào)

? stock_id:微信為每個(gè)代金券批次分配的唯一id。

更多參數(shù)、響應(yīng)詳情及錯(cuò)誤碼請(qǐng)參見(jiàn)查詢批次詳情接口文檔

3.2.8. 【服務(wù)端】查詢代金券詳情

步驟說(shuō)明:通過(guò)此接口可查詢代金券信息,包括代金券的基礎(chǔ)信息、狀態(tài)。如代金券已核銷,會(huì)包括代金券核銷的訂單信息(訂單號(hào)、單品信息等)。

示例代碼


public void GetConponInfo() throws Exception{
    //請(qǐng)求URL
    HttpGet httpGet = new HttpGet("https://api.mch.weixin.qq.com/v3/marketing/favor/users/o4GgauInH_RCEdvrrNGrntXDu6D4/coupons/985688?appid=wx233544546545989");
    httpGet.setHeader("Accept", "application/json");

    //完成簽名并執(zhí)行請(qǐng)求
    CloseableHttpResponse response = httpClient.execute(httpGet);

    try {
        int statusCode = response.getStatusLine().getStatusCode();
        if (statusCode == 200) { //處理成功
            System.out.println("success,return body = " + EntityUtils.toString(response.getEntity()));
        } else if (statusCode == 204) { //處理成功,無(wú)返回Body
            System.out.println("success");
        } else {
            System.out.println("failed,resp code = " + statusCode+ ",return body = " + EntityUtils.toString(response.getEntity()));
            throw new IOException("request failed");
        }
    } finally {
        response.close();
    }
}
    

try {
    $resp = $client->request(
        'GET',
        'https://api.mch.weixin.qq.com/v3/marketing/favor/users/o4GgauInH_RCEdvrrNGrntXDu6D4/coupons/985688?appid=wx233544546545989', //請(qǐng)求URL
        [
            'headers' => [ 'Accept' => 'application/json']
        ]
    );
    $statusCode = $resp->getStatusCode();
    if ($statusCode == 200) { //處理成功
        echo "success,return body = " . $resp->getBody()->getContents()."\n";
    } else if ($statusCode == 204) { //處理成功,無(wú)返回Body
        echo "success";
    }
} catch (RequestException $e) {
    // 進(jìn)行錯(cuò)誤處理
    echo $e->getMessage()."\n";
    if ($e->hasResponse()) {
        echo "failed,resp code = " . $e->getResponse()->getStatusCode() . " return body = " . $e->getResponse()->getBody() . "\n";
    }
    return;
}
    

func GetConponInfo() {
       // 初始化客戶端
    ctx := context.TODO()
    opts, err := SetUp()
    if err != nil {
        return
    }
    client, err := core.NewClient(ctx, opts...,)
    if err != nil{
        log.Printf("init client err:%s",err)
        return
    }
    //設(shè)置請(qǐng)求地址
    URL := "https://api.mch.weixin.qq.com/v3/marketing/favor/users/o4GgauInH_RCEdvrrNGrntXDu6D4/coupons/985688?appid=wx233544546545989"
  // 發(fā)起請(qǐng)求
  response, err := client.Get(ctx, URL)
  if err != nil{
    log.Printf("client get err:%s",err)
    return
  }
  // 校驗(yàn)回包內(nèi)容是否有邏輯錯(cuò)誤
  err = core.CheckResponse(response)
  if err != nil{
    log.Printf("check response err:%s",err)
    return
  }
  // 讀取回包信息
  body, err := ioutil.ReadAll(response.Body)
  if err != nil{
    log.Printf("read response body err:%s",err)
    return
  }
  fmt.Println(string(body))
}
}
    

重要入?yún)⒄f(shuō)明

? openid:openid是微信用戶在appid下的唯一用戶標(biāo)識(shí)(appid不同,則獲取到的openid就不同),可用于永久標(biāo)記一個(gè)用戶。openid獲取方式請(qǐng)參考以下文檔小程序獲取openid公眾號(hào)獲取openidAPP獲取openid

? coupon_id:微信為代金券唯一分配的id。

更多參數(shù)、響應(yīng)詳情及錯(cuò)誤碼請(qǐng)參見(jiàn)查詢代金券詳情接口文檔

3.2.9. 【服務(wù)端】查詢代金券可用商戶

步驟說(shuō)明:通過(guò)調(diào)用此接口可查詢批次的可用商戶號(hào),判斷券是否在某商戶號(hào)可用,來(lái)決定是否展示。

示例代碼


public void GetConponMch() throws Exception{
    //請(qǐng)求URL
    HttpGet httpGet = new HttpGet("https://api.mch.weixin.qq.com/v3/marketing/favor/stocks/9865000/merchants?offset=10&limit=10&stock_creator_mchid=1900001111");
    httpGet.setHeader("Accept", "application/json");

    //完成簽名并執(zhí)行請(qǐng)求
    CloseableHttpResponse response = httpClient.execute(httpGet);

    try {
        int statusCode = response.getStatusLine().getStatusCode();
        if (statusCode == 200) { //處理成功
            System.out.println("success,return body = " + EntityUtils.toString(response.getEntity()));
        } else if (statusCode == 204) { //處理成功,無(wú)返回Body
            System.out.println("success");
        } else {
            System.out.println("failed,resp code = " + statusCode+ ",return body = " + EntityUtils.toString(response.getEntity()));
            throw new IOException("request failed");
        }
    } finally {
        response.close();
    }
}
    

try {
    $resp = $client->request(
        'GET',
        'https://api.mch.weixin.qq.com/v3/marketing/favor/stocks/9865000/merchants?offset=10&limit=10&stock_creator_mchid=1900001111', //請(qǐng)求URL
        [
            'headers' => [ 'Accept' => 'application/json']
        ]
    );
    $statusCode = $resp->getStatusCode();
    if ($statusCode == 200) { //處理成功
        echo "success,return body = " . $resp->getBody()->getContents()."\n";
    } else if ($statusCode == 204) { //處理成功,無(wú)返回Body
        echo "success";
    }
} catch (RequestException $e) {
    // 進(jìn)行錯(cuò)誤處理
    echo $e->getMessage()."\n";
    if ($e->hasResponse()) {
        echo "failed,resp code = " . $e->getResponse()->getStatusCode() . " return body = " . $e->getResponse()->getBody() . "\n";
    }
    return;
}
    

func GetConponMch() {
       // 初始化客戶端
    ctx := context.TODO()
    opts, err := SetUp()
    if err != nil {
        return
    }
    client, err := core.NewClient(ctx, opts...,)
    if err != nil{
        log.Printf("init client err:%s",err)
        return
    }
    //設(shè)置請(qǐng)求地址
    URL := "https://api.mch.weixin.qq.com/v3/marketing/favor/stocks/9865000/merchants?offset=10&limit=10&stock_creator_mchid=1900001111"
  // 發(fā)起請(qǐng)求
  response, err := client.Get(ctx, URL)
  if err != nil{
    log.Printf("client get err:%s",err)
    return
  }
  // 校驗(yàn)回包內(nèi)容是否有邏輯錯(cuò)誤
  err = core.CheckResponse(response)
  if err != nil{
    log.Printf("check response err:%s",err)
    return
  }
  // 讀取回包信息
  body, err := ioutil.ReadAll(response.Body)
  if err != nil{
    log.Printf("read response body err:%s",err)
    return
  }
  fmt.Println(string(body))
}
}
    

重要入?yún)⒄f(shuō)明

? stock_creator_mchid:批次創(chuàng)建方商戶號(hào)

? stock_id:微信為每個(gè)代金券批次分配的唯一id。

更多參數(shù)、響應(yīng)詳情及錯(cuò)誤碼請(qǐng)參見(jiàn)查詢代金券可用商戶接口文檔

3.2.10. 【服務(wù)端】查詢代金券可用單品

步驟說(shuō)明:通過(guò)此接口可查詢批次的可用商品編碼,判斷券是否可用于某些商品,來(lái)決定是否展示。

示例代碼


public void GetConponItem() throws Exception{
    //請(qǐng)求URL
    HttpGet httpGet = new HttpGet("https://api.mch.weixin.qq.com/v3/marketing/favor/stocks/9865000/items?offset=10&limit=10&stock_creator_mchid=9865000");
    httpGet.setHeader("Accept", "application/json");

    //完成簽名并執(zhí)行請(qǐng)求
    CloseableHttpResponse response = httpClient.execute(httpGet);

    try {
        int statusCode = response.getStatusLine().getStatusCode();
        if (statusCode == 200) { //處理成功
            System.out.println("success,return body = " + EntityUtils.toString(response.getEntity()));
        } else if (statusCode == 204) { //處理成功,無(wú)返回Body
            System.out.println("success");
        } else {
            System.out.println("failed,resp code = " + statusCode+ ",return body = " + EntityUtils.toString(response.getEntity()));
            throw new IOException("request failed");
        }
    } finally {
        response.close();
    }
}
    

try {
    $resp = $client->request(
        'GET',
        'https://api.mch.weixin.qq.com/v3/marketing/favor/stocks/9865000/items?offset=10&limit=10&stock_creator_mchid=9865000', //請(qǐng)求URL
        [
            'headers' => [ 'Accept' => 'application/json']
        ]
    );
    $statusCode = $resp->getStatusCode();
    if ($statusCode == 200) { //處理成功
        echo "success,return body = " . $resp->getBody()->getContents()."\n";
    } else if ($statusCode == 204) { //處理成功,無(wú)返回Body
        echo "success";
    }
} catch (RequestException $e) {
    // 進(jìn)行錯(cuò)誤處理
    echo $e->getMessage()."\n";
    if ($e->hasResponse()) {
        echo "failed,resp code = " . $e->getResponse()->getStatusCode() . " return body = " . $e->getResponse()->getBody() . "\n";
    }
    return;
}
    

func GetConponItem() {
       // 初始化客戶端
    ctx := context.TODO()
    opts, err := SetUp()
    if err != nil {
        return
    }
    client, err := core.NewClient(ctx, opts...,)
    if err != nil{
        log.Printf("init client err:%s",err)
        return
    }
    //設(shè)置請(qǐng)求地址
    URL := "https://api.mch.weixin.qq.com/v3/marketing/favor/stocks/9865000/items?offset=10&limit=10&stock_creator_mchid=9865000"
  // 發(fā)起請(qǐng)求
  response, err := client.Get(ctx, URL)
  if err != nil{
    log.Printf("client get err:%s",err)
    return
  }
  // 校驗(yàn)回包內(nèi)容是否有邏輯錯(cuò)誤
  err = core.CheckResponse(response)
  if err != nil{
    log.Printf("check response err:%s",err)
    return
  }
  // 讀取回包信息
  body, err := ioutil.ReadAll(response.Body)
  if err != nil{
    log.Printf("read response body err:%s",err)
    return
  }
  fmt.Println(string(body))
}
}
    

重要入?yún)⒄f(shuō)明

? stock_creator_mchid:批次創(chuàng)建方商戶號(hào)

? stock_id:微信為每個(gè)代金券批次分配的唯一id

更多參數(shù)、響應(yīng)詳情及錯(cuò)誤碼請(qǐng)參見(jiàn)查詢代金券可用單品接口文檔

3.2.11. 【服務(wù)端】根據(jù)商戶號(hào)查用戶的券

步驟說(shuō)明:可通過(guò)該接口查詢用戶在某商戶號(hào)可用的全部券,可用于商戶的小程序/H5中,用戶"我的代金券"或"提交訂單頁(yè)"展示優(yōu)惠信息。無(wú)法查詢到微信支付立減金。本接口查不到用戶的微信支付立減金(又稱“全平臺(tái)通用券”),即在所有商戶都可以使用的券,例如:搖搖樂(lè)紅包;當(dāng)按可用商戶號(hào)查詢時(shí),無(wú)法查詢用戶已經(jīng)核銷的券

示例代碼


public void GetUserConpon() throws Exception{
    //請(qǐng)求URL
    HttpGet httpGet = new HttpGet("https://api.mch.weixin.qq.com/v3/marketing/favor/users/o4GgauInH_RCEdvrrNGrntXDu6D4/coupons?appid=wx233544546545989");
    httpGet.setHeader("Accept", "application/json");

    //完成簽名并執(zhí)行請(qǐng)求
    CloseableHttpResponse response = httpClient.execute(httpGet);

    try {
        int statusCode = response.getStatusLine().getStatusCode();
        if (statusCode == 200) { //處理成功
            System.out.println("success,return body = " + EntityUtils.toString(response.getEntity()));
        } else if (statusCode == 204) { //處理成功,無(wú)返回Body
            System.out.println("success");
        } else {
            System.out.println("failed,resp code = " + statusCode+ ",return body = " + EntityUtils.toString(response.getEntity()));
            throw new IOException("request failed");
        }
    } finally {
        response.close();
    }
}
    

   try {
    $resp = $client->request(
        'GET',
        'https://api.mch.weixin.qq.com/v3/marketing/favor/users/o4GgauInH_RCEdvrrNGrntXDu6D4/coupons?appid=wx233544546545989', //請(qǐng)求URL
        [
            'headers' => [ 'Accept' => 'application/json']
        ]
    );
    $statusCode = $resp->getStatusCode();
    if ($statusCode == 200) { //處理成功
        echo "success,return body = " . $resp->getBody()->getContents()."\n";
    } else if ($statusCode == 204) { //處理成功,無(wú)返回Body
        echo "success";
    }
} catch (RequestException $e) {
    // 進(jìn)行錯(cuò)誤處理
    echo $e->getMessage()."\n";
    if ($e->hasResponse()) {
        echo "failed,resp code = " . $e->getResponse()->getStatusCode() . " return body = " . $e->getResponse()->getBody() . "\n";
    }
    return;
}
    

func GetUserConpon() {
       // 初始化客戶端
    ctx := context.TODO()
    opts, err := SetUp()
    if err != nil {
        return
    }
    client, err := core.NewClient(ctx, opts...,)
    if err != nil{
        log.Printf("init client err:%s",err)
        return
    }
    //設(shè)置請(qǐng)求地址
    URL := "https://api.mch.weixin.qq.com/v3/marketing/favor/users/2323dfsdf342342/coupons?appid=wx233544546545989"
  // 發(fā)起請(qǐng)求
  response, err := client.Get(ctx, URL)
  if err != nil{
    log.Printf("client get err:%s",err)
    return
  }
  // 校驗(yàn)回包內(nèi)容是否有邏輯錯(cuò)誤
  err = core.CheckResponse(response)
  if err != nil{
    log.Printf("check response err:%s",err)
    return
  }
  // 讀取回包信息
  body, err := ioutil.ReadAll(response.Body)
  if err != nil{
    log.Printf("read response body err:%s",err)
    return
  }
  fmt.Println(string(body))
}
}
    

重要入?yún)⒄f(shuō)明

? stock_creator_mchid:批次創(chuàng)建方商戶號(hào)

? stock_id:微信為每個(gè)代金券批次分配的唯一id。

? openid:openid是微信用戶在appid下的唯一用戶標(biāo)識(shí)(appid不同,則獲取到的openid就不同),可用于永久標(biāo)記一個(gè)用戶。openid獲取方式請(qǐng)參考以下文檔小程序獲取openid公眾號(hào)獲取openidAPP獲取openid

? available_mchid:可用商戶號(hào)

更多參數(shù)、響應(yīng)詳情及錯(cuò)誤碼請(qǐng)參見(jiàn)根據(jù)商戶號(hào)查用戶的券接口文檔

3.2.12. 【服務(wù)端】下載批次核銷明細(xì)

步驟說(shuō)明:可獲取到某批次的核銷明細(xì)數(shù)據(jù),包括訂單號(hào)、單品信息、銀行流水號(hào)等,用于對(duì)賬/數(shù)據(jù)分析。

示例代碼


public void UseBill() throws Exception{

  //請(qǐng)求URL
  HttpGet httpGet = new HttpGet("https://api.mch.weixin.qq.com/v3/marketing/favor/stocks/9865000/use-flow");
  httpGet.setHeader("Accept", "application/json");

  //完成簽名并執(zhí)行請(qǐng)求
  CloseableHttpResponse response = httpClient.execute(httpGet);

  try {
      int statusCode = response.getStatusLine().getStatusCode();
      if (statusCode == 200) { //處理成功
          System.out.println("success,return body = " + EntityUtils.toString(response.getEntity()));
      } else if (statusCode == 204) { //處理成功,無(wú)返回Body
          System.out.println("success");
      } else {
          System.out.println("failed,resp code = " + statusCode+ ",return body = " + EntityUtils.toString(response.getEntity()));
          throw new IOException("request failed");
      }
  } finally {
      response.close();
  }
}
    

try {
    $resp = $client->request(
        'GET',
        'https://api.mch.weixin.qq.com/v3/marketing/favor/stocks/9865000/use-flow', //請(qǐng)求URL
        [
            'headers' => [ 'Accept' => 'application/json']
        ]
    );
    $statusCode = $resp->getStatusCode();
    if ($statusCode == 200) { //處理成功
        echo "success,return body = " . $resp->getBody()->getContents()."\n";
    } else if ($statusCode == 204) { //處理成功,無(wú)返回Body
        echo "success";
    }
} catch (RequestException $e) {
    // 進(jìn)行錯(cuò)誤處理
    echo $e->getMessage()."\n";
    if ($e->hasResponse()) {
        echo "failed,resp code = " . $e->getResponse()->getStatusCode() . " return body = " . $e->getResponse()->getBody() . "\n";
    }
    return;
}
    

func UseBill() {
       // 初始化客戶端
    ctx := context.TODO()
    opts, err := SetUp()
    if err != nil {
        return
    }
    client, err := core.NewClient(ctx, opts...,)
    if err != nil{
        log.Printf("init client err:%s",err)
        return
    }
    //設(shè)置請(qǐng)求地址
    URL := "https://api.mch.weixin.qq.com/v3/marketing/favor/stocks/9865000/use-flow"
  // 發(fā)起請(qǐng)求
  response, err := client.Get(ctx, URL)
  if err != nil{
    log.Printf("client get err:%s",err)
    return
  }
  // 校驗(yàn)回包內(nèi)容是否有邏輯錯(cuò)誤
  err = core.CheckResponse(response)
  if err != nil{
    log.Printf("check response err:%s",err)
    return
  }
  // 讀取回包信息
  body, err := ioutil.ReadAll(response.Body)
  if err != nil{
    log.Printf("read response body err:%s",err)
    return
  }
  fmt.Println(string(body))
}
}
    

重要入?yún)⒄f(shuō)明

? stock_id:微信為每個(gè)代金券批次分配的唯一id

更多參數(shù)、響應(yīng)詳情及錯(cuò)誤碼請(qǐng)參見(jiàn)下載批次核銷明細(xì)接口文檔

3.2.13. 【服務(wù)端】下載批次退款明細(xì)

步驟說(shuō)明:可獲取到某批次的退款明細(xì)數(shù)據(jù),包括訂單號(hào)、單品信息、銀行流水號(hào)等,用于對(duì)賬/數(shù)據(jù)分析。

示例代碼


public void RefundBill() throws Exception{
  //請(qǐng)求URL
  HttpGet httpGet = new HttpGet("https://api.mch.weixin.qq.com/v3/marketing/favor/stocks/9865000/refund-flow");
  httpGet.setHeader("Accept", "application/json");

  //完成簽名并執(zhí)行請(qǐng)求
  CloseableHttpResponse response = httpClient.execute(httpGet);

  try {
      int statusCode = response.getStatusLine().getStatusCode();
      if (statusCode == 200) { //處理成功
          System.out.println("success,return body = " + EntityUtils.toString(response.getEntity()));
      } else if (statusCode == 204) { //處理成功,無(wú)返回Body
          System.out.println("success");
      } else {
          System.out.println("failed,resp code = " + statusCode+ ",return body = " + EntityUtils.toString(response.getEntity()));
          throw new IOException("request failed");
      }
  } finally {
      response.close();
  }
}
    

try {
    $resp = $client->request(
        'GET',
        'https://api.mch.weixin.qq.com/v3/marketing/favor/stocks/9865000/refund-flow', //請(qǐng)求URL
        [
            'headers' => [ 'Accept' => 'application/json']
        ]
    );
    $statusCode = $resp->getStatusCode();
    if ($statusCode == 200) { //處理成功
        echo "success,return body = " . $resp->getBody()->getContents()."\n";
    } else if ($statusCode == 204) { //處理成功,無(wú)返回Body
        echo "success";
    }
} catch (RequestException $e) {
    // 進(jìn)行錯(cuò)誤處理
    echo $e->getMessage()."\n";
    if ($e->hasResponse()) {
        echo "failed,resp code = " . $e->getResponse()->getStatusCode() . " return body = " . $e->getResponse()->getBody() . "\n";
    }
    return;
}
    

func RefundBill() {
       // 初始化客戶端
    ctx := context.TODO()
    opts, err := SetUp()
    if err != nil {
        return
    }
    client, err := core.NewClient(ctx, opts...,)
    if err != nil{
        log.Printf("init client err:%s",err)
        return
    }
    //設(shè)置請(qǐng)求地址
    URL := "https://api.mch.weixin.qq.com/v3/marketing/favor/stocks/9865000/refund-flow"
  // 發(fā)起請(qǐng)求
  response, err := client.Get(ctx, URL)
  if err != nil{
    log.Printf("client get err:%s",err)
    return
  }
  // 校驗(yàn)回包內(nèi)容是否有邏輯錯(cuò)誤
  err = core.CheckResponse(response)
  if err != nil{
    log.Printf("check response err:%s",err)
    return
  }
  // 讀取回包信息
  body, err := ioutil.ReadAll(response.Body)
  if err != nil{
    log.Printf("read response body err:%s",err)
    return
  }
  fmt.Println(string(body))
}
}
    

重要入?yún)⒄f(shuō)明

? stock_id:微信為每個(gè)代金券批次分配的唯一id

更多參數(shù)、響應(yīng)詳情及錯(cuò)誤碼請(qǐng)參見(jiàn)下載批次退款明細(xì)接口文檔

3.2.14. 【服務(wù)端】設(shè)置消息通知地址

步驟說(shuō)明:用于設(shè)置接收營(yíng)銷事件通知的URL,可接收營(yíng)銷相關(guān)的事件通知,包括核銷、發(fā)放、退款等。

示例代碼


public void SetCouponCallback() throws Exception{
    //請(qǐng)求URL
    HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/v3/marketing/favor/callbacks");
    // 請(qǐng)求body參數(shù)
    String reqdata = "{"
            + "\"mchid\":\"9856888\","
            + "\"notify_url\":\"http://www.tg885.com\""
            + "}";
    StringEntity entity = new StringEntity(reqdata,"utf-8");
    entity.setContentType("application/json");
    httpPost.setEntity(entity);
    httpPost.setHeader("Accept", "application/json");

    //完成簽名并執(zhí)行請(qǐng)求
    CloseableHttpResponse response = httpClient.execute(httpPost);

    try {
        int statusCode = response.getStatusLine().getStatusCode();
        if (statusCode == 200) { //處理成功
            System.out.println("success,return body = " + EntityUtils.toString(response.getEntity()));
        } else if (statusCode == 204) { //處理成功,無(wú)返回Body
            System.out.println("success");
        } else {
            System.out.println("failed,resp code = " + statusCode+ ",return body = " + EntityUtils.toString(response.getEntity()));
            throw new IOException("request failed");
        }
    } finally {
        response.close();
    }
}
    

try {
    $resp = $client->request(
        'POST',
        'https://api.mch.weixin.qq.com/v3/marketing/favor/callbacks', //請(qǐng)求URL
        [
            // JSON請(qǐng)求體
            'json' => [
                "mchid" => "9856888",
                "notify_url" => "http://www.tg885.com",
            ],
            'headers' => [ 'Accept' => 'application/json' ]
        ]
    );
    $statusCode = $resp->getStatusCode();
    if ($statusCode == 200) { //處理成功
        echo "success,return body = " . $resp->getBody()->getContents()."\n";
    } else if ($statusCode == 204) { //處理成功,無(wú)返回Body
        echo "success";
    }
} catch (RequestException $e) {
    // 進(jìn)行錯(cuò)誤處理
    echo $e->getMessage()."\n";
    if ($e->hasResponse()) {
        echo "failed,resp code = " . $e->getResponse()->getStatusCode() . " return body = " . $e->getResponse()->getBody() . "\n";
    }
    return;
}
    

func SetCouponCallback() {
       // 初始化客戶端
    ctx := context.TODO()
    opts, err := SetUp()
    if err != nil {
        return
    }
    client, err := core.NewClient(ctx, opts...,)
    if err != nil{
        log.Printf("init client err:%s",err)
        return
    }
    //設(shè)置請(qǐng)求地址
  URL := "https://api.mch.weixin.qq.com/v3/marketing/favor/callbacks"
  //設(shè)置請(qǐng)求信息,此處也可以使用結(jié)構(gòu)體來(lái)進(jìn)行請(qǐng)求
  mapInfo := map[string]interface{}{
    "mchid": "9856888",
    "notify_url": "http://www.tg885.com",
  }

  // 發(fā)起請(qǐng)求
  response, err := client.Post(ctx, URL, mapInfo)
  if err != nil{
    log.Printf("client post err:%s",err)
    return
  }
  // 校驗(yàn)回包內(nèi)容是否有邏輯錯(cuò)誤
  err = core.CheckResponse(response)
  if err != nil{
    log.Printf("check response err:%s",err)
    return
  }
  // 讀取回包信息
  body, err := ioutil.ReadAll(response.Body)
  if err != nil{
    log.Printf("read response body err:%s",err)
    return
  }
  fmt.Println(string(body))
}
}
    

重要入?yún)⒄f(shuō)明

? notify_url:必須為https協(xié)議。如果鏈接無(wú)法訪問(wèn),商戶將無(wú)法接收到微信通知。 通知url必須為直接可訪問(wèn)的url,不能攜帶參數(shù)。示例: “http://www.tg885.com”

更多參數(shù)、響應(yīng)詳情及錯(cuò)誤碼請(qǐng)參見(jiàn)設(shè)置消息通知地址接口文檔

3.2.15.【服務(wù)端】核銷事件回調(diào)通知

步驟說(shuō)明:用戶使用券后,微信會(huì)把相關(guān)核銷券信息發(fā)送給商戶,商戶需要接收處理,并按照文檔規(guī)范返回應(yīng)答。出于安全的考慮,我們對(duì)核銷券信息數(shù)據(jù)進(jìn)行了加密,商戶需要先對(duì)通知數(shù)據(jù)進(jìn)行解密,才能得到核銷券信息數(shù)據(jù)。

注意

  • 核銷券信息通知是以POST 方法訪問(wèn)商戶設(shè)置的通知url,通知的數(shù)據(jù)以JSON 格式通過(guò)請(qǐng)求主體(BODY)傳輸。通知的數(shù)據(jù)包括了加密的支付結(jié)果詳情
  • 加密不能保證通知請(qǐng)求來(lái)自微信。微信會(huì)對(duì)發(fā)送給商戶的通知進(jìn)行簽名,并將簽名值放在通知的HTTP頭Wechatpay-Signature。商戶應(yīng)當(dāng)驗(yàn)證簽名,以確認(rèn)請(qǐng)求來(lái)自微信,而不是其他的第三方。簽名驗(yàn)證的算法請(qǐng)參考 《微信支付API v3簽名驗(yàn)證》
  • 支付通知http應(yīng)答碼為200或204才會(huì)當(dāng)作正常接收,當(dāng)回調(diào)處理異常時(shí),應(yīng)答的HTTP狀態(tài)碼應(yīng)為500,或者4xx
  • 商戶成功接收到回調(diào)通知后應(yīng)返回成功的http應(yīng)答碼為200或204
  • 同樣的通知可能會(huì)多次發(fā)送給商戶系統(tǒng)。商戶系統(tǒng)必須能夠正確處理重復(fù)的通知。 推薦的做法是,當(dāng)商戶系統(tǒng)收到通知進(jìn)行處理時(shí),先檢查對(duì)應(yīng)業(yè)務(wù)數(shù)據(jù)的狀態(tài),并判斷該通知是否已經(jīng)處理。如果未處理,則再進(jìn)行處理;如果已處理,則直接返回結(jié)果成功。在對(duì)業(yè)務(wù)數(shù)據(jù)進(jìn)行狀態(tài)檢查和處理之前,要采用數(shù)據(jù)鎖進(jìn)行并發(fā)控制,以避免函數(shù)重入造成的數(shù)據(jù)混亂
  • 對(duì)后臺(tái)通知交互時(shí),如果微信收到應(yīng)答不是成功或超時(shí),微信認(rèn)為通知失敗,微信會(huì)通過(guò)一定的策略定期重新發(fā)起通知,盡可能提高通知的成功率,但微信不保證通知最終能成功。(通知頻率為1min1次,總計(jì)9次)

更多參數(shù)、響應(yīng)詳情及錯(cuò)誤碼請(qǐng)參見(jiàn) 核銷事件回調(diào)通知支付通知API接口文檔

4. 常見(jiàn)問(wèn)題

Q:創(chuàng)建代金券接口報(bào)錯(cuò):“你配置的信息需要開(kāi)通特殊權(quán)限”

A:請(qǐng)按以下步驟進(jìn)行排查

1. stock_name:最多可填寫(xiě)9個(gè)字

2. max_coupons_per_user:?jiǎn)翁彀l(fā)放個(gè)數(shù)上限不能為0

3. coupon_amount:10<=coupon_amount<=100000

4. available_time_after_receive:可用時(shí)間:相對(duì)時(shí)間,按分鐘設(shè)置,是否1min<=分鐘范圍<=1440min

5. transaction_minimum校驗(yàn)規(guī)則:
    a、使用門檻-券面額>=0.01(門檻要大于面額)
    b、0.1元<=門檻<=100000

6. stock_type:目前只支持NORMAL

7. out_request_no:校驗(yàn)規(guī)則:不可以重復(fù)

8. 開(kāi)始時(shí)間結(jié)束時(shí)間控制在90天內(nèi)

9. 不可使用的時(shí)間參數(shù)不可以傳遞

Q:創(chuàng)建代金券報(bào)錯(cuò)“批次預(yù)算等于批次面額乘以發(fā)券數(shù)”

A:請(qǐng)按以下步驟進(jìn)行排查

1. max_amount需要等于coupon_amount(面額) * max_coupons(發(fā)放總上限)

2. 核對(duì)最終請(qǐng)求數(shù)據(jù),并查看是否存在遺漏數(shù)據(jù),建議使用postman進(jìn)行調(diào)試

Q:創(chuàng)建代金券報(bào)錯(cuò)“活動(dòng)未開(kāi)始或已結(jié)束”

A:活動(dòng)時(shí)間不能大于90天,請(qǐng)檢查available_begin_time、available_end_time參數(shù)設(shè)置是否符合要求。

Q:激活代金券API,如果大于1min或者更久還報(bào)錯(cuò)“系統(tǒng)繁忙”?

A:請(qǐng)檢查單個(gè)可用商戶號(hào)下正在運(yùn)營(yíng)的活動(dòng)是否控制在500個(gè)以內(nèi),若超過(guò)500個(gè)活動(dòng)可能導(dǎo)致新活動(dòng)激活失敗的情況。

Q:設(shè)置消息通知地址報(bào)錯(cuò)“系統(tǒng)繁忙”

A:請(qǐng)按以下步驟進(jìn)行排查

1. 請(qǐng)檢查notify_url設(shè)置是否正確,notify_url必須為https

2. notify_url地址為一個(gè)可訪問(wèn)的地址

3. notify_url不能攜帶參數(shù)。示例:“http://www.tg885.com/wxpay/pay.action”



技術(shù)咨詢

文檔反饋