1. 程式人生 > >php 支付寶網頁支付(TP5)

php 支付寶網頁支付(TP5)

PHP交流群:294088839

1.提交支付請求

require_once './payment/zfb/pagepay/service/AlipayTradeService.php';
require_once './payment/zfb/pagepay/buildermodel/AlipayTradePagePayContentBuilder.php';
$payInfo=Db::name('pay_type')->where(['pay_id'=>1])->find();
$zfb=json_decode($payInfo['pay_json'],true);
$config=[
    'app_id'=>$zfb['app_id'],
    'merchant_private_key'=>$zfb['merchant_private_key'],
    'notify_url'=>config('z_notify_url'),
    'return_url'=>config('z_return_url'),
    'charset'=>config('charset'),
    'sign_type'=>config('sign_type'),
    'gatewayUrl'=>config('gatewayUrl'),
    'alipay_public_key'=>$zfb['alipay_public_key']
];

//商品訂單號
$out_trade_no=$orderData['order_number'];
//訂單名稱,必填
$subject='充值訂單';
//付款金額
$total_amount=$money;
//商品描述
$body =  $out_trade_no . '-' . $this->agent_id.'-'.$money;

$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']);
echo $response;

2.非同步回撥支付寶引數認證

 $pay=Db::name('pay_type')->where(['pay_id'=>1])->find();
    $zfb=json_decode($pay['pay_json'],true);
    $config = [
        'app_id' => $zfb['app_id'],
        'merchant_private_key' => $zfb['merchant_private_key'],
        'notify_url' => config('z_notify_url'),
        'return_url' => config('z_return_url'),
        'charset' => config('charset'),
        'sign_type' => config('sign_type'),
        'gatewayUrl' => config('gatewayUrl'),
        'alipay_public_key' => $zfb['alipay_public_key']
    ];

    $arr=$_POST;
    $alipaySevice = new \AlipayTradeService($config);
    $alipaySevice->writeLog(var_export($_POST,true));
    $result = $alipaySevice->check($arr);

    /* 實際驗證過程建議商戶新增以下校驗。
    1、商戶需要驗證該通知資料中的out_trade_no是否為商戶系統中建立的訂單號,
    2、判斷total_amount是否確實為該訂單的實際金額(即商戶訂單建立時的金額),
    3、校驗通知中的seller_id(或者seller_email) 是否為out_trade_no這筆單據的對應的操作方(有的時候,一個商戶可能有多個seller_id/seller_email)
    4、驗證app_id是否為該商戶本身。
    */

    if($result) {//驗證成功

        /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        //請在這裡加上商戶的業務邏輯程式代
        //——請根據您的業務邏輯來編寫程式(以下程式碼僅作參考)——
        //獲取支付寶的通知返回引數,可參考技術文件中伺服器非同步通知引數列表
        //商戶訂單號
        $out_trade_no = $_POST['out_trade_no'];
        //支付寶交易號
        $trade_no = $_POST['trade_no'];
        //交易狀態
        $trade_status = $_POST['trade_status'];

        //交易金額
        $total_amount = $_POST['total_amount'];
        if($_POST['trade_status'] == 'TRADE_FINISHED') {
            //判斷該筆訂單是否在商戶網站中已經做過處理
            //如果沒有做過處理,根據訂單號(out_trade_no)在商戶網站的訂單系統中查到該筆訂單的詳細,並執行商戶的業務程式
            //請務必判斷請求時的total_amount與通知時獲取的total_fee為一致的
            //如果有做過處理,不執行商戶的業務程式
            //注意:
            //退款日期超過可退款期限後(如三個月可退款),支付寶系統傳送該交易狀態通知
        } else if ($_POST['trade_status'] == 'TRADE_SUCCESS') {

            //判斷該筆訂單是否在商戶網站中已經做過處理
            //如果沒有做過處理,根據訂單號(out_trade_no)在商戶網站的訂單系統中查到該筆訂單的詳細,並執行商戶的業務程式
            //請務必判斷請求時的total_amount與通知時獲取的total_fee為一致的
            //如果有做過處理,不執行商戶的業務程式
            //注意:
            //付款完成後,支付寶系統傳送該交易狀態通知
            //此處應該更新一下訂單狀態,商戶自行增刪操作

              這裡寫你的邏輯程式

        }
        //——請根據您的業務邏輯來編寫程式(以上程式碼僅作參考)——
        echo 'success';
    }else {
        //驗證失敗
        echo "fail";

    }
}

 

3.同步回撥頁面跳轉處理  同步只是做一個跳轉處理 不要寫任何資料處理 

$pay=Db::name('pay_type')->where(['pay_id'=>1])->find();
$zfb=json_decode($pay['pay_json'],true);
$config = [
    'app_id' => $zfb['app_id'],
    'merchant_private_key' => $zfb['merchant_private_key'],
    'notify_url' => config('z_notify_url'),
    'return_url' => config('z_return_url'),
    'charset' => config('charset'),
    'sign_type' => config('sign_type'),
    'gatewayUrl' => config('gatewayUrl'),
    'alipay_public_key' => $zfb['alipay_public_key']
];
$arr=$_GET;

$alipaySevice = new \AlipayTradeService($config);
$result = $alipaySevice->check($arr);

/* 實際驗證過程建議商戶新增以下校驗。
1、商戶需要驗證該通知資料中的out_trade_no是否為商戶系統中建立的訂單號,
2、判斷total_amount是否確實為該訂單的實際金額(即商戶訂單建立時的金額),
3、校驗通知中的seller_id(或者seller_email) 是否為out_trade_no這筆單據的對應的操作方(有的時候,一個商戶可能有多個seller_id/seller_email)
4、驗證app_id是否為該商戶本身。
*/
if($result) {//驗證成功
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //請在這裡加上商戶的業務邏輯程式程式碼
    //——請根據您的業務邏輯來編寫程式(以下程式碼僅作參考)——
    //獲取支付寶的通知返回引數,可參考技術文件中頁面跳轉同步通知引數列表
    //商戶訂單號
    $out_trade_no = htmlspecialchars($_GET['out_trade_no']);
    //支付寶交易號
    $trade_no = htmlspecialchars($_GET['trade_no']);

    $this->success("支付成功",url('Index/index'));

    //——請根據您的業務邏輯來編寫程式(以上程式碼僅作參考)——

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}
else {
    //驗證失敗
    echo "驗證失敗";
}