最近公司要用php做一個網站支付寶自動充值的功能,具體就是客戶把錢直接轉到公司的支付寶賬號里,然后在我們網站上填寫上交易號,我們網站程序自動獲取交易信息,自動給網站的賬戶充值。
我的具體想法就是利用支付寶的api根據交易號查找跟公司賬號交易的信息,獲取信息以后把金額、交易人、交易時間等信息存入網站數據庫。
然后這兩天就研究了一下支付寶的api,以前沒用過支付寶的api,走了一些彎路,把經驗記下,給后來者參考。
一、找接口
在找接口的過程中我發現阿里巴巴有兩套接口。一套是支付寶api,簡稱Aop,只有企業實名認證的賬戶才可以申請。另一套是淘寶開放平台的api,簡稱Top,個人可以申請,有的接口也需要企業認證。這兩套接口應該使用哪一個想必很好分辨了,跟支付寶有關就申請支付寶的Aop,跟淘寶相關的就申請Top。
我需要的是支付寶接口,就在支付寶文檔里找想要的接口。alipay.user.trade.search
二、使用接口
怎么使用接口呢?在這兩個平台上都是要創建應用,通過應用的id和一些token來獲取權限,再進行相應的操作。這里我只用過支付寶的api,所以只說一下Aop的了。
打開控制面板創建應用。
創建完成以后,會分配一個App ID給你。當你修改應用的時候還提示你需要填寫一個回調地址,回調地址是什么呢?暫且一等,一步一步的來。
當應用創建完了以后是需要根據App ID來進行用戶授權的,要不然你沒有權限獲取用戶賬號的交易信息。
授權的地址是:


現在你就可以通過這個code來進行操作獲取用戶的authtoken。
authtoken是什么?authtoken是你在調用支付寶函數的時候需要傳入的參數。
找到函數以后可以用測試工具獲取測試代碼示例:
https://sandbox.alipaydev.com/home/apiTestTools.htm?method=alipay.user.trade.search
代碼說明:
$c = new AopClient;//AopClient是Aop的sdk里給出的工具類,首先實例化一個工具類對象 $c->appId = appId;//給對象appid賦值 $c->privateKey = rsaPrivateKeyFilePath;//給privatekey賦值,這里有個bug,就是AopClient里面根本沒定義 privateKey這個屬性,我擦。。坑爹的api,實際上是名為 rsaPrivateKeyFilePath的屬性。。。這個屬性是什么意思呢?這個就是openssl加密方式的私鑰路徑,私鑰是需要放到你服務器上的。openssl在你配置應用的時候就讓你配置了公鑰,這里需要把私鑰路徑放到這里,openssl不知道啥意思看這個地址:https://openhome.alipay.com/doc/docIndex.htm?url=https://openhome.alipay.com/doc/viewKbDoc.htm?key=236615_428849&type=info $c->format = format;//這個format是格式,具體是分為"xml"和"json" //總的來說上面這個AopClient就是相當於權限認證,系統根據appid和密鑰文件驗證你的權限 $req = new AlipayUserTradeSearchRequest();//這個地方是實例化了一個api具體請求方法類 $req->setEndTime("2015-2-7 00:07:37");//設置結束時間,具體就不說了 $req->setAlipayOrderNo("111");//交易號 $req->setStartTime("2015-2-7 00:07:35");//開始時間 $resp = $c->execute($req, authToken);//執行,這里要說一下,這個authtoken從哪里取啊。。這個就是比較坑爹的地方了,我找了半天才知道 //這個地方就是要調用一下alipay.system.oauth.token這個api來獲取token,具體代碼我放到下一個片段里
$c = new AopClient();
$c->appId = "102014123000022415";//應用id
$c->rsaPrivateKeyFilePath = APPLICATION_PATH . '/../public/res/rsa_private_keyShaxiang.pem';//設置密鑰的路徑
$c->format = "json";//指定格式
$req = new AlipaySystemOauthTokenRequest();//獲取token的request
$req->setGrantType("authorization_code");//設置要操作的類型
$req->setCode("");//回調地址給你傳回的code參數,code原來是用來生成authtoken的。。。好吧。。
$resp = $c->execute($req);//執行,很重要的一點,這個地方官方給的地代碼實例傳了一個AuthToken,其實這個方法不需要傳AuthToken的,本來就是獲取AuthToken的方法。。。這個函數是重載方法
echo "<pre>"; var_dump($resp);//打印一下,就看到 access_token這個屬性了,就是它了,它就是AuthToken。。。 echo "</pre>";
聽別的教程里說這個AuthToken有效期是一年。。不知道真假,待驗證。有效期過了需要根據update_token來更新AuthToken,這個地方是獲取token調用AlipaySystemOauthToken和更新AuthToken的詳細介紹:
到這里就可以基本上搞定了這個獲取信息的api了。。。
然后就可以利用各種request類來操作了,如下
$c = new AopClient();
$c->appId = "1020141230000224";//id
$c->rsaPrivateKeyFilePath = APPLICATION_PATH . '/../public/res/rsa_private_keyShaxiang.pem'; $c->format = "json"; $req = new AlipayUserTradeSearchRequest();//此處實例化各種請求就可以各種操作了 $req->setEndTime("2015-2-7 00:07:37");//設置結束時間,具體就不說了 $req->setAlipayOrderNo("111");//交易號 $req->setStartTime("2015-2-7 00:07:35");//開始時間 $resp = $c->execute($req, “201502BBa66dd2645f10418fb8ba1ef953a3dX”);//獲取的AuthToken
返回的信息如下:
只是做一個指引。。。有不懂的問題可以咨詢阿里旺旺“alipay開放平台”會有專門的技術人員給解答問題,不過自己能解決的盡量還是自己搞定吧。。
還有補充一下:他們有個沙箱測試這么一說,PHP下沙箱好像有些問題,強烈建議直接申請上線,然后修改api,上面的沙箱測試我也忘了為何成功了,之后用的時候都失敗了,浪費了很多時間。總是獲取私鑰解析失敗,有人說是因為給的私鑰是經過pkcs8編碼過的。有不懂的就多看幾遍api,表示他們的api文檔寫的很爛唉。。。傷不起。。沒有細節說明
2015-3-14補充:
最近有朋友說沙箱測試PHP獲取不到auth_token,提示缺少sign參數。我又測試了一下,原因是在對回調地址的code處理時出了問題。私鑰不能生成sign參數。Aopclient里面openssl_get_privatekey()這個方法返回false,換了openssl_pkey_get_private()還是不行。我當時可能是直接申請上線的。
估計是支付寶沙箱給出的私鑰是經過PKCS8編碼過的。參考一下:http://blog.csdn.net/zhouzme/article/details/38380621
建議大家直接應用上線吧,把Apache升級到2.29,openssl升級到1.02就可以通過安全監測了。
申請周期大概在四五個工作日。