Laravel5.8集成支付宝,微信支付+支付沙箱测试教程

由于前人已经帮我们踩了太多的坑,我们在遇到问题的时候可以非常迅速的解决。

Snipaste_2020-06-04_10-28-57.png

所以在此我们没必要去死磕支付宝官方的sdk。

#教程开始

##准备一个包

composer require yansongda/pay

 ##配置config设置

在config下创建一个pay配置文件,config/pay.php

<?php

return [
    'alipay' => [
        'app_id'         => '',
        'ali_public_key' => '',
        'private_key'    => '',
        'log'            => [
            'file' => storage_path('logs/alipay.log'),
        ],
    ],

    'wechat' => [
        'app_id'      => '',
        'mch_id'      => '',
        'key'         => '',
        'cert_client' => '',
        'cert_key'    => '',
        'log'         => [
            'file' => storage_path('logs/wechat_pay.log'),
        ],
    ],
];
参数先留空,我们先把服务容器给做了。


PS:如果你不知道啥是服务容器可以看一下官方的文档https://learnku.com/docs/laravel/5.8/container/3886

##注入服务容器

我们通常在`AppServiceProvider`的register()中进行注入实例;

当然我们这边先要在这个文件中加载一下文件的限定名称


use Monolog\Logger;
use Yansongda\Pay\Pay;


public function register()
    {
        // 往服务容器中注入一个名为 alipay 的单例对象
        $this->app->singleton('alipay', function () {
            $config = config('pay.alipay');
            // 判断当前项目运行环境是否为线上环境
            if (app()->environment() !== 'production') {
                $config['mode']         = 'dev';
                $config['log']['level'] = Logger::DEBUG;
            } else {
                $config['log']['level'] = Logger::WARNING;
            }
            // 调用 Yansongda\Pay 来创建一个支付宝支付对象
            return Pay::alipay($config);
        });
    }

##完善配置文件

###那么如何获取参数呢?,首先我们先打开https://openhome.alipay.com/platform/appDaily.htm?tab=info 登陆

Snipaste_2020-06-04_22-56-54.pngSnipaste_2020-06-04_22-56-59.pngSnipaste_2020-06-04_22-57-03.pngSnipaste_2020-06-04_22-57-19.pngSnipaste_2020-06-04_22-57-25.pngSnipaste_2020-06-04_22-57-29.pngSnipaste_2020-06-04_22-57-32.png

'app_id' => '你在支付宝沙箱看到的appid',
'ali_public_key' => '支付宝沙箱显示的公钥',
'private_key' => '刚刚生成的私钥',


##最后查看一下调用方法 丢到web.php 瞅瞅

Route::get('alipay', function() {
    return app('alipay')->web([
        'out_trade_no' => time(),
        'total_amount' => '1',
        'subject' => 'test subject - 测试',
    ]);
});

##开始那么支付成功之后如何写回调呢?


//前端回调
    public function alipayReturn()
    {
        // 校验提交的参数是否合法
        $data = app('alipay')->verify();
        //上面的verify是用来校验签名的来判断是否被人恶意更改
        // dump($data);
        $order = DB::table('146_orders')->where('ordernum',$data->out_trade_no)->first();
        if(!$order){
            //这说明啥?这说明付款了一个不存在的订单
            return 'fail';
        }
        //如果这个参数为1说明交易成功
        if($order->status){
            return app('alipay')->success();
        }
        //cpinlj3041@sandbox.com
        DB::table('146_orders')->where('ordernum',$data->out_trade_no)->update(['status'=>1]);
        dump($data);
        app('alipay')->success();
        return redirect()->route('myorders');
    }

    // 服务器端回调
    public function alipayNotify()
    {
        $data = app('alipay')->verify();
        //因为后端回调我们木得办法看到结果只能写入日志了啦~
        \Log::debug('Alipay notify', $data->all());
    }
}
 ##此处写法只是非常笼统。并且由于是测试环境,所以我们这边将原先后端回调中的代码,写入到了前端回调中。


 ##那么使用服务门面将回调功能也写入

app\Http\Controller\Providers\AppServiceProvider.php

public function register()
    {
        // 往服务容器中注入一个名为 alipay 的单例对象
        $this->app->singleton('alipay', function () {
            $config = config('pay.alipay');
            // $config['notify_url'] = route('orders.alipay.notify');
            $config['return_url'] = route('orders.alipay.return');
            // 判断当前项目运行环境是否为线上环境
            if (app()->environment() !== 'production') {
                $config['mode']         = 'dev';
                $config['log']['level'] = Logger::DEBUG;
            } else {
                $config['log']['level'] = Logger::WARNING;
            }
            // 调用 Yansongda\Pay 来创建一个支付宝支付对象
            return Pay::alipay($config);
        });
    }
    //至此应该就能完成一个简单的支付+回调demo


版权声明:若无特殊注明,本文为《周小雨》原创,转载请保留文章出处。
本文链接:https://zxyy.me/post-184.html
正文到此结束

热门推荐

管理员已关闭本篇文章评论!