laravel 对接支付宝当面付扫码支付

发布时间:2019-11-18作者:小灵龙点击:182

第一步 开发中心>网页&移动应用下支付接入

早呢

第二步  创建应用后需添加可支付的方式

功能

 

第三步  配置公钥与私钥

公钥

 

工具下载地址   

Windows :http://p.tb.cn/rmsportal_6680_secret_key_tools_RSA_win.zip

Mac:http://p.tb.cn/rmsportal_6680_secret_key_tools_RSA_macosx.zip

 

第四步  在创建新应用中把工具刚刚生成的公钥,设置应用公钥(下图已经设置,所以为查看,设置成功会自动出现查看支付宝公钥,同时支付宝公钥是需要在项目config文件需要用到的,千万不要弄错)

开发设置

第五步  composer require yansongda/laravel-pay     支付组件

第六步  composer require simplesoftwareio/simple-qrcode    二维码生成器

第七步  laravel 配置文件    /config 目录下新建 alipay.php 文件 写入以下内容

 

		<?php

		return [

		    'pay'=>[

		        'app_id'=>'',
                               // 支付宝 支付成功后 主动通知商户服务器地址  注意 是post请求。服务器异步通知页面路径,根据自己项目路径做相应的修改。外网可访问的地址,本地不跳转
                               'notify_url' => 'http://jinghuajuanke.cn/api/home/ali_pay_ntify',
                              // 支付宝 支付成功后 回调页面 get//页面跳转同步通知页面路径。
                              'return_url' => 'http://jinghuajuanke.cn/#/pay_success',

		       

		        //支付宝公钥

		        'ali_public_key'=>'',

		        //商家应用私钥

		        'private_key'=>'',

		        

		        'log'=>[

		            'file'=>'../storage/logs/alipay.log',

		            'level'=>'info',//建设生产环境下info,开发环境下debug

		            'type'=>'single',//optional 可选daily

		            'max_file'=>30 //optional 当type是daily时有效,默认是30天

		        ],

		        'http'=>[

		            'timeout'=>5.0,

		            'connect_timeout'=>5.0,

		        ]

		    ]

		]

		?>

 

第八步  控制器。

 

		<?php
		namespace App\Http\Controllers\Admin;
		use App\Http\Controllers\Controller;
                use App\Services\OrderService;
		use Illuminate\Http\Request;
		use Yansongda\Pay\Pay;
		use Yansongda\Pay\Log;
		use SimpleSoftwareIO\QrCode\Facades\QrCode;
		use Illuminate\Support\Facades\DB;

		class AlipaysController extends Controller

		{

                       // 手机网页支付接口
    public function aliPay(Request $request)
    {
        $aliPayOrder = [
            'out_trade_no' => time(),
            'total_amount' => $order->total_amount, // 支付金额
            'subject'      => $request->subject ?? '支付宝手机网页支付' // 备注
        ];

        $config = config('alipay.pay');

        $config['return_url'] = $config['return_url'].'?id='.$request->id;

        $config['notify_url'] = $config['notify_url'].'?id='.$request->id;

        return Pay::alipay($config)->wap($aliPayOrder);
    }
// app支付接口
    public function aliPayApp(Request $request)
    {
        $aliPayOrder = [
            'out_trade_no' => time(),
            'total_amount' => $order->total_amount, // 支付金额
            'subject'      => $request->subject ?? '默认' // 备注
        ];

        $config = config('alipay.pay');

        $config['return_url'] = $config['return_url'].'?id='.$request->id;

        return Pay::alipay($config)->app($aliPayOrder);
    }
                       // 支付宝扫码支付 当面付
		    public function alipay(Request $req){

		        $aliPayOrder=[

		            'out_trade_no'=>time(),

		            'total_amount'=>'0.01',//支付金额

		            'subject'=> $req->subject ?? '扫码支付' //备注

		        ];

		        $config=config('alipay.pay');

		        $config['return_url']=$config['return_url'].'?order_guid='.$req->order_guid;

		        $scan =Pay::alipay($config)->scan($aliPayOrder);

		        if(empty($scan->code) || $scan->code !=='10000' ) return false;

		        $url=$scan->qr_code.'?order_guid='.$req->order_guid;

		        //生成二维码 order_guid是订单编号 subject是显示支付说明

		        return QrCode::encoding('UTF-8')->size(300)->generate($url);

		    }
     // 支付成功后 支付宝服务通知本项目服务器
    // post 请求
    // 这里只是大概写一下逻辑,具体的安全防护 自己再去做限制
    public function aliPayNtify(Request $request, OrderService $orderService)
    {
        $order = Order::find($request->id);
        // 更新自己项目 订单状态
        if(!empty($order))  $orderService->payOrder($order);
    }

    // 支付宝退款
    public function aliPayRefund(Request $request)
    {
        try {
            $payOrder = [
                'out_trade_no' => $order->out_trade_no, // 商家订单号
                'refund_amount' => $order->total_amount, // 退款金额  不得超过该订单总金额
                 'out_request_no' => Common::getUuid() // 同一笔交易多次退款标识(部分退款标识)
            ];

            $config = config('alipay.pay');

            // 返回状态码 code 10000 成功
            $result = Pay::alipay($config)->refund($payOrder);
            if (empty($result->code) || $result->code !== '10000') throw new \Exception('请求支付宝退款接口失败');
            // 订单改为 已退款状态
            // ~~自己商城的订单状态修改逻辑
        } catch (\Exception $exception) {
            \Log::error($exception->getMessage());
            return false;
        }
    }

		}


		?>

	

 

 

第九步  以前的坑(勿踩)

treeeeeeeeeeeeeeeee

 

再停止使用沙箱功能,用正式账号时,请注释掉此配置

注意:
1,当出现这个错误时:

cURL error 60: SSL certificate problem: unable to get local issuer certifica

点击文章查看解决办法。
2,当出现这个问题

The Process class relies on proc_open, which is not available on your PHP installation

在php.ini中找到这两个删除掉。然后重启apache
佣兵


扫码时,通过判断浏览器,是微信还是支付宝

    //判断是不是微信
    if ( strpos($_SERVER['HTTP_USER_AGENT'], 'MicroMessenger') !== false ) {
        return "微信支付的逻辑";
    }
    //判断是不是支付宝
    if (strpos($_SERVER['HTTP_USER_AGENT'], 'AlipayClient') !== false) {
        return "支付宝支付的逻辑";
    }
标签: