功能介紹:前端
1.支付寶對接nginx
2.支付回調express
3.查詢支付狀態tomcat
學習目標:服務器
1.熟悉支付寶對接核心文檔,調通支付寶支付功能官方Demo網絡
2.解析支付寶SDK對接源碼app
3.RSA1和RSA2驗證簽名及加解密異步
4.避免支付寶重複通知和數據校驗工具
5.natapp外網穿透和tomcat remote debug學習
6.生成二維碼,並持久化到圖片服務器
7.支付寶回調,會放在request中,再從request中取出來,放在map中,再對map進行處理,打印的日誌就是map中的內容
接口:
1./order/pay.do 支付訂單
入參:orderNo,要支付的訂單號
返回值:將持久化到ftp服務器上的二維碼(經過nginx反向代理解析出來的url)和orderNo返回
2./order/query_order_pay_status.do 查詢訂單
入參:orderNo,要查詢的訂單號
用戶付款後,收到支付寶確認成功的一個回調,就能夠實時查到這個訂單是否已經付款成功。
3./order/alipay_callback.do 支付寶回調
將回調地址/order/alipay_callback.do配置在項目中,以及支付寶官方配置,參數是ServerletRequest,從中拿到各類參數,並進行RSA2的簽名
一些重要的官方文檔:
1.沙箱登陸
https://openhome.alipay.com/platform/appDaily.htm
2.沙箱環境使用說明和如何使用沙箱環境
3.當面付產品介紹、掃碼支付接入指引、當面付快速接入、當面付接入必讀、當面付進階功能、當面付異步通知-僅用於掃碼支付、當面付SDK&DEMO
4.服務端SDK
https://docs.open.alipay.com/54/103419
5.生成RSA密鑰
https://docs.open.alipay.com/291/105971
6.線上建立應用說明
https://docs.open.alipay.com/200/105310
沙箱調試環境:
受權回調地址:線上url,這裏我是申請了的nat,在咱們發起請求時,要把這個url做爲參數傳給服務器。
AES密鑰:在傳輸數據時,進行加密,支付寶經過AES密鑰,對數據進行解密。
內部生成一個訂單號,即選完商品後提交訂單的那個操做;而後向支付寶請求預下單信息,裏面包括外部訂單號(out_trade_number,是針對支付寶來講的,但實際上是咱們的內部訂單號)、驗籤、公鑰等;而後,支付寶返回二維碼信息(http協議的信息),拿到信息後能夠利用工具生成二維碼,以base64的方式傳給前端,或以圖片的形式持久化到ftp服務器,而後以http協議(nginx反向代理)的形式傳給前端;支付寶錢包掃碼後,會收到兩次支付寶回調信息,第一次是支付寶返回的支付詳情,第二次是在輸入完密碼後的帳單詳情。
支付寶掃碼支付重要的字段:
關鍵入參:
參數名稱 | 參數說明 |
out_trade_no | 用戶訂單號,須要保證不重複 |
total_amount | 訂單金額 |
subject | 訂單標題 |
store_id | 商戶門店編號 |
timeout_express | 交易超時時間 |
關鍵出參:
參數名稱 | 參數說明 |
qr_code | 訂單二維碼圖片地址 |
其餘重要字段:
參數名稱 | 參數說明 |
trade_status | 交易目前所處的狀態 |
total_amount | 本次交易支付的訂單金額,單位爲元 |
receipt_amount | 商家在交易中實際收到的款項,單位爲元 |
buyer_pay_amount | 用戶在交易中支付的金額,單位爲元 |
交易狀態說明:
枚舉名稱 | 枚舉說明 | 觸發條件描述 | 觸發條件默認值 |
WAIT_BUYER_PAY | 交易建立,等待賣家付款 | 交易建立 | false(不觸發) |
TRADE_CLOSED | 未付款交易超時關閉,或支付完成後全額退款 | 交易關閉 | false(不觸發) |
TRADE_SUCCESS | 交易支付成功 | 支付成功 | true(觸發) |
TRADE_FINISHED | 交易結束,不可退款 | 交易完成 | false(不觸發) |
支付寶掃碼支付重要細節:
1.主動輪詢和回調的區別
2.避免單邊帳
3.同步請求的加簽和驗籤
加簽方法(若是不用SDK調用,推薦用該方法加簽):
/* params 請求支付寶生成訂單時的參數,參數列表,key是參數名稱,value是參數值 privateKey 加簽私鑰 charset 加簽字符集,統一用utf-8 */ String AlipaySignature.rsaSign(Map<String, String> params, String privateKey, String charset);
驗籤方法(同步請求時,若是不用SDK調用,推薦用該方法驗籤):
/* content 待驗簽字符串 sign 簽名值 publicKey 驗籤公鑰 charset 驗簽字符集,統一用utf-8 */ boolean AlipaySignature.rsaCheckContent(String content, String sign, String publicKey, String charset);
4.回調的驗證(簽名、金額、訂單號、訂單狀態、交易狀態、商戶id)
5.過濾掉重複的通知
6.必定要驗證並確保可接受的異步通知是支付寶發出的
驗籤方法(例如異步通知的時候,用戶須要用到驗籤方法):
/* params 支付寶的回調參數,參數列表(包括待驗籤參數和簽名值sign),key是參數名稱,value是參數值 publicKey 驗籤公鑰 charset 驗簽字符集,統一用utf-8
返回boolean類型,根據這個來判斷是否接受這個異步通知 */ boolean AlipaySignature.rsaCheckV2(Map<String, String> params, String publicKey, String charset);
7.回調請求的返回
商城給支付寶的返回數據。給支付寶返回時,應在response中把"success"放進去,返回的規則:
程序執行完後必須打印輸出"success"(不包含引號),若是商戶反饋給支付寶的字符不是success這7個字符,支付寶服務器會不斷重發通知,直到超過24小時22分鐘,通常狀況下,25小時內完成8次通知。(通知的間隔頻率通常是:4m,10m,1h,2h,6h,15h)。
支付寶掃碼支付對接技巧:
1.回調的調試方式
支付寶怎麼調到我,由於支付寶是在網絡中的,因此至少我應該是能夠上外網的。因此有如下幾種方案:
1)路由器設置開放本地到外網(不推薦)
2)外網遠程debug:例如當前商城部署在阿里雲上,阿里雲對外是有一個固定的ip或域名,回調地址設置成阿里雲的這個服務器,而後保證本地代碼和阿里雲上的代碼是一致的,而後開放一個遠程debug的端口,在本機進行遠程debug。這樣在支付寶送回請求時,能夠在本地進行debug。注意:(1)保持遠端代碼版本和本地代碼保持一致。(2)及時關閉開放的debug端口。
3)內網穿透(natapp)
經過這個natapp軟件,能夠獲得一個外網能夠訪問的域名,訪問這個域名與訪問本機是同樣的。