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