首先使用yansongda/pay包集成支付功能,配置支付宝和微信支付参数至config/payment.php并存储敏感信息到.env文件;接着在控制器中调用Pay::alipay()->web()发起网页支付,跳转至支付宝收银台;支付完成后,支付宝POST请求notify_url,需在alipayNotify方法中验证签名、更新订单状态并返回success响应;对于微信JSAPI支付,调用Pay::wechat()->mp()生成前端所需参数;最后遵循安全实践:验证签名、比对数据库金额、使用HTTPS、记录日志并处理重复通知,确保支付流程安全可靠。
在 Laravel 中实现支付功能,尤其是集成
支付宝
和
微信
支付,是电商类项目中的常见需求。虽然 Laravel 本身不提供原生支付支持,但借助第三方包和良好的架构设计,可以高效、安全地完成支付集成。
选择合适的支付 SDK
直接调用支付宝或微信的 API 比较繁琐,推荐使用社区广泛使用的封装包:
yansongda/pay
:这是目前 Laravel 中最流行的支付解决方案,支持支付宝、微信支付(公众号、小程序、App、扫码等)、银联等,文档完善,更新活跃。
通过 Composer 安装:
composerrequire yansongda/pay
配置支付宝与微信支付
创建配置文件,例如
config/payment.php
,集中管理支付参数:
return [
'alipay' => [
'app_id' => env('ALI_APP_ID'),
'notify_url' => '/pay/alipay/notify',
'return_url' => '/pay/alipay/return',
'ali_public_key' => env('ALI_PUBLIC_KEY'), // 支付宝公钥
'private_key' => env('ALI_PRIVATE_KEY'), // 应用私钥
'log' => [
'file' => storage_path('logs/alipay.log'),
],
'mode' => 'normal', // 'dev' 或 'normal'
],
'wechat' => [
'app_id' => env('WECHAT_APP_ID'),
'mch_id' => env('WECHAT_MCH_ID'),
'key' => env('WECHAT_KEY'),
'notify_url' => '/pay/wechat/notify',
'cert_client' => storage_path('certs/apiclient_cert.pem'),
'cert_key' => storage_path('certs/apiclient_key.pem'),
'log' => [
'file' => storage_path('logs/wechat.log'),
],
],
];
将敏感信息写入
.env
文件中,确保安全性。
发起支付请求(以支付宝为例)
在控制器中使用
发起网页支付:
PHP 8.5.5
PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。
下载
use Yansongda\Pay\Pay;
public function payWithAlipay(Request $request)
{
$order = [
'out_trade_no' => uniqid(),
'total_amount' => '0.01',
'subject' => '测试商品',
];
return Pay::alipay(config('payment.alipay'))->web($order);
}
该方法会自动跳转到支付宝收银台页面。
处理异步通知(回调)
支付完成后,支付宝或微信会向你配置的
发送 POST 请求,必须正确处理以更新订单状态。
public function alipayNotify()
{
$pay = Pay::alipay(config('payment.alipay'));
try {
$data = $pay->verify(); // 验证签名
// 更新订单:$data->out_trade_no, $data->trade_no
if ($data->trade_status == 'TRADE_SUCCESS') {
// 标记订单为已支付
}
return $pay->success(); // 返回成功响应
} catch (\Exception $e) {
\Log::error('支付宝回调失败:' . $e->getMessage());
return 'fail';
}
}
注意:不能在回调中重定向或返回 HTML,必须返回字符串
或调用
方法。
微信支付示例(JSAPI 公众号支付)
适用于公众号内调起支付:
$order = [
'out_trade_no' => uniqid(),
'body' => '公众号支付测试',
'total_fee' => 1, // 单位为分
'openid' => $userOpenid,
];
$result = Pay::wechat(config('payment.wechat'))->mp($order);
// 返回给前端调用微信 JS SDK 所需参数
return response()->json($result);
安全与最佳实践
所有回调必须验证签名,防止伪造请求。
订单金额应从数据库读取比对,避免前端传参篡改。
使用 HTTPS 确保通信安全。
记录完整的支付日志,便于排查问题。
处理重复通知,确保订单状态幂等更新。
基本上就这些。通过使用
yansongda/pay
这类成熟组件,Laravel 集成支付宝和微信支付变得非常清晰可控。关键是理解流程:生成订单 → 调起支付 → 异步通知 → 更新状态。只要按规范实现,稳定性有保障。
yansongda/paynotify_urlsuccesssuccess()