為了在保證支付安全的前提下,帶給商戶簡(jiǎn)單、一致且易用的開發(fā)體驗(yàn),我們推出了全新的微信支付APIv3接口。該版本API的具體規(guī)則請(qǐng)參考“APIv3接口規(guī)則”
為了幫助開發(fā)者調(diào)用開放接口,我們提供了JAVA、PHP、GO三種語(yǔ)言版本的開發(fā)庫(kù),封裝了簽名生成、簽名驗(yàn)證、敏感信息加/解密、媒體文件上傳等基礎(chǔ)功能(更多語(yǔ)言版本的開發(fā)庫(kù)將在近期陸續(xù)提供)
測(cè)試步驟:
1、根據(jù)自身開發(fā)語(yǔ)言,選擇對(duì)應(yīng)的開發(fā)庫(kù)并構(gòu)建項(xiàng)目,具體配置請(qǐng)參考下面鏈接的詳細(xì)說(shuō)明:
? wechatpay-java(推薦)wechatpay-apache-httpclient,適用于Java開發(fā)者。
? wechatpay-php(推薦)、wechatpay-guzzle-middleware,適用于PHP開發(fā)者
注:當(dāng)前開發(fā)指引接口PHP示例代碼采用wechatpay-guzzle-middleware版本
? wechatpay-go,適用于Go開發(fā)者
更多資源可前往微信支付開發(fā)者社區(qū)搜索查看
2、創(chuàng)建加載商戶私鑰、加載平臺(tái)證書、初始化httpClient的通用方法
@Before
public void setup() throws IOException {
// 加載商戶私鑰(privateKey:私鑰字符串)
PrivateKey merchantPrivateKey = PemUtil
.loadPrivateKey(new ByteArrayInputStream(privateKey.getBytes("utf-8")));
// 加載平臺(tái)證書(mchId:商戶號(hào),mchSerialNo:商戶證書序列號(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ō)明:
? 上面的開發(fā)庫(kù)為微信支付官方開發(fā)庫(kù),其它沒有審核或者控制下的第三方工具和庫(kù),微信支付不保證它們的安全性和可靠性
通過(guò)包管理工具引入SDK后,可根據(jù)下面每個(gè)接口的示例代碼替換相關(guān)參數(shù)后進(jìn)行快速測(cè)試
? 開發(fā)者如果想詳細(xì)了解簽名生成、簽名驗(yàn)證、敏感信息加/解密、媒體文件上傳等常用方法的具體代碼實(shí)現(xiàn),可閱讀下面的詳細(xì)說(shuō)明:
1.簽名生成
3.敏感信息加解密
5.wechatpayCertificates(平臺(tái)證書)
? 如想更詳細(xì)的了解我們的接口規(guī)則,可查看我們的接口規(guī)則指引文檔
申請(qǐng)單狀態(tài)變化如下:
重點(diǎn)步驟說(shuō)明:
步驟1 獲取微信支付商戶號(hào):渠道商使用銀行或者支付機(jī)構(gòu)提供的API或者后臺(tái)系統(tǒng)錄入商家門店信息,獲取商家每個(gè)門店在微信支付側(cè)的商戶號(hào)(上送給微信支付的“商戶名稱”字段必須與營(yíng)業(yè)執(zhí)照上商戶名稱一致,具體規(guī)則?點(diǎn)擊查看?)。
步驟2 查詢微信支付商戶號(hào)授權(quán)狀態(tài):渠道商使用《獲取商戶號(hào)開戶意愿確認(rèn)狀態(tài)接口》查詢微信支付商戶號(hào)是否完成開戶意愿確認(rèn)。
步驟5 提交商家資料給微信支付:渠道商根據(jù)商家類型(企業(yè)、個(gè)體戶、小微、事業(yè)單位、其他組織等)準(zhǔn)備好相關(guān)的商家資料,使用微信支付接口《提交開戶意愿確認(rèn)申請(qǐng)單》獲取微信支付申請(qǐng)單編號(hào)。
步驟8 查詢申請(qǐng)單審核結(jié)果:渠道商提交商家資料后,建議每隔五分鐘調(diào)用《查詢申請(qǐng)單審核結(jié)果接口》查詢申請(qǐng)單審核結(jié)果。
1、提交后申請(qǐng)單狀態(tài)為“審核中”,微信支付后臺(tái)會(huì)進(jìn)行審核,審核通過(guò)后申請(qǐng)單狀態(tài)變成“待聯(lián)系人確認(rèn)”,同時(shí)接口會(huì)提供“申請(qǐng)單小程序碼” (小程序碼的圖片)。
2、聯(lián)系人掃“申請(qǐng)單小程序碼”后確認(rèn)資料無(wú)誤后,申請(qǐng)單狀態(tài)變成“待賬戶驗(yàn)證”。
3、聯(lián)系人將“法人確認(rèn)二維碼”在微信上發(fā)給法人確認(rèn)后(或打款驗(yàn)證),申請(qǐng)單狀態(tài)變成“審核通過(guò)”。
文檔展示了如何使用微信支付服務(wù)端 SDK 快速接入商戶開戶意愿確認(rèn)產(chǎn)品,完成與微信支付對(duì)接的部分。
注意:
步驟說(shuō)明:服務(wù)商收集商戶資料后,調(diào)用提交申請(qǐng)單接口,提交創(chuàng)建入駐申請(qǐng)單。
示例代碼:
public void Applyment() throws Exception {
// 加載商戶私鑰(privateKey:私鑰字符串)
PrivateKey merchantPrivateKey = PemUtil
.loadPrivateKey(new ByteArrayInputStream(privateKey.getBytes("utf-8")));
// 加載平臺(tái)證書(mchId:商戶號(hào),mchSerialNo:商戶證書序列號(hào),apiV3Key:V3秘鑰)
AutoUpdateCertificatesVerifier verifier = new AutoUpdateCertificatesVerifier(
new WechatPay2Credentials(mchId, new PrivateKeySigner(mchSerialNo, merchantPrivateKey)),apiV3Key.getBytes("utf-8"));
CloseableHttpClient httpClient = HttpClients.createDefault();
// 初始化httpClient
httpClient = WechatPayHttpClientBuilder.create()
.withMerchant(mchId, mchSerialNo, merchantPrivateKey)
.withValidator(new WechatPay2Validator(verifier)).build();
//請(qǐng)求URL
HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/v3/apply4subject/applyment");
// 請(qǐng)求body參數(shù)
String reqdata = "{"
+ "\"business_code\":\"1111111111\","
+ "\"contact_info\": {"
+ "\"name\":\"wRNIsXOvVuTYIhVxZJCD8uJIGmNPGozCe44Ph8rD+QAJEPxw==\","
+ "\"mobile\":\"w+zPKEVNm7IDxPvK55P0OfNd5E5VXoWbRwyyGk37HiB6C/F2lUog==\","
+ "\"id_card_number\":\"rjbq82xBwMixDGA5A4x6/hqZRAYmaeM+yyjn9BU8qUBZga+mKqQ==\""
+ "},"
+ "\"subject_info\": {"
+ "\"subject_type\":\"SUBJECT_TYPE_ENTERPRISE\","
+ "\"business_licence_info\": {"
+ "\"licence_number\":\"914201123033363296\","
+ "\"licence_copy\":\"0P3ng6KTIW4-Q_l2FjKLZuhHjBWoMAjmVtCz7ScmhEIThCaV4BBgVwtNkCHO_XXqK5dE5YdOmFJBZR9FwczhJehHhAZN6BKXQPcs-VvdSo\","
+ "\"merchant_name\":\"李四網(wǎng)絡(luò)有限公司\","
+ "\"legal_person\":\"李四\","
+ "\"company_address\":\"廣東省深圳市南山區(qū)xx路xx號(hào)\","
+ "\"licence_valid_date\":\"["1970-01-01","forever"]\""
+ "},"
+ "\"certificate_info\": {"
+ "\"cert_type\":\"CERTIFICATE_TYPE_2388\","
+ "\"cert_number\":\"111111111111\","
+ "\"cert_copy\":\"0P3ng6KTIW4-Q_l2FjKLZuhHjBWoMAjmVtCz7ScmhEIThCaV4BBgVwtNkCHO_XXqK5dE5YdOmFJBZR9FwczhJehHhAZN6BKXQPcs-VvdSo\","
+ "\"merchant_name\":\"xx公益團(tuán)體\","
+ "\"legal_person\":\"李四\","
+ "\"company_address\":\"廣東省深圳市南山區(qū)xx路xx號(hào)\","
+ "\"cert_valid_date\":\"["1970-01-01","forever"]\""
+ "},"
+ "\"company_prove_copy\":\"0P3ng6KTIW4-Q_l2FjKLZuhHjBWoMAjmVtCz7ScmhEIThCaV4BBgVwtNkCHO_XXqK5dE5YdOmFJBZR9FwczhJehHhAZN6BKXQPcs-VvdSo\","
+ "\"assist_prove_info\": {"
+ "\"micro_biz_type\":\"MICRO_TYPE_STORE\","
+ "\"store_name\":\"大郎燒餅\","
+ "\"store_address_code\":\"440305\","
+ "\"store_address\":\"廣東省深圳市南山區(qū)xx大廈x層xxxx室\","
+ "\"store_header_copy\":\"0P3ng6KTIW4-Q_l2FjKLZuhHjBWoMAjmVtCz7ScmhEIThCaV-4BBgVwtNkCHO_XXqK5dE5YdOmFJBZR9FwczhJehHhAZN6BKXQPcs-VvdSo\","
+ "\"store_indoor_copy\":\"0P3ng6KTIW4-Q_l2FjKLZuhHjBWoMAjmVtCz7ScmhEIThCaV4BBgVwtNkCHO_XXqK5dE5YdOmFJBZR9FwczhJehHhAZN6BKXQPcs-VvdSo\""
+ "}"
+ "},"
+ "\"identification_info\": {"
+ "\"identification_type\":\"IDENTIFICATION_TYPE_IDCARD\","
+ "\"identification_name\":\"MZnwEx6zotwIz6ctW2/iQL5z94odwP9sKiFRL8Aii3L4U74RPCPztcJOScaXsaGs82HJNU3K+46ndk7prENiPDw==\","
+ "\"identification_number\":\"ZTnn5dKGCvP4csw4XTLug/+VLB+4R6nxSPQwqSpmPVZtXmye+/3s9O+y32w==\","
+ "\"identification_valid_date\":\"["1970-01-01","forever"]\","
+ "\"identification_front_copy\":\"0P3ng6KTIW4-Q_l2FjKLZuhHjBWoMAjmVtCz7ScmhEIThCaV-4BBgVwtNkCHO_XXqK5dE5YdOmFJBZR9FwczhJehHhAZN6BKXQPcs-VvdSo\","
+ "\"identification_back_copy\":\"0P3ng6KTIW4-Q_l2FjKLZuhHjBWoMAjmVtCz7ScmhEIThCaV4BBgVwtNkCHO_XXqK5dE5YdOmFJBZR9FwczhJehHhAZN6BKXQPcs-VvdSo\""
+ "},"
+ "\"addition_info\": {"
+ "\"confirm_mchid_list\": ["
+ "\"20001113\","
+ "\"20001112\""
+ "]"
+ "}"
+ "}";
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ō)明:
? business_code:業(yè)務(wù)申請(qǐng)編號(hào),服務(wù)商自定義的唯一編號(hào),每個(gè)編號(hào)對(duì)應(yīng)一個(gè)申請(qǐng)單。
? subject_type:主體類型。枚舉值:
SUBJECT_TYPE_ENTERPRISE:企業(yè)
SUBJECT_TYPE_INSTITUTIONS_CLONED:事業(yè)單位
SUBJECT_TYPE_INDIVIDUAL:個(gè)體工商戶
SUBJECT_TYPE_OTHERS:其他組織
SUBJECT_TYPE_MICRO:小微商戶
? licence_number:營(yíng)業(yè)執(zhí)照注冊(cè)號(hào)。
1、請(qǐng)?zhí)顚憼I(yíng)業(yè)執(zhí)照上的注冊(cè)號(hào)。
2、若主體類型為個(gè)體工商戶或企業(yè),注冊(cè)號(hào)格式須為15位數(shù)字或18位數(shù)字|大寫字母。
? merchant_name:商戶名稱。
1、個(gè)體工商戶,不能以“公司”結(jié)尾。
2、個(gè)體工商戶,若營(yíng)業(yè)執(zhí)照上商戶名稱為空或?yàn)椤盁o(wú)”,請(qǐng)?zhí)顚?個(gè)體戶+經(jīng)營(yíng)者姓名",如“個(gè)體戶張三”。
? legal_person:法人姓名。
1、只能由中文字符、英文字符、可見符號(hào)組成。
2、請(qǐng)?zhí)顚憼I(yíng)業(yè)執(zhí)照的經(jīng)營(yíng)者/法定代表人姓名。
注意:
更多參數(shù)、響應(yīng)詳情及錯(cuò)誤碼請(qǐng)參見提交申請(qǐng)單接口文檔
步驟說(shuō)明:服務(wù)商提交申請(qǐng)單后需要修改信息時(shí),或者申請(qǐng)單審核結(jié)果為“已駁回”時(shí)服務(wù)商要修改申請(qǐng)材料時(shí),均需要先調(diào)用撤銷申請(qǐng)單接口。
示例代碼:
public void CancelApplyment() throws Exception{
// 加載商戶私鑰(privateKey:私鑰字符串)
PrivateKey merchantPrivateKey = PemUtil
.loadPrivateKey(new ByteArrayInputStream(privateKey.getBytes("utf-8")));
// 加載平臺(tái)證書(mchId:商戶號(hào),mchSerialNo:商戶證書序列號(hào),apiV3Key:V3秘鑰)
AutoUpdateCertificatesVerifier verifier = new AutoUpdateCertificatesVerifier(
new WechatPay2Credentials(mchId, new PrivateKeySigner(mchSerialNo, merchantPrivateKey)),apiV3Key.getBytes("utf-8"));
CloseableHttpClient httpClient = HttpClients.createDefault();
// 初始化httpClient
httpClient = WechatPayHttpClientBuilder.create()
.withMerchant(mchId, mchSerialNo, merchantPrivateKey)
.withValidator(new WechatPay2Validator(verifier)).build();
//請(qǐng)求URL
HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/v3/apply4subject/applyment/20000011111/cancel");
StringEntity entity = new StringEntity("");
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ō)明:
? applyment_id:申請(qǐng)單編號(hào),微信支付分配的申請(qǐng)單號(hào),申請(qǐng)單編號(hào)和業(yè)務(wù)申請(qǐng)編號(hào)至少傳一個(gè)。
? business_code:業(yè)務(wù)申請(qǐng)編號(hào)
1、服務(wù)商自定義的唯一編號(hào)。
2、每個(gè)編號(hào)對(duì)應(yīng)一個(gè)申請(qǐng)單。
注意:
更多參數(shù)、響應(yīng)詳情及錯(cuò)誤碼請(qǐng)參見撤銷申請(qǐng)單接口文檔
步驟說(shuō)明:當(dāng)服務(wù)商提交申請(qǐng)單后,需要定期調(diào)用此接口查詢申請(qǐng)單的審核狀態(tài)。
示例代碼:
public void QueryApplyment() throws Exception{
// 加載商戶私鑰(privateKey:私鑰字符串)
PrivateKey merchantPrivateKey = PemUtil
.loadPrivateKey(new ByteArrayInputStream(privateKey.getBytes("utf-8")));
// 加載平臺(tái)證書(mchId:商戶號(hào),mchSerialNo:商戶證書序列號(hào),apiV3Key:V3秘鑰)
AutoUpdateCertificatesVerifier verifier = new AutoUpdateCertificatesVerifier(
new WechatPay2Credentials(mchId, new PrivateKeySigner(mchSerialNo, merchantPrivateKey)),apiV3Key.getBytes("utf-8"));
CloseableHttpClient httpClient = HttpClients.createDefault();
// 初始化httpClient
httpClient = WechatPayHttpClientBuilder.create()
.withMerchant(mchId, mchSerialNo, merchantPrivateKey)
.withValidator(new WechatPay2Validator(verifier)).build();
//請(qǐng)求URL
HttpGet httpGet = new HttpGet("https://api.mch.weixin.qq.com/v3/apply4subject/applyment?applyment_id=20000011111");
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ō)明:
? applyment_id:申請(qǐng)單編號(hào),微信支付分配的申請(qǐng)單號(hào),申請(qǐng)單編號(hào)和業(yè)務(wù)申請(qǐng)編號(hào)至少傳一個(gè)。
? business_code:業(yè)務(wù)申請(qǐng)編號(hào)
1、服務(wù)商自定義的唯一編號(hào)。
2、每個(gè)編號(hào)對(duì)應(yīng)一個(gè)申請(qǐng)單。
注意:
更多參數(shù)、響應(yīng)詳情及錯(cuò)誤碼請(qǐng)參見撤銷申請(qǐng)單接口文檔
步驟說(shuō)明:當(dāng)服務(wù)商需要確認(rèn)微信支付子商戶號(hào)是否完成確認(rèn)時(shí),如果調(diào)用此接口提到“已授權(quán)”狀態(tài),則說(shuō)明該商戶號(hào)已完成開戶意愿確認(rèn)。
示例代碼:
public void QueryMerchantsState() throws Exception{
// 加載商戶私鑰(privateKey:私鑰字符串)
PrivateKey merchantPrivateKey = PemUtil
.loadPrivateKey(new ByteArrayInputStream(privateKey.getBytes("utf-8")));
// 加載平臺(tái)證書(mchId:商戶號(hào),mchSerialNo:商戶證書序列號(hào),apiV3Key:V3秘鑰)
AutoUpdateCertificatesVerifier verifier = new AutoUpdateCertificatesVerifier(
new WechatPay2Credentials(mchId, new PrivateKeySigner(mchSerialNo, merchantPrivateKey)),apiV3Key.getBytes("utf-8"));
CloseableHttpClient httpClient = HttpClients.createDefault();
// 初始化httpClient
httpClient = WechatPayHttpClientBuilder.create()
.withMerchant(mchId, mchSerialNo, merchantPrivateKey)
.withValidator(new WechatPay2Validator(verifier)).build();
//請(qǐng)求URL
HttpGet httpGet = new HttpGet("https://api.mch.weixin.qq.com/v3/apply4subject/applyment/merchants/20000011111/state");
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ō)明:
? sub_mchid:特約商戶號(hào),微信支付分配的特約商戶的唯一標(biāo)識(shí)。
注意:
更多參數(shù)、響應(yīng)詳情及錯(cuò)誤碼請(qǐng)參見獲取商戶開戶意愿確認(rèn)狀態(tài)接口文檔
A1:請(qǐng)求參數(shù)“營(yíng)業(yè)執(zhí)照注冊(cè)號(hào)(licence_number)”填寫錯(cuò)誤,請(qǐng)?zhí)顚憼I(yíng)業(yè)執(zhí)照上的注冊(cè)號(hào),若主體類型為個(gè)體工商戶或企業(yè),注冊(cè)號(hào)格式須為15位數(shù)字或18位數(shù)字|大寫字母
A2:請(qǐng)按照以下幾點(diǎn)檢查:
1. 系統(tǒng)異常,請(qǐng)使用相同參數(shù)稍后重新調(diào)用
2. 請(qǐng)求參數(shù)錯(cuò)誤,請(qǐng)確認(rèn)參數(shù)的大小寫、參數(shù)名、格式是否與接口文檔一致
3. 請(qǐng)求頭里面的參數(shù)mchid錯(cuò)誤,也會(huì)報(bào)這個(gè)錯(cuò)誤,請(qǐng)檢查確認(rèn)
A3:請(qǐng)求參數(shù)申請(qǐng)單編號(hào)(applyment_id)填寫錯(cuò)誤或沒有填寫,請(qǐng)?zhí)顚懳⑿胖Ц斗峙涞纳暾?qǐng)單號(hào),申請(qǐng)單編號(hào)和業(yè)務(wù)申請(qǐng)編號(hào)至少傳一個(gè)
A4:請(qǐng)按照以下幾點(diǎn)檢查:
1. Authorization頭認(rèn)證類型或簽名信息錯(cuò)誤,請(qǐng)嚴(yán)格按照文檔要求填寫參數(shù)
a. Authorization頭認(rèn)證類型目前為WECHATPAY2-SHA256-RSA2048
b. Authorization頭簽名信息包括發(fā)起請(qǐng)求的商戶(渠道商)的商戶號(hào)mchid
商戶API證書序列號(hào)serial_no,用于聲明所使用的證書
請(qǐng)求隨機(jī)串nonce_str
時(shí)間戳timestamp
簽名值signature
2. Authorization頭參數(shù)存在換行,實(shí)際數(shù)據(jù)應(yīng)在一行
A5:請(qǐng)按照錯(cuò)誤提示,到商戶平臺(tái)上申請(qǐng)下載API證書并正確使用,請(qǐng)參考以下幾點(diǎn):
1. 證書獲取指引
2. 如何在程序中加載證書
A6:請(qǐng)求參數(shù)類型填寫錯(cuò)誤,正確的參數(shù)類型是uint64