首先,下載支付寶提供的demo。
下載demo,目錄結構如下:
把 alipay.trade.wap.pay-PHP-UTF-8文件夾拿出來,放到tp5根目錄 vendor 文件夾下,重命名為alipay:
配置config.php內的內容
<?php $config = array ( //應用ID,您的APPID。 'app_id' => "2016102212345813", //商戶私鑰 'merchant_private_key' => "MIIEvQIBADAN HQL9bkGvrVR/R2QlXFMSBD+HTtH2qjY=", //異步通知地址 'notify_url' => "http://域名/Pay/Alipay/notifyUrl", //同步跳轉 'return_url' => "http://域名/Pay/Alipay/returnUrl", //編碼格式 'charset' => "UTF-8", //簽名方式 'sign_type'=>"RSA2", //支付寶網關 //'gatewayUrl' => "https://openapi.alipay.com/gateway.do",//正式支付地址 'gatewayUrl' => "https://openapi.alipaydev.com/gateway.do",//沙盒支付地址 //支付寶公鑰,查看地址:https://openhome.alipay.com/platform/keyManage.htm 對應APPID下的支付寶公鑰。 'alipay_public_key' => "MIIBIj gD3ogRaVNGHdQIDAQAB", );
添加Alipay.php控制器
<?php namespace app\index\controller; use think\Controller; use think\Request; use think\Db; class Alipay extends Controller { public function index(Request $request){ header("Content-type:text/html;charset=utf-8"); require_once VENDOR_PATH.'/alipay/config.php'; require_once VENDOR_PATH.'/alipay/pagepay/service/AlipayTradeService.php'; require_once VENDOR_PATH.'/alipay/pagepay/buildermodel/AlipayTradePagePayContentBuilder.php'; $param = $request->param(); //商戶訂單號,商戶網站訂單系統中唯一訂單號,必填 $out_trade_no = trim($param['out_trade_no']); //訂單名稱,必填 $subject = trim($param['subject']); //付款金額,必填 $total_amount = trim($param['total_amount']); //商品描述,可空 $body = trim($param['body']); //公用回傳參數 // $passback_params = http_build_query($param['purchaseInfo']); //$passback_params = urlencode($param['buyer']); //構造參數 $payRequestBuilder = new \AlipayTradePagePayContentBuilder(); $payRequestBuilder->setBody($body); $payRequestBuilder->setSubject($subject); $payRequestBuilder->setTotalAmount($total_amount); $payRequestBuilder->setOutTradeNo($out_trade_no); //電腦網站支付請求 $aop = new \AlipayTradeService($config); $response = $aop->pagePay($payRequestBuilder,$config['return_url'],$config['notify_url']); //輸出表單 var_dump($response); } /** * 異步 * @param Request $request * @throws \Exception */ public function notifyUrl(Request $request){ $param = $request->param(); require_once VENDOR_PATH.'/alipay/config.php'; require_once VENDOR_PATH.'/alipay/pagepay/service/AlipayTradeService.php'; require_once VENDOR_PATH.'/alipay/pagepay/buildermodel/AlipayTradePagePayContentBuilder.php'; $alipaySevice = new \AlipayTradeService($config); $alipaySevice->writeLog(var_export($param,true)); $result = $alipaySevice->check($param); if($result) { //驗證成功 $out_trade_no = urldecode($param['out_trade_no']); if($param['trade_status'] == 'TRADE_SUCCESS') { //判斷該筆訂單是否在商戶網站中已經做過處理 //如果沒有做過處理,根據訂單號(out_trade_no)在商戶網站的訂單系統中查到該筆訂單的詳細,並執行商戶的業務程序 //請務必判斷請求時的total_amount與通知時獲取的total_fee為一致的 //如果有做過處理,不執行商戶的業務程序 //注意: //付款完成后,支付寶系統發送該交易狀態通知 } echo "success"; }else { //驗證失敗 echo "fail"; } } /** * 同步 * @param Request $request * @throws \Exception */ public function returnUrl(Request $request){ $param = $request->param(); require_once VENDOR_PATH.'/alipay/config.php'; require_once VENDOR_PATH.'/alipay/pagepay/service/AlipayTradeService.php'; require_once VENDOR_PATH.'/alipay/pagepay/buildermodel/AlipayTradePagePayContentBuilder.php'; $alipaySevice = new \AlipayTradeService($config); $result = $alipaySevice->check($param); /* 實際驗證過程建議商戶添加以下校驗。 1、商戶需要驗證該通知數據中的out_trade_no是否為商戶系統中創建的訂單號, 2、判斷total_amount是否確實為該訂單的實際金額(即商戶訂單創建時的金額), 3、校驗通知中的seller_id(或者seller_email) 是否為out_trade_no這筆單據的對應的操作方(有的時候,一個商戶可能有多個seller_id/seller_email) 4、驗證app_id是否為該商戶本身。 */ if($result) { //驗證成功 echo "驗證成功"; } else { //驗證失敗 echo "驗證失敗"; } } } ?>
添加自己處理數據的方法
web頁面
<!DOCTYPE html> <html> <head> <title>alipay_test</title> </head> <body> <form name=alipayment action="{:url('Alipay/index')}" method="post" target="_blank"> 商戶訂單號:<input type="text" name="out_trade_no" value="{$out_trade_no}" /><br/> 訂單名稱:<input type="text" name="subject" value="{$subject}"/><br/> 付款金額:<input type="text" name="total_amount" value="{$body}" /><br/> 商品描述:<input type="text" name="body" value="{$body}"/><br/> <button type="submit">付 款</button> </form> </body> </html>
效果: