沙箱 vs 生产两阶段分别需要什么、密钥怎么拿、备案到底卡在哪一步。配套独立支付服务 pay(PC 网页支付 alipay.trade.page.pay)。
| 沙箱(现在就能做) | 生产(收真钱) | |
|---|---|---|
| 企业实名 | 不需要 | 需要(营业执照/对公/法人) |
| 产品签约 | 不需要 | 需签约「电脑网站支付」 |
| 域名 | 不需要 | 签约审核基本要备案域名 |
| ICP 备案 | 不需要 | 基本绕不开(见第二节) |
| HTTPS | 不需要(localhost 即可) | 需要(域名证书) |
| 能验证什么 | 下单→跳收银台→扫码付→(查单兜底)全链路 | 真实到账 + 异步回调 notify |
技术层面:不绑域名就不触发 ICP 备案(备案=域名+大陆服务器对外提供服务)。而且有个对支付宝有利的事实:
notify_url / return_url 支付宝不校验是否备案——只要能 POST 回调到你的地址就行。这点和微信不同(微信 JSAPI/H5 要在后台填「已备案授权域名」)。所以单从回调技术看,甚至能用服务器公网 IP 当 notify_url 把真实支付跑通。
但「想正经收真钱」时,备案基本还是绕不开,卡在这三处:
| 卡点 | 说明 |
|---|---|
| 商户签约审核 | 申请生产「电脑网站支付」要提交网站地址,支付宝审核要求网站可正常访问且合规,实践中基本要备案域名(裸 IP 网站过审很难) |
| HTTPS | 给纯 IP 签受信任 HTTPS 证书极难(Let's Encrypt 不给 IP 发证),无 HTTPS 收款页显示「不安全」 |
| 微信支付 | 微信必须填备案授权域名,完全绕不开 |
支付宝账号登录 → https://open.alipay.com/develop/sandbox/app。页面直接给你 沙箱 APPID(形如 9021000xxxxxxxxx)。
加签方式选 公钥模式(对应代码 LoadAliPayPublicKey)。下载官方密钥生成工具(有 Mac 版)→ 格式 PKCS8、长度 2048 → 生成得到 应用私钥 和 应用公钥。
把应用公钥粘贴到沙箱「公钥模式」处保存,页面会生成一串 支付宝公钥。
沙箱页「沙箱账号」标签提供买家账号(邮箱)+ 登录密码 + 支付密码(假钱)。扫码付需装沙箱版支付宝 App(同页二维码),或用沙箱网页登录买家付款。
登录 open.alipay.com → 用企业支付宝账号完成企业实名认证(营业执照、法人/对公信息)。个体户用对应类型亦可。
控制台 → 创建应用 → 选「网页 & 移动应用」→ 得到 正式 APPID。
应用里「添加能力/产品签约」→ 签约「电脑网站支付」(对应 alipay.trade.page.pay)。需提交企业资质、网站地址(基本要备案域名)、经营信息。审核约 1–3 个工作日。
密钥工具生成应用私钥/公钥 → 应用「接口加签方式 → 公钥模式」上传应用公钥 → 复制返回的「支付宝公钥」。
把正式 APPID/应用私钥/支付宝公钥写入商户配置,production: true(代码走正式网关),base_url 用正式 HTTPS 备案域名。
| 拿到的 | 来源 | 填到哪 |
|---|---|---|
| APPID | 沙箱页面 / 生产应用页直接给 | config.yaml → alipay_sandbox.app_id(或 merchants 表) |
| 应用私钥 | 你用密钥工具生成,自己保管 | 环境变量 ALIPAY_APP_PRIVATE_KEY |
| 支付宝公钥 | 上传应用公钥后支付宝生成 | 环境变量 ALIPAY_PUBLIC_KEY |
cd /Users/wangjia/code/pay
export ALIPAY_APP_PRIVATE_KEY="MIIEv...应用私钥..."
export ALIPAY_PUBLIC_KEY="MIIBIj...支付宝公钥..."
# config.yaml 里 alipay_sandbox.enabled=true、填上 app_id
go run .
# 浏览器开 http://localhost:8080 选套餐 → 跳沙箱收银台 → 沙箱买家账号付款
query_sync 主动查单兜底会在 30 秒内把订单补成「已支付」,结果页照样变 ✅。要完整验证 notify 需内网穿透或部署到公网服务器。
两条线独立推进:A 线现在就能把代码全跑通,B 线(域名/备案/签约)慢慢走;B 线齐了,只需「换生产密钥 + 换备案域名」即可上线,主流程一行不改(Merchant.Production + base_url)。