支付寶掃碼支付+php+ThinkPHP5

PC網站中大部分情況用的是支付寶的電腦網站支付功能,但是有時候需要用到支付寶的掃碼支付功能。
這個功能類似於微信的掃碼支付,流程是根據訂單信息生成二維碼,用戶用支付寶掃碼,付款,前端輪詢監測訂單狀態。上代碼以及目錄
(1)支付寶開放平臺申請應用,獲得appid ,支付寶公鑰,商傢俬鑰
(2)下載支付寶的掃碼支付的sdk,兩個文件夾aop,f2fpay,以及訂單提交檢驗的文件alipay.php(隨後有目錄截圖,附件)
(3)將支付寶信息的配置文件放在extra文件夾下 。命名爲alipay.php
(4)下載phpqrcode類(生成二維碼的類)放在extend下的phpqrcode文件夾中
(5)選擇api模塊控制器中的方法,生成訂單,調用生成二維碼的類,並且在該模塊下寫支付回調。
目錄截圖
在這裏插入圖片描述
Alipayscan.php

<?php
namespace app\api\controller;

use phpqrcode\QRcode;
use alipay\alipay;

class Alipayscan
{
    public function index()
    {
        $data = [
            'notify_url' => 'http://www.thinkphp5.com/api/alipayscan/notify_url', //回調鏈接
            'return_url' => '',
            'out_trade_no' => time(), //訂單號
            'subject' => 'TEST ', //產品標題
            'total_fee' => 0.01,//訂單金額,單位爲元
            'body' => 'TEST', //產品描述
        ];
        import('alipay.alipay',EXTEND_PATH,'.php');
        $alipay = new Alipay;
        $result = $alipay->qrpay($data);
        if (!$result['code']) {
            return $this->error($result['msg']);
        }

        $url = $result['msg'];

        $payImage = "<img alt='掃碼支付' src='http://www.thinkphp5.com/api/alipayscan/QR?data={$url}'/>";
        return $payImage;

    }

    public function QR()
    {
        //二維碼生成
        import('phpqrcode.phpqrcode', EXTEND_PATH, '.php');
        $url = $_GET['data'];
        QRcode::png($url);
    }

    public function notify_url()
    {
        //這裏是回調邏輯,要驗籤,檢驗金額,
        //主要業務邏輯 訂單狀態改變,支付記錄日誌
    }

}

extra\alipay.php

<?php
return [
    //簽名方式,默認爲RSA2(RSA2048)
    'sign_type' => "RSA2",
    //支付寶公鑰
    'alipay_public_key' =>'',
    //商戶祕鑰
    'merchant_private_key' =>'',
    //編碼格式
    'charset' => "UTF-8",
    //支付寶網關
    'gatewayUrl' => "https://openapi.alipay.com/gateway.do",
    //應用ID
    'app_id' => "",
    //異步通知地址
    'notify_url' => "",
    //最大查詢重試次數
    'MaxQueryRetry' => "10",
    //查詢間隔
    'QueryDuration' => "3",
];

extend\alipay.php

<?php
namespace alipay;
use think\Validate;
use think\Log;
/**
 * 支付寶掃碼支付
 */
class Alipay
{
    public function qrpay($data = [])
    {
        $validate = new Validate([
            ['out_trade_no','require','訂單編號輸入錯誤'],
            ['total_fee','require','金額輸入錯誤'],
            ['subject','require','請輸入標題'],
            ['body','require','請輸入描述'],
            ['notify_url','require','異步通知地址不爲空'],
        ]);
        if (!$validate->check($data)) {
            return ['code'=>0,'msg'=>$validate->getError()];
        }


        $timeExpress = "5m";//超時時間
        import('alipay.f2fpay.model.builder.AlipayTradePrecreateContentBuilder', EXTEND_PATH);
        import('alipay.f2fpay.service.AlipayTradeService', EXTEND_PATH);
        // 創建請求builder,設置請求參數
        $qrPayRequestBuilder = new \AlipayTradePrecreateContentBuilder();
        $qrPayRequestBuilder->setOutTradeNo($data['out_trade_no']);
        $qrPayRequestBuilder->setTotalAmount($data['total_fee']);
        $qrPayRequestBuilder->setTimeExpress($timeExpress);
        $qrPayRequestBuilder->setSubject($data['subject']);
        $qrPayRequestBuilder->setBody($data['body']);
        // 調用qrPay方法獲取當面付應答
        $config = config('alipay');
        if (!empty($data['notify_url'])) {
            $config['notify_url'] = $data['notify_url'];
        }
        $qrPay = new \AlipayTradeService($config);
        $qrPayResult = $qrPay->qrPay($qrPayRequestBuilder);

        //  根據狀態值進行業務處理
        switch ($qrPayResult->getTradeStatus()){
            case "SUCCESS":
                 echo "支付寶創建訂單二維碼成功:"."<br>---------------------------------------<br>";

                $response = $qrPayResult->getResponse();
//                return ['code'=>1,'msg'=>$qrPay->create_erweima($response->qr_code)];
                return ['code'=>1,'msg'=>$response->qr_code];
                break;
            case "FAILED":
                // echo "支付寶創建訂單二維碼失敗!!!"."<br>--------------------------<br>";

                return ['code'=>0,'msg'=>'支付寶創建訂單二維碼失敗!!!'];
                break;
            case "UNKNOWN":
                // echo "系統異常,狀態未知!!!"."<br>--------------------------<br>";

                return ['code'=>0,'msg'=>'系統異常,狀態未知!!!'];
                break;
            default:

                return ['code'=>0,'msg'=>'不支持的返回狀態,創建訂單二維碼返回異常!!!'];
                break;
        }
        return ;
    }

}


aop 和否f2fpay文件不做展示,直接下載即可。
也可以網盤下載文件:鏈接:https://pan.baidu.com/s/1N049vHp0Ay3IDRaRo0w-jg
提取碼:wphg

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章