优点:灵活性高,可控性强
缺点:需要自行处理较多细节
# 安装官方SDK
composer require yansongda/pay
推荐包:
- overtrue/laravel-pay
(支持微信和支付宝)
- yansongda/laravel-pay
(国内开发者维护)
composer require overtrue/laravel-pay
// 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'),
],
];
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'],
]);
}
}
// 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';
}
}
异步通知处理:使用队列处理支付成功后的业务逻辑
dispatch(new ProcessPaymentSuccess($paymentData));
支付日志记录:记录完整的支付请求和响应数据
PaymentLog::create([
'order_no' => $orderNo,
'payment_type' => 'wechat',
'request_data' => $requestData,
'response_data' => $responseData,
]);
多支付方式统一接口:设计统一的支付接口
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();
}
}
支付状态查询:实现主动查询支付状态功能
public function queryPaymentStatus($orderNo, $paymentType)
{
if ($paymentType === 'wechat') {
return Pay::wechat()->find($orderNo);
}
return Pay::alipay()->find($orderNo);
}
通过以上方案,您可以在Laravel框架中高效、安全地集成微信和支付宝支付功能,同时保持代码的可维护性和扩展性。