當用戶進行支付操做時候能夠直接跳轉到支付寶支付頁面進行支付 php
關於支付寶簽約即時到帳和PID獲取、密鑰生成這裏不作敘述,官方文檔步驟也很清楚:傳送門前端
支付寶即時到帳DEMO下載:下載json
簡單使用須要的文件說明後端
./alipay.config.php --- 配置文件api
./alipayapi.php ------- 接口文件安全
./notify_url.php ------ 服務器異步通知文件服務器
./return_url.php ----- 服務器同步跳轉文件curl
./log.txt -------------- 日誌異步
在配置文件中有詳細的說明,主要配置有函數
$alipay_config['partner'] = '208862160xxxxxxx'; // 合做者身份ID $alipay_config['private_key'] = "xxxxxxxxxxxxx」; // 商戶的私鑰,此處填寫原始私鑰去頭去尾 $alipay_config['notify_url'] = "http://xxxx/alipay/notify_url.php"; // 服務器異步通知頁面路徑 需http://格式的完整路徑,不能加?id=123這類自定義參數,必須外網能夠正常訪問 $alipay_config['return_url'] = "http://xxxx/alipay/return_url.php"; // 頁面跳轉同步通知頁面路徑 需http://格式的完整路徑,不能加?id=123這類自定義參數,必須外網能夠正常訪問
其餘配置按實際狀況配置
請求通常都是form表單post請求alipayapi.php,涉及到金錢操做的咱們都要當心嚴謹,這種請求代碼須要封裝到後端,不能前端展現出來
例如,咱們能夠後端封裝個方法來進行處理,請求這個方法將代碼echo到頁面直接進行二次跳轉
/** * 支付寶支付 * @param string $id ID */ public function getAlipayParam($id) { $form = <<<FORM <form style='display: none;' action='提交URL' name='payForm' method='post'> <input name='WIDout_trade_no' value='訂單編號'> <input name='WIDsubject' value='訂單名稱'> <input name='WIDtotal_fee' value='金額'> <input name='WIDbody' value='商品描述'> <input name='extra_common_param' value='公共回參'> </form> <script> function submitForm() { document.payForm.submit(); } submitForm(); </script> FORM; echo $form; }
在DEMO中(alipay.php)接受的請求參數並很少,實際上請求參數是很全面的:請求參數列表
咱們能夠根據實際需求進行擴展,實際開發中爲了安全,請求的name能夠適當的進行改變
/**************************請求參數**************************/ //商戶訂單號,商戶網站訂單系統中惟一訂單號,必填 $out_trade_no = $_POST['WIDout_trade_no']; //訂單名稱,必填 $subject = $_POST['WIDsubject']; //付款金額,必填 $total_fee = $_POST['WIDtotal_fee']; //商品描述,可空 $body = $_POST['WIDbody']; //公共回傳參數 $extra_common_param = $_POST['extra_common_param'];
跳轉到支付頁面進行支付
關於異步通知的參數:服務器異步通知參數列表
前面提到異步通知請求到notify_url.php(根據我的配置)
異步通知主要負責處理支付結果的業務邏輯,這個須要本身根據項目需求更改編寫
例如
<?php /* * * 功能:支付寶服務器異步通知頁面 * 版本:3.5 * 日期:2016-06-25 * 說明: * 如下代碼只是爲了方便商戶測試而提供的樣例代碼,商戶能夠根據本身網站的須要,按照技術文檔編寫,並不是必定要使用該代碼。 * 該代碼僅供學習和研究支付寶接口使用,只是提供一個參考。 *************************頁面功能說明************************* * 建立該頁面文件時,請留心該頁面文件中無任何HTML代碼及空格。 * 該頁面不能在本機電腦測試,請到服務器上作測試。請確保外部能夠訪問該頁面。 * 該頁面調試工具請使用寫文本函數logResult,該函數已被默認關閉,見alipay_notify_class.php中的函數verifyNotify * 若是沒有收到該頁面返回的 success 信息,支付寶會在24小時內按必定的時間策略重發通知 */ require_once("alipay.config.php"); require_once("admin.config.php"); require_once("lib/alipay_notify.class.php"); require_once("log.php"); //計算得出通知驗證結果 $alipayNotify = new AlipayNotify($alipay_config); $verify_result = $alipayNotify->verifyNotify(); //初始化日誌 $logHandler = new CLogFileHandler('logs/'.date('y-m-d').'.log'); $log = Log::Init($logHandler, 15); if($verify_result) {//驗證成功 Log::DEBUG(json_encode($_POST)); // 操做類型 $extra_common_param = $_POST['extra_common_param']; // 訂單編號 $code = $_POST['out_trade_no']; // 支付寶交易號 $trade_no = $_POST['trade_no']; // 交易狀態 $trade_status = $_POST['trade_status']; /** * 判斷交易狀態 * ------------------------------------------------------------------------ * 判斷該筆訂單是否在商戶網站中已經作過處理 * 若是沒有作過處理,根據訂單號(out_trade_no)在商戶網站的訂單系統中查到該筆訂單的詳細,並執行商戶的業務程序 * 請務必判斷請求時的total_fee、seller_id與通知時獲取的total_fee、seller_id爲一致的 * 若是有作過處理,不執行商戶的業務程序 * ------------------------------------------------------------------------ * 調試用,寫文本函數記錄程序運行狀況是否正常 * logResult("這裏寫入想要調試的代碼變量值,或其餘運行的結果記錄"); */ if ($trade_status == 'TRADE_FINISHED') { //注意:退款日期超過可退款期限後(如三個月可退款),支付寶系統發送該交易狀態通知 } elseif ($trade_status == 'TRADE_SUCCESS') { //注意:付款完成後,支付寶系統發送該交易狀態通知 switch ($extra_common_param) { case AdminConfig::OPER_PLACE_ORDER: // 判斷該訂單是否處理過 $url = AdminConfig::BACKOFFICE_URL . 'xxx/xxx/xxx/' . $code . '/outtradeNo/' . $trade_no; $is_order = request($url); if ($is_order == 'success') { // 訂單未處理 // 修改訂單的相關狀態爲已支付 $url = AdminConfig::BACKOFFICE_URL . 'xxx/xxx/xxx/' . $code . '/outtradeNo/' . $trade_no; request($url); } break; case AdminConfig::OPER_RECHARGE: //修改充值訂單支付狀態爲已支付 $id = $_POST['out_trade_no']; $outtrade_no = $_POST['trade_no']; $money = $_POST['total_fee']; $url = AdminConfig::ORDER_URL . 'xxx/xxx/id/'.$id.'/money/'.$money.'/outtradeno/'.$outtrade_no; request($url); break; } } echo "success"; //請不要修改或刪除 } else { //驗證失敗 echo "fail"; } /** * 發送請求 * @param string $url 請求地址 * @param array $data 請求數據 * @param string $type 請求類型 * @param boolean $ssl 是不是HTTPS請求 * @return string 響應主體Content */ function request($url, $data=array(), $type='get', $ssl=false) { // curl請求 $curl = curl_init(); // 設置curl選項 curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_AUTOREFERER, true); // referer 請求來源 curl_setopt($curl, CURLOPT_TIMEOUT, 10); // 設置超時時間 // SSL相關 if ($ssl) { curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // 是否在服務端進行驗證 curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, '2'); // 檢查服務器SSL證書中是否存在一個公用名 } // POST請求 if ($type == 'post') { curl_setopt($curl, CURLOPT_POST, true); // 是否爲post請求 curl_setopt($curl, CURLOPT_POSTFIELDS, $data); // 處理請求數據 } // 處理響應結果 curl_setopt($curl, CURLOPT_HEADER, false); // 是否處理響應頭 curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); // 是否返回響應結果 // 發送請求 $response = curl_exec($curl); if (false === $response) { return false; } return $response; } ?>
關於同步通知的參數:服務器同步通知參數列表
前面提到同步通知請求到return_url.php(根據我的配置)
同步通知主要負責處理支付結果的結果展現,這個須要本身根據項目需求更改編寫
例如
/** * 判斷該筆訂單是否在商戶網站中已經作過處理 * 若是沒有作過處理,根據訂單號(out_trade_no)在商戶網站的訂單系統中查到該筆訂單的詳細,並執行商戶的業務程序 * 若是有作過處理,不執行商戶的業務程序 */ if($_GET['trade_status'] == 'TRADE_FINISHED' || $_GET['trade_status'] == 'TRADE_SUCCESS') { // 交易成功或交易成功且訂單結束 switch ($extra_common_param) { case AdminConfig::OPER_PLACE_ORDER: // 訂單支付 $url = AdminConfig::ORDER_URL . 'xxx/orderPaySuccessShow'; header("Location:$url"); break; case AdminConfig::OPER_RECHARGE: $url = AdminConfig::ORDER_URL . 'xxx/rechargeSuccessShow'; header("Location:$url"); break; default: echo 'Undefined operation type!!'; break; } } else { // 交易狀態未成功 switch ($extra_common_param) { case AdminConfig::OPER_PLACE_ORDER: // 訂單支付 $url = AdminConfig::ORDER_URL . 'xxx/orderPayFailShow'; header("Location:$url"); break; case AdminConfig::OPER_RECHARGE: $url = AdminConfig::ORDER_URL . 'xxx/rechargeFailShow'; break; default: echo 'Undefined operation type!!'; break; } }
其餘一些細節性問題請你們參閱官方文檔,文檔永遠是最好的教程!