為了在保證支付安全的前提下,帶給商戶簡單、一致且易用的開發(fā)體驗,我們推出了全新的微信支付APIv3接口。該版本API的具體規(guī)則請參考“APIv3接口規(guī)則”
備注:當前接口用于微信國內(nèi)錢包
為了幫助開發(fā)者調(diào)用開放接口,我們提供了JAVA、PHP、GO三種語言版本的開發(fā)庫,封裝了簽名生成、簽名驗證、敏感信息加/解密、媒體文件上傳等基礎功能(更多語言版本的開發(fā)庫將在近期陸續(xù)提供)
測試步驟:
1、根據(jù)自身開發(fā)語言,選擇對應的開發(fā)庫并構建項目,具體配置請參考下面鏈接的詳細說明:
? wechatpay-java(推薦)wechatpay-apache-httpclient,適用于Java開發(fā)者。
? wechatpay-php(推薦)、wechatpay-guzzle-middleware,適用于PHP開發(fā)者
注:當前開發(fā)指引接口PHP示例代碼采用wechatpay-guzzle-middleware版本
? wechatpay-go,適用于Go開發(fā)者
更多資源可前往微信支付開發(fā)者社區(qū)搜索查看
2、創(chuàng)建加載商戶私鑰、加載平臺證書、初始化httpClient的通用方法
@Before
public void setup() throws IOException {
// 加載商戶私鑰(privateKey:私鑰字符串)
PrivateKey merchantPrivateKey = PemUtil
.loadPrivateKey(new ByteArrayInputStream(privateKey.getBytes("utf-8")));
// 加載平臺證書(mchId:商戶號,mchSerialNo:商戶證書序列號,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、基于接口的示例代碼,替換請求參數(shù)后可發(fā)起測試
說明:
? 上面的開發(fā)庫為微信支付官方開發(fā)庫,其它沒有審核或者控制下的第三方工具和庫,微信支付不保證它們的安全性和可靠性
通過包管理工具引入SDK后,可根據(jù)下面每個接口的示例代碼替換相關參數(shù)后進行快速測試
? 開發(fā)者如果想詳細了解簽名生成、簽名驗證、敏感信息加/解密、媒體文件上傳等常用方法的具體代碼實現(xiàn),可閱讀下面的詳細說明:
1.簽名生成
2.簽名驗證
3.敏感信息加解密
? 如想更詳細的了解我們的接口規(guī)則,可查看我們的接口規(guī)則指引文檔
重點步驟說明:
步驟2 創(chuàng)建代金券:商戶可通過《創(chuàng)建代金券批次》接口創(chuàng)建代金券,微信支付生成代金券批次后并返回代金券批次號給到商戶。
步驟7 激活代金券:商戶獲取到代金券批次號,需要確認并激活代金券,該批次代金券才能發(fā)放,需要調(diào)用《激活代金券批次》接口來激活創(chuàng)建的代金券。
步驟12 發(fā)放代金券:已經(jīng)激活的代金券,商戶可調(diào)用微信支付《發(fā)放代金券批次》接口來進行代金券發(fā)放,并獲取微信支付返回代金券發(fā)放結果。
步驟17 管理代金券:商戶發(fā)券成功后,商戶可通過《查詢批次詳情》、《查詢代金券詳情》等代金券管理接口進行券管理。
文檔展示了如何使用微信支付服務端 SDK 快速接入代金券產(chǎn)品,完成與微信支付對接的部分。
注意:
步驟說明:通過創(chuàng)建代金券批次接口,可創(chuàng)建代金券的類型包含預充值和免充值兩種類型。
示例代碼
public void CreateCoupon() throws Exception{
//請求URL
HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/v3/marketing/favor/coupon-stocks");
// 請求body參數(shù)
String reqdata = "{"
+ "\"stock_name\":\"GD測批次4\","
+ "\"comment\":\"驗證活動\","
+ "\"belong_merchant\":\"xx98568865xxxx\","
+ "\"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í)行請求
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) { //處理成功,無返回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明:
? out_trade_no:商戶創(chuàng)建批次憑據(jù)號(格式:商戶id+日期+流水號),可包含英文字母,數(shù)字,|,_,*,-等內(nèi)容,不允許出現(xiàn)其他不合法符號,商戶側(cè)需保持商戶單據(jù)號全局唯一
? available_begin_time:批次開始時間
1. 開始時間不可早于當前時間
2. 不能創(chuàng)建365天后開始的批次
3. 批次可用時間范圍最長為90天
? stock_name:批次名稱·
校驗規(guī)則:
1. 批次名稱最多9個中文漢字
2. 批次名稱最多20個字母
3. 批次名稱中不能包含不當內(nèi)容和特殊字符 _ , ; |
更多參數(shù)、響應詳情及錯誤碼請參見創(chuàng)建代金券批次接口文檔
步驟說明:制券成功后,通過調(diào)用激活接口激活代金券批次。
示例代碼
public void ActiveCoupon() throws Exception{
//請求URL
HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/v3/marketing/favor/stocks/9856000/start");
// 請求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í)行請求
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) { //處理成功,無返回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明:
? stock_creator_mchid:批次創(chuàng)建方商戶號
? stock_id:微信為每個代金券批次分配的唯一id。
更多參數(shù)、響應詳情及錯誤碼請參見激活代金券批次接口文檔
步驟說明:商戶平臺/API完成制券后,可使用發(fā)放代金券接口發(fā)券。通過調(diào)用此接口可發(fā)放指定批次給指定用戶,發(fā)券場景可以是小程序、H5、APP等。
注意:
示例代碼
public void SendCoupon() throws Exception{
//請求URL
HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/v3/marketing/favor/users/o4GgauInH_RCEdvrrNGrntXDu6D4/coupons");
// 請求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í)行請求
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) { //處理成功,無返回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明:
? out_trade_no:商戶系統(tǒng)內(nèi)部訂單號,只能是數(shù)字、大小寫字母_-*且在同一個商戶號下唯一
? openid:openid是微信用戶在appid下的唯一用戶標識(appid不同,則獲取到的openid就不同),可用于永久標記一個用戶。openid獲取方式請參考以下文檔小程序獲取openid、公眾號獲取openid、APP獲取openid
? stock_creator_mchid:批次創(chuàng)建方商戶號
? stock_id:微信為每個代金券批次分配的唯一id。
更多參數(shù)、響應詳情及錯誤碼請參見發(fā)放代金券批次接口文檔
步驟說明:通過此接口可暫停指定代金券批次。暫停后,該代金券批次暫停發(fā)放,用戶無法通過任何渠道再領取該批次的券。暫停接口的前提是批次處于激活狀態(tài)。
示例代碼
public void PauseCoupon() throws Exception{
//請求URL
HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/v3/marketing/favor/stocks/9856000/pause");
// 請求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í)行請求
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) { //處理成功,無返回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明:
? stock_creator_mchid:批次創(chuàng)建方商戶號
? stock_id:微信為每個代金券批次分配的唯一id
更多參數(shù)、響應詳情及錯誤碼請參見暫停代金券批次接口文檔
步驟說明:通過此接口可重啟指定代金券批次。重啟后,該代金券批次可以再次發(fā)放。重啟接口的前提是批次處于暫停狀態(tài)。
示例代碼
public void RestartCoupon() throws Exception{
//請求URL
HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/v3/marketing/favor/stocks/9856000/restart");
// 請求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í)行請求
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) { //處理成功,無返回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明:
? stock_creator_mchid:批次創(chuàng)建方商戶號
? stock_id:微信為每個代金券批次分配的唯一id。
更多參數(shù)、響應詳情及錯誤碼請參見重啟代金券批次接口文檔
步驟說明:通過此接口可查詢多個批次的信息,包括批次的配置信息以及批次概況數(shù)據(jù)。
示例代碼
public void GetStocksList() throws Exception{
//請求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í)行請求
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) { //處理成功,無返回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明:
? stock_creator_mchid:批次創(chuàng)建方商戶號
? status:批次狀態(tài)
更多參數(shù)、響應詳情及錯誤碼請參見條件查詢批次列表接口文檔
步驟說明:通過此接口可查詢批次信息,包括批次的配置信息以及批次概況數(shù)據(jù)。
示例代碼
public void GetStocksInfo() throws Exception{
//請求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í)行請求
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) { //處理成功,無返回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明:
? stock_creator_mchid:批次創(chuàng)建方商戶號
? stock_id:微信為每個代金券批次分配的唯一id。
更多參數(shù)、響應詳情及錯誤碼請參見查詢批次詳情接口文檔
步驟說明:通過此接口可查詢代金券信息,包括代金券的基礎信息、狀態(tài)。如代金券已核銷,會包括代金券核銷的訂單信息(訂單號、單品信息等)。
示例代碼
public void GetConponInfo() throws Exception{
//請求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í)行請求
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) { //處理成功,無返回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明:
? openid:openid是微信用戶在appid下的唯一用戶標識(appid不同,則獲取到的openid就不同),可用于永久標記一個用戶。openid獲取方式請參考以下文檔小程序獲取openid、公眾號獲取openid、APP獲取openid
? coupon_id:微信為代金券唯一分配的id。
更多參數(shù)、響應詳情及錯誤碼請參見查詢代金券詳情接口文檔
步驟說明:通過調(diào)用此接口可查詢批次的可用商戶號,判斷券是否在某商戶號可用,來決定是否展示。
示例代碼
public void GetConponMch() throws Exception{
//請求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í)行請求
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) { //處理成功,無返回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明:
? stock_creator_mchid:批次創(chuàng)建方商戶號
? stock_id:微信為每個代金券批次分配的唯一id。
更多參數(shù)、響應詳情及錯誤碼請參見查詢代金券可用商戶接口文檔
步驟說明:通過此接口可查詢批次的可用商品編碼,判斷券是否可用于某些商品,來決定是否展示。
示例代碼
public void GetConponItem() throws Exception{
//請求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í)行請求
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) { //處理成功,無返回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明:
? stock_creator_mchid:批次創(chuàng)建方商戶號
? stock_id:微信為每個代金券批次分配的唯一id
更多參數(shù)、響應詳情及錯誤碼請參見查詢代金券可用單品接口文檔
步驟說明:可通過該接口查詢用戶在某商戶號可用的全部券,可用于商戶的小程序/H5中,用戶"我的代金券"或"提交訂單頁"展示優(yōu)惠信息。無法查詢到微信支付立減金。本接口查不到用戶的微信支付立減金(又稱“全平臺通用券”),即在所有商戶都可以使用的券,例如:搖搖樂紅包;當按可用商戶號查詢時,無法查詢用戶已經(jīng)核銷的券
示例代碼
public void GetUserConpon() throws Exception{
//請求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í)行請求
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) { //處理成功,無返回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明:
? stock_creator_mchid:批次創(chuàng)建方商戶號
? stock_id:微信為每個代金券批次分配的唯一id。
? openid:openid是微信用戶在appid下的唯一用戶標識(appid不同,則獲取到的openid就不同),可用于永久標記一個用戶。openid獲取方式請參考以下文檔小程序獲取openid、公眾號獲取openid、APP獲取openid
? available_mchid:可用商戶號
更多參數(shù)、響應詳情及錯誤碼請參見根據(jù)商戶號查用戶的券接口文檔
步驟說明:可獲取到某批次的核銷明細數(shù)據(jù),包括訂單號、單品信息、銀行流水號等,用于對賬/數(shù)據(jù)分析。
示例代碼
public void UseBill() throws Exception{
//請求URL
HttpGet httpGet = new HttpGet("https://api.mch.weixin.qq.com/v3/marketing/favor/stocks/9865000/use-flow");
httpGet.setHeader("Accept", "application/json");
//完成簽名并執(zhí)行請求
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) { //處理成功,無返回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明:
? stock_id:微信為每個代金券批次分配的唯一id
更多參數(shù)、響應詳情及錯誤碼請參見下載批次核銷明細接口文檔
步驟說明:可獲取到某批次的退款明細數(shù)據(jù),包括訂單號、單品信息、銀行流水號等,用于對賬/數(shù)據(jù)分析。
示例代碼
public void RefundBill() throws Exception{
//請求URL
HttpGet httpGet = new HttpGet("https://api.mch.weixin.qq.com/v3/marketing/favor/stocks/9865000/refund-flow");
httpGet.setHeader("Accept", "application/json");
//完成簽名并執(zhí)行請求
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) { //處理成功,無返回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明:
? stock_id:微信為每個代金券批次分配的唯一id
更多參數(shù)、響應詳情及錯誤碼請參見下載批次退款明細接口文檔
步驟說明:用于設置接收營銷事件通知的URL,可接收營銷相關的事件通知,包括核銷、發(fā)放、退款等。
示例代碼
public void SetCouponCallback() throws Exception{
//請求URL
HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/v3/marketing/favor/callbacks");
// 請求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í)行請求
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) { //處理成功,無返回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明:
? notify_url:必須為https協(xié)議。如果鏈接無法訪問,商戶將無法接收到微信通知。 通知url必須為直接可訪問的url,不能攜帶參數(shù)。示例: “http://www.tg885.com”
更多參數(shù)、響應詳情及錯誤碼請參見設置消息通知地址接口文檔
步驟說明:用戶使用券后,微信會把相關核銷券信息發(fā)送給商戶,商戶需要接收處理,并按照文檔規(guī)范返回應答。出于安全的考慮,我們對核銷券信息數(shù)據(jù)進行了加密,商戶需要先對通知數(shù)據(jù)進行解密,才能得到核銷券信息數(shù)據(jù)。
注意:
更多參數(shù)、響應詳情及錯誤碼請參見 核銷事件回調(diào)通知支付通知API接口文檔
A:請按以下步驟進行排查
1. stock_name:最多可填寫9個字
2. max_coupons_per_user:單天發(fā)放個數(shù)上限不能為0
3. coupon_amount:10<=coupon_amount<=100000
4. available_time_after_receive:可用時間:相對時間,按分鐘設置,是否1min<=分鐘范圍<=1440min
5. transaction_minimum校驗規(guī)則:
a、使用門檻-券面額>=0.01(門檻要大于面額)
b、0.1元<=門檻<=100000
6. stock_type:目前只支持NORMAL
7. out_request_no:校驗規(guī)則:不可以重復
8. 開始時間結束時間控制在90天內(nèi)
9. 不可使用的時間參數(shù)不可以傳遞
A:請按以下步驟進行排查
1. max_amount需要等于coupon_amount(面額) * max_coupons(發(fā)放總上限)
2. 核對最終請求數(shù)據(jù),并查看是否存在遺漏數(shù)據(jù),建議使用postman進行調(diào)試
A:活動時間不能大于90天,請檢查available_begin_time、available_end_time參數(shù)設置是否符合要求。
A:請檢查單個可用商戶號下正在運營的活動是否控制在500個以內(nèi),若超過500個活動可能導致新活動激活失敗的情況。
A:請按以下步驟進行排查
1. 請檢查notify_url設置是否正確,notify_url必須為https
2. notify_url地址為一個可訪問的地址
3. notify_url不能攜帶參數(shù)。示例:“http://www.tg885.com/wxpay/pay.action”