1. 程式人生 > >微信公眾平臺開發(120) 微信支付報關介面

微信公眾平臺開發(120) 微信支付報關介面

關鍵字:微信支付 微信支付v3 報關介面 
作者:方倍工作室
 

本文介紹微信支付下的報關介面的開發過程。微信報關是用於商戶提交海關需要的訂單資訊。

 

一、報關介面API

介面地址

https://api.mch.weixin.qq.com/cgi-bin/mch/customs/customdeclareorder

是否需要證書

不需要。

請求方式:post 資料格式:xml 簽名方式:MD5

注意:商戶訂單號金額以支付系統記錄的為準,無需上傳,如有子訂單號則必須上傳子訂單應付金額、物流費、商品價格(應付金額=物流費+商品價格)。
 
欄位名 變數名 必填 型別 示例值 說明
簽名 sign String(32) C380BEC2BFD727A4B6845133519F3AD6 簽名,詳見簽名生成演算法
公眾賬號ID appid String(32) wxd678efh567hg6787 微信分配的公眾賬號ID
商戶號 mch_id String(32) 1230000109 微信支付分配的商戶號
商戶訂單號 out_trade_no String(32) 20150806125346 商戶系統內部的訂單號
微信支付訂單號 transaction_id String(28) 1000320306201511078440737890 微信支付返回的訂單號
海關 customs String(32) SHANGHAI

NO 無需上報海關

GUANGZHOU 廣州

HANGZHOU 杭州

NINGBO 寧波

ZHENGZHOU_BS 鄭州(保稅物流中心)

CHONGQING 重慶

XIAN 西安

SHANGHAI 上海

ZHENGZHOU_ZH 鄭州(綜保區)

SHENZHEN 深圳

商戶海關備案號 mch_customs_no String(32) 123456 商戶在海關登記的備案號,customs非NO,此引數必填
關稅 duty Int 888 關稅,以分為單位

以下欄位在拆單或重新報關時必傳

欄位名 變數名 必填 型別 示例值 描述
商戶子訂單號 sub_order_no String(32) 20150806125346 商戶子訂單號,如有拆單則必傳
幣種 fee_type String(3) CNY 微信支付訂單支付時使用的幣種,暫只支援人民幣CNY,如有拆單則必傳。
應付金額 order_fee Int 888 子訂單金額,以分為單位,不能超過原訂單金額,order_fee=transport_fee+product_fee(應付金額=物流費+商品價格),如有拆單則必傳。
物流費 transport_fee Int 888 物流費用,以分為單位,如有拆單則必傳。
商品價格 product_fee Int 888 商品費用,以分為單位,如有拆單則必傳。

以下欄位在微信缺少使用者資訊時必傳,如果商戶上傳了使用者資訊,則以商戶上傳的資訊為準。

欄位名 變數名 必填 型別 示例值 描述
證件型別 cert_type String(32) IDCARD 暫只支援身份證,該引數是指使用者資訊,商戶若有使用者資訊,可上送,系統將以商戶上傳的資料為準,進行海關通關報備;
證件號碼 cert_id String(64) 330821198809085211 身份證號,該引數是指使用者資訊,商戶若有使用者資訊,可上送,系統將以商戶上傳的資料為準,進行海關通關報備;
姓名 name String(64) 張三 使用者姓名,該引數是指使用者資訊,商戶若有使用者資訊,可上送,系統將以商戶上傳的資料為準,進行海關通關報備;

舉例如下:

複製程式碼
<xml>
   <appid>wx2421b1c4370ec43b</appid>
   <customs>ZHENGZHOU_BS</customs>
   <mch_customs_no>D00411</mch_customs_no>
   <mch_id>1262544101</mch_id>
   <order_fee>13110</order_fee>
   <out_trade_no>15112496832609</out_trade_no>
   <product_fee>13110</product_fee>
   <sign>8FF6CEF879FB9555CD580222E671E9D4</sign>
   <transaction_id>1006930610201511241751403478</transaction_id>
   <transport_fee>0</transport_fee>
   <fee_type>CNY</fee_type>
   <sub_order_no>15112496832609001</sub_order_no>
</xml>
複製程式碼

注:引數值用XML轉義即可,CDATA標籤用於說明資料不被XML解析器解析。

應答引數列表

欄位名 變數名 必填 型別 示例值 說明
返回狀態碼 return_code String(16) SUCCESS

SUCCESS/FAIL

此欄位是通訊標識,非交易標識,交易是否成功需要檢視result_code來判斷

返回資訊 return_msg String(128) 簽名失敗

返回資訊,如非空,為錯誤原因

簽名失敗

引數格式校驗錯誤

以下欄位在return_code為SUCCESS的時候有返回

欄位名 變數名 必填 型別 示例值 描述
簽名型別 sign_type String(32) MD5 暫只支援MD5
簽名 sign String(32) C380BEC2BFD727A4B6845133519F3AD6 簽名,詳見簽名生成演算法
公眾賬號ID appid String(32) wxd678efh567hg6787 微信分配的公眾賬號ID
商戶號 mch_id String(32) 1230000109 微信支付分配的商戶號
業務結果 result_code String(16) SUCCESS SUCCESS/FAIL
錯誤程式碼 err_code String(32) SYSTEMERROR 詳細參見錯誤列表
錯誤程式碼描述 err_code_des String(128) 系統錯誤 錯誤返回的資訊描述

以下欄位在return_code 和result_code都為SUCCESS的時候有返回

欄位名 變數名 必填 型別 示例值 描述
狀態碼 state String(2) UNDECLARED

狀態碼

UNDECLARED -- 未申報

SUBMITTED -- 申報已提交(訂單已經送海關,商戶重新申報,並且海關還有修改介面,那麼記錄的狀態會是這個)

PROCESSING -- 申報中

SUCCESS -- 申報成功

FAIL-- 申報失敗

EXCEPT --海關介面異常

微信支付訂單號 transaction_id String(28) 1000320306201511078440737890 微信支付返回的訂單號
商戶訂單號 out_trade_no String(32) 20150806125346 商戶系統內部的訂單號
商戶子訂單號 sub_order_no String(32) 20150806125346 商戶子訂單號,如有拆單則必傳
微信子訂單號 sub_order_id String(32) 20150806125346 微信子訂單號
最後更新時間 modify_time String(14) 20091227091010 最後更新時間,格式為yyyyMMddhhmmss,如2009年12月27日9點10分10秒錶示為20091227091010。時區為GMT+8 beijing。該時間取自微信伺服器

錯誤碼

名稱 描述 原因 解決方案
132011004 引數錯誤 報關時僅傳入訂單號,不傳入子訂單號(sub_order_no)時,不能填費用資訊,須以支付系統中的值為準 請檢查引數是否都正確
132021028 交易幣種與商戶結算幣種不一致】 報關時傳入子訂單號(sub_order_no)時,幣種引數(fee_type)必填 請檢查所傳幣種引數(fee_type)是否為空
MCHID_NOT_SET 商戶號未設定 商戶號為必傳引數,請求時必傳 請檢查商戶號是否為空
MCHID_INVALID_LENGTH 無效的商戶號長度 報關介面只支援12開頭10位數字的商戶號 請檢查商戶號長度是否為10位
CUSTOMSCONFIG_NOT_SET 海關配置未設定 報關介面需要商戶已配置過海關資訊才可以訪問 請參照上文中的海關備案指引,進行海關資訊報備
FEETYPE_NOT_SET 幣種類型未設定 拆單情況下,幣種為必填引數 請檢查fee_type是否為空
OUTTRADENO_NOT_SET 商戶訂單號(out_trade_no)未設定 商戶訂單號為必傳引數 請檢查商戶訂單號(out_trade_no)是否為空
TRANSACTION_ID_NOT_SET 微信訂單號(transaction_id)未設定 微信訂單號(transaction_id)為必傳引數 請檢查微信訂單號(transaction_id)是否為空
INVALID_TRANSACTION_ID 無效的微信訂單號長度 微信訂單號為28位數字,請確保長度一致 請檢查微信訂單號(transaction_id)是否正確
CUSTOMS_NOT_SET 海關資訊未設定 海關資訊為必傳欄位 請檢查海關資訊是否為空
CHCUSTOMSNO_NOT_SET 海關備案號未設定 海關備案號為必傳欄位 請檢查備案號是否為空
INVALID_MCHCUSTOMSNO 無效的海關備案號長度 海關備案號一般為6位字串 請檢查海關備案號是否正確
PAYFEE_NOT_MATCH 金額不匹配 報關的訂單金額必須和支付的金額一致 請檢查報關訂單的金額是否正確
INVALID_SUBORDER_NO 無效的子訂單號長度(sub_order_no) 子訂單號要求是32位以內的字串 請檢查子訂單號長度是否正確
APPID_NOT_EXIST AppId未設定(sub_order_no) appid為必傳欄位 請檢查appid是否正確
MCHID_NOT_EXIST 商戶號(mch_id)未設定 MCH_ID為必傳欄位 請檢查mch_id是否正確
AUTHORITY_NOT_FOUND 未開通自助清關功能 須先開通自助清關功能才可成功呼叫介面 請檢查是否已開通自助清關功能,開通路徑:微信支付商戶平臺-產品中心-自助清關中申請開通。
NO_AUTH 無許可權 未獲得此介面的呼叫許可權 請檢查當前商戶號是否已獲得此介面的呼叫許可權

 

二、SDK實現

sdk定義

 

 

三、呼叫方式

 

四、返回結果

傳送資料如下

array(6) {
  ["appid"]=>
  string(18) "wxa8092dd025e45123"
  ["mch_id"]=>
  string(10) "1238298123"
  ["out_trade_no"]=>
  string(22) "SH20160824095750086988"
  ["transaction_id"]=>
  string(28) "4006742001201608242098415582"
  ["customs"]=>
  string(6) "NINGBO"
  ["mch_customs_no"]=>
  string(10) "3302461123"
}

接收到的資料如下

array(12) {
  ["return_code"]=>
  string(7) "SUCCESS"
  ["return_msg"]=>
  string(6) "成功"
  ["sign"]=>
  string(32) "91EFCEEAAD4322F331F3F63C4D8F1279"
  ["appid"]=>
  string(18) "wxa8092dd025e45123"
  ["mch_id"]=>
  string(10) "1238298123"
  ["result_code"]=>
  string(7) "SUCCESS"
  ["err_code"]=>
  string(1) "0"
  ["err_code_des"]=>
  string(2) "OK"
  ["state"]=>
  string(9) "SUBMITTED"
  ["transaction_id"]=>
  string(28) "4006742001201608242098415582"
  ["out_trade_no"]=>
  string(22) "SH20160824095750086988"
  ["modify_time"]=>
  string(14) "20160825111049"
}