🌉 核心定位
🔗 支付网关 = 商户系统 ↔ 银行系统 的翻译官
负责交易路由、协议转换、数据加密、结果通知
商户与银行之间的桥梁
负责交易路由、协议转换、数据加密、结果通知
| 网关 | 用户量 | 覆盖 | 特点 |
|---|---|---|---|
| 💙 支付宝 | 10亿+ | 中国 | 功能最全、AI风控、刷脸支付 |
| 💚 微信支付 | 13亿+ | 中国 | 小程序生态、私域流量 |
| 💜 Stripe | 全球 | 135+国家 | 开发者友好、多币种 |
| 💙 PayPal | 4亿+ | 190+国家 | 跨境支付、买家保护 |
所有请求必须带签名,防止数据被篡改
下面是完整的签名生成和验证过程:
# 签名算法实现详解
import hmac
import hashlib
# 步骤1: 参数预处理
def prepare_params(raw_params):
# 移除签名字段并按字典序排序
clean_params = {k: v for k, v in raw_params.items() if k != 'sign'}
return sorted(clean_params.items())
# 步骤2: 生成签名
def generate_signature(params, secret_key):
# 按参数名排序
sorted_params = prepare_params(params)
# 拼接参数字符串
param_str = "&".join([f"{k}={v}" for k, v in sorted_params])
# 添加密钥并生成签名
sign_str = f"{param_str}&key={secret_key}"
# 使用HMAC-SHA256生成签名
sign = hmac.new(
secret_key.encode('utf-8'),
sign_str.encode('utf-8'),
hashlib.sha256
).hexdigest().lower() # 转换为小写
return sign
# 步骤3: 验证签名
def verify_signature(received_params, received_sign, secret_key):
# 重新计算签名
expected_sign = generate_signature(received_params, secret_key)
# 安全比较(防止时序攻击)
return hmac.compare_digest(expected_sign, received_sign.lower())
# 使用示例
sample_params = {
"amount": "100.00",
"currency": "CNY",
"merchant_id": "M123456",
"order_id": "ORD20230101001",
"timestamp": "1672531200"
}
api_secret = "your_super_secret_api_key_here"
calculated_signature = generate_signature(sample_params, api_secret)
print(f"计算得到的签名: {calculated_signature}")
# 验证签名
is_valid = verify_signature(sample_params, calculated_signature, api_secret)
print(f"签名是否有效: {is_valid}")
同一个请求重复执行,结果一致
# 使用唯一订单号作为幂等键
def create_order(out_trade_no, amount):
# 检查订单是否已存在
order = db.get_order(out_trade_no)
if order:
return order # 已存在,直接返回
# 不存在,创建新订单
order = db.create_order(...)
return order
支付超时了怎么办?
支付成功后,页面卡住了 → 调用查询接口确认状态
# 超时后的处理流程
def pay_with_timeout(order_id):
try:
result = request_payment(order_id, timeout="30s")
except Timeout:
# 超时了?立即查询状态
status = query_order_status(order_id)
if status == "SUCCESS":
return "已支付"
else:
return "支付中,请稍后查询"
| 错误码 | 含义 | 解决方案 |
|---|---|---|
| 1001 | 参数错误 | 检查必填参数是否完整 |
| 1002 | 签名失败 | 检查签名算法和密钥 |
| 1003 | 订单不存在 | 检查订单号是否正确 |
| 1004 | 订单状态异常 | 别重复操作,换查询接口 |
| 1005 | 余额不足 | 提示用户充值 |
| 1006 | 系统繁忙 | 稍后重试 |
1. 统一下单 /api/payment/create - 创建支付订单
2. 支付查询 /api/payment/query - 查询订单状态
3. 申请退款 /api/payment/refund - 退款操作
4. 异步回调 商户提供notify_url - 接收支付结果