基于 Node.js、AWS Lambda、DynamoDB、lambda-api 的支付服务,目标是给公司内部 App 提供统一支付能力,并提供一个可手工操作的管理界面。
当前版本已经具备:
- 外部系统可调用的订单创建、查单、退款接口
- 管理端可用的手工建单、查单、发起退款能力
- 微信与支付宝回调入口和订单状态更新链路
- 基础的 Serverless Framework 部署结构
注意:
- 微信与支付宝的真实下单签名、验签、证书校验目前是骨架位,需要你按本文档准备材料后接入真实网关
- 生产前必须完成沙箱联调与安全核查
- 订单金额统一用分存储
- 订单最终支付成功以异步通知或主动查单为准,不以前端跳转为准
- 回调处理必须幂等,重复通知不能重复记账
- 退款能力纳入首期,退款状态与订单状态同步推进
- 微信支付:商户模式,Native 扫码支付
- 支付宝:电脑网站支付
- 两个渠道都支持:下单、查单、退款、异步通知
- 对外业务接口使用 JSON
- 支付宝异步通知入口接收表单格式
- 管理接口需要管理令牌请求头
- 私钥只能放在服务端,不可放客户端
- 私钥、证书内容不能写入日志
- 管理端必须配置独立令牌
- 生产环境只允许 HTTPS
- 可部署 Lambda、API Gateway、DynamoDB、CloudWatch 的 AWS 账号
- 部署用 IAM 用户或角色
- 部署区域选择(建议先固定一个区域)
- 微信商户号
- 商户 APIv3 密钥
- 商户证书序列号
- 商户私钥文件
- 微信平台证书
- 微信回调地址
- 支付宝应用 APPID
- 应用私钥
- 支付宝公钥
- 网关地址(沙箱与生产)
- 支付宝异步通知地址
- 开通电脑网站支付产品权限
- 订单号生成规则(是否由业务方传入)
- 退款单号生成规则
- 支付成功回调到你内部系统的地址(可选)
- 管理端访问控制策略(IP 白名单或额外认证)
当前工程至少需要以下变量:
- ADMIN_API_KEY
- ORDERS_TABLE_NAME
- REFUNDS_TABLE_NAME
- EVENT_LOCKS_TABLE_NAME
建议新增的支付变量(接真实网关时):
- WECHAT_MCH_ID
- WECHAT_API_V3_KEY
- WECHAT_SERIAL_NO
- WECHAT_PRIVATE_KEY
- WECHAT_PLATFORM_CERT
- WECHAT_NOTIFY_URL
- ALIPAY_APP_ID
- ALIPAY_PRIVATE_KEY
- ALIPAY_PUBLIC_KEY
- ALIPAY_GATEWAY_URL
- ALIPAY_NOTIFY_URL
建议按环境分层:
- dev:本地联调
- sandbox:支付沙箱联调
- prod:生产
cd /workspace
npm install
aws configure
或使用临时角色:
export AWS_ACCESS_KEY_ID=你的Key
export AWS_SECRET_ACCESS_KEY=你的Secret
export AWS_REGION=ap-southeast-1
export ADMIN_API_KEY=请替换为强随机字符串
export WECHAT_MCH_ID=你的微信商户号
export WECHAT_API_V3_KEY=你的APIv3密钥
export ALIPAY_APP_ID=你的支付宝APPID
export ALIPAY_GATEWAY_URL=https://openapi.alipay.com/gateway.do
npm run dev
npx serverless deploy --stage dev --region ap-southeast-1
npx serverless deploy --stage sandbox --region ap-southeast-1
npx serverless deploy --stage prod --region ap-southeast-1
npx serverless remove --stage dev --region ap-southeast-1
- POST /api/orders
- GET /api/orders
- GET /api/orders/:orderId
- POST /api/orders/:orderId/refunds
- GET /api/refunds/:refundId
- POST /api/webhooks/wechat
- POST /api/webhooks/alipay
- GET /admin
- GET /api/admin/orders
- POST /api/admin/orders
- POST /api/admin/orders/:orderId/refunds
管理接口请求头:
- X-Admin-Token: 对应 ADMIN_API_KEY
- 部署 sandbox 环境
- 用管理页面手工创建一笔微信订单
- 打通微信回调并确认订单状态从 PENDING_PAYMENT 到 PAID
- 发起退款并确认状态推进
- 用同样流程打通支付宝
- 验证重复通知幂等
- 生产网关与沙箱网关已区分
- 生产商户号、APPID、证书、公钥已切换
- 私钥未出现在仓库和日志
- 管理令牌已更换为高强度值
- 回调地址可被微信和支付宝公网访问
- 订单金额校验和幂等校验已通过测试
- 前端同步返回不作为支付成功依据
- src/handler.js:HTTP 路由入口和管理页
- src/services/orderService.js:订单与退款状态机核心逻辑
- src/services/paymentGateway.js:支付渠道适配层
- src/repositories/orderRepository.js:订单存储访问
- src/repositories/refundRepository.js:退款存储访问
- src/repositories/eventRepository.js:回调幂等去重
- serverless.yml:云资源与函数部署定义
- 接入微信支付官方 SDK,补真实下单签名、回调验签、查单、退款
- 接入支付宝 Node SDK,补真实 page pay、异步验签、查单、退款
- 增加自动重试任务(查单补偿、退款补偿)
- 增加审计日志和告警(失败率、回调验签失败、重复退款请求)