1. 程式人生 > >支付寶接入總結

支付寶接入總結

1.分類

目前支付寶支付分類為:

APP支付:商家APP向支付寶APP發起請求,使用SDK,支付方法為alipay.trade.app.pay

手機網站支付:手機網頁發起支付請求,貌似可以get也可以post,ajax祝你幸福,效果是首先喚起支付寶APP,不行轉為網頁收銀臺帳號密碼支付,支付方法為alipay.trade.wap.pay

電腦網站支付:電腦網頁發起支付請求,轉向網頁收銀臺,可以帳號密碼支付也可以掃碼支付,支付方法為alipay.trade.page.pay

支付時統一需要向後臺獲取簽名引數,然後發起請求

但是支付寶還有一些其他介面,alipay.trade.pay,alipay.trade.create,alipay.trade.precreate等,這些介面主要使用者線下掃碼或者條碼支付,雖然能生成二維碼,但是不是給網頁支付使用的,網頁支付是掃支付寶網頁收銀臺的碼

2.請求方式

在文件、demo當中看到過post、get請求方式,事實上都是可以的,但是有一個字元轉義的問題,我遇到的情況是:

前端form表單提交post請求,成功

後端使用nodejs的request庫提交post請求失敗,一直簽名失敗,我直接拼接的簽名字串,沒有url編碼!!!!!沒有url編碼!!!!

後端使用庫發出get請求,查詢字串用qs庫生成,一次成功

所以說,與其去測試如何對引數進行轉義,不如就使用查詢字串吧,反正查詢字串肯定是要url編碼的,但是這個過程應該比較統一,沒有什麼異議

3.簽名方式

目前簽名方式沒有什麼異議,還是支付寶那一套,過濾空值,排序,拼接,簽名,base64是不用說的,這些對於每個介面都是一樣的

4驗籤

支付寶文件沒有明確說明驗籤方式,可能會按照簽名方式去推斷驗籤方式,而事實上支付寶不同情況驗籤方式是不一樣的

非同步回撥:與簽名方式一樣,而且回撥mime為application/x-www-form-urlencoded

退款、退款查詢、關閉:這些介面響應與回撥不一樣,mime型別為text/plain,但是值為JSON字串,解析為物件後為

退款:

alipay_trade_refund_response:包含了退款響應的有效載荷

sign:簽名

退款查詢:

alipay_trade_fastpay_refund_query_response:包含了退款查詢的有效載荷

sign:簽名

關閉:

alipay_trade_close_response:包含了關閉訂單響應的有效載荷

sign:簽名

面對這個簽名的驗籤方式是,將有效載荷轉換為JSON字串,然後對JSON字串驗籤

5.金鑰

使用openssl生成的pem檔案是有頭、尾的,如-----BEGIN PUBLIC KEY-----,支付寶上傳公鑰是要求去掉頭尾、空格、換行等,其中金鑰字串中換行有沒有無所謂,不影響簽名結果,但是使用nodejs簽名時這個頭尾不能去掉,去掉簽名會出錯

6編碼

回撥請求:過程中一開始接收到utf-8編碼,沒問題,但是後來出現了charset為GBK的情況,而nodejs的body-parser中介軟體不支援GBK,直接報錯,這個情況只能修改庫檔案,將報錯的程式碼註釋,不影響驗籤等,但是不知道為何編碼會變為GBK

請求響應:支付寶的退款、退款查詢響應都是GBK格式的,在nodejs中需要使用iconv-lite對Buffer進行解碼,才能得到正常的響應