PHP 串接 AlipayHK 踩坑記錄
最近幫朋友串接 AlipayHK,一開始根本這什麼東西都不知道,只大概知道是串金流、支付寶,串接的過程真是千辛萬苦,這邊記錄下來給有需要的人。
AlipayHK?支付寶?
根據【教學】Alipay HK vs 支付寶中國版 常見香港用家 3 大錯誤,大概就像是香港版的支付寶,文章內提到
Alipay HK 跟「支付寶」的區別
如以上所說 Alipay HK 及支付寶中國版是兩套獨立的系統,就連 APP 也是兩個不同的版本。Alipay HK 是獨立的本地公司,方便為香港度身訂造各種不同的優惠及使用方法。
好,小蛙了解自己要串的東西是「香港版支付寶」後,開始吧!朋友 email 一些「線索」來:
- Alipay Global Portal: https://globalprod.alipay.com/login/global.htm
- Account Name (PID Email):
- Default Login Password:
- Default Payment Password:
- AlipayHK – PC2Mobile: https://global.alipay.com/doc/website_hk/intro
- Sandbox Guideline: http://offsite.dev-codpayment.com/sandbox_app/AlipayHK_Sandbox_Account.pdf
- Sandbox APP Download Link: https://offsite.dev-codpayment.com/sandbox_app/sandboxapp.pdf
不知道是支付寶網站改版還是怎樣,很多查到的資料或是連結,都沒有辦法連到正確的網頁,連照著教學文件都面臨找不到選單或位置的窘境,真的是花了很多冤枉時間,估計如果沒有寫下這篇,三天後小蛙又忘記怎麼連到對應的頁面或功能了。
準備密鑰
首先一開始登入的頁面就怪怪的,從上面連結進去登入完之後,卻轉到這個頁面要再登入一次,嗯,也許是新舊首頁,就再登入一次吧!登入完之後,下面有兩個選項,Online Payment / In-store Payment 跟 Global Merchant Portal,好,看完敘述也不是很了解,不過「線上付款」選左邊的看看。
AlipayHK 簽署的方式有兩種
- 使用 md5
- 使用 RSA / DSA
後台介面就有 md5 的私鑰,小蛙直接使用這種方式,比較方便。進到管理頁面,切換到「My Technical Service」後右邊有「See Partner ID(PID)」跟「See Key」,先把 PID 跟 Key 記起來,等一下串接會用到。
小蛙從來沒有用過支付寶及其相關產品,這個頁面 下有介紹整個流程,小蛙看完才對 AlipayHK 比較有概念,到 這邊 看說明文件吧!今天才發現有中文文檔!!!
下載範例
小蛙是要在 PHP 環境下串接「支付功能」,到這邊下載 PHP 範例。解壓縮之後裡面有一些比較重要的檔案:
alipay.config.php
這個檔案主要是環境變數上的設定,等等要修改 partner、key、notify_url 這些變數。
alipayapi.php
這支是搭配 index.php 送出的表單接到參數來產生 QRCode,因為小蛙付款時不需要讓使用者輸入 index.php 的內容,因此將這些的功能拉一些出來寫成 function,如此一來就可以在要付款的地方直接設定好固定及要接的參數。
notify_url.php
最後一支是用來接收付款成功之後的 callback,在這邊設定付款完成之後要做對應的動作。
小蛙改完上面這些東西之後,其實整個範例還是沒辦法動的,這後面會再提,一開始要測試範例當然沒辦法用正式的 key 及 partner id,接下來要先建立沙箱帳號,透過沙箱環境來測試付款。
使用沙箱測試
iOS 或 Android 到 這邊 下載沙箱 app。
到 Alipay Sandbox Portal 去新建沙箱測試帳號,小蛙這次要串的是 AlipayHK,要到 Hong Kong Wallet 下面建一個 Merchant 跟一個 Buyer 來測試。
建好之後記下 Merchant 右邊的 Merchant UID\/PID 及 MD5 Signature key,記下 Buyer 的 Buyer account 及 Login password。
沙箱測試
把上面記下來的 Merchant UID\/PID 及 MD5 Signature key 分別填入 alipay.config.php,以及修改 notify_url 位址,一定要確定這個頁面可以存取,付款完成之後 AlipayHK 會送一個 POST 過來這裡,如果無法存取會收不到付款完成通知。
$alipay_config['partner'] = 'PID 填到這裡'; $alipay_config['key'] = 'MD5 Signature key 填到這裡'; $alipay_config['notify_url'] = 'https://xxxx.xxx/notify_url.php';
修改完成之後連到付款首頁,https://your_domain/alipayHK/index.php,可以看到一個表單,這表單是讓人測試用的,可以測試不同參數產生的 QRCode,送出之後會送到 alipayapi.php。
等等,跳出一堆錯誤訊息
小蛙記得有兩三個問題,這範例程式有點不是很嚴謹 …
- alipayapi.php 這支的第 73 行就出現一個奇怪符號,刪掉就好了。
- notify_url.php 這支的第 23 行,註解符號沒有放好。
還有一個最後再說吧~最後一個也是小蛙花了最多時間去找出來的,修正完上面兩個錯誤後,應該這個範例程式就能運行了。
測試流程
連到 https://your_domain/alipayHK/index.php 會看到以下畫面
直接按 Play 後會產生 QRCode
用沙箱 app 掃描上面的 QRCode,在用上面的 Buyer account 跟 Login password 登入進行沙箱付款,付款完成之後 AlipayHK 會 POST 資料到上面的 notify_url.php,接著做後續處理。
付款完成後處理
最後一個動作就是讓 Sever 知道付款完成了,AlipayHK 發送一個 POST 到 notify_url.php,小蛙卡在不管怎樣回來的結果都是「驗證錯誤」,小蛙試了很久,也看了很多官方文件、其他網友分享的過程,都沒有找到解法。
然後小蛙就一步一步 trace code,發現通通都過了,驗證方法都一樣卻出來不一樣的東西,最後發現是這行在搞鬼 … 真不知道怎麼說,AlipayHK 都好心放出範例檔了,卻如此不嚴謹 … (也可能是小蛙自己太笨,說不定只有小蛙一個人卡在這)
到 alipay.config.php 裡面找到
$alipay_config['cacert'] = getcwd().'\\cacert.pem';
改成
$alipay_config['cacert'] = getcwd().'/cacert.pem';
打完收工~
串金流系列:
Thank you so much. Very helpful !!!!!!
😀 ~ 很高興幫上忙!!!