共计 2553 个字符,预计需要花费 7 分钟才能阅读完成。
背景痛点
开发者在接入 ChatGPT 类应用的支付功能时,常常会遇到以下几个问题:

- 支付超时:用户支付后系统未及时收到回调,导致订单状态未更新。
- 重复扣款:由于网络波动或用户重复点击,可能触发多次支付请求。
- 回调验证:支付平台回调的验证机制不完善,容易遭受伪造请求攻击。
- 订单状态同步:支付成功后的订单状态同步不及时,影响用户体验。
- 数据安全:敏感支付信息如卡号、CVV 等未加密存储或传输。
这些问题不仅影响用户体验,还可能带来财务风险。因此,构建一个安全可靠的支付系统至关重要。
技术选型
常见的支付接口包括支付宝、微信支付和 Stripe,各有其适用场景:
- 支付宝 :适合国内用户,接入文档丰富,支持多种支付方式。
- 微信支付 :与微信生态深度集成,适合微信内支付场景。
- Stripe:国际化支付解决方案,支持全球多种货币和支付方式。
对于 ChatGPT 类应用,如果用户群体主要是国内用户,支付宝和微信支付是首选;如果是国际化应用,Stripe 更为合适。接入复杂度上,Stripe 的 API 设计较为简洁,而支付宝和微信支付的文档较为详细但配置稍复杂。
核心实现
支付流程设计
一个典型的支付流程包括以下步骤:
- 用户发起支付请求,生成订单。
- 调用支付平台接口获取支付链接或二维码。
- 用户完成支付,支付平台发送异步通知。
- 系统验证通知并更新订单状态。
时序图如下:
sequenceDiagram
participant User
participant System
participant PaymentPlatform
User->>System: 发起支付请求
System->>PaymentPlatform: 调用支付接口
PaymentPlatform-->>User: 返回支付链接 / 二维码
User->>PaymentPlatform: 完成支付
PaymentPlatform->>System: 发送异步通知
System->>PaymentPlatform: 验证通知
System->>User: 更新订单状态
关键代码示例(Python)
以下是一个简单的支付接口调用和异步通知处理的代码示例:
import hashlib
import hmac
from flask import Flask, request, jsonify
app = Flask(__name__)
# 支付接口调用
def create_payment(order_id, amount):
# 调用支付平台接口,生成支付链接
# 这里以 Stripe 为例
import stripe
stripe.api_key = "your_stripe_api_key"
try:
payment_intent = stripe.PaymentIntent.create(
amount=amount,
currency="usd",
metadata={"order_id": order_id}
)
return {"client_secret": payment_intent.client_secret}
except Exception as e:
return {"error": str(e)}
# 异步通知处理
@app.route('/payment/webhook', methods=['POST'])
def payment_webhook():
payload = request.data
sig_header = request.headers.get('Stripe-Signature')
try:
# 验证签名
event = stripe.Webhook.construct_event(payload, sig_header, "your_webhook_secret")
except ValueError as e:
return jsonify({"error": "Invalid payload"}), 400
except stripe.error.SignatureVerificationError as e:
return jsonify({"error": "Invalid signature"}), 400
# 处理支付成功事件
if event['type'] == 'payment_intent.succeeded':
payment_intent = event['data']['object']
order_id = payment_intent.metadata.get('order_id')
# 更新订单状态
update_order_status(order_id, "paid")
return jsonify({"status": "success"}), 200
def update_order_status(order_id, status):
# 更新订单状态的逻辑
pass
订单状态机设计
订单状态机是支付系统的核心,典型的状态包括:
created:订单已创建,等待支付。pending:支付进行中,等待支付平台回调。paid:支付成功。failed:支付失败。refunded:已退款。
状态转换规则如下:
created->pending:用户发起支付。pending->paid:支付成功。pending->failed:支付失败或超时。paid->refunded:用户申请退款。
安全考量
防重放攻击机制
重放攻击是指攻击者截获支付请求后重复发送,导致重复扣款。防范措施包括:
- 使用唯一订单号(order_id)确保请求唯一性。
- 在支付平台接口中设置幂等性参数(如 Stripe 的
idempotency_key)。
敏感数据加密方案
- 传输层:使用 HTTPS 加密通信。
- 存储层:对敏感数据如卡号、CVV 等进行加密存储,推荐使用 AES-256。
避坑指南
- 支付超时 :设置合理的超时时间(如 15 分钟),超时后自动取消订单。
- 重复扣款 :在支付接口调用时设置幂等性参数。
- 回调验证 :严格验证支付平台回调的签名,防止伪造请求。
- 订单状态同步 :定期检查未完成订单的状态,避免漏单。
- 数据安全 :避免在日志中记录敏感信息,如卡号、CVV 等。
实践建议
完整的 Demo 代码仓库地址:GitHub Repo
结尾思考
- 如何在高并发场景下保证支付系统的性能和可靠性?
- 支付系统中的分布式事务如何处理?比如订单服务和库存服务的数据一致性。
- 如何设计一个多租户的支付系统,支持不同商户的个性化需求?
正文完
发表至: 未分类
近两天内
