Laravel-pay 最优雅的微信支付

前后端分离微信支付

为了解决相关问题看了许多博客文章这里是记录解决问题和方法,文章有不对的地方给予建议哦
安装和配置就不一一介绍了请参照文档,话不多直接上代码你懂得。

参考链接

<?php
namespace App\Http\Controllers;
use SimpleSoftwareIO\QrCode\BaconQrCodeGenerator;
use Yansongda\Pay\Exceptions\GatewayException;
use Yansongda\Pay\Log;
use Yansongda\Pay\Pay;
class PayController extends Controller
{
  protected $order = [
            'out_trade_no' => time(), // 只能是数字、大小写字母_-|* 且在同一个商户号下唯一 要求32字符
            'body'         => '订单支付',
            'total_fee'    => '1',  // 订单总金额,单位为分,详见支付金额
        ];

    /**
     * 扫码支付
     *
     * @return mixed
     */
    public function weixinScanPay()
    {
        //  对支付异常捕获和支付日志记录
        try {
            $pay = Pay::wechat(config('pay.wechat'))->scan($order);
            $res = (new BaconQrCodeGenerator)
                ->format('svg')
                ->size(200)->errorCorrection("L")
                ->generate($pay['code_url']);
            return $res;
        } catch (GatewayException $e) {
            Log::info('二维码出错:' . $e->getMessage());
        }

    }

    /**
     * H5支付订单下单处理
     * @return string
     */
    public function H5Pay()
    {
       // TODO:订单处理
        $order = $this->order;
        try {
            $wap = Pay::wechat(config('pay.wechat'))->wap($order);
            // 回调地址支付完成页面  config('pay.wechat.pay_success')地址需要与前端约定
            $mweb_url = $wap->getTargetUrl() . '&redirect_url=' . config('pay.wechat.pay_success');
            $set_wap = Pay::wechat(config('pay.wechat'))->wap($order)->setTargetUrl($mweb_url);
            return $set_wap->getContent();// html内容进行跳转
        } catch (GatewayException $e) {
            Log::info(date("H:i:s") . " 订单{order['out_trade_no']}");
            if (strpos($e->getMessage(), 'OK该订单已支付') === false) {
                // 不是已支付订单
                //  $e->getMessage();
            } else {
              // 订单已支付消息;
            }

        }

    }

    /**
     * 获取 wx js api pay 信息
     *
     * @param Api $api
     * @return mixed
     */
    public function Pay()
    {
       // 业务处理
        $order = $this->order
        try {
            return Pay::wechat(config('pay.wechat'))->mp($order);
        } catch (GatewayException $e) {
            Log::info(date("H:i:s") . " 订单{order['out_trade_no']}");
            if (strpos($e->getMessage(), 'OK该订单已支付') === false) {
                // 不是已支付订单
            } else {
            // 订单已支付
            }
        }
    }
    /**
     * 支付回调 
     * @return \Symfony\Component\HttpFoundation\Response
     */
    public function notify()
    {
        try {

            Log::info('微信支付回调开始<================================支付中');

            $pay = Pay::wechat(config('pay.wechat'));

            $data = $pay->verify(); // 验签

            Log::debug('支付回调参数', $data->all());

            $outTradeNo = $data->out_trade_no;
            Log::info('订单编号====' . $outTradeNo);
           // 业务处理
        } catch (GatewayException $e) {

            Log::error('微信回调错误', [$e->getMessage()]);

        }

        Log::info('微信支付回调结束================================>支付已完成');、
        }
    }
}

laravel -pay 本地开发测试注意客户端IP地址获取

本作品采用《CC 协议》,转载必须注明作者和本文链接
sea-robbers
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 2

Parse [mch_public_cert_path] Serial Number Error 我怎么一直报这个错啊

2年前 评论
tctct 2年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!