Laravel支付----支付宝篇

文档

https://pay.yanda.net.cn/docs/2.x/installation

运行环境

  1. php >= 7.0
  2. composer
  3. laravel || lumen >= 5.1

安装

composer require yansongda/laravel-pay

配置

  1. config/app.php 添加providers代码段// laravel < 5.5 Yansongda\LaravelPay\PayServiceProvider::class,添加代码
  2. config/app.php 添加aliases代码段 'Pay' => Yansongda\LaravelPay\Facades\Pay::class,
    添加代码

发布

$ php artisan vendor:publish --provider="Yansongda\LaravelPay\PayServiceProvider" --tag=laravel-pay

随后,请在 config 文件夹pay.php中完善配置信息。

Laravel支付----支付宝篇_第1张图片
.

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


/**
 * 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
Laravel支付----支付宝篇_第2张图片

完成以上配置
访问域名+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);

你可能感兴趣的:(PHP)