https://open.unionpay.com/tjweb/index 銀聯支付
統一支付接口
接口描述
用於線下刷卡交易、生物特征識別(例如人臉)、被掃支付等后台交易。 對於被掃支付,收銀員使用掃碼設備讀取用戶微信、支付寶、雲閃付等APP付款碼以后,二維碼或條碼信息傳送至商戶收銀台,由商戶收銀台或者商戶后台調用該接口發起支付對用戶進行收款。 對於線下刷卡交易,上送卡支付信息域;刷臉和二維碼被掃交易上送授權碼域。 +三家授權碼的規則 關於調用支付接口后相關情況的處理方案:當調用扣款接口返回支付中或未知狀態,需要調用查詢接口查詢訂單實際支付狀態。當遇到用戶超過日限額需要輸入密碼返回“支付中”的狀態,建議 5 秒調一次查詢,調用 6 次后還未成功作支付超時處理。 調用訂單查詢接口建議:查詢6次每隔2的N次方秒查詢一次(具體的查詢次數和時間也可自定義,建議查詢時間不低於30秒)6次查詢完成,接口仍未返回成功標識,則調用沖正接口;
請求方式
POST
生產地址
https://gateway.95516.com/api/trans.do
測試地址
https://gateway.test.95516.com/api/trans.do
公共請求參數
中文名稱 英文名稱 域類型 默認值 請求要求 備注
版本號 version String(5) 6.0.0 M-必填
固定填寫6.0.0
編碼方式 encoding String(1,20) UTF-8 M-必填
填寫報文使用的字符編碼 UTF-8,默認取值:UTF-8
交易發送時間 txnTime String(14) M-必填
商戶發送交易時間,格式: yyyyMMDDHHmmss
簽名 signature String(1,1024) M-必填
填寫對報文摘要的簽名
簽名方法 signMethod String(1,32) M-必填
RSA-SHA256:表示采用RSA簽名,摘要算法用SHA256
商戶代碼 merId String(15) M-必填
已被批准加入銀聯互聯網系統的商戶代碼
固定15位長,僅支持數字和字母
商戶訂單號 orderId String(8,40) M-必填
商戶訂單號,不能含“-”或“_”
僅支持數字和字母
商戶證書序列號 merCertId String(1,128) M-必填
填寫商戶簽名私鑰證書的Serial Number(十進制),該值可通過銀聯提供的SDK獲取
僅支持數字。
隨機字符串 nonceStr String(1,32) M-必填
業務接口 bizMethod String(1,128) M-必填
acp.trade.pay
參數集合 bizContent String(1,10240) C-按條件必填
詳見請求參數
請求參數
中文名稱 英文名稱 域類型 默認值 請求要求 備注
交易幣種 currencyCode String(3) 156(表示人民幣) M-必填
幣種格式必須為3位代碼,默認取值:156(人民幣)
交易金額 txnAmt String(1,12) M-必填
僅支持數字。 單位為【分】,參數值不能帶小數
僅支持數字
渠道類型 channelType String(2) M-必填
03:線下POS
11:移動POS
支付場景 scene String(2) M-必填
01:線下刷卡支付
02:條碼被掃支付
03:人臉后台支付
終端號 termId String(8) M-必填
授權碼 authCode String(1,128) C-按條件必填
支付場景為條碼被掃支付或者人臉后台支付時必送
用於被掃場景下的二維碼支付時,
授權碼的默認有效時間為3分鍾
掃碼支付授權碼,設備讀取用戶雲閃付、微信或者支付寶中的條碼或者二維碼信息;
用於人臉標記時,僅支持15到19位長度。
刷卡支付信息域 cardInfo CardInfo C-按條件必填 查看詳情
A條碼被掃支付個性化請求域 aliExtendPayReq AliExtendPayReq O-選填 查看詳情
T條碼被掃支付個性化請求域 wxExtendPayReq WxExtendPayReq O-選填 查看詳情
U個性化請求域 upExtendReq UpExtendReq O-選填 查看詳情
操作員 operId String(1,28) O-選填
商戶操作員編號
門店編號 opShopId String(1,32) O-選填
請求方自定義域 reqReserved String(1,1024) O-選填
商戶自定義保留域,交易應答時會原樣返回
終端信息 termInfo TermInfo O-選填 查看詳情
公共應答參數
中文名稱 英文名稱 域類型 默認值 請求要求 備注
交易狀態碼 resultCode String(1,10) M-必填
SUCCESS:成功
FAILURE:失敗
UNKNOWN:未知
PROCESSING:處理中
簽名 signature String(1,1024) M-必填
填寫對報文摘要的簽名
銀聯證書序列號 cupCertId String(1,128) M-必填
填寫銀聯簽名私鑰證書的Serial Number(十進制),該值可通過銀聯提供的SDK獲取。
僅支持數字。
參數集合 bizContent String(1,10240) C-按條件必填
具體見應答參數
交易應答碼 respCode String(1,128) C-按條件必填
返回信息為具體原因,如:
成功:SUCCESS
系統異常:SYSTEM_ERROR
驗簽失敗:SIGNATURE_VERIFY_FAIL
無此交易權限:NOT_AUTH
余額不足:NOT_ENOUGH_MONEY
銀行系統異常:BANK_ERROR
交易密碼錯:PIN_ERROR
……
交易應答信息 respMsg String(1,256) C-按條件必填
返回交易應答信息的詳細描述
交易發送時間 txnTime String(14) R-需要返回
商戶發送交易時間,格式: yyyyMMDDHHmmss
商戶代碼 merId String(15) R-需要返回
已被批准加入銀聯互聯網系統的商戶代碼
固定15位長,僅支持數字和字母
商戶訂單號 orderId String(8,40) R-需要返回
商戶訂單號,不能含“-”或“_”
僅支持數字和字母
隨機字符串 nonceStr String(1,32) R-需要返回
應答參數
中文名稱 英文名稱 域類型 默認值 請求要求 備注
銀聯受理訂單號 tn String(21) C-按條件必填
由銀聯返回,用於在后續類交易中唯一標識一筆交易
21位定長,僅支持數字
交易幣種 currencyCode String(3) 156(表示人民幣) R-需要返回
幣種格式必須為3位代碼,默認取值:156(人民幣)
交易金額 txnAmt String(1,12) R-需要返回
僅支持數字。 單位為【分】,參數值不能帶小數
僅支持數字
請求方自定義域 reqReserved String(1,1024) R-需要返回
商戶自定義保留域,交易應答時會原樣返回
A條碼被掃支付個性化應答域 aliExtendPayResp AliExtendPayResp O-選填 查看詳情
T條碼被掃支付個性化應答域 wxExtendPayResp WxExtendPayResp O-選填 查看詳情
U個性化應答域 upExtendResp UpExtendResp O-選填 查看詳情
HTTP請求源碼:
version=6.0.0&encoding=UTF-8&merCertId=123456&signMethod=RSA-SHA256&bizMethod=acp.unified.pay&merId=123456789&nonceStr=asdfasdf&signature=ft1242Q6Hrrsx2hmyIEGvSfA5777wXUXvZtQVqsrdy7TAxzgro=
&orderId=12345678&bizContent={
"scene": "01",
"authCode": "625899998745556",
"txnAmt": 1000,
"currencyCode": "156",
"backUrl": "http://merchantsvc.do",
"needReceipt": "Y",
"termId": "12345678",
"termInfo": {
"mchCreateIP": "",
"longitude": "",
"latitude": "",
"networkLicense": "",
"termDeviceType": "04",
"serialNum": "",
"encryptRandNum": "",
"secretText": "",
"appVersion": "",
"mCountryCode": ""
},
"WxExtendPayReq": {
"appid": "wx8888888888888888",
"deviceInfo": "13467007045764",
"body": "形象店-深圳騰大- QQ公仔",
"detail": {
"costPrice": 608800,
"receiptId": "wx123",
"goodsDetail": [{
"goodsId": "商品編碼",
"wxpayGoodsid": "1001",
"goodsName": "",
"quantity": 1,
"price": 528800
},
{
"goodsId": "商品編碼",
"wxpayGoodsId": "1002",
"goodsName": "iPhone6s 32G",
"quantity": 1,
"price": 608800
}
]
},
"goodsTag": "1234",
"receipt": "Y",
"sceneInfo": {
"storeInfo": {
"id": "SZTX001",
"name": "餐廳",
"areaCode": "440305",
"address": "大廈"
}
}
}
}}//為確保安全通信,需自行驗證響應示例中的signature值是否為銀聯所提供。
https://open.alipay.com/platform/home.htm https://opendocs.alipay.com/open/270/105898支付寶支付
開放能力 > 支付能力 > 電腦網站支付 > 快速接入
快速接入
更新時間:2020-08-24 18:28:40
本文展示了如何從零開始,使用支付寶開放平台服務端 SDK 快速接入電腦網站支付產品,完成與支付寶對接的部分。 由於支付產品全面升級,若您使用的是舊版本接口,請移步即時到賬文檔。若您希望從即時到賬(使用舊版本接口)升級為電腦網站支付(使用新版本接口),請參考以下步驟完成即時到賬新版本(即電腦網站支付)的接入工作。
注意: 文檔中的代碼示例和 Demo 是用來闡述 API 基本使用方法的,僅針對大眾場景,供 ISV 參考。特殊情況還請 ISV 自行擴展,確保符合自身業務需求。
第一步:創建應用
要在您的應用中接入電腦網站支付能力,您需要登錄支付寶開放平台(open.alipay.com),在開發者中心中創建您的應用,應用審核通過后會生成應用唯一標識(APPID),並且可以申請開通開放產品使用權限。通過 APPID 您的應用才能調用開放產品的接口能力。需要詳細了解開放平台創建應用步驟請參考《開放平台應用創建指南》。
第二步:配置應用
添加功能並簽約
應用創建完成后,系統會自動跳轉到應用詳情頁面。開發者可以在 功能列表 中點擊 添加功能 來添加電腦網站支付功能。待應用上線后,您可以給添加的功能進行簽約。電腦網站支付功能支持兩種簽約方式:商家中心簽約和應用詳情的功能列表處簽約(如下圖所示)。 詳細步驟步驟可以參考添加應用功能,第三方應用可以代替商戶簽約。
配置密鑰
為了保證交易雙方(商戶和支付寶)的身份和數據安全,開發者在調用接口前,需要配置雙方密鑰,對交易數據進行雙方校驗。密鑰包含應用私鑰(APP_PRIVATE_KEY)和應用公鑰(APP_PUBLIC_KEY)。生成密鑰后,開發者需要在開放平台開發者中心進行密鑰配置,配置完成后可以獲取支付寶公鑰(ALIPAY_PUBLIC_KEY),配置的詳細步驟請參考《配置應用環境》。您還可以通過觀看快速簽名教程學習密鑰的配置。
說明: 支付寶開放平台 SDK 封裝了簽名和驗簽過程,只需配置賬號及密鑰參數,建議開發者使用。開發者還可以通過自助排查流程和驗簽教程自助排查配置應用過程中遇到的問題。
第三步:集成並配置 SDK
要接入電腦網站支付,開發者需要集成服務端 SDK。服務端 SDK 需要商戶集成在自己的服務端系統中,用於后續的服務端接口調用。
下載服務端 SDK
** 為了幫助開發者調用開放接口,我們提供了開放平台服務端 SDK,包含 JAVA、PHP、NodeJS、Python 和 .NET 五種,封裝了簽名&驗簽、HTTP 接口請求等基礎功能。請先下載對應語言版本的 SDK 並引入您的開發工程。
接口調用配置
在 SDK 調用前需要進行初始化,以 JAVA 代碼為例:
AlipayClient alipayClient = new DefaultAlipayClient(URL,APP_ID,APP_PRIVATE_KEY,FORMAT,CHARSET,ALIPAY_PUBLIC_KEY,SIGN_TYPE);
關鍵參數說明:
配置參數 示例值解釋 獲取方式/示例值
URL 支付寶網關(固定) https://openapi.alipay.com/gateway.do
APPID APPID 即創建應用后生成 獲取見上方創建應用
APP_PRIVATE_KEY 開發者私鑰,由開發者自己生成 獲取見配置密鑰
FORMAT 參數返回格式,只支持 json json(固定)
CHARSET 編碼集,支持 GBK/UTF-8 開發者根據實際工程編碼配置
ALIPAY_PUBLIC_KEY 支付寶公鑰,由支付寶生成 獲取詳見配置密鑰
SIGN_TYPE 商戶生成簽名字符串所使用的簽名算法類型,目前支持 RSA2 和 RSA,推薦使用 RSA2 RSA2
接下來,就可以用 alipayClient 來調用具體的 API 了。alipayClient 只需要初始化一次,后續調用不同的 API 都可以使用同一個 alipayClient 對象。
注意: ISV /開發者可以通過第三方應用授權得到商戶授權令牌(app_auth_token)作為請求參數傳入,實現代商戶發起請求的能力。
第四步:接口調用
支付
電腦網站支付的支付接口 alipay.trade.page.pay 調用時序圖如下: 電腦網站支付.png
調用順序如下:
商戶系統請求支付寶接口 alipay.trade.page.pay,支付寶對商戶請求參數進行校驗,而后重新定向至用戶登錄頁面。
用戶確認支付后,支付寶通過 get 請求 returnUrl(商戶入參傳入),返回同步返回參數。
交易成功后,支付寶通過 post 請求 notifyUrl(商戶入參傳入),返回異步通知參數。
若由於網絡等問題異步通知沒有到達,商戶可自行調用交易查詢接口 alipay.trade.query 進行查詢,根據查詢接口獲取交易以及支付信息(商戶也可以直接調用查詢接口,不需要依賴異步通知)。
注意:
由於同步返回的不可靠性,支付結果必須以異步通知或查詢接口返回為准,不能依賴同步跳轉。
商戶系統接收到異步通知以后,必須通過驗簽(驗證通知中的 sign 參數)來確保支付通知是由支付寶發送的。詳細驗簽規則參考異步通知驗簽。
接收到異步通知並驗簽通過后,一定要檢查通知內容,包括通知中的 app_id、out_trade_no、total_amount 是否與請求中的一致,並根據 trade_status 進行后續業務處理。
在支付寶端,partnerId 與 out_trade_no 唯一對應一筆單據,商戶端保證不同次支付 out_trade_no 不可重復;若重復,支付寶會關聯到原單據,基本信息一致的情況下會以原單據為准進行支付。
開放平台提供了支持主流開發語言的 SDK 接入的方式。對於頁面跳轉類 API,SDK 不會也無法像系統調用類 API 一樣自動請求支付寶並獲得結果,而是在接受 request 請求對象后,為開發者生成前台頁面請求需要的完整 form 表單的 html(包含自動提交腳本),商戶直接將這個表單的 String 輸出到 http response 中即可。
以 JAVA 語言為例,調用統一收單下單並支付頁面接口 alipay.trade.page.pay 的代碼示例如下:
public void doPost (HttpServletRequest httpRequest,
HttpServletResponse httpResponse) throws ServletException, IOException {
AlipayClient alipayClient = new DefaultAlipayClient( "https://openapi.alipay.com/gateway.do" , APP_ID, APP_PRIVATE_KEY, FORMAT, CHARSET, ALIPAY_PUBLIC_KEY, SIGN_TYPE); //獲得初始化的AlipayClient
AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest(); //創建API對應的request
alipayRequest.setReturnUrl( "http://domain.com/CallBack/return_url.jsp" );
alipayRequest.setNotifyUrl( "http://domain.com/CallBack/notify_url.jsp" ); //在公共參數中設置回跳和通知地址
alipayRequest.setBizContent( "{" +
" "out_trade_no":"20150320010101001"," +
" "product_code":"FAST_INSTANT_TRADE_PAY"," +
" "total_amount":88.88," +
" "subject":"Iphone6 16G"," +
" "body":"Iphone6 16G"," +
" "passback_params":"merchantBizType%3d3C%26merchantBizNo%3d2016010101111"," +
" "extend_params":{" +
" "sys_service_provider_id":"2088511833207846"" +
" }" +
" }" ); //填充業務參數
String form= "" ;
try {
form = alipayClient.pageExecute(alipayRequest).getBody(); //調用SDK生成表單
} catch (AlipayApiException e) {
e.printStackTrace();
}
httpResponse.setContentType( "text/html;charset=" + CHARSET);
httpResponse.getWriter().write(form); //直接將完整的表單html輸出到頁面
httpResponse.getWriter().flush();
httpResponse.getWriter().close();
}
對異步返回結果進行驗簽的 JAVA 示例代碼如下:
Map<String, String> paramsMap = ... //將異步通知中收到的所有參數都存放到 map 中
boolean signVerified = AlipaySignature.rsaCheckV1(paramsMap, ALIPAY_PUBLIC_KEY, CHARSET, SIGN_TYPE) //調用SDK驗證簽名
if (signVerfied){
// TODO 驗簽成功后,按照支付結果異步通知中的描述,對支付結果中的業務內容進行二次校驗,校驗成功后在response中返回success並繼續商戶自身業務處理,校驗失敗返回failure
} else {
// TODO 驗簽失敗則記錄異常日志,並在response中返回failure.
}
以 JAVA 語言為例,調用統一收單線下交易查詢接口 alipay.trade.query 的示例代碼如下:
AlipayClient alipayClient = new DefaultAlipayClient( "https://openapi.alipay.com/gateway.do" , "app_id" , "your private_key" , "json" , "GBK" , "alipay_public_key" , "RSA2" );
AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
request.setBizContent( "{" +
" "out_trade_no":"20150320010101001"," +
" "trade_no":"2014112611001004680 073956707"" +
" }" );
AlipayTradeQueryResponse response = alipayClient.execute(request);
if (response.isSuccess()){
System.out.println( "調用成功" );
} else {
System.out.println( "調用失敗" );
}
退款
若用戶或商戶需要退款,商戶可調用 alipay.trade.refund 接口進行退款,支付寶同步返回退款參數。電腦網站支付的退款接口 alipay.trade.refund 調用時序圖如下: image.png
若退款接口由於網絡等原因返回異常,商戶可調用退款查詢接口 alipay.trade.fastpay.refund.query 查詢指定交易的退款信息。
注意:
當交易發生之后一段時間內,由於買家或者賣家的原因需要退款時,賣家可以通過退款接口將支付款退還給買家,支付寶將在收到退款請求並且驗證成功之后,按照退款規則將支付款按原路退回到買家賬號上。
交易超過約定時間(簽約時設置的可退款時間)的訂單無法進行退款。
支付寶退款支持單筆交易分多次退款,多次退款需要提交原支付訂單的商戶訂單號和設置不同的退款單號。
一筆退款失敗后重新提交,要采用原來的退款單號。
總退款金額不能超過用戶實際支付金額。
退款信息以退款接口同步返回或者退款查詢接口 alipay.trade.fastpay.refund.query 為准。
開放平台提供了支持主流開發語言的 SDK 接入的方式,以 JAVA 語言為例,調用統一收單交易退款接口 alipay.trade.refund 的代碼示例如下:
AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do","app_id","your private_key","json","GBK","alipay_public_key");
AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();
request.setBizContent("{" +
" "out_trade_no":"20150320010101001"," +
" "trade_no":"2014112611001004680073956707"," +
" "refund_amount":200.12," +
" "refund_reason":"正常退款"," +
" "out_request_no":"HZ01RF001"," +
" "operator_id":"OP001"," +
" "store_id":"NJ_S_001"," +
" "terminal_id":"NJ_T_001"" +
" }");
AlipayTradeRefundResponse response = alipayClient.execute(request);
if(response.isSuccess()){
System.out.println("調用成功");
} else {
System.out.println("調用失敗");
}
調用統一收單交易退款查詢接口 alipay.trade.fastpay.refund.query 的 JAVA 示例代碼如下:
AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do","app_id","your private_key","json","GBK","alipay_public_key");
AlipayTradeFastpayRefundQueryRequest request = new AlipayTradeFastpayRefundQueryRequest();
request.setBizContent("{" +
" "trade_no":"20150320010101001"," +
" "out_trade_no":"2014112611001004680073956707"," +
" "out_request_no":"2014112611001004680073956707"" +
" }");
AlipayTradeFastpayRefundQueryResponse response = alipayClient.execute(request);
if(response.isSuccess()){
System.out.println("調用成功");
} else {
System.out.println("調用失敗");
}
關閉交易
通常交易關閉是通過 alipay.trade.page.pay 中的超時時間來控制,支付寶也提供給商戶一個手動關閉交易的接口alipay.trade.close。若用戶一直未支付,商戶可以調用該接口關閉指定交易;成功關閉交易后該交易不可支付。交易關閉接口的調用時序圖 alipay.trade.close 如下圖所示:
開放平台提供了支持主流開發語言的 SDK 接入的方式,以 JAVA 語言為例,調用統一收單交易關閉接口 alipay.trade.close 的代碼示例如下:
AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do","app_id","your private_key","json","GBK","alipay_public_key","RSA2");
AlipayTradeCloseRequest request = new AlipayTradeCloseRequest();
request.setBizContent("{" +
" "trade_no":"2013112611001004680073956707"," +
" "out_trade_no":"HZ0120131127001"," +
" "operator_id":"YX01"" +
" }");
AlipayTradeCloseResponse response = alipayClient.execute(request);
if(response.isSuccess()){
System.out.println("調用成功");
} else {
System.out.println("調用失敗");
}
下載賬單
為方便商戶快速查賬,開放平台支持商戶通過查詢對賬單下載地址接口 alipay.data.dataservice.bill.downloadurl.query 獲取商戶離線賬單下載地址。調用該接口的時序圖如下:
開放平台提供了支持主流開發語言的 SDK 接入的方式,以 JAVA 語言為例,調用查詢對賬單下載地址接口 alipay.data.dataservice.bill.downloadurl.query 的代碼示例如下:
AlipayClient alipayClient = new DefaultAlipayClient( "https://openapi.alipay.com/gateway.do" , APP_ID, APP_PRIVATE_KEY, "json" , CHARSET, ALIPAY_PUBLIC_KEY, "RSA2" ); //獲得初始化的AlipayClient
AlipayDataDataserviceBillDownloadurlQueryRequest request = new AlipayDataDataserviceBillDownloadurlQueryRequest(); //創建API對應的request類
request.setBizContent( "{" +
" "bill_type":"trade"," +
" "bill_date":"2016-04-05""
" }" ); //設置業務參數
AlipayDataDataserviceBillDownloadurlQueryResponse response = alipayClient.execute(request);
System.out.print(response.getBody());
//根據response中的結果繼續業務邏輯處理
開發者在得到接口返回的賬單下載地址(bill_download_url)后還可以下載賬單文件,JAVA 示例代碼如下:
//將接口返回的對賬單下載地址傳入urlStr
String urlStr = "http://dwbillcenter.alipay.com/downloadBillFile.resource?bizType=X&userId=X&fileType=X&bizDates=X&downloadFileName=X&fileId=X" ;
//指定希望保存的文件路徑
String filePath = "/Users/fund_bill_20160405.csv" ;
URL url = null ;
HttpURLConnection httpUrlConnection = null ;
InputStream fis = null ;
FileOutputStream fos = null ;
try {
url = new URL(urlStr);
httpUrlConnection = (HttpURLConnection) url.openConnection();
httpUrlConnection.setConnectTimeout( 5 * 1000 );
httpUrlConnection.setDoInput( true );
httpUrlConnection.setDoOutput( true );
httpUrlConnection.setUseCaches( false );
httpUrlConnection.setRequestMethod( "GET" );
httpUrlConnection.setRequestProperty( "Charsert" , "UTF-8" );
httpUrlConnection.connect();
fis = httpUrlConnection.getInputStream();
byte [] temp = new byte [ 1024 ];
int b;
fos = new FileOutputStream( new File(filePath));
while ((b = fis.read(temp)) != - 1 ) {
fos.write(temp, 0 , b);
fos.flush();
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (fis!= null ) fis.close();
if (fos!= null ) fos.close();
if (httpUrlConnection!= null ) httpUrlConnection.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}
關於沙箱
沙箱環境是開放平台提供給開發者調試接口的環境,具體操作步驟見沙箱接入指南。 沙箱接入注意事項:
電腦網站支付支持沙箱接入;在沙箱調通接口后,必須在線上進行測試與驗收,所有返回碼及業務邏輯以線上為准;
電腦網站支付只支持余額支付,不支持銀行卡、余額寶等其他支付方式;
支付時,請使用沙箱買家賬號支付;
如果掃二維碼付款時,請使用沙箱支付寶客戶端掃碼付款。
https://pay.weixin.qq.com/wiki/doc/api/index.html 微信支付
開發步驟
接口流程圖
1、用戶在商戶側完成下單,使用微信支付進行支付
2、由商戶后台向微信支付發起下單請求(調用統一下單接口)注:交易類型trade_type=MWEB
3、統一下單接口返回支付相關參數給商戶后台,如支付跳轉url(參數名“mweb_url”),商戶通過mweb_url調起微信支付中間頁
4、中間頁進行H5權限的校驗,安全性檢查(此處常見錯誤請見下文)
5、如支付成功,商戶后台會接收到微信側的異步通知
6、用戶在微信支付收銀台完成支付或取消支付,返回商戶頁面(默認為返回支付發起頁面)
7、商戶在展示頁面,引導用戶主動發起支付結果的查詢
8,9、商戶后台判斷是否接到收微信側的支付結果通知,如沒有,后台調用我們的訂單查詢接口確認訂單狀態
10、展示最終的訂單支付結果給用戶
常見問題
一、回調頁面
正常流程用戶支付完成后會返回至發起支付的頁面,如需返回至指定頁面,則可以在MWEB_URL后拼接上redirect_url參數,來指定回調頁面。
如,您希望用戶支付完成后跳轉至https://www.wechatpay.com.cn,則可以做如下處理:
假設您通過統一下單接口獲到的MWEB_URL= https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?prepay_id=wx20161110163838f231619da20804912345&package=1037687096
注意:
1.需對redirect_url進行urlencode處理
2.由於設置redirect_url后,回跳指定頁面的操作可能發生在:1,微信支付中間頁調起微信收銀台后超過5秒 2,用戶點擊“取消支付“或支付完成后點“完成”按鈕。因此無法保證頁面回跳時,支付流程已結束,所以商戶設置的redirect_url地址不能自動執行查單操作,應讓用戶去點擊按鈕觸發查單操作。回跳頁面展示效果可參考下圖
二、其它常見錯誤
序號 問題 錯誤描述 解決方法
1 網絡環境未能通過安全驗證,請稍后再試 1. 商戶側統一下單傳的終端IP(spbill_create_ip)與用戶實際調起支付時微信側檢測到的終端IP不一致導致的,這個問題一般是商戶在統一下單時沒有傳遞正確的終端IP到spbill_create_ip導致,詳細可參見客戶端ip獲取指引
- 統一下單與調起支付時的網絡有變動,如統一下單時是WIFI網絡,下單成功后切換成4G網絡再調起支付,這樣可能會引發我們的正常攔截,請保持網絡環境一致的情況下重新發起支付流程
2 商家參數格式有誤,請聯系商家解決
-
當前調起H5支付的referer為空導致,一般是因為直接訪問頁面調起H5支付,請按正常流程進行頁面跳轉后發起支付,或自行抓包確認referer值是否為空
-
如果是APP里調起H5支付,需要在webview中手動設置referer,如(
Map extraHeaders = new HashMap();
extraHeaders.put("Referer", "商戶申請H5時提交的授權域名");//例如 http://www.baidu.com ))
3 商家存在未配置的參數,請聯系商家解決 1,當前調起H5支付的域名(微信側從referer中獲取)與申請H5支付時提交的授權域名不一致,如需添加或修改授權域名,請登陸商戶號對應的商戶平台--"產品中心"--"開發配置"自行配置
2,如果設置了回跳地址redirect_url,請確認設置的回跳地址的域名與申請H5支付時提交的授權域名是否一致
4 支付請求已失效,請重新發起支付 統一下單返回的MWEB_URL生成后,有效期為5分鍾,如超時請重新生成MWEB_URL后再發起支付
5 請在微信外打開訂單,進行支付 H5支付不能直接在微信客戶端內調起,請在外部瀏覽器調起
6 IOS:簽名驗證失敗
安卓:系統繁忙,請稍后再試 1,請確認同一個MWEB_URL只被一個微信號調起,如果不同微信號調起請重新下單生成新的MWEB_URL
2,如MWEB_URL有添加redirect_url,請確認參數拼接格式是否有誤,是否有對redirect_url的值做urlencode,可對比以下例子格式:
三、QA
Q1:
1、傳遞redirect_url safari瀏覽器時支付完成后會新開一個頁面;
2、還有就是有些ios手機使用其他瀏覽器支付完成后默認會回到safari瀏覽器。
這個錯誤咱們文檔這邊有說明嗎?
A1:
1、目前邏輯就是這樣設計的,防止商戶無限循環調用微信客戶端
2、對的,返回需要瀏覽器的schame信息,部分瀏覽器隱藏了這個信息,在無法拿到schame信息的情況下,就會回到safari瀏覽器