laravel–支付宝支付和微信支付

由于个人用户不能认证支付宝支付,所以,我们学习的话,只能是使用沙箱环境
https://opendocs.alipay.com/open/200/105311

支付宝也提供了相关API文档,不过也是要我们自己去组装起来使用的,
https://opendocs.alipay.com/apis

去安装扩展包

找到laravel的扩展包

安装命令

composer require yansongda/laravel-pay:~3.0.0

安装完成后,再去发布配置文件

php artisan vendor:publish --provider="YansongdaLaravelPayPayServiceProvider" --tag=laravel-pay

发布完成后,会多出来一个配置文件

下一步,我们去配置吧
打开支付宝开放平台,进入沙箱应用去开启这个

然后,可以去下载生成秘钥的工具
https://opendocs.alipay.com/open/291/105971


值得注意的是,我安装的是3.0版本的yansongda/pay,与2.x版本的区别还是挺大的,光是配置,就发生了很大的改变,使用的都是RSA2密钥(证书模式)

与之相对应的

必须得这样的一个问题,2.x和3.x的区别就在这里

配置好后,就可以去使用它的API了

我在项目中去使用

//支付宝支付
        if ($request->input('type') == 'aliyun') {
            $order = [
                'out_trade_no' => $order->order_no,
                'total_amount' => $order->amount / 100,
                'subject' => $order->goods->first()->title . '等' . $order->goods()->count() . '商品',
            ];
            return Pay::alipay()->scan($order);
        }

成功后会返回响应的支付资源

但是返回的这个并不是可以直接使用的,

“qr_code”: “https://qr.alipay.com/bax06122avdovvu30uty0034”

这个链接是还需要去生成二维码才可以去扫码

可以去草料测试,

既然支付成功了,那么就要去接收支付宝返回的回调了

但是,既然要接收回调,我的域名也要被外部访问,但是,我使用的是本地环境,外部是不允许访问了,还好,homestead提供了解决这个问题的方案

有时,您可能希望跟您的同事共享您的工作内容。Vagrant 内置了一个通过 vagrant share 的方法实现之;但是,若您在
Homestead.yaml 文件中配置了多站点则无法正常工作。

我现在的homestead是使用的多站点,所以,
要解决这个问题,Homestead 包含了自己的 share 命令。通过 vagrant ssh 进入到您的 Homestead 机器,然后运行 share homestead.test 以实现之。这将从您的 Homestead.yaml 配置文件共享 homestead.test 站点
比如,我的本地域名是api.test,那么就执行share api.test

这样外部就可以访问了

竟然可以访问了,就需要把他配置在回调里面

我的方法是,创建一个支付的控制器,在控制器里面写一个方法,专门接受回调

 /*
     * 回调
     */
    public function notifyAliyun(Request $request)
    {
        $alipay = Pay::alipay();

        try {
            $data = $alipay->callback(); // 是的,验签就这么简单!

            // 请自行对 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、其它业务逻辑情况
            Log::info('回调数据' . $data);
        } catch (Exception $e) {
            // $e->getMessage();
        }

        return $alipay->success();
    }

路由

/*
     * 支付回调
     */
    //支付成功后接受支付宝返回回调
    $api->any('pay/notify/aliyun', [AppHttpControllersApiPayController::class, 'notifyAliyun']);

然后在configpay.php里面

'notify_url' => 'http://6a95-112-96-52-100.ngrok.io/api/pay/notify/aliyun',

这样就可以接受回调了

接收回调成功

然后就可以去做他的逻辑判断了

这个就是验签了

 public function notifyAliyun(Request $request)
    {
        $alipay = Pay::alipay();

        try {
            $data = $alipay->callback(); // 是的,验签就这么简单!
             Log::info('回调数据' . $data);
        } catch (Exception $e) {
            // $e->getMessage();
        }

        return $alipay->success();
    }

然后就是逻辑判断了

// 1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号;
// 2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额);
// 3、校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据的对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email);
// 4、验证app_id是否为该商户本身。
// 5、其它业务逻辑情况
//判断支付状态
            // 对 trade_status 进行判断及其它逻辑进行判断,在支付宝的业务通知中,只有交易通知状态为 TRADE_SUCCESS 或 TRADE_FINISHED 时,支付宝才会认定为买家付款成功。

if ($data->trade_status == 'TRADE_SUCCESS' || $data->trade_status == 'TRADE_FINISHED') {
    //查询订单
    // 1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号;
    $order = Order::where('order_no', $data->out_trade_no)->first();
    //更新订单数据
    $order->update([
        'status' => 2,//更改状态为已支付
        'pay_time' => $data->gmt_payment,//支付时间
        'pay_type' => '支付宝',//设置支付类型
        'trade_no' => $data->trade_no,//支付单号,不是在数据中的单号,在退款的时候用到
    ]);
}

完整代码:

  /*
     * 回调
     */
    public function notifyAliyun(Request $request)
    {
        $alipay = Pay::alipay();

        try {
            $data = $alipay->callback(); // 是的,验签就这么简单!

            // 1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号;
            // 2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额);
            // 3、校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据的对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email);
            // 4、验证app_id是否为该商户本身。
            // 5、其它业务逻辑情况
            //判断支付状态
            // 对 trade_status 进行判断及其它逻辑进行判断,在支付宝的业务通知中,只有交易通知状态为 TRADE_SUCCESS 或 TRADE_FINISHED 时,支付宝才会认定为买家付款成功。
            if ($data->trade_status == 'TRADE_SUCCESS' || $data->trade_status == 'TRADE_FINISHED') {
                //查询订单
                // 1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号;
                $order = Order::where('order_no', $data->out_trade_no)->first();
                //更新订单数据
                $order->update([
                    'status' => 2,//更改状态为已支付
                    'pay_time' => $data->gmt_payment,//支付时间
                    'pay_type' => '支付宝',//设置支付类型
                    'trade_no' => $data->trade_no,//支付单号,不是在数据中的单号,在退款的时候用到
                ]);
            }
            Log::info('回调数据' . $data);
        } catch (Exception $e) {
            // $e->getMessage();
        }

        return $alipay->success();
    }

如果日志无报错的话,就可以正常更新订单数据了,阿里的支付宝支付大概流程就差不多这样了

接下来的是微信支付,由于微信支付需要商务号才能测试,使用,我个人是没有办法测试的了,所以,只能是写好代码就可以了

微信支付和支付宝支付差不多,首先先去配置好环境

'wechat' => [
        'default' => [
            // 公众号 的 app_id
            'mp_app_id' => '',
            // 小程序 的 app_id
            'mini_app_id' => '',
            // app 的 app_id
            'app_id' => '',
            // 商户号
            'mch_id' => '',
            // 合单 app_id
            'combine_app_id' => '',
            // 合单商户号
            'combine_mch_id' => '',
            // 商户秘钥
            'mch_secret_key' => '',
            // 商户私钥
            'mch_secret_cert' => '',
            // 商户公钥证书路径
            'mch_public_cert_path' => '',
            // 微信公钥证书路径
            'wechat_public_cert_path' => [
                '' => '',
            ],
            //接收回调数据地址
            'notify_url' => 'http://6a95-112-96-52-100.ngrok.io/api/pay/notify/wechat',
            'mode' => Pay::MODE_NORMAL,
        ],
    ],

也需要去创建一个接收数据的控制器方法

 /*
     * 微信支付成功之后的回调
     */
    public function notifyWechat()
    {
	 $wechat = Pay::wechat();
	   return $wechat->success();
}

路由

 //微信支付成功后接受支付宝返回回调
    $api->any('pay/notify/wechat', [AppHttpControllersApiPayController::class, 'notifyWechat']);

完整代码

/*
     * 微信支付成功之后的回调
     */
    public function notifyWechat()
    {
        $wechat = Pay::wechat();

        try {
            $data = $wechat->callback(); // 是的,验签就这么简单!

            //判断支付状态
            if ($data->return_code == 'SUCCESS') {
                //查询订单
                $order = Order::where('order_no', $data->out_trade_no)->first();
                //更新订单数据
                $order->update([
                    'status' => 2,//更改状态为已支付
                    'pay_time' => now(),//支付时间
                    'pay_type' => '微信',//设置支付类型
                    'trade_no' => $data->transaction_id,//支付单号,不是在数据中的单号,在退款的时候用到
                ]);
            }
            Log::info('wechat回调数据' . $data);
        } catch (Exception $e) {
            // $e->getMessage();
        }

        return $wechat->success();
    }

版权声明:
作者:linrux
链接:https://www.tot7.cn/technology/php/77.html
来源:阿信博客
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>