7.0 KiB
7.0 KiB
Stripe国际支付集成指南
概述
本项目已成功集成Stripe国际信用卡支付功能,支持多种国际货币(USD、EUR、GBP、JPY等)的在线支付。Stripe适配器已完整实现并集成到现有的统一支付架构中。
功能特性
✅ 已实现功能
-
支付订单管理
- 创建Stripe PaymentIntent
- 查询支付状态
- 支持多种国际货币
-
Webhook处理
- 安全的签名验证
- 异步支付结果通知
- 订单状态同步
-
退款管理
- 申请退款
- 查询退款状态
- 部分退款支持
-
安全特性
- Webhook签名验证
- 环境变量配置管理
- 错误处理和日志记录
-
API接口
- RESTful API设计
- Swagger文档自动生成
- 完整的DTO验证
环境配置
必需的环境变量
在.env文件中添加以下Stripe配置:
# Stripe配置
STRIPE_SECRET_KEY=sk_test_your_secret_key_here
STRIPE_PUBLISHABLE_KEY=pk_test_your_publishable_key_here
STRIPE_WEBHOOK_SECRET=whsec_your_webhook_secret_here
# 服务器配置(用于回调URL)
SERVER_URL=https://your-domain.com
获取Stripe密钥
-
注册Stripe账号
- 访问 stripe.com
- 创建账号并完成验证
-
获取API密钥
- 登录Stripe Dashboard
- 进入"开发者" -> "API密钥"
- 复制可发布密钥和密钥
-
设置Webhook
- 进入"开发者" -> "Webhook"
- 添加端点:
https://your-domain.com/api/v1/payment/stripe/webhook - 选择事件:
payment_intent.succeeded - 复制签名密钥
API使用指南
1. 创建支付订单
POST /api/v1/payment/stripe/create-order
Content-Type: application/json
{
"userId": "user_123",
"businessType": "credit_purchase",
"businessId": "credits_500",
"amount": 4800,
"currency": "USD",
"description": "购买500积分包",
"customerEmail": "user@example.com"
}
响应示例:
{
"orderId": "order_123",
"paymentIntentId": "pi_test_123",
"clientSecret": "pi_test_123_secret_abc",
"publishableKey": "pk_test_123",
"amount": 4800,
"currency": "USD",
"status": "pending",
"createdAt": "2024-01-01T00:00:00.000Z"
}
2. 查询订单状态
GET /api/v1/payment/stripe/order/{orderId}
3. 申请退款
POST /api/v1/payment/stripe/refund
Content-Type: application/json
{
"orderId": "order_123",
"refundAmount": 2400,
"reason": "用户申请退款"
}
4. 查询退款状态
GET /api/v1/payment/stripe/refund/{refundId}
5. 获取支持的货币
GET /api/v1/payment/stripe/supported-currencies
前端集成示例
React + Stripe Elements
import { loadStripe } from '@stripe/stripe-js';
import {
Elements,
CardElement,
useStripe,
useElements
} from '@stripe/react-stripe-js';
const stripePromise = loadStripe('pk_test_your_publishable_key');
function PaymentForm({ clientSecret }) {
const stripe = useStripe();
const elements = useElements();
const handleSubmit = async (event) => {
event.preventDefault();
if (!stripe || !elements) return;
const cardElement = elements.getElement(CardElement);
const { error, paymentIntent } = await stripe.confirmCardPayment(
clientSecret,
{
payment_method: {
card: cardElement,
billing_details: {
email: 'user@example.com',
},
}
}
);
if (error) {
console.error('支付失败:', error);
} else {
console.log('支付成功:', paymentIntent);
}
};
return (
<form onSubmit={handleSubmit}>
<CardElement />
<button type="submit" disabled={!stripe}>
支付
</button>
</form>
);
}
function App() {
const [clientSecret, setClientSecret] = useState('');
// 创建支付订单获取clientSecret
useEffect(() => {
fetch('/api/v1/payment/stripe/create-order', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
userId: 'user_123',
businessType: 'credit_purchase',
businessId: 'credits_500',
amount: 4800,
currency: 'USD'
})
})
.then(res => res.json())
.then(data => setClientSecret(data.clientSecret));
}, []);
return (
<Elements stripe={stripePromise}>
<PaymentForm clientSecret={clientSecret} />
</Elements>
);
}
支持的货币
| 货币代码 | 货币名称 | 符号 | 最小单位 |
|---|---|---|---|
| USD | 美元 | $ | 2位小数 |
| EUR | 欧元 | € | 2位小数 |
| GBP | 英镑 | £ | 2位小数 |
| JPY | 日元 | ¥ | 0位小数 |
| AUD | 澳元 | A$ | 2位小数 |
| CAD | 加元 | C$ | 2位小数 |
| SGD | 新加坡元 | S$ | 2位小数 |
| HKD | 港币 | HK$ | 2位小数 |
测试
运行单元测试
# 运行Stripe适配器测试
npm test stripe-payment.adapter.spec.ts
# 运行所有支付相关测试
npm test payment
测试用卡号
Stripe提供以下测试卡号:
- 成功支付: 4242 4242 4242 4242
- 需要验证: 4000 0025 0000 3155
- 被拒绝: 4000 0000 0000 0002
- 余额不足: 4000 0000 0000 9995
使用任意未来日期作为过期时间,任意3位数字作为CVC。
监控和日志
日志级别
- INFO: 正常的支付流程日志
- WARN: 配置问题和可恢复错误
- ERROR: 支付失败和系统错误
关键监控指标
- 支付成功率
- 响应时间
- 错误率
- 退款处理时间
安全注意事项
-
密钥管理
- 绝不在客户端暴露密钥
- 使用环境变量存储敏感信息
- 定期轮换API密钥
-
Webhook安全
- 始终验证Webhook签名
- 使用HTTPS端点
- 实现幂等性处理
-
金额处理
- 服务端验证所有金额
- 使用整数避免浮点精度问题
- 实现金额限制和验证
故障排查
常见问题
-
支付失败
- 检查Stripe密钥配置
- 验证货币代码格式
- 确认金额范围有效
-
Webhook失败
- 验证端点URL可访问
- 检查签名密钥配置
- 确认事件类型选择
-
退款问题
- 确认订单支付成功
- 检查退款金额限制
- 验证Charge ID存在
调试步骤
- 查看应用日志
- 检查Stripe Dashboard事件
- 验证Webhook配置
- 测试API端点连通性
部署注意事项
生产环境
- 使用生产环境Stripe密钥
- 配置HTTPS回调地址
- 设置适当的日志级别
- 配置监控和告警
性能优化
- 使用数据库连接池
- 实现适当的缓存策略
- 配置合理的超时时间
- 监控内存和CPU使用
更新日志
- v1.0.0: 初始Stripe集成实现
- 支付订单创建
- Webhook处理
- 退款功能
- 多货币支持
- 完整测试覆盖
技术支持
如有问题,请参考:
- Stripe官方文档
- 项目API文档
- 查看应用日志和错误信息