php實(shí)現(xiàn)的支付寶支付功能:結(jié)合實(shí)例形式分析php使用支付寶接口實(shí)現(xiàn)支付功能,首先對(duì)接口代碼進(jìn)行整理,保證運(yùn)行的穩(wěn)定性;然后,回調(diào)處理中驗(yàn)簽通過(guò)核實(shí)參數(shù)達(dá)到功能實(shí)現(xiàn)。
問(wèn)題詳情:
本文實(shí)例講述了php實(shí)現(xiàn)的支付寶的支付功能。
分享給大家供大家參考,具體如下:
在給app做支付寶支付接口的時(shí)候收集內(nèi)容整理如下:
接口:
import('alipay.aopclient', extend_path);import('alipay.request.alipaytradeapppayrequest', extend_path);$aop = new \\\\aopclient();$aop->gatewayurl = "https://openapi.alipay.com/gateway.do";$aop->appid = config::get('alipay.app_id');$aop->rsaprivatekey = config::get('alipay.rsa_private_key');$aop->format = "json";$aop->charset = "utf-8";$aop->signtype = "rsa2";$aop->alipayrsapublickey = config::get('alipay.alipay_rsa_public_key'); //config::get('alipay.rsa_public_key'); //$request = new \\\\alipaytradeapppayrequest();$bizcontent = json_encode([ 'body' => '紅包支付', 'subject' => '用戶紅包支付', 'out_trade_no' => $ordersn, 'timeout_express' => '30m', 'total_amount' => $amount, 'product_code' => 'quick_msecurity_pay']);$request->setnotifyurl("https://" . $_server['http_host'] . "/api/callback/alipay");$request->setbizcontent($bizcontent);//這里和普通的接口調(diào)用不同,使用的是sdkexecute$response = $aop->sdkexecute($request);$return['aliresponse'] = $response;//htmlspecialchars($response);//htmlspecialchars是為了輸出到頁(yè)面時(shí)防止被瀏覽器將關(guān)鍵參數(shù)html轉(zhuǎn)義,實(shí)際打印到日志以及http傳輸不會(huì)有這個(gè)問(wèn)題$this->returnsuccess($return);回調(diào)處理:
public function alipay(){ import('alipay.aopclient', extend_path); $aop = new \\\\aopclient(); $aop->alipayrsapublickey = config::get('alipay.alipay_rsa_public_key');// file_get_contents($_server['document_root']."/key/alipay/alipay_public_key.txt"); $flag = $aop->rsacheckv1($_post, null, "rsa2"); if ($flag){ //驗(yàn)簽通過(guò)后核實(shí)如下參數(shù)trade_status、out_trade_no、total_amount、seller_id if (isset($_post['trade_status']) && ($_post['trade_status'] == 'trade_success' || $_post['trade_status'] == 'trade_finished') ) { // 業(yè)務(wù)處理 } else { $msg = var_export($_post, true); $filename = mt_rand(10,1000) .'00alisuccessanother.log' ; file_put_contents($filename, $msg); } echo "success"; } else { $msg = var_export($_post, true); $filename = mt_rand(10,1000) .'00alichecksignfail.log'; file_put_contents($filename, $msg); }}更多學(xué)習(xí)推薦:支付寶即時(shí)到賬在線支付實(shí)戰(zhàn)項(xiàng)目開發(fā)視頻教程
附:支付寶支付和微信支付異步回調(diào)一直調(diào)用
最近在開發(fā)支付寶支付,前期的工作都已經(jīng)做好了,但是在異步回調(diào)取值的時(shí)候,異步回調(diào)一直在調(diào)用,弄得我數(shù)據(jù)一直重復(fù)的存入數(shù)據(jù)庫(kù),仔細(xì)思考下,腦海中立馬浮現(xiàn)的一個(gè)解決方法就是,在異步回調(diào),里面再寫一個(gè)接口,每次回調(diào)取到數(shù)據(jù)后,查詢數(shù)據(jù)庫(kù),看看有沒(méi)有數(shù)據(jù),如果有就不重復(fù)存入,但是仔細(xì)一想,不對(duì)啊,這是治標(biāo)不治本啊,不行,既然有問(wèn)題,肯定有根源,有正確的解決方法。所以,找起根據(jù),那就是查看文檔:
1. 支付寶文檔,下面這是支付寶異步回調(diào)的文檔:
服務(wù)器異步通知頁(yè)面特性
必須保證服務(wù)器異步通知頁(yè)面(notify_url)上無(wú)任何字符,如空格、html標(biāo)簽、開發(fā)系統(tǒng)自帶拋出的異常提示信息等;
支付寶是用post方式發(fā)送通知信息,因此該頁(yè)面中獲取參數(shù)的方式,如:request.form(“out_trade_no”)、$_post[‘out_trade_no'];
支付寶主動(dòng)發(fā)起通知,該方式才會(huì)被啟用;
只有在支付寶的交易管理中存在該筆交易,且發(fā)生了交易狀態(tài)的改變,支付寶才會(huì)通過(guò)該方式發(fā)起服務(wù)器通知(即時(shí)到賬交易狀態(tài)為“等待買家付款”的狀態(tài)默認(rèn)
是不會(huì)發(fā)送通知的);
服務(wù)器間的交互,不像頁(yè)面跳轉(zhuǎn)同步通知可以在頁(yè)面上顯示出來(lái),這種交互方式是不可見(jiàn)的;
第一次交易狀態(tài)改變(即時(shí)到賬中此時(shí)交易狀態(tài)是交易完成)時(shí),不僅會(huì)返回同步處理結(jié)果,而且服務(wù)器異步通知頁(yè)面也會(huì)收到支付寶發(fā)來(lái)的處理結(jié)果通知;
程序執(zhí)行完后必須打印輸出“success”(不包含引號(hào))。如果商戶反饋給支付寶的字符不是success這7個(gè)字符,支付寶服務(wù)器會(huì)不斷重發(fā)通知,直到超過(guò)24小時(shí)22分鐘。
一般情況下,25小時(shí)以內(nèi)完成8次通知(通知的間隔頻率一般是:4m,10m,10m,1h,2h,6h,15h);
程序執(zhí)行完成后,該頁(yè)面不能執(zhí)行頁(yè)面跳轉(zhuǎn)。如果執(zhí)行頁(yè)面跳轉(zhuǎn),支付寶會(huì)收不到success字符,會(huì)被支付寶服務(wù)器判定為該頁(yè)面程序運(yùn)行出現(xiàn)異常,而重發(fā)處理結(jié)果通知;
cookies、session等在此頁(yè)面會(huì)失效,即無(wú)法獲取這些數(shù)據(jù);
該方式的調(diào)試與運(yùn)行必須在服務(wù)器上,即互聯(lián)網(wǎng)上能訪問(wèn);
該方式的作用主要防止訂單丟失,即頁(yè)面跳轉(zhuǎn)同步通知沒(méi)有處理訂單更新,它則去處理;
當(dāng)商戶收到服務(wù)器異步通知并打印出success時(shí),服務(wù)器異步通知參數(shù)notify_id才會(huì)失效。也就是說(shuō)在支付寶發(fā)送同一條異步通知時(shí)
(包含商戶并未成功打印出success導(dǎo)致支付寶重發(fā)數(shù)次通知),服務(wù)器異步通知參數(shù)notify_id是不變的。
看到?jīng)],程序必須要打印出來(lái)success后,支付寶才會(huì)停止噴血,自己再回頭看程序的時(shí)候,發(fā)現(xiàn)自己的確沒(méi)有返回success,所以在程序結(jié)束后,返回一個(gè)success即可。由于我使用的php,在程序結(jié)束后。使用下面一句話即可。
eg:echo "success";2. 微信文檔
支付完成后,微信會(huì)把相關(guān)支付結(jié)果和用戶信息發(fā)送給商戶,商戶需要接收處理,并返回應(yīng)答。
對(duì)后臺(tái)通知交互時(shí),如果微信收到商戶的應(yīng)答不是成功或超時(shí),微信認(rèn)為通知失敗,微信會(huì)通過(guò)一定的策略定期重新發(fā)起通