接入支付寶準備工作:(關於賬號可以是個體商戶也可以是企業賬號但必須有營業執照) 1.登錄螞蟻金服開放平臺 2.創建應用,應用分類網頁應用和移動應用。應用提交審核審核通過後得到Appid才能調用相應的介面許可權 3.添加功能:一般有掃碼付,電腦網站支付,手機網站支付,APP支付。看你的需求什麼。移動應用 ...
接入支付寶準備工作:(關於賬號可以是個體商戶也可以是企業賬號但必須有營業執照)
1.登錄螞蟻金服開放平臺 2.創建應用,應用分類網頁應用和移動應用。應用提交審核審核通過後得到Appid才能調用相應的介面許可權
3.添加功能:一般有掃碼付,電腦網站支付,手機網站支付,APP支付。看你的需求什麼。移動應用選擇APP支付或者是掃碼付,而網頁應用分為移動端和PC端。
4.商戶簽約 需要提交相關的資料 一般是要求你提供你的網站地址和APP包等要求 按照支付寶要求來簽約相關的支付功能
5.配置你的應用開發配置 (非常關鍵一旦配置錯誤則調不起支付寶支付)
a.支付寶網關 支付寶已經填寫好了不動
b.應用網關 這裡填的是你的後臺系統的功能變數名稱如https://www.ios.events.com必須能夠訪問
c.授權回調地址 是獲取用戶預授權時使用的回調地址 照此要求填寫就可以沒有固定的
d.加簽方式一般推薦RSA(SHA256) 這裡關鍵點來了 首先通過https://docs.open.alipay.com/291/105971這個鏈接下載Windows系統下載window的生成商戶應用公鑰和商戶應用私鑰一定要是匹配的
然後複製到這裡那麼支付寶公鑰會自動生成。請保存在文本中
6.這樣應用配置完成 當然如果你想測試使用沙箱進行測試則還需要配置沙箱環境當然和線上的是一樣只不過支付寶網關是https://openapi.alipaydev.com/gateway.do但如果是APP支付除非是IOS,安卓語言支付則沙箱環境是沒有用的
簽約完成就添加功能,應用配置完成則開始進行前後臺的支付功能模塊的開發了
後臺開發
1.先配置好你的後臺支付寶支付環境 並且如果你是使用官方SDK的話最好將其SDK放在擴展類庫下麵
'Alipay' => [ //線上app_id 'app_id' => "2016092300576028", //線上應用私鑰 'merchant_private_key' => "en4wG3L", //線上非同步通知地址 'notify_url' => "https://www.ios.events.com/index.php/Order/notify", //線上同步通知地址 'return_url' => "https://www.ios.events.com/index.php/Order/return_url", //編碼格式 'charset' => "UTF-8", //簽名方式 'sign_type'=>"RSA2", //線上支付寶網關 'gatewayUrl' => "https://openapi.alipay.com/gateway.do", //沙箱支付寶網關 //'gatewayUrl' => "https://openapi.alipaydev.com/gateway.do", //線上支付寶公鑰 'alipay_public_key' => "", //應用公鑰 'wap_public_key' => "", ]
2.下載螞蟻金服開放平臺的PHP支付SDK TP框架引入SDK重要的文件放在ThinkPHP/Library/Vendor/Alipay_wap 公共類庫Vendor下
將你所需要的文件改成.class.php 因為我們需要引入並且將他們當成類來使用並且他們的命名空間是Vendor/Alipay_wap
上面2步好了以後,支付環境已經搭建好了。這裡進入實際開發希望不懂的可以參照開放文檔。我也是一邊看著開發文檔(不得不說支付寶開發文檔很詳細)一邊開發
3.(手機網站支付)步驟一般是前臺先創建好訂單傳給下一個支付頁面(上面有支付寶或者是微信支付類型和金額當然還有其他的東西) 點擊支付按鈕調用後臺寫好的支付介面比如Pay
1. 調用支付寶支付單介面 $config = C("Alipay");//支付寶介面配置數據 if (!empty($_POST['WIDout_trade_no']) && trim($_POST['WIDout_trade_no']) != "") { //商戶訂單號,商戶網站訂單系統中唯一訂單號,必填 $out_trade_no = $_POST['WIDout_trade_no']; //訂單名稱,必填 $subject = $_POST['WIDsubject']; //付款金額,必填 $total_amount = $_POST['WIDtotal_amount']; //商品描述,可空 $body = $_POST['WIDbody']; //超時時間 $timeout_express = "9m"; $payRequestBuilder = new AlipayWapPay(); $payRequestBuilder->setBody($body); $payRequestBuilder->setSubject($subject); $payRequestBuilder->setOutTradeNo($out_trade_no); $payRequestBuilder->setTotalAmount($total_amount); $payRequestBuilder->setTimeExpress($timeout_express); $payResponse = new AlipayService($config); $result=$payResponse->wapPay($payRequestBuilder,$config['return_url'],$config['notify_url']); }
當然你可以加入自己的不必要填寫的參數進去(這我就管不著了)
4.調起支付後支付結果會通過非同步的方式發送支付結果通知給我們也被稱為非同步通知
$time = time(); $orderModel = M('order'); $config = C("Alipay");//支付寶介面配置數據 $arr=$_POST; /* 實際驗證過程建議商戶添加以下校驗。 1、商戶需要驗證該通知數據中的out_trade_no是否為商戶系統中創建的訂單號, 2、判斷total_amount是否確實為該訂單的實際金額(即商戶訂單創建時的金額), 3、校驗通知中的seller_id(或者seller_email) 是否為out_trade_no這筆單據的對應的操作方(有的時候,一個商戶可能有多個seller_id/seller_email) 4、驗證app_id是否為該商戶本身。 */ //驗簽過程 $alipaySevice = new AlipayService($config); $alipaySevice->writeLog(var_export($_POST,true)); $result = $alipaySevice->check($arr); if($result) {//驗證成功 //進行校驗 if($arr){ $ordersn = $_POST['out_trade_no'];//訂單號 $total_amount = $_POST['total_amount'];//訂單總金額 $app_id = $_POST['app_id'];//應用id $data = M('weiz_order')->where('ordersn='.$ordersn)->find(); if(empty($data)||$total_amount!==$data['total']||$app_id!==$config['app_id']){ return false; } }else{ return false; } if($_POST['trade_status'] == 'TRADE_SUCCESS') { $orderModel->startTrans();//事務開始 if(!empty($ordersn)){ $data['paytime'] = $time;//支付時間 $data['payment'] = 2; $data['paystatus'] = 1; $res=$orderModel->where('ordersn='.$ordersn)->save($data); $orderData = M('order')->where('ordersn='.$ordersn)->find(); $orderId = $orderData['id'];
這裡就不上傳代碼這個是百度的代碼
步驟是:先接受支付寶非同步通知返回參數 , 對於返回的簽名進行驗證簽名如果錯誤則不進行下去,後如果支付成功則驗證訂單號是否和我們資料庫中生成的
訂單號是否一致,訂單金額是否一致,app_id是否一致。如果都一致就要去修改訂單的支付狀態 判斷是否已經修改過了則不予處理,如果沒有 就要進行資料庫的
事務處理如果不行就要回滾。修改成功則進行提交事務 別忘了最重要的一步echo success 不然支付寶每隔一段時間就會一直發送非同步通知。
當然可能會出現一些極端情況如果非同步通知沒有修改訂單支付狀態成功或者非同步通知沒有接受到咋辦但用戶支付成功,用戶支付失敗就不用管了。
這種就要通過我們資料庫中欄位來記錄我們的非同步通知中支付寶交易流水號了 。 通過交易流水號來查詢訂單是否支付成功如果支付成功那就自己再次
修改訂單支付狀態了。
當然非同步通知我們如果收不到的話(這種意外很少發送但是會發生),所以同步通知就很重要了
5.同步通知 首先拿到我們後臺系統的訂單號後面判斷這個支付狀態是否是未支付的狀態如果不是則退出程式 如果是則修改訂單支付狀態即可。
好了手機網站支付PHP版接結束了 這裡是記錄我的個人分享和體會吧 一起努力吧!