為了在保證支付安全的前提下,帶給商戶簡(jiǎn)單、一致且易用的開(kāi)發(fā)體驗(yàn),我們推出了全新的微信支付APIv3接口。該版本API的具體規(guī)則請(qǐng)參考“APIv3接口規(guī)則”
為了幫助開(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();
}
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.簽名生成
3.敏感信息加解密
5.wechatpayCertificates(平臺(tái)證書(shū))
? 如想更詳細(xì)的了解我們的接口規(guī)則,可查看我們的接口規(guī)則指引文檔
重點(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)行券管理。
文檔展示了如何使用微信支付服務(wù)端 SDK 快速接入代金券產(chǎn)品,完成與微信支付對(duì)接的部分。
注意:
步驟說(shuō)明:通過(guò)創(chuàng)建代金券批次接口,可創(chuàng)建代金券的類型包含預(yù)充值和免充值兩種類型。
示例代碼
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();
}
}
重要入?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)建代金券批次接口文檔
步驟說(shuō)明:制券成功后,通過(guò)調(diào)用激活接口激活代金券批次。
示例代碼
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();
}
}
重要入?yún)⒄f(shuō)明:
? stock_creator_mchid:批次創(chuàng)建方商戶號(hào)
? stock_id:微信為每個(gè)代金券批次分配的唯一id。
更多參數(shù)、響應(yīng)詳情及錯(cuò)誤碼請(qǐng)參見(jiàn)激活代金券批次接口文檔
步驟說(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();
}
}
重要入?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)獲取openid、APP獲取openid
? stock_creator_mchid:批次創(chuàng)建方商戶號(hào)
? stock_id:微信為每個(gè)代金券批次分配的唯一id。
更多參數(shù)、響應(yīng)詳情及錯(cuò)誤碼請(qǐng)參見(jiàn)發(fā)放代金券批次接口文檔
步驟說(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();
}
}
重要入?yún)⒄f(shuō)明:
? stock_creator_mchid:批次創(chuàng)建方商戶號(hào)
? stock_id:微信為每個(gè)代金券批次分配的唯一id
更多參數(shù)、響應(yīng)詳情及錯(cuò)誤碼請(qǐng)參見(jiàn)暫停代金券批次接口文檔
步驟說(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();
}
}
重要入?yún)⒄f(shuō)明:
? stock_creator_mchid:批次創(chuàng)建方商戶號(hào)
? stock_id:微信為每個(gè)代金券批次分配的唯一id。
更多參數(shù)、響應(yīng)詳情及錯(cuò)誤碼請(qǐng)參見(jiàn)重啟代金券批次接口文檔
步驟說(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();
}
}
重要入?yún)⒄f(shuō)明:
? stock_creator_mchid:批次創(chuàng)建方商戶號(hào)
? status:批次狀態(tài)
更多參數(shù)、響應(yīng)詳情及錯(cuò)誤碼請(qǐng)參見(jiàn)條件查詢批次列表接口文檔
步驟說(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();
}
}
重要入?yún)⒄f(shuō)明:
? stock_creator_mchid:批次創(chuàng)建方商戶號(hào)
? stock_id:微信為每個(gè)代金券批次分配的唯一id。
更多參數(shù)、響應(yīng)詳情及錯(cuò)誤碼請(qǐng)參見(jiàn)查詢批次詳情接口文檔
步驟說(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();
}
}
重要入?yún)⒄f(shuō)明:
? openid:openid是微信用戶在appid下的唯一用戶標(biāo)識(shí)(appid不同,則獲取到的openid就不同),可用于永久標(biāo)記一個(gè)用戶。openid獲取方式請(qǐng)參考以下文檔小程序獲取openid、公眾號(hào)獲取openid、APP獲取openid
? coupon_id:微信為代金券唯一分配的id。
更多參數(shù)、響應(yīng)詳情及錯(cuò)誤碼請(qǐng)參見(jiàn)查詢代金券詳情接口文檔
步驟說(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();
}
}
重要入?yún)⒄f(shuō)明:
? stock_creator_mchid:批次創(chuàng)建方商戶號(hào)
? stock_id:微信為每個(gè)代金券批次分配的唯一id。
更多參數(shù)、響應(yīng)詳情及錯(cuò)誤碼請(qǐng)參見(jiàn)查詢代金券可用商戶接口文檔
步驟說(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();
}
}
重要入?yún)⒄f(shuō)明:
? stock_creator_mchid:批次創(chuàng)建方商戶號(hào)
? stock_id:微信為每個(gè)代金券批次分配的唯一id
更多參數(shù)、響應(yīng)詳情及錯(cuò)誤碼請(qǐng)參見(jiàn)查詢代金券可用單品接口文檔
步驟說(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();
}
}
重要入?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)獲取openid、APP獲取openid
? available_mchid:可用商戶號(hào)
更多參數(shù)、響應(yīng)詳情及錯(cuò)誤碼請(qǐng)參見(jiàn)根據(jù)商戶號(hào)查用戶的券接口文檔
步驟說(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();
}
}
重要入?yún)⒄f(shuō)明:
? stock_id:微信為每個(gè)代金券批次分配的唯一id
更多參數(shù)、響應(yīng)詳情及錯(cuò)誤碼請(qǐng)參見(jiàn)下載批次核銷明細(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();
}
}
重要入?yún)⒄f(shuō)明:
? stock_id:微信為每個(gè)代金券批次分配的唯一id
更多參數(shù)、響應(yīng)詳情及錯(cuò)誤碼請(qǐng)參見(jiàn)下載批次退款明細(xì)接口文檔
步驟說(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();
}
}
重要入?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è)置消息通知地址接口文檔
步驟說(shuō)明:用戶使用券后,微信會(huì)把相關(guān)核銷券信息發(fā)送給商戶,商戶需要接收處理,并按照文檔規(guī)范返回應(yīng)答。出于安全的考慮,我們對(duì)核銷券信息數(shù)據(jù)進(jìn)行了加密,商戶需要先對(duì)通知數(shù)據(jù)進(jìn)行解密,才能得到核銷券信息數(shù)據(jù)。
注意:
更多參數(shù)、響應(yīng)詳情及錯(cuò)誤碼請(qǐng)參見(jiàn) 核銷事件回調(diào)通知支付通知API接口文檔
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ù)不可以傳遞
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)試
A:活動(dòng)時(shí)間不能大于90天,請(qǐng)檢查available_begin_time、available_end_time參數(shù)設(shè)置是否符合要求。
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)激活失敗的情況。
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”