本文主要討論PC端的用戶付款接口html
用戶輸入支付寶帳號密碼及確認支付等操做,都是在支付寶域下進行。數據庫
網站將業務信息經過相似於重定向的方式提交到支付寶。api
<form name="alipaysubmit" action="https://mapi.alipay.com/gateway.do" method="get" > <input type="hidden" name="service" value="支付寶接口名"/> <input type="hidden" name="total_fee" value="訂單金額"/> <input type="hidden" name="out_trade_no" value="對外訂單編號"/> <input type="hidden" name="return_url" value="交易結果同步回調路徑"/> <input type="hidden" name="notify_url" value="交易結果異步回調路徑"/> ...... <input type="submit" value="確認" style="display:none;"> </form> <script> /*頁面加載後當即執行,發起支付請求*/ document.forms['alipaysubmit'].submit(); </script>
如下截圖:第一個是網站本身的,第二個是支付寶的。用戶在第一個頁面點擊'當即支付',請求會發到網站後臺,網站後臺輸出上面所說的html,瀏覽器會新開頁並跳轉至第二個頁面。瀏覽器
在支付寶域下確認支付後,網站會收到支付寶交易結果通知,分爲同步和異步。同步由瀏覽器發送(經過支付寶頁面的JS執行),異步由支付寶後臺主動發送直到收到網站的返回或者發送次數用完。同步通知,能夠很方便地進行本地測試,但同步發起只有一次,並且瀏覽器可能被關閉,因此不能依賴於同步,對於異步通知,能夠經過內網穿透工具(推薦natapp)進行模擬測試。網絡
out_trade_no是網站對外的訂單編號,採用‘用戶訂單編號'+'支付方式'的規則,這樣對於同一筆訂單同一種支付方式,不管用戶在網站發起幾回請求,out_trade_no始終惟一,能夠避免重複扣款。 app
曾經註冊了一號店、優酷、迅雷等網站,測試發現他們的out_trade_no規則主要包括2種:異步
1):直接使用原訂單號,這樣能夠防止重複支付,可是不適合咱們網站,由於咱們網站的網銀支付走的也是支付寶的接口,這樣若是用戶從支付寶支付切回網銀支付時,支付寶會報錯:交易已存在,意思就是說你已經提交過支付請求。若是網站的網銀支付走的是銀聯接口,這種方式沒有任何問題。工具
2):一筆訂單每次提交支付請求時,out_trade_no都會變化。對於網站的同一筆訂單,每次請求out_trade_no不同的話,支付寶就會當成一筆新的交易,這樣極易出現重複支付。但話說回來,如今用戶一點都不傻。測試
異步回調有次數限制,爲防止異常狀況下沒有收到支付寶的交易通知,必須輔以支付寶的另外一接口"單筆交易查詢",能夠主動去查詢交易結果。爲了原路退款,同時須要開發「批量退款接口」。網站
支付寶的每一筆交易是以「支付寶流水號」惟一肯定的,爲保證數據及邏輯的一致性,網站數據庫須要使用惟一索引,應用層級須要使用事務(事務:登記支付寶流水信息,更新訂單支付狀態等)。
支付寶的交易通知可能屢次,若是網站已經處理過,須直接返回或忽略。若是發現是異常扣款(後面介紹),可能須要執行退款等業務操做。
防止串號,必定要保證測試環境發給支付寶的out_trade_no跟生產環境不同,通常會經過設置訂單編號的前綴來區分,好比測試時都以「T」打頭。
這裏說的"異常支付"不是系統或代碼異常,特指在支付寶接口開發中違背業務邏輯的需全額退款的支付。
主要包括如下2種狀況:
重複扣款:網站的一筆訂單,客戶支付兩次。
發生機率:很低
產生場景:客戶選擇了支付寶支付,因爲網站訂單狀態未更新,客戶覺得未支付成功,又選擇網銀等其餘支付方式;另外一種狀況是客戶選擇了支付寶支付並登陸成功但未確認支付,回到網站又選擇了其餘支付方式並支付成功,但支付寶的帳單記錄還在那放着,有效期內客戶又不當心點了確認支付。
說明:因爲out_trade_no 設計根據訂單編號+支付類別惟一輩子成,因此不會出現同一支付渠道下的重複扣款。
發生機率:很低
產生場景:用戶在支付成功後立馬去「取消訂單」,因爲網絡延遲或其餘緣由,網站沒有收到支付結果通知,就主動去調用「單筆交易查詢」接口,可是調用又出現系統異常,這個時候只能將訂單狀態置爲已取消。待網站最終收到支付通知時,發現訂單已取消了,那當前支付就是無效的。即使網站最終收不到該筆支付結果通知,客戶也會投訴爲何沒收到退款。
PS: 即時到帳接口曾經支持「網銀支付」,就是說不用登錄支付寶, 用戶直接登錄網銀, 但2016年支付寶已經下架了「網銀通道」(老用戶能夠繼續用一段時間)。想實現網銀支付的朋友們,請聯繫銀聯, 或者找第三方代理機構.