php 服務(wù)端集成支付寶APP支付實例
支付寶支付分為了很多種場景,這里只講述支付寶APP支付功能集成,期間遇到了特別大的坑,因此我簡單描述下集成過程,并概述遇到的問題及解決方案
由于公司業(yè)務(wù)簡單,只支持支付寶支付,而無需關(guān)心退款,查詢等等額外功能,因此該篇內(nèi)容僅僅講述支付寶支付接口時服務(wù)端如何準(zhǔn)備APP拉取支付訂單的信息,大概流程如下
一、創(chuàng)建應(yīng)用及配置
首先,需要到螞蟻金服開發(fā)平臺(open.alipay.com)注冊應(yīng)用,并獲取應(yīng)用ID,并配置應(yīng)用,這里在配置時主要是簽約,生成應(yīng)用的RSA2公私鑰,同時獲取到支付寶提供的支付公鑰等,這部分官網(wǎng)后臺都有提示,比較簡單
二、下載對應(yīng)SDK
這里我是在PHP后臺集成服務(wù),因此下載的是PHP SDK,地址:https://docs.open.alipay.com/54/103419/
三、準(zhǔn)備一個可以訪問的真實域名
四、案例
當(dāng)以上三部完成之后,此時就可以進(jìn)入配置我們自己的業(yè)務(wù)代碼了
4.1、組織APP支付時的支付訂單信息
<?php require_once (__DIR__.'/alipay-sdk-PHP-20171023143822/AopSdk.php'); class Alipay { /** * 應(yīng)用ID */ const APPID = '你的應(yīng)用ID'; /** *請?zhí)顚戦_發(fā)者私鑰去頭去尾去回車,一行字符串 */ const RSA_PRIVATE_KEY = '應(yīng)用對應(yīng)開發(fā)者私鑰'; /** *請?zhí)顚懼Ц秾毠€,一行字符串 */ const ALIPAY_RSA_PUBLIC_KEY = '支付寶提供的公鑰'; /** * 支付寶服務(wù)器主動通知商戶服務(wù)器里指定的頁面 * @var string */ private $callback = "http://www.test.com/notify/alipay_notify.php"; /** *生成APP支付訂單信息 * @param string $orderId 商品訂單ID * @param string $subject 支付商品的標(biāo)題 * @param string $body 支付商品描述 * @param float $pre_price 商品總支付金額 * @param int $expire 支付交易時間 * @return bool|string 返回支付寶簽名后訂單信息,否則返回false */ public function unifiedorder($orderId, $subject,$body,$pre_price,$expire){ try{ $aop = new \AopClient(); $aop->gatewayUrl = "https://openapi.alipay.com/gateway.do"; $aop->appId = self::APPID; $aop->rsaPrivateKey = self::RSA_PRIVATE_KEY; $aop->format = "json"; $aop->charset = "UTF-8"; $aop->signType = "RSA2"; $aop->alipayrsaPublicKey = self::ALIPAY_RSA_PUBLIC_KEY; //實例化具體API對應(yīng)的request類,類名稱和接口名稱對應(yīng),當(dāng)前調(diào)用接口名稱:alipay.trade.app.pay $request = new \AlipayTradeAppPayRequest(); //SDK已經(jīng)封裝掉了公共參數(shù),這里只需要傳入業(yè)務(wù)參數(shù) $bizcontent = "{\"body\":\"{$body}\"," //支付商品描述 . "\"subject\":\"{$subject}\"," //支付商品的標(biāo)題 . "\"out_trade_no\":\"{$orderId}\"," //商戶網(wǎng)站唯一訂單號 . "\"timeout_express\":\"{$expire}m\"," //該筆訂單允許的最晚付款時間,逾期將關(guān)閉交易 . "\"total_amount\":\"{$pre_price}\"," //訂單總金額,單位為元,精確到小數(shù)點后兩位,取值范圍[0.01,100000000] . "\"product_code\":\"QUICK_MSECURITY_PAY\"" . "}"; $request->setNotifyUrl($this->callback); $request->setBizContent($bizcontent); //這里和普通的接口調(diào)用不同,使用的是sdkExecute $response = $aop->sdkExecute($request); //htmlspecialchars是為了輸出到頁面時防止被瀏覽器將關(guān)鍵參數(shù)html轉(zhuǎn)義,實際打印到日志以及http傳輸不會有這個問題 return htmlspecialchars($response);//就是orderString 可以直接給客戶端請求,無需再做處理。 }catch (\Exception $e){ return false; } } }
4.2、支付寶支付成功之后異步回調(diào)處理
<?php /** * alipay_notify.php. * User: lvfk * Date: 2017/10/26 0026 * Time: 13:48 * Desc: 支付寶支付成功異步通知 */ include_once (__DIR__.'/../alipay-sdk-PHP-20171023143822/AopSdk.php'); //驗證簽名 $aop = new \AopClient(); $aop->alipayrsaPublicKey = \Comm\Pay\Alipay::ALIPAY_RSA_PUBLIC_KEY; $flag = $aop->rsaCheckV1($_POST, NULL, "RSA2"); //驗簽 if($flag){ //處理業(yè)務(wù),并從$_POST中提取需要的參數(shù)內(nèi)容 if($_POST['trade_status'] == 'TRADE_SUCCESS' || $_POST['trade_status'] == 'TRADE_FINISHED'){//處理交易完成或者支付成功的通知 //獲取訂單號 $orderId = $_POST['out_trade_no']; //交易號 $trade_no = $_POST['trade_no']; //訂單支付時間 $gmt_payment = $_POST['gmt_payment']; //轉(zhuǎn)換為時間戳 $gtime = strtotime($gmt_payment); //此處編寫回調(diào)處理邏輯 //處理成功一定要返回 success 這7個字符組成的字符串, //die('success');//響應(yīng)success表示業(yè)務(wù)處理成功,告知支付寶無需在異步通知 } }
五、遇到的問題
5.1、一直報錯40001=>isv.invalid-signature
為了搞清楚原因,先后多次重新生成應(yīng)用的RSA2公私密鑰,發(fā)現(xiàn)都沒有作用。最后結(jié)合網(wǎng)上資料,才發(fā)現(xiàn),原來是支付寶回調(diào)地址notifyUrl不能有 '?' 以及 ?后面加參數(shù)
5.2、支付寶異步通知成功了,但是$_POST為空
這個也花費了一點時間查找,開始做的時候就是遵照支付寶的建議使用HTTS方式請求。但這樣應(yīng)用后臺一直通知沒有參數(shù)內(nèi)容。最后才想起來由于我們的應(yīng)用使用了HTTS雙向認(rèn)證,這個原因?qū)е轮Ц秾毜姆?wù)器回調(diào)的參數(shù)為空。最后,把回調(diào)地址改為了HTTP方式,驗證通過
通過遇到的問題,首先查看支付寶的文檔描述以及支付寶提供的錯誤碼解釋,實在不行就百度或者谷歌,再加上自己不斷測試驗證,最終一定可以解決問題
至此,支付寶APP支付這塊功能完成,其他的APP退款、對賬單等等功能就沒繼續(xù)做,不過按照支付寶官網(wǎng)文檔以及支付寶提供的SDK,集成到自己應(yīng)用也只是時間問題。
以上這篇php 服務(wù)端集成支付寶APP支付實例就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
使用JavaScript創(chuàng)建新樣式表和新樣式規(guī)則
這篇文章主要介紹了使用JavaScript創(chuàng)建新樣式表和新樣式規(guī)則的相關(guān)資料,需要的朋友可以參考下2016-06-06PHP實現(xiàn)生成唯一編號(36進(jìn)制的不重復(fù)編號)
這篇文章主要介紹了PHP實現(xiàn)生成唯一編號,文中使用10進(jìn)制轉(zhuǎn)換36進(jìn)制得到不重復(fù)的6000多萬個唯一編號,編號位數(shù)為10位,需要的朋友可以參考下2014-07-07