文档
https://pay.yanda.net.cn/docs/2.x/installation
运行环境
- php >= 7.0
- composer
- laravel || lumen >= 5.1
安装
composer require yansongda/laravel-pay
配置
- config/app.php 添加providers代码段
// laravel < 5.5 Yansongda\LaravelPay\PayServiceProvider::class,
- config/app.php 添加aliases代码段
'Pay' => Yansongda\LaravelPay\Facades\Pay::class,
发布
$ php artisan vendor:publish --provider="Yansongda\LaravelPay\PayServiceProvider" --tag=laravel-pay
随后,请在 config 文件夹pay.php中完善配置信息。
.
env 文件里面配置
// alipay 配置
ALI_APP_ID=
ALI_PUBLIC_KEY=
ALI_PRIVATE_KEY=
// wechat 配置
WECHAT_APP_ID=
WECHAT_MINIAPP_ID=
WECHAT_APPID=
WECHAT_MCH_ID=
WECHAT_KEY=
创建控制器
AliPayController.php
<?php
/**
* Created by PhpStorm.
* User: 97235
* Date: 2019/10/18
* Time: 14:57
*/
namespace App\Http\Controllers;
use Illuminate\Support\Facades\DB;
use Yansongda\Pay\Pay;
use Yansongda\Pay\Log;
use App\Services\OrderService;
use SimpleSoftwareIO\QrCode\Facades\QrCode;
class AliPayController extends Controller
{
public function index()
{
$order = [
'out_trade_no' => time(),
'total_amount' => '1',
'subject' => '测试',
'timeout_express'=>'15m'//该笔订单允许的最晚付款时间,逾期将关闭交易。取值范围:1m~15d。m-分钟,h-小时,d-天,1c-当天(1c-当天的情况下,无论交易何时创建,都在0点关闭)。 该参数数值不接受小数点
];
$alipay = Pay::alipay(config('pay.alipay'))->web($order);
return $alipay->send();// laravel 框架中请直接 `return $alipay`
}
// 支付宝扫码 支付
public function aliPayScan($code,$price,$id='1',$name = null)
{
$aliPayOrder = [
'out_trade_no' => $code,
'total_amount' => $price, // 支付金额
'subject' => $name ?? '扫码支付', // 备注
'timeout_express'=>'15m'//该笔订单允许的最晚付款时间,逾期将关闭交易。取值范围:1m~15d。m-分钟,h-小时,d-天,1c-当天(1c-当天的情况下,无论交易何时创建,都在0点关闭)。 该参数数值不接受小数点
];
$scan = Pay::alipay(config('pay.alipay'))->scan($aliPayOrder);
if(empty($scan->code) || $scan->code !== '10000') return false;
$url = $scan->qr_code.'?order_guid='.$id;
return $url;
// 生成二维码
//二维码生成器 需要安装composer require simplesoftwareio/simple-qrcode
// return QrCode::encoding('UTF-8')->size(300)->generate($url);
}
public function return()
{
$data = Pay::alipay(config('pay.alipay'))->verify(); // 是的,验签就这么简单!
Log::debug('Paying...', $data->all());
// 订单号:$data->out_trade_no
// 支付宝交易号:$data->trade_no
// 订单总金额:$data->total_amount
}
public function notify(){
$alipay = Pay::alipay(config('pay.alipay'));
try {
$data = $alipay->verify(); // 是的,验签就这么简单!
Log::debug('Alipay 回调获取到的参数', $data->all());
// 请自行对 trade_status 进行判断及其它逻辑进行判断,在支付宝的业务通知中,只有交易通知状态为 TRADE_SUCCESS 或 TRADE_FINISHED 时,支付宝才会认定为买家付款成功。
// 1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号;
// 2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额);
// 3、校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据的对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email);
// 4、验证app_id是否为该商户本身。
// 5、其它业务逻辑情况
if ($data->trade_status =='TRADE_SUCCESS' || $data->trade_status =='TRADE_FINISHED'){
//验证app_id是否为该商户本身。然后写入数据
//Log::debug('写入数据成功', []);
return $alipay->success();// laravel 框架中请直接 `return $alipay->success()`
} else{
return 'error';
}
} catch (\Exception $e) {
$e->getMessage();
// return $alipay->success();// laravel 框架中请直接 `return $alipay->success()`
}
}
}
配置路由
Route::get('alipay','AliPayController@index');
Route::post('notify','AliPayController@notify');
Route::get('return','AliPayController@return');
由于异步回到是post请求 所以需要绕过route的token验证
http/Middleware/VerifyCsrfToken.php
添加 notify
完成以上配置
访问域名+alipay
调用支付即刻使用
$AliPay= new AliPayController();
$url= $AliPay->aliPayScan($code,$price,$id='1',$name);
//
$img= QrCode::format('png')->merge('/public/qrcodes/logo.png')->errorCorrection('H')->size(300)->generate($url);
$img= base64_encode($img);