針對(duì)近期小伙伴詢(xún)問(wèn)ThinkPHP集成支付寶的人數(shù)較多,特此編寫(xiě)一篇較詳細(xì)且易理解的教程
對(duì)應(yīng)dmeo源碼本人已擱到github上了,歡迎大家下載使用。
對(duì)應(yīng)的github下載地址為:https://github.com/paopao7/ThinkPHP_Alipay_Demo
以下所有圖片可點(diǎn)擊放大后進(jìn)行查看
相關(guān)版本說(shuō)明:
ThinkPHP版本為3.2.3完整版
支付寶demo為截止到該文章發(fā)表前官方最新版
應(yīng)官方版本要求,特將本地PHP版本修改為5以上
官方要求:

因本人使用的mac下的php開(kāi)發(fā)的集成換成Mamp,所以截圖為Mamp下的php版本
Mamp版本號(hào):

Mamp下php版本號(hào):

若您使用的為其他開(kāi)發(fā)環(huán)境,也請(qǐng)務(wù)必將php的版本修改為5及以上
1、首先需下載ThinkPHP,具體要去哪里下載,就不需要我多說(shuō)明了吧。我選擇的版本是3.2.3完整版

下載鏈接在此:http://www.thinkphp.cn/down/610.html
2、下載支付寶demo
此處我們以電腦網(wǎng)站支付為例,其他demo也類(lèi)似,此處就不再贅述了

下載鏈接在此:https://docs.open.alipay.com/270/106291/
3、將下載下來(lái)的ThinkPHP完整版擱到我們的網(wǎng)站根目錄下

我的網(wǎng)站根目錄是wwwroot,我將此次的項(xiàng)目命名為AlipayClass,該名稱(chēng)的意思是以自定義類(lèi)的形式去執(zhí)行支付寶支付,當(dāng)然你想命名為什么名稱(chēng)都可以。
4、將下載來(lái)的支付寶demo擱到ThinkPHP的三方框架下,關(guān)于ThinkPHP的三方類(lèi)庫(kù)說(shuō)明見(jiàn)此地址:
http://document.thinkphp.cn/manual_3_2.html#lib_extend

擱進(jìn)去的具體操作如下圖所示:

5、此處先補(bǔ)充下電腦網(wǎng)站支付的配置及流程,若你已了解,可直接跳轉(zhuǎn)至下一節(jié)。
1)、首先我們可以通過(guò)執(zhí)行支付寶官方demo來(lái)了解其支付的流程
2)、我們還是跟之前將官方demo擱到我們網(wǎng)站的根目錄下:

3)、在進(jìn)行本地調(diào)試之前,安裝官方的說(shuō)法,請(qǐng)先閱讀下該demo目錄下的readme.txt,此處就不展開(kāi)了
4)、閱讀完成后,先別急著在本地運(yùn)行,先對(duì)需要的數(shù)據(jù)進(jìn)行配置
需要配置的數(shù)據(jù)如下圖所示:

針對(duì)以上信息的獲取,請(qǐng)參考本人的另一篇文章,文章地址:
5)、請(qǐng)注意以上參數(shù)中的?notify_url、return_url,需為外網(wǎng)地址,不然支付寶無(wú)法調(diào)用到,也就無(wú)法進(jìn)行跳轉(zhuǎn)及驗(yàn)簽了。
6)、以上信息配置完成后,我們就可以愉快的在本地跑起來(lái)了

7)、接下來(lái)是對(duì)整個(gè)支付過(guò)程的講解,若您已了解,請(qǐng)?zhí)^(guò)。
首先我們打開(kāi)項(xiàng)目所在的index.php文件,會(huì)發(fā)現(xiàn)付款功能是將填寫(xiě)的相關(guān)參數(shù)提交到?pagepay下面的pagepay.php文件,如下圖紅色框中的內(nèi)容所示。

以下為提交頁(yè)面的參數(shù)和后端接受的參數(shù)對(duì)應(yīng)說(shuō)明

以下就針對(duì)上述文件進(jìn)行分析,首先該文件引入了我們?cè)谝婚_(kāi)始填寫(xiě)appid等參數(shù)的配置文件,然后將前臺(tái)頁(yè)面填寫(xiě)的訂單號(hào)、支付金額等參數(shù)獲取到。再將這些參數(shù)通過(guò)對(duì)應(yīng)的set方法寫(xiě)入$payRequestBuilder,以供AlipayTradeService文件下的pagePay方法使用。

下圖為AlipayTradeService文件的pagePay方法所在頁(yè)面。然后該方法又去調(diào)用了aopclientRequestExecute方法,也就是第94行的方法。我們會(huì)發(fā)現(xiàn)在調(diào)用aopclientRequestExecute方法的時(shí)候,第二個(gè)參數(shù)為true,因此它會(huì)調(diào)用$aop下的pageExecute方法,也就是第109行代碼。

繼續(xù)往下走。若下圖所示,我們已經(jīng)找到了pageExecute方法所在的定義。該方法先判斷文件編碼,然后獲取到需要加密的一些參數(shù),然后調(diào)用該文件下的generateSign方法進(jìn)行加密,也就是第385行代碼。

繼續(xù)往下走,最終代碼來(lái)到第119行,該方法為調(diào)用我們之前配置好的公鑰和私鑰,然后使用openssl_sign方法進(jìn)行加密,將加密后的參數(shù)(sign)進(jìn)行返回。
請(qǐng)注意openssl_sign方式為php自帶方法,需進(jìn)去到php.ini文件下進(jìn)行配置,具體配置過(guò)程此處就不再贅述了。可參考該文章:
http://www.jb51.net/article/50173.htm

好的,我們了解了支付寶是如何進(jìn)行加密操作了,那就繼續(xù)往下走。

因?yàn)閭魅氲?httpmethod的值是POST,因此代碼會(huì)走到397行,也就是上圖中紅色框的部分。順著往下走,就找到了該方法的定義,根據(jù)上方注釋?zhuān)苋菀拙土私獾皆摲椒ㄊ菍⒅Ц缎枰膮?shù)循環(huán)填入form表單中,然后將整個(gè)表單進(jìn)行返回。為了獲取其中上傳的參數(shù),我特定將返回的數(shù)據(jù)進(jìn)行了寫(xiě)文件操作。

該文件會(huì)生成在項(xiàng)目目錄下的pagepay目錄下

生成的內(nèi)容如下圖所示:

實(shí)際提交的參數(shù),就是支付寶電腦網(wǎng)站支付api下的aplipy.trade.page.pay方法所需要提交的參數(shù)。具體鏈接為:https://docs.open.alipay.com/common/105901
至此整個(gè)demo的支付流程已講解完畢。
8)到了激動(dòng)人心的時(shí)刻了,若相關(guān)配置正確無(wú)誤,則會(huì)出現(xiàn)以下界面。

是不是感到非常的熟悉和親切呢。若未出現(xiàn),請(qǐng)根據(jù)錯(cuò)誤提示自行進(jìn)行百度。
9)針對(duì)有小伙伴反饋在出現(xiàn)該頁(yè)面之前會(huì)出現(xiàn)一個(gè)錯(cuò)誤界面,然后一閃而過(guò),如下圖所示:

出現(xiàn)這個(gè)問(wèn)題的原因是因?yàn)楸镜丨h(huán)境缺少時(shí)區(qū)導(dǎo)致的。具體解決方法請(qǐng)參考該鏈接:http://jingyan.baidu.com/article/2a138328a95186074b134f4f.html
6、官方demo的說(shuō)明至此結(jié)束了,接下來(lái)是對(duì)官方demo進(jìn)行封裝。此處已將支付寶demo擱到三方框架下。因?yàn)橄螺d的代碼中未包含控制器等文件夾,所以需先進(jìn)行在瀏覽器下執(zhí)行下。在進(jìn)行接下來(lái)操作的時(shí)候,請(qǐng)先將demo文件夾下的config.php文件配置完成,否則無(wú)法進(jìn)行支付。如下圖所示:

7、執(zhí)行完成后,會(huì)發(fā)現(xiàn)對(duì)應(yīng)的Application已經(jīng)有了控制器等文件夾。

8、接下來(lái)是搭建支付頁(yè)面以及支付記錄頁(yè)面,這兩項(xiàng)操作就不在此進(jìn)行贅述了。頁(yè)面搭建的時(shí)候,記得預(yù)留下支付金融的input,該參數(shù)需要傳遞到服務(wù)器端進(jìn)行處理。

9、服務(wù)器端在接收到用戶輸入的支付金額的時(shí)候,會(huì)先對(duì)用戶輸入的值進(jìn)判斷。驗(yàn)證無(wú)誤后,會(huì)執(zhí)行生成訂單號(hào)以及寫(xiě)入訂單表等操作,具體見(jiàn)下圖:其中具體的操作的請(qǐng)點(diǎn)擊下圖方大進(jìn)行查看或去到文章的頂部將源碼下載下來(lái)進(jìn)行研究。

10、以上操作均無(wú)誤的情況下,將會(huì)出現(xiàn)我們所熟悉的界面,此處就不在贅述了。
11、若在支付的過(guò)程中,遇到和Tp框架的C方法沖突的時(shí)候,可直接將支付寶demo的C方法修改為任何方法名即可。


12、支付過(guò)程到此結(jié)束,接下來(lái)是支付寶回調(diào)以及驗(yàn)簽的說(shuō)明。在進(jìn)行驗(yàn)簽操作之前,請(qǐng)先填寫(xiě)好支付寶demo文件夾下config。php文件中的notify_url地址且要是外網(wǎng)能夠訪問(wèn)的。

13、接下來(lái)是對(duì)驗(yàn)簽功能的講解。支付寶在你支付成功后,會(huì)異步訪問(wèn)你在配置文件里面填寫(xiě)的地址,也就是下圖中的方法。
你可以通過(guò)$_POST獲取所有的返回?cái)?shù)據(jù),也可以通過(guò)$_POST[‘參數(shù)名’]獲取某個(gè)特定的數(shù)據(jù)。
在獲取到支付寶全部的數(shù)據(jù)之后,第一步要做的就是對(duì)支付寶返回的數(shù)據(jù)進(jìn)行驗(yàn)簽,也就是下圖中第66行處的代碼。
驗(yàn)簽完成后,就是你自己的業(yè)務(wù)邏輯什么的,例如修改訂單狀態(tài)以及修改對(duì)應(yīng)用戶余額什么的,具體要做哪些操作了,就看個(gè)人需要了。
此處需要注意的是,成功或失敗返回的結(jié)果為 echo “success”;或echo “fail”; 該行代碼切記不要?jiǎng)e做任何修改。

14、好了Tp框架集成支付寶電腦網(wǎng)站支付并以自定義類(lèi)的形式的功能說(shuō)明到此結(jié)束。
如果還有什么不明白的地方,歡迎加我QQ進(jìn)行咨詢(xún),請(qǐng)注明技術(shù)咨詢(xún)
本人QQ:980569038
也可以掃碼本人微信:

若該文章對(duì)您有一定幫助,歡迎打賞



(點(diǎn)擊圖片可放大)
本人原創(chuàng),轉(zhuǎn)載請(qǐng)注明出處