插件窝 干货文章 如何在 Laravel 中整合微信支付和支付宝支付?

如何在 Laravel 中整合微信支付和支付宝支付?

支付 order alipay wechat 189    来源:    2025-04-01

Laravel 中整合微信支付和支付宝支付方案

在 Laravel 项目中整合微信支付和支付宝支付是电商类应用的常见需求。以下是完整的实现方案:

1. 准备工作

1.1 申请支付接口

  • 微信支付:需要企业资质,申请商户平台账号
  • 支付宝:申请开放平台商家账号

1.2 安装必要包

推荐使用成熟的支付SDK包:

composer require yansongda/pay

这个包支持微信和支付宝的多重支付方式。

2. 配置支付参数

config/services.php 中添加配置:

'wechat_pay' => [
    'app_id' => env('WECHAT_PAY_APP_ID'),
    'mch_id' => env('WECHAT_PAY_MCH_ID'),
    'key' => env('WECHAT_PAY_KEY'),
    'cert_path' => env('WECHAT_PAY_CERT_PATH'), // 证书路径
    'key_path' => env('WECHAT_PAY_KEY_PATH'),   // 密钥路径
    'notify_url' => env('WECHAT_PAY_NOTIFY_URL'),
],

'alipay' => [
    'app_id' => env('ALIPAY_APP_ID'),
    'ali_public_key' => env('ALIPAY_PUBLIC_KEY'),
    'private_key' => env('ALIPAY_PRIVATE_KEY'),
    'notify_url' => env('ALIPAY_NOTIFY_URL'),
    'return_url' => env('ALIPAY_RETURN_URL'),
],

3. 创建支付服务类

<?php

namespace App\Services;

use Yansongda\Pay\Pay;

class PaymentService
{
    // 微信支付
    public function wechatPay($order)
    {
        $order = [
            'out_trade_no' => $order['order_no'],
            'body' => $order['subject'],
            'total_fee' => $order['amount'] * 100, // 单位:分
            'openid' => $order['openid'], // JSAPI支付需要
        ];

        return Pay::wechat(config('services.wechat_pay'))
            ->mp($order);
    }

    // 支付宝支付
    public function alipay($order)
    {
        $order = [
            'out_trade_no' => $order['order_no'],
            'subject' => $order['subject'],
            'total_amount' => $order['amount'],
        ];

        return Pay::alipay(config('services.alipay'))
            ->wap($order); // 手机网站支付
    }
}

4. 控制器实现

<?php

namespace App\Http\Controllers;

use App\Services\PaymentService;
use Illuminate\Http\Request;

class PaymentController extends Controller
{
    protected $paymentService;

    public function __construct(PaymentService $paymentService)
    {
        $this->paymentService = $paymentService;
    }

    // 发起微信支付
    public function wechatPay(Request $request)
    {
        $order = [
            'order_no' => 'WX'.time(),
            'subject' => '测试商品',
            'amount' => 0.01, // 测试金额
            'openid' => $request->user()->openid,
        ];

        return $this->paymentService->wechatPay($order);
    }

    // 发起支付宝支付
    public function alipay(Request $request)
    {
        $order = [
            'order_no' => 'ALI'.time(),
            'subject' => '测试商品',
            'amount' => 0.01, // 测试金额
        ];

        return $this->paymentService->alipay($order);
    }

    // 微信支付回调
    public function wechatNotify()
    {
        $pay = Pay::wechat(config('services.wechat_pay'));

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

            // 处理订单逻辑
            \Log::info('WechatNotify', $data->all());

            return $pay->success();
        } catch (\Exception $e) {
            \Log::error('WechatNotifyError', [$e->getMessage()]);
            return 'fail';
        }
    }

    // 支付宝回调
    public function alipayNotify()
    {
        $pay = Pay::alipay(config('services.alipay'));

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

            // 处理订单逻辑
            \Log::info('AlipayNotify', $data->all());

            return $pay->success();
        } catch (\Exception $e) {
            \Log::error('AlipayNotifyError', [$e->getMessage()]);
            return 'fail';
        }
    }
}

5. 路由配置

Route::post('/payment/wechat', [PaymentController::class, 'wechatPay']);
Route::post('/payment/alipay', [PaymentController::class, 'alipay']);

// 支付回调路由 - 需要配置到支付平台后台
Route::post('/payment/wechat/notify', [PaymentController::class, 'wechatNotify']);
Route::post('/payment/alipay/notify', [PaymentController::class, 'alipayNotify']);

6. 前端集成

微信支付前端处理

axios.post('/payment/wechat', { openid: userOpenid })
  .then(response => {
    WeixinJSBridge.invoke(
      'getBrandWCPayRequest', 
      response.data,
      function(res) {
        if(res.err_msg == "get_brand_wcpay_request:ok") {
          // 支付成功
        }
      }
    );
  });

支付宝支付前端处理

axios.post('/payment/alipay')
  .then(response => {
    const div = document.createElement('div');
    div.innerHTML = response.data;
    document.body.appendChild(div);
    document.forms[0].submit();
  });

7. 安全注意事项

  1. 验证回调:必须验证支付平台回调的签名
  2. 金额校验:回调中校验金额与订单金额一致
  3. 幂等处理:防止重复处理同一笔支付
  4. 日志记录:完整记录支付和回调过程
  5. HTTPS:支付接口必须使用HTTPS

8. 测试建议

  1. 使用微信和支付宝的沙箱环境进行测试
  2. 测试各种异常情况:支付失败、重复支付、退款等
  3. 测试并发支付情况

扩展功能

  1. 支付记录表:创建支付记录表存储所有支付信息
  2. 退款功能:实现完整的退款流程
  3. 对账功能:定期与支付平台对账
  4. 多商户支持:支持多个微信/支付宝账号

通过以上方案,你可以在Laravel项目中完整地集成微信支付和支付宝支付功能。根据实际业务需求,你可以进一步扩展和优化这个基础实现。