1. 程式人生 > >支付寶的伺服器端的開發流程

支付寶的伺服器端的開發流程

支付寶支付的服務端接入流程

0、寫在前面的話

支付寶支付官網上服務端沒有提供C++語言的SDK,所以如果要用C++接入的話要自己實現簽名驗證,醉了,當然是用Java了。。。官網上的流程不清不楚的,所以自己整理了一下。

1、RSA金鑰

應用公鑰:

商戶自己生成的RSA公鑰,需要上傳到支付寶平臺,以便支付寶驗證交易是否由商戶發起的

應用私鑰:

商戶自己生成的RSA私鑰,商戶用該私鑰對請求字串進行加簽

支付寶公鑰:

支付寶的RSA公鑰,商戶使用該公鑰驗證結果是否由支付寶返回的

生成金鑰以及簽名教程,參考此處

簡述:利用支付寶提供的工具生成一對RSA金鑰(應用公鑰、應用私鑰),上傳應用公鑰到支付寶上獲取到支付寶公鑰,使用應用私鑰對訂單請求內容進行簽名,使用支付寶公鑰驗籤包括同步返回驗籤(客戶端處理)、非同步通知驗籤(伺服器端處理)。

2、功能流程

1.客戶端將訂單資訊以請求引數傳送給服務端,服務端對請求引數使用應用私鑰進行簽名,再返回給客戶端。

  • 客戶端請求引數的格式:按照key=value&key=value方式拼接的未簽名原始字串,如app_id=2015052600090779&biz_content={"timeout_express":"30m","product_code":"QUICK_MSECURITY_PAY","total_amount":"0.01","subject":"1","body":"我是測試資料","out_trade_no":"IQJZSRC1YMQB5HU"}&charset=utf-8&format=json&method=alipay.trade.app.pay&notify_url=http://domain.merchant.com/payment_notify&sign_type=RSA2&timestamp=2016-08-25 20:26:31&version=1.0 


    請求引數說明參考此處

  • 引數說明:

    • notify_url:支付寶伺服器主動通知商戶伺服器裡指定的頁面http/https路徑。
    • 請求引數的sign欄位請務必在服務端完成簽名生成(不要在客戶端本地簽名)。
    • 支付請求中的訂單金額total_amount,請務必依賴服務端,不要輕信客戶端上行的資料(客戶端本地上行資料在使用者手機環境中無法確保一定安全)。
  • 服務端使用開放平臺SDK接入時,開放平臺SDK封裝了簽名實現,只需在建立DefaultAlipayClient物件時,設定請求閘道器(gateway),應用id(app_id),應用私鑰(private_key),編碼格式(charset),支付寶公鑰(alipay_public_key),簽名型別(sign_type)即可,報文請求時會自動進行簽名。如果未使用開放平臺SDK,需要自行實現簽名過程,

    參考此處

2、客戶端傳送支付請求給支付寶SDK後,支付寶SDK對請求支付資料處理完成後,會將結果同步反饋給客戶端。

3、服務端收到支付寶SDK發過來的非同步通知,對通知內容使用支付寶公鑰進行驗證並返回。

  • 非同步通知 :App支付產生的交易,支付寶會根據原始支付API中傳入的非同步通知地址notify_url,通過POST請求的形式將支付結果作為引數通知到app服務端。如客戶端設定的通知地址為https://api.xx.com/receive_notify.htm,服務端對應接收到通知的示例如下:https://api.xx.com/receive_notify.htm?total_amount=2.00&buyer_id=2088102116773037&body=大樂透2.1&trade_no=2016071921001003030200089909&refund_fee=0.00&notify_time=2016-07-19 14:10:49&subject=大樂透2.1&sign_type=RSA2&charset=utf-8&notify_type=trade_status_sync&out_trade_no=0719141034-6418&gmt_close=2016-07-19 14:10:46&gmt_payment=2016-07-19 14:10:47&trade_status=TRADE_SUCCESS&version=1.0&sign=kPbQIjX+xQc8F0/A6/AocELIjhhZnGbcBN6G4MM/HmfWL4ZiHM6fWl5NQhzXJusaklZ1LFuMo+lHQUELAYeugH8LYFvxnNajOvZhuxNFbN2LhF0l/KL8ANtj8oyPM4NN7Qft2kWJTDJUpQOzCzNnV9hDxh5AaT9FPqRS6ZKxnzM=&gmt_create=2016-07-19 14:10:44&app_id=2015102700040153&seller_id=2088102119685838&notify_id=4a91b7a78a503640467525113fb7d8bg8e

  • 對通知內容使用支付寶公鑰進行驗證簽名,支付寶的服務端SDK中封裝了簽名&驗籤、HTTP介面請求等基礎功能,如果要自行驗籤,參考非同步返回結果的驗籤

  • 驗證簽名正確後,必須校驗通知資料的正確性,資料正確則返回success 
    • 商戶需要驗證該通知資料中的out_trade_no是否為商戶系統中建立的訂單號
    • 判斷total_amount是否確實為該訂單的實際金額(即商戶訂單建立時的金額)
    • 校驗通知中的seller_id(或者seller_email) 是否為out_trade_no這筆單據的對應的操作方(有的時候,一個商戶可能有多個seller_id/seller_email)
    • 驗證app_id是否為該商戶本身。
    • 上述1、2、3、4有任何一個驗證不通過,則表明本次通知是異常通知,務必忽略。在上述驗證通過後商戶必須根據支付寶不同型別的業務通知,正確的進行不同的業務處理,並且過濾重複的通知結果資料。在支付寶的業務通知中,只有交易通知狀態為TRADE_SUCCESS或TRADE_FINISHED時,支付寶才會認定為買家付款成功。
  • 注意:同步返回的資料,客戶端可以在服務端驗證,驗證通過後,可以認為本次使用者付款成功。由於同步通知和非同步通知都可以作為支付完成的憑證,且非同步通知支付寶一定會確保傳送給商戶服務端。為了簡化整合流程,商戶可以將同步結果僅僅作為一個支付結束的通知(忽略執行校驗),實際支付是否成功,完全依賴服務端非同步通知。

    • 必須保證伺服器非同步通知頁面(notify_url)上無任何字元,如空格、HTML標籤、開發系統自帶丟擲的異常提示資訊等;

    • 伺服器間的互動,不像頁面跳轉同步通知可以在頁面上顯示出來,這種互動方式是不可見的;
    • 程式執行完後必須列印輸出“success”(不包含引號)。如果商戶反饋給支付寶的字元不是success這7個字元,支付寶伺服器會不斷重發通知,直到超過24小時22分鐘。一般情況下,25小時以內完成8次通知(通知的間隔頻率一般是:4m,10m,10m,1h,2h,6h,15h);
    • 程式執行完成後,該頁面不能執行頁面跳轉。如果執行頁面跳轉,支付寶會收不到success字元,會被支付寶伺服器判定為該頁面程式執行出現異常,而重發處理結果通知;
    • 該方式的作用主要防止訂單丟失,即頁面跳轉同步通知沒有處理訂單更新,它則去處理;