Payum支付集成入门指南:从零开始构建支付系统
什么是Payum
Payum是一个强大的PHP支付处理库,它提供了统一的API来集成多种支付网关。无论是PayPal、Stripe还是线下支付,Payum都能让你用相似的代码结构来处理不同的支付方式,大大简化了支付系统的开发流程。
环境准备
在开始之前,确保你的开发环境满足以下要求:
- PHP 7.2或更高版本
- Composer包管理工具
- 基本的PHP开发环境
安装Payum核心组件
Payum采用模块化设计,你可以根据需要安装特定的支付网关模块。以下是安装基础组件和离线支付模块的命令:
php composer.phar require payum/offline php-http/guzzle7-adapter
这里我们选择了离线支付模块(payum/offline)作为示例,实际项目中你可以替换为其他支付网关如payum/paypal-express-checkout-nvp或payum/stripe。
Payum工作流程解析
Payum遵循标准化的支付处理流程,主要包括以下几个步骤:
- 配置阶段:设置支付网关和存储
- 准备阶段:创建支付订单
- 捕获阶段:处理支付请求
- 完成阶段:处理支付结果
详细配置指南
1. 基础配置(config.php)
首先创建配置文件,这里我们设置一个离线支付网关作为示例:
<?php
// config.php
use Payum\Core\PayumBuilder;
use Payum\Core\Payum;
use Payum\Core\Model\Payment;
$paymentClass = Payment::class;
$payum = (new PayumBuilder())
->addGateway('aGateway', [
'factory' => 'offline',
])
->getPayum();
在实际项目中,你可能需要考虑使用更可靠的存储方案如数据库存储,而非示例中的文件系统存储。
2. 准备支付订单(prepare.php)
准备脚本负责创建支付订单并设置必要信息:
<?php
include __DIR__.'/config.php';
$gatewayName = 'aGateway';
$storage = $payum->getStorage($paymentClass);
$payment = $storage->create();
$payment->setNumber(uniqid());
$payment->setCurrencyCode('EUR');
$payment->setTotalAmount(123); // 1.23 EUR
$payment->setDescription('订单描述');
$payment->setClientId('客户ID');
$payment->setClientEmail('客户邮箱');
// 设置支付网关需要的额外参数
$payment->setDetails([
// 支付网关特定参数
]);
$storage->update($payment);
// 创建捕获令牌并重定向
$captureToken = $payum->getTokenFactory()->createCaptureToken(
$gatewayName,
$payment,
'done.php'
);
header("Location: ".$captureToken->getTargetUrl());
3. 捕获支付请求(capture.php)
捕获脚本处理实际的支付请求,这段代码是通用的,适用于所有支付网关:
<?php
include __DIR__.'/config.php';
$token = $payum->getHttpRequestVerifier()->verify($_REQUEST);
$gateway = $payum->getGateway($token->getGatewayName());
if ($reply = $gateway->execute(new Capture($token), true)) {
if ($reply instanceof HttpRedirect) {
header("Location: ".$reply->getUrl());
die();
} elseif ($reply instanceof HttpPostRedirect) {
echo $reply->getContent();
die();
}
throw new \LogicException('不支持的回复类型');
}
$payum->getHttpRequestVerifier()->invalidate($token);
header("Location: ".$token->getAfterUrl());
4. 处理支付结果(done.php)
完成脚本处理支付结果,检查状态并返回响应:
<?php
include __DIR__.'/config.php';
$token = $payum->getHttpRequestVerifier()->verify($_REQUEST);
$gateway = $payum->getGateway($token->getGatewayName());
$gateway->execute($status = new GetHumanStatus($token));
$payment = $status->getFirstModel();
header('Content-Type: application/json');
echo json_encode([
'status' => $status->getValue(),
'order' => [
'total_amount' => $payment->getTotalAmount(),
'currency_code' => $payment->getCurrencyCode(),
'details' => $payment->getDetails(),
],
]);
最佳实践建议
-
生产环境注意事项:
- 避免使用文件系统存储支付数据
- 实现适当的错误处理和日志记录
- 考虑添加CSRF保护
-
安全建议:
- 定期使旧令牌失效
- 验证所有输入数据
- 实现适当的访问控制
-
性能优化:
- 考虑缓存支付网关配置
- 优化数据库查询
- 实现异步通知处理
扩展与定制
Payum的强大之处在于它的可扩展性。你可以:
- 创建自定义支付网关
- 添加支付前后的事件处理
- 集成自定义存储后端
- 开发特定业务逻辑的扩展
通过掌握Payum的基础流程,你已经具备了集成各种支付网关的能力。无论是简单的信用卡支付还是复杂的订阅系统,Payum都能提供稳定可靠的解决方案。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考