在 Laravel 项目中整合微信支付和支付宝支付是电商类应用的常见需求。以下是完整的实现方案:
推荐使用成熟的支付SDK包:
composer require yansongda/pay
这个包支持微信和支付宝的多重支付方式。
在 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'),
],
<?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); // 手机网站支付
}
}
<?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';
}
}
}
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']);
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();
});
通过以上方案,你可以在Laravel项目中完整地集成微信支付和支付宝支付功能。根据实际业务需求,你可以进一步扩展和优化这个基础实现。