採用 WordPress 搭建的網站,並使用 WooCommerce 插件,現在需要接入支付寶支付功能。

1. 創建應用

1.1 登錄

使用支付寶賬號登錄開放平台

這裏寫圖片描述


1.2 創建應用

登錄之後是如下界面:


這裏寫圖片描述
開發文檔中説 “根據實際需求創建應用(如” 支付應用 “)”,我在這個頁面沒看到這一項,只有 “支付接入” 、 “自定義接入” 、 “商業零售” 、 “交通出行” 、 “政務民生” 、 “醫療教育” 這幾項。不知道這幾項的具體含義。暫時先選擇 “支付接入” 吧!


這裏寫圖片描述
這裏要求選擇 “使用場景”,有第三方法應用和自用型應用兩個選項,第一個是指開發出來給別人用的,第二個是指開發給自己用的。選擇自用型,填入應用名稱後,跳轉到下面的頁面:


這裏寫圖片描述
這個頁面包含基礎信息、功能選項、開發配置三塊。上面的圖只截取到了前兩塊。


1.2.1 基礎信息

基礎信息中有應用名稱和應用圖標。應用名稱之前已經填過了,現在上傳自己的應用圖標就行了。應用基礎信息在開發應用過程中可以無需審核隨時完善。但在應用申請上線時需要進行審核。


1.2.2 功能選項

功能選項模塊中包含各種功能,您可以選擇自己需要的功能添加到功能列表中,現在默認添加了當面付、手機網站支付、 APP 支付功能。不同的功能有不同的使用條件,如果某個功能的使用條件是簽約,那麼在使用此項功能之前,需要簽約對應產品。點擊 “+ 繼續添加”,跳到添加功能頁面,這裏有非常多的功能供選擇:


這裏寫圖片描述
添加了 “電腦網站支付” 功能。


1.2.3 開發配置


這裏寫圖片描述
– 支付寶網關:已有默認值。

  • 應用網關:用於接收支付寶異步通知,這裏可以不用設置。
  • 授權回調地址:第三方授權或者用户信息授權後回調地址。授權鏈接中配置的 redirect_uri 值必須與此值保持一致。
  • RSA2(SHA256) 密鑰 (推薦):開發者要保證接口中使用的秘鑰與此處的公鑰匹配,否則無法調用接口。接口參數 sign_type=RSA2 。
  • RSA(SHA1) 密鑰:同上,接口參數為 sign_type=RSA 。

對接口加簽方式中的 “設置應用公鑰” 進行設置,會彈出如下窗口:


這裏寫圖片描述
選擇設置應用公鑰後彈出下面窗口:


這裏寫圖片描述
填寫校驗碼後,彈出窗口:


這裏寫圖片描述
這個框框裏面需要填入商户自己的公鑰。簡單介紹一下商户公鑰、商户私鑰和支付寶公鑰的概念:

  • 商户應用公鑰:商户自己生成的 RSA 公鑰,生成之後需要上傳公鑰到支付寶開放平台以便支付寶使用該公鑰驗證交易是否由該商户發起的;
  • 商户應用私鑰:商户自己生成的 RSA 私鑰,商户開發者使用生成的私鑰對請求字符串進行加簽;
  • 支付寶公鑰:支付寶的 RSA 公鑰,商户使用該公鑰驗證結果是否由支付寶返回的。

生成商户應用私鑰和應用公鑰
點擊右邊的鏈接:https://docs.open.alipay.com/291/105971,這裏介紹了生成商户 RSA 密鑰的方法。根據指導,生成了应用公钥 2048.txt应用私钥 2048.txt 兩個文件。生成的私鑰一定要妥善保管。私鑰需要填寫到代碼中供簽名時使用;公鑰需要上傳到支付寶開放平台。

上傳商户應用公鑰到支付寶平台:
应用公钥 2048.txt 中的內容複製粘貼到前面的框框中。然後保存,彈出如下窗口:


這裏寫圖片描述
現在在 RSA2(SHA256) 密鑰 (推薦) 右邊如下:


這裏寫圖片描述
可以看到,除了商户的應用公鑰之外,還有支付寶公鑰。
可以隨時修改應用公鑰。

使用應用私鑰生成請求籤名
把 AppID 、應用私鑰、支付寶公鑰配置在代碼中,對請求內容進行簽名,並對支付寶返回的內容進行驗籤。

支付寶開放平台 SDK 封裝了簽名和驗簽過程,只需配置賬號和密鑰參數即可,推薦使用 SDK 。這個在開發過程中會介紹。


創建應用時的應用狀態為 “開發中”,無法在線上正式調用接口。按照上面的步驟設置好後,提交審核。

2 開發

應用審核通過後,變成已上線狀態。現在我們可以嘗試開發支付寶網站接口了。

2.1 下載服務端 SDK

為了幫助開發者調用開放接口,支付寶開放平台提供了 “開放平台服務端 SDK”,包含 JAVA 、 PHP 和.NET 三個版本,封裝了簽名&驗籤、 HTTP 接口請求等基礎功能。

https://docs.open.alipay.com/54/103419,選擇您熟悉的語言的 SDK 。我下載的是 PHP 版本的。這個頁面中有關於各語言版本 SDK 的詳細使用説明,可以仔細閲讀一遍。

將下載的 alipay-sdk-PHP-20171121170331.zip 解壓到項目目錄中去,比如項目文件夾為 alipay/,那麼解壓後的 SDK 為 alipay/alipay-sdk-PHP-20171121170331/

2.2 接口調用配置

在 SDK 調用前需要進行初始化,代碼如下:

接下來,就可以用 $aop 來調用具體的 API 了。 $aop 只需要初始化一次,後續調用不同的 API 都可以使用同一個 $aop 對象。

2.3 向支付寶發送支付請求

通過向支付寶網關發送alipay.trade.page.pay請求進行支付。

報文請求時會自動用應用私鑰進行簽名;支付寶收到請求之後,首先用應用公鑰對請求參數驗籤,然後返回表單 $result,打印這個表單會把用户重定向到支付頁面。

請求返回的結果 $result 的內容如下:

當用户付過錢後,會跳轉到設置的 return url 中,並以 GET 方式返回支付結果參數。

2.4 處理異步通知

由於同步返回的不可靠性,支付結果必須以異步通知或查詢接口返回為準,不能依賴同步跳轉。

2.4.1 驗籤

支付成功後,支付寶除了向 return url 發送同步通知外,還會以 POST 方式向 notify url 發送異步通知。商户系統受到異步通知後,首先需要用支付寶公鑰進行驗籤,確定消息是否來自支付寶。 SDK 中封裝了驗籤接口。

剛開始的時候,出現了驗籤失敗的結果。後來在網上搜了一下,發現這是因為 PHP 自動將 fund_bill_list 中的特殊字符前加了轉義符,需要把轉義字符去掉才行。所以如果驗籤沒通過,不妨加上 $arr['fund_bill_list'] = stripslashes($arr['fund_bill_list']); 試試。

2.4.2 二次檢驗

驗籤通過後,需要按照以下步驟檢驗數據的正確性:

  • 1 、商户需要驗證該通知數據中的 out_trade_no 是否為商户系統中創建的訂單號;
  • 2 、判斷 total_amount 是否確實為該訂單的實際金額(即商户訂單創建時的金額);
  • 3 、校驗通知中的 seller_id(或者 seller_email) 是否為 out_trade_no 這筆單據的對應的操作方(有的時候,一個商户可能有多個 seller_id/seller_email);
  • 4 、驗證 app_id 是否為該商户本身。

上述 1 、 2 、 3 、 4 有任何一個驗證不通過,則表明本次通知是異常通知,務必忽略。

在上述驗證通過後商户必須根據支付寶不同類型的業務通知,正確的進行不同的業務處理,並且過濾重複的通知結果數據。在支付寶的業務通知中,只有交易通知狀態為 TRADE_SUCCESS 或 TRADE_FINISHED 時,支付寶才會認定為買家付款成功。

注意:
狀態 TRADE_SUCCESS 的通知觸發條件是商户簽約的產品支持退款功能的前提下,買家付款成功;
交易狀態 TRADE_FINISHED 的通知觸發條件是商户簽約的產品不支持退款功能的前提下,買家付款成功;或者,商户簽約的產品支持退款功能的前提下,交易已經成功並且已經超過可退款期限。

2.4.3 繼續商户自身的業務邏輯

在驗籤、二次校通過後,根據 trade_status 進行後續業務處理。

3 問題集錦

1. 調試錯誤,請回到請求來源地,重新發起請求。
錯誤代碼 missing-signature 錯誤原因: 缺少簽名參數

解答:
這是因為 alipay.trade.page.pay 請求結果裏面沒有 sign,為什麼呢?https://openclub.alipay.com/read.php?tid=2333&fid=46 給出了原因。
php 環境必須 5.5 以上,而現在的服務器上通過 php -v 命令查看,版本是 PHP 5.3.28 。升級之後這個問題解決了。

2. 支付請求提交後,返回 “訂單信息無法識別,建議聯繫賣家” 的錯誤提示?

解答:
$request->setBizContent(); 中每個參數值都應該是字符串,比如'"' . $value1 . '"'

參考

[1] 電腦網站支付快速接入
[2] 創建應用
[3] 生成 RSA 密鑰
[4] 上傳應用公鑰並獲取支付寶公鑰
[5] 使用應用私鑰生成請求籤名
[6] 服務端 SDK
[7] alipay.trade.page.pay
[8] 電腦網站支付結果異步通知

原文來自:victoriawy.com  感謝作者提供又一個支付寶解決方案。