插件窝 干货文章 如何用 Laravel 框架高效集成微信和支付宝支付?

如何用 Laravel 框架高效集成微信和支付宝支付?

支付 wechat pay alipay 656    来源:    2025-03-31

Laravel 框架高效集成微信和支付宝支付方案

一、准备工作

1. 支付账户申请

  • 微信支付:申请商户账号并获取 AppID、MCH ID、API Key
  • 支付宝:申请企业账号并获取 APPID、商户私钥、支付宝公钥

2. Laravel 环境要求

  • PHP 7.3+
  • Laravel 8.x/9.x/10.x
  • Composer 依赖管理

二、推荐集成方案

方案1:使用官方SDK + 自定义封装

优点:灵活性高,可控性强
缺点:需要自行处理较多细节

# 安装官方SDK
composer require yansongda/pay

方案2:使用成熟的Laravel支付包

推荐包: - overtrue/laravel-pay (支持微信和支付宝) - yansongda/laravel-pay (国内开发者维护)

composer require overtrue/laravel-pay

三、具体实现步骤

1. 配置支付参数

// config/pay.php
return [
    'wechat' => [
        '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'),
        'private_key' => env('ALIPAY_PRIVATE_KEY'),
        'ali_public_key' => env('ALIPAY_PUBLIC_KEY'),
        'notify_url' => env('ALIPAY_NOTIFY_URL'),
        'return_url' => env('ALIPAY_RETURN_URL'),
    ],
];

2. 创建支付服务类

namespace App\Services;

use Overtrue\LaravelPay\Facades\Pay;

class PaymentService
{
    public function wechatPay(array $orderData)
    {
        return Pay::wechat()->scan([
            'out_trade_no' => $orderData['order_no'],
            'total_fee' => $orderData['amount'] * 100, // 单位:分
            'body' => $orderData['description'],
        ]);
    }

    public function alipay(array $orderData)
    {
        return Pay::alipay()->web([
            'out_trade_no' => $orderData['order_no'],
            'total_amount' => $orderData['amount'],
            'subject' => $orderData['description'],
        ]);
    }
}

3. 处理支付回调

// routes/api.php
Route::post('pay/notify/wechat', 'PaymentController@wechatNotify');
Route::post('pay/notify/alipay', 'PaymentController@alipayNotify');

// PaymentController.php
public function wechatNotify(Request $request)
{
    $pay = Pay::wechat();

    try {
        $data = $pay->verify();
        // 处理订单逻辑
        Log::info('Wechat notify:', $data->all());

        return $pay->success();
    } catch (\Exception $e) {
        Log::error('Wechat notify error:', ['error' => $e->getMessage()]);
        return response('FAIL', 400);
    }
}

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

    try {
        $data = $pay->verify();
        // 处理订单逻辑
        Log::info('Alipay notify:', $data->all());

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

四、优化建议

  1. 异步通知处理:使用队列处理支付成功后的业务逻辑

    dispatch(new ProcessPaymentSuccess($paymentData));
    
  2. 支付日志记录:记录完整的支付请求和响应数据

    PaymentLog::create([
       'order_no' => $orderNo,
       'payment_type' => 'wechat',
       'request_data' => $requestData,
       'response_data' => $responseData,
    ]);
    
  3. 多支付方式统一接口:设计统一的支付接口

    public function pay(Request $request)
    {
       $paymentType = $request->input('payment_type');
       $orderData = $this->validateOrder($request);
    
       switch ($paymentType) {
           case 'wechat':
               return $this->wechatPay($orderData);
           case 'alipay':
               return $this->alipay($orderData);
           default:
               throw new InvalidPaymentMethodException();
       }
    }
    
  4. 支付状态查询:实现主动查询支付状态功能

    public function queryPaymentStatus($orderNo, $paymentType)
    {
       if ($paymentType === 'wechat') {
           return Pay::wechat()->find($orderNo);
       }
    
       return Pay::alipay()->find($orderNo);
    }
    

五、安全注意事项

  1. 使用HTTPS协议传输支付数据
  2. 验证支付回调的签名
  3. 不要信任客户端传递的支付金额,应从服务端获取
  4. 支付成功后使用服务端状态验证,而非依赖客户端跳转
  5. 定期检查支付密钥和证书的安全性

六、测试建议

  1. 使用沙箱环境测试支付流程
  2. 模拟各种支付失败场景
  3. 测试高并发下的支付处理能力
  4. 验证退款流程的正确性
  5. 测试网络异常情况下的支付处理

通过以上方案,您可以在Laravel框架中高效、安全地集成微信和支付宝支付功能,同时保持代码的可维护性和扩展性。