logo
0
0
WeChat Login

lambda-payments-app

基于 Node.js、AWS Lambda、DynamoDB、lambda-api 的支付服务,目标是给公司内部 App 提供统一支付能力,并提供一个可手工操作的管理界面。

当前版本已经具备:

  1. 外部系统可调用的订单创建、查单、退款接口
  2. 管理端可用的手工建单、查单、发起退款能力
  3. 微信与支付宝回调入口和订单状态更新链路
  4. 基础的 Serverless Framework 部署结构

注意:

  1. 微信与支付宝的真实下单签名、验签、证书校验目前是骨架位,需要你按本文档准备材料后接入真实网关
  2. 生产前必须完成沙箱联调与安全核查

一、项目约定

1) 业务约定

  1. 订单金额统一用分存储
  2. 订单最终支付成功以异步通知或主动查单为准,不以前端跳转为准
  3. 回调处理必须幂等,重复通知不能重复记账
  4. 退款能力纳入首期,退款状态与订单状态同步推进

2) 渠道约定

  1. 微信支付:商户模式,Native 扫码支付
  2. 支付宝:电脑网站支付
  3. 两个渠道都支持:下单、查单、退款、异步通知

3) 接口约定

  1. 对外业务接口使用 JSON
  2. 支付宝异步通知入口接收表单格式
  3. 管理接口需要管理令牌请求头

4) 安全约定

  1. 私钥只能放在服务端,不可放客户端
  2. 私钥、证书内容不能写入日志
  3. 管理端必须配置独立令牌
  4. 生产环境只允许 HTTPS

二、你需要准备的材料

1) AWS 材料

  1. 可部署 Lambda、API Gateway、DynamoDB、CloudWatch 的 AWS 账号
  2. 部署用 IAM 用户或角色
  3. 部署区域选择(建议先固定一个区域)

2) 微信支付材料

  1. 微信商户号
  2. 商户 APIv3 密钥
  3. 商户证书序列号
  4. 商户私钥文件
  5. 微信平台证书
  6. 微信回调地址

3) 支付宝材料

  1. 支付宝应用 APPID
  2. 应用私钥
  3. 支付宝公钥
  4. 网关地址(沙箱与生产)
  5. 支付宝异步通知地址
  6. 开通电脑网站支付产品权限

4) 业务侧材料

  1. 订单号生成规则(是否由业务方传入)
  2. 退款单号生成规则
  3. 支付成功回调到你内部系统的地址(可选)
  4. 管理端访问控制策略(IP 白名单或额外认证)

三、环境变量与配置

当前工程至少需要以下变量:

  1. ADMIN_API_KEY
  2. ORDERS_TABLE_NAME
  3. REFUNDS_TABLE_NAME
  4. EVENT_LOCKS_TABLE_NAME

建议新增的支付变量(接真实网关时):

  1. WECHAT_MCH_ID
  2. WECHAT_API_V3_KEY
  3. WECHAT_SERIAL_NO
  4. WECHAT_PRIVATE_KEY
  5. WECHAT_PLATFORM_CERT
  6. WECHAT_NOTIFY_URL
  7. ALIPAY_APP_ID
  8. ALIPAY_PRIVATE_KEY
  9. ALIPAY_PUBLIC_KEY
  10. ALIPAY_GATEWAY_URL
  11. ALIPAY_NOTIFY_URL

建议按环境分层:

  1. dev:本地联调
  2. sandbox:支付沙箱联调
  3. prod:生产

四、部署前设置

1) 本地依赖安装

cd /workspace npm install

2) AWS 凭证配置

aws configure

或使用临时角色:

export AWS_ACCESS_KEY_ID=你的Key export AWS_SECRET_ACCESS_KEY=你的Secret export AWS_REGION=ap-southeast-1

3) 管理令牌配置

export ADMIN_API_KEY=请替换为强随机字符串

4) 支付参数配置(示例)

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

五、部署命令

1) 本地启动

npm run dev

2) 部署到开发环境

npx serverless deploy --stage dev --region ap-southeast-1

3) 部署到沙箱环境

npx serverless deploy --stage sandbox --region ap-southeast-1

4) 部署到生产环境

npx serverless deploy --stage prod --region ap-southeast-1

5) 移除某个环境

npx serverless remove --stage dev --region ap-southeast-1

六、接口清单

对外业务接口

  1. POST /api/orders
  2. GET /api/orders
  3. GET /api/orders/:orderId
  4. POST /api/orders/:orderId/refunds
  5. GET /api/refunds/:refundId

支付回调接口

  1. POST /api/webhooks/wechat
  2. POST /api/webhooks/alipay

管理界面与管理接口

  1. GET /admin
  2. GET /api/admin/orders
  3. POST /api/admin/orders
  4. POST /api/admin/orders/:orderId/refunds

管理接口请求头:

  1. X-Admin-Token: 对应 ADMIN_API_KEY

七、首轮联调建议顺序

  1. 部署 sandbox 环境
  2. 用管理页面手工创建一笔微信订单
  3. 打通微信回调并确认订单状态从 PENDING_PAYMENT 到 PAID
  4. 发起退款并确认状态推进
  5. 用同样流程打通支付宝
  6. 验证重复通知幂等

八、上线检查清单

  1. 生产网关与沙箱网关已区分
  2. 生产商户号、APPID、证书、公钥已切换
  3. 私钥未出现在仓库和日志
  4. 管理令牌已更换为高强度值
  5. 回调地址可被微信和支付宝公网访问
  6. 订单金额校验和幂等校验已通过测试
  7. 前端同步返回不作为支付成功依据

九、目录结构

  1. src/handler.js:HTTP 路由入口和管理页
  2. src/services/orderService.js:订单与退款状态机核心逻辑
  3. src/services/paymentGateway.js:支付渠道适配层
  4. src/repositories/orderRepository.js:订单存储访问
  5. src/repositories/refundRepository.js:退款存储访问
  6. src/repositories/eventRepository.js:回调幂等去重
  7. serverless.yml:云资源与函数部署定义

十、下一步开发建议

  1. 接入微信支付官方 SDK,补真实下单签名、回调验签、查单、退款
  2. 接入支付宝 Node SDK,补真实 page pay、异步验签、查单、退款
  3. 增加自动重试任务(查单补偿、退款补偿)
  4. 增加审计日志和告警(失败率、回调验签失败、重复退款请求)