ZovoCard 帮助与博客
帮助中心 / developers

卖卡密图文教程:协议、开放 API、自托管 CDK 站与日常对账

面向卖卡密的代理:直充协议、开发者 API 密钥与回调、部署自托管 CDK 站,以及发码、兑换与对账的图文步骤。

更新 2026-10-05

第 4 章 协议简介

4.1 工作流程

协议的工作流程

  1. 你在卡台或自己的 CDK 站发一批卡密,选好套餐、数量和付款地区。
  2. 把卡密卖给买家,渠道不限,发卡网、群聊、私聊都可以。
  3. 买家拿着卡密和自己 ChatGPT 账号的完整 Session,到你的 CDK 站(或你对接的页面)兑换。
  4. 站点依次调用卡台的预览、预检和兑换接口,之后只查询结果。
  5. 卡台用你名下的卡付款,买家的账号开通。
  6. 买家在结果页看到开通完成,你在后台对账。

费用的承担方式(CDK 接入文档 §6.18.6):

  • 发码时按张扣服务费,金额以账户的实时配置为准。
  • 买家兑换时,卡片注资和订阅实付由 CDK 所有者,也就是发码人承担。

所以卡密每被兑换一张,你名下的卡和余额就会被用掉一次,发码前请确认余额充足。

4.2 确认账号权限

开放 API 文档 §6.18.1 规定,账户需要是正常的主账户、没有卡片操作限制,并且已经有一笔入账的充值,同时满足下面任意一条:

  1. 管理员手工开通了 GPT 直充;
  2. 是管理员账户;
  3. 会员等级达到超级 SVIP、至尊 SVIP 或传奇 SVIP。达标后自动开通,不用另外申请。

最直接的判断方法是登录卡台,看左侧菜单里有没有「商城与工具 → 直充协议」。

左侧菜单中的「直充协议」

有这一项,说明已经有权限。没有的话,可以在充值页的「会员权益」里查看各等级的门槛,或者通过帮助中心联系客服申请。

子账户也可以使用,前提是主账户满足上面的条件,并且给子账户授予了 gpt_direct 权限。

部署 CDK 站还需要开放 API 权限,用来创建 API 密钥。开发者页没有解锁时会显示「开发者功能尚未解锁」,页面说明是「累计充值满 3000U 后自动解锁开放 API;代理也可以提交 API 权限工单申请」,同时显示你当前的累计充值金额。

4.3 两种用法

卡密系统(自托管 CDK 站) 自己对接(调用 API)
适合 想卖卡密、让买家自助兑换,不打算写代码 有开发能力,想把兑换接进自己的网站或机器人
需要做的事 准备服务器和域名,用官方脚本部署,在后台发码 在服务器端用 API 密钥调用接口,自己做页面和业务逻辑
买家看到的页面 你的域名下的兑换页:输入卡密、粘贴 Session、查看结果 你自己做的页面
本文对应的章节 第 6、7 章,或 AI 代办版 第 5 章、7.11 和官方《开放 API 文档》

拿不定主意的话,选卡密系统。官方的自托管 CDK 站已经实现了预览、预检、兑换和查询结果的完整流程,部署好就能用。

4.4 需要准备的东西

序号 项目 说明
1 有「直充协议」权限、余额充足的卡台账号 见第 1 章和 4.2
2 一个卡台 API 密钥(sk_ 开头),已设置 IP 白名单 见第 5 章,开发者页需要已经解锁
3 一台 Linux 服务器,推荐 Ubuntu 22.04 / 24.04 或 Debian 12,内存 2GB 以上 任意云服务商
4 一个域名,已解析到服务器的 IP;服务器放行 80 和 443 端口 任意域名服务商

第 5 章 开发者页:API 密钥和回调

这一章的操作都在卡台网页上完成,目的是创建一个 API 密钥,并限制好它的使用范围。部署 CDK 站和自己写程序对接都要用到这个密钥。

帮助中心「开放 API 接入前准备」要求:密钥不能写进公开网页,也不能交给第三方;子账号使用还需要主账户授予对应的权限。

5.1 打开开发者页

登录卡台,在左侧菜单进入「商城与工具 → 开发者」。

如果页面显示「开发者功能尚未解锁」,说明账号还没有开放 API 权限。页面的说明是「累计充值满 3000U 后自动解锁开放 API;代理也可以提交 API 权限工单申请」,按说明办理后再回来。

开发者页

标号 位置 说明
1 Base URL 生产环境的接口地址 https://zovocard.com/openapi/v1
2 鉴权、限流、幂等 请求头带 X-API-Key: <app_secret>,也可以用 Authorization: Bearer <app_secret>。写操作要带 Idempotency-Key 请求头,重试时沿用同一个值,就不会重复开卡或扣费。限流方面,页面写的是每个密钥每分钟 300 次,官方文档附录写的是默认每分钟 100 次,写程序时按 100 次设计更稳妥,遇到 429 按指数退避重试
3 隐藏 GPT 直充 API 与 CDK 「进入隐藏功能」只有在账号具备 GPT 直充 API 权限时才显示,里面有各套餐的 CDK 创建服务费、购买 CDK 和 CDK 接入文档
4 我的 API 密钥 「+ 创建密钥」创建密钥,并设置 IP 白名单和消费限额(5.2、5.3)

页面下方还有「通用回调 Webhook」(5.4)和「接口文档」(5.5)。

5.2 创建 API 密钥

  1. 在「我的 API 密钥」区域点「+ 创建密钥」。按钮左边的数字框是新密钥的消费限额,0 表示不限制,可以先填,也可以创建后再改。
  2. 列表里新增一行,其中:
    • App ID:ak_ 开头,是公开的标识;
    • App Secret:sk_ 开头,相当于密码。

创建成功后新增的一行(App Secret 为示例值)

警告:App Secret 只完整显示这一次,页面提示「创建后仅完整显示一次,遗失请删除重建」。创建后马上复制,保存在密码管理器或服务器上只有你能读的文件里,不要截图,也不要发到群里。

5.3 设置 IP 白名单和消费限额

设置 IP 白名单和消费限额

项目 填法 原因
IP 白名单 填服务器的出口 IP,多个 IP 用英文逗号隔开,点「保存」 官方文档附录 A.1 规定,新签发的密钥必须先填服务器出口 IP,否则调用会被 403 拒绝(「该密钥尚未配置 IP 白名单」)。要填的是服务器的公网出口 IP,不是你自己电脑的 IP,也不是内网地址。页面表头写着「空=不限」,文档的接入流程里也写着「可选」,但以附录 A.1 为准,一定要填
消费限额(U) 这个密钥累计最多能花的金额,0 表示不限制 官方文档说明,API 密钥有独立的累计消费上限,和账户余额分开控制。上限用完后,账户里有钱也会被拒绝。建议设一个够用的额度,程序出错时不至于多花钱
状态 启用开关,可以随时停用这个密钥 密钥泄露时先停用,再删除重建

查看服务器出口 IP 的方法:在服务器上运行 curl -fsS https://api.ipify.org,输出的就是。第 6 章会用到。

5.4 回调地址(Webhook)

回调是订单状态变化时,卡台主动发给你的通知。官方文档的相关规定:

  • 回调地址必须是有效的 https 公网地址,不接受 http、localhost 和内网 IP,长度不超过 256 个字符。
  • 自己的 CDK 站(文档里叫「白标 CDK」)应该使用密钥级回调:在这个密钥那一行点「Webhook」,填写回调地址,勾选订阅的事件。自托管 CDK 站建议勾选 gpt_direct.* 和 cdk.*。带 * 的是通配项,包含同一前缀下的全部事件;弹窗默认只勾了 gpt_direct.completed。
  • 第一次保存非空的回调地址时,系统会为这个密钥生成专用的签名密钥(whsec_ 开头),在开发者页可以看到,用来校验请求是否真的来自卡台。
  • 回调只是通知,可能收不到,也可能晚到或重复到。订单的状态以订单查询为准,可以按 updated_after 分页补查。接收端要在 10 秒左右返回 2xx,否则卡台会重试。
  • 把回调地址清空并保存,就会停止推送。
  • 页面上的「通用回调」用于商城订单,自托管 CDK 站用不到。
  • 回调地址填你自己的接收接口,不是卡台官网的地址。

在密钥那一行点「Webhook」打开的弹窗(签名密钥为示例值)

回调地址要等第 6 章部署完、CDK 站有了域名之后再来填,CDK 站对应的接收地址是 https://你的域名/api/v1/webhooks/cardplatform。

5.5 下载官方文档

页面最下方的「接口文档」:点「查看完整文档」在线阅读,点「下载 Markdown」把《开放 API 文档》存到本地。另一份《CDK 卡密系统接入文档》在「进入隐藏功能」页的「CDK 接入」里下载。接口、字段或错误码不清楚时,先查这两份文档。

「接口文档」区域

5.6 用 curl 测试密钥

密钥准备好后,先用只读接口确认密钥有效、白名单设置正确、能查到余额。这些接口不会扣钱。把命令里的 sk_你的密钥 换成自己的,在你自己的服务器或电脑上执行,不要把密钥发给别人。

查余额(GET /balance):

curl https://zovocard.com/openapi/v1/balance -H "X-API-Key: sk_你的密钥"

查余额的返回结果

  • balance:账面余额。
  • spendable_balance:可消费余额,已经扣除了 20U 风险保证金。判断余额够不够,看这个字段。

查套餐、价格和付款地区(GET /gpt-direct/plans):

curl "https://zovocard.com/openapi/v1/gpt-direct/plans" -H "X-API-Key: sk_你的密钥"

查套餐的返回结果

  • 服务费看 serviceFeeUsdMinor,单位是美分,15 就是 $0.15。
  • 判断某一档现在能不能买,要同时满足三个条件:registry 里有这一档,它的 purchasable 为 true,并且它在 plans 里的 enabled 为 true。
  • 价格和服务费随时可能调整,不要写死在自己的程序里。

常见报错:

返回 含义 处理方法
HTTP 401 密钥缺失、无效或已停用 检查 X-API-Key 是否完整、密钥是否被停用
HTTP 403,提示白名单 IP 不在白名单里,或者密钥还没有设置白名单 按 5.3 填写这台机器的出口 IP
HTTP 403 GPT_DIRECT_ACCESS_DENIED 账号还没有直充权限 按 4.2 确认权限
HTTP 403 RECHARGE_REQUIRED 账户还没有已入账的充值 按第 1 章充值
HTTP 429 调用太频繁 稍等,按指数退避重试

完整的错误码见附录 A和官方文档附录 A。程序里请按 error_code 判断错误,不要匹配 msg 的文字,文字可能会改。


第 6 章 部署自托管 CDK 站

本章用官方自托管项目 zovocard/zovo_card_cdk_auto 自带的 Docker 部署脚本,在你自己的服务器和域名上搭建一个卡密兑换站:买家输入卡密就能兑换。整个过程约 30 到 60 分钟,大部分时间花在构建镜像上。如果想让 AI 助手代为部署,请看第 8 章。

部署 CDK 站的六个步骤

6.1 准备服务器、域名和端口

服务器的配置建议:

项目 建议
系统 Linux x86-64:Ubuntu 22.04 / 24.04 或 Debian 12
内存 2GB 以上。构建镜像时要同时编译前端和后端,内存太小容易失败
磁盘 20GB 以上
网络 有公网 IPv4,能正常访问 GitHub、Docker 镜像仓库和 zovocard.com。海外机房比较省事

买好服务器后,记下公网 IP 和 root 的登录方式,建议用 SSH 密钥登录。

域名解析:把一个域名(或子域名)的 A 记录指向服务器 IP。

域名解析示意

放行端口:在云服务商控制台的「安全组」或「防火墙」里放行 80 和 443。

安全组示意

在自己电脑上执行 ping 你的域名,显示的 IP 和服务器 IP 一致,说明解析已经生效。解析生效可能需要几分钟。

6.2 用 SSH 登录服务器

Windows 10/11 打开「终端」或 PowerShell,macOS 打开「终端」,输入:

ssh root@服务器IP

SSH 登录

第一次连接会询问是否信任这台服务器,输入 yes。输入密码时屏幕上不显示字符,这是正常的。出现 root@xxx:~# 这样的提示符就表示登录成功,后面的命令都在这个窗口里执行。

6.3 安装前置工具

官方脚本需要用到 curl、git 和 openssl,Docker 和 compose 插件由脚本自动安装。Ubuntu 和 Debian 执行:

apt-get update && apt-get install -y curl git ca-certificates openssl

CentOS、Rocky 等系统用 yum install -y curl git ca-certificates openssl。

安装完成后用 --version 确认

6.4 运行官方部署脚本

建议先把脚本下载下来看一遍再运行。官方给的写法是 curl … | bash,先下载再运行,效果是一样的:

curl -fsSL https://raw.githubusercontent.com/zovocard/zovo_card_cdk_auto/master/deploy/docker-deploy.sh -o docker-deploy.sh
less docker-deploy.sh            # 查看脚本内容,按 q 退出
bash docker-deploy.sh --domain 你的域名

把 你的域名 换成实际的域名,例如 cdk.example.com。

运行部署脚本

脚本参数:

参数 作用
--domain 域名 绑定域名并自动申请 HTTPS 证书。不传这个参数时,站点用 IP 的 80 端口以 HTTP 方式访问
--dir 目录 安装目录,默认 /opt/cdk-recharge
--skip-build 跳过镜像构建,已经有镜像时才用

脚本依次做六件事:检查并安装 Docker;把代码克隆到 /opt/cdk-recharge;用 openssl 生成 JWT 密钥(文件权限 600);写入 .env;配置 Caddy(绑定域名、自动申请 HTTPS,并屏蔽 /.env*、/.git/*、/data/* 等敏感路径);构建镜像并启动容器。

最后一步需要几分钟,取决于服务器的网络和配置。出现「部署完成!」就结束了。

部署完成

提示:脚本最后一行会打印「首次打开进入安装向导,设置管理员账号和卡台 API Key」(图中标号 2)。实际的安装向导只需要设置管理员账号和密码,并没有 API Key 这一项。卡台的 API 密钥要在登录后台后,到「卡台接入」页填写(见 6.8)。

确认两个容器都已经启动:

cd /opt/cdk-recharge
docker compose ps

cdk 容器状态为 healthy,caddy 正在运行

脚本运行失败时,先看最后几行的报错:

  • git: command not found:回到 6.3 安装 git。
  • 拉取 GitHub 或 Docker 镜像超时:服务器的网络访问不了这些地址,需要换网络环境或机房。
  • 内存不足、构建进程被杀:把内存加到 2GB 以上,或者先添加 swap。

问题解决后,再运行一遍同样的命令即可。脚本会识别已经存在的目录并更新,不会破坏已有的配置。

6.5 找到 Setup Token

站点第一次启动时,会在日志里打印一次性的 Setup Token。它是打开安装向导的凭证,不是管理员密码。

cd /opt/cdk-recharge
docker compose logs cdk | grep "Setup Token"

日志中的 Setup Token

只复制冒号后面的那一串,共 24 位字母和数字。

注意:Setup Token 只打印这一次。完成安装之前,不要重复运行脚本,也不要重建容器,否则旧日志会被清掉,再也找不到这个 Token。如果已经错过,处理方法见 6.11。

6.6 运行安装向导,创建管理员

在浏览器中打开 https://你的域名/ops/setup。

首次安装向导(Token 和域名为示例)

  1. Setup Token:粘贴上一步复制的内容。
  2. 管理员用户名:默认是 admin,长度 3 到 32 位,只能包含字母、数字和下划线。
  3. 选择设置密码的方式:
    • 「一键生成并进入后台」:系统生成一个强密码并自动登录。推荐用这种方式。密码只显示这一次,请马上存进密码管理器。
    • 「自设密码」:点开后输入两遍密码。密码至少 12 位,必须同时包含字母和数字,不能是常见的弱密码(如 password、12345678),也不能和用户名相同。

「自设密码」的表单

选择「一键生成」后,会显示下面的成功页(图中的密码已打码):

安装成功页

  1. 「登录密码(请复制)」一栏就是生成的密码。页面提示「安装成功,已自动登录。请立刻复制保存下面的密码(只显示一次)」。
  2. 点「复制账号密码」,粘贴到密码管理器里。
  3. 勾选「我已安全保存密码」。
  4. 点「进入运营后台」。

提示:本文测试的版本中,点「进入运营后台」后页面没有跳转。这时实际上已经登录,在地址栏打开 https://你的域名/ops,或者刷新页面,就能进入后台。

安装向导有防暴力破解的限制:同一个 IP 连续输错 5 次会被锁定 1 小时,页面提示「尝试过多,请 N 分钟后再试」。安装完成后 Setup Token 立即失效,再打开向导页会自动跳到登录页。

6.7 登录后台

之后用 https://你的域名/ops/login 登录后台,填写用户名和安装时保存的密码。

管理员登录页

登录状态保持 24 小时。同一个 IP 和用户名连续输错多次会被限制,页面提示「尝试次数过多,请 N 分钟后再试」,等一会儿再试。

登录后进入「管理后台」总览页。顶部菜单共 8 项:总览、CDK卡密、兑换对账、卡台接入、选卡配置、Webhook、外观、审计。刚装好时还没有填卡台 API 密钥,页面顶部会显示红色提示「未配置卡台 API Key,请先到「卡台接入」填写」,下一步就去填写。

刚装好时的后台总览

菜单 用途
总览 后台首页,有快捷入口、版本信息和「修改密码」(新密码至少 12 位)
CDK卡密 发码、查看卡密、复制和导出、备注、禁用和解除禁用,最常用的页面
兑换对账 查看买家的兑换订单,核对每一单的状态、用卡和资金
卡台接入 填写卡台 API 密钥,选择环境,一键检测
选卡配置 兑换时的选卡规则和卡头优先级
Webhook 复制回调地址,保存回调签名密钥,查看收到的回调事件
外观 站点名称、主题等
审计 后台操作日志

6.8 填写卡台 API 密钥

点顶部菜单的「卡台接入」。

「卡台接入」页

页面从上到下:

  1. 本机出口 IP · 卡台白名单:服务器访问卡台时使用的出口 IP,不是你浏览器的 IP。点「复制 IP」,到卡台开发者页,把它填进这个 API 密钥的 IP 白名单(方法见 5.3)。
  2. 环境:正式使用选「生产 · zovocard.com」。
  3. 卡台 Base URL:填站点根地址即可,页面说明「Open API / CDK 路径自动拼接」。选好环境后保持默认。
  4. Open API Key (sk_…):粘贴在卡台开发者页创建的 App Secret(sk_ 开头)。输入框是密码框,看不到明文属于正常。保存后,输入框里显示「已配置」和密钥的后四位(其余位用星号隐藏),右上角出现「Key 已存」。之后输入框留空再点保存,不会修改已保存的密钥。
  5. 点「保存」,再点「一键检测」。一键检测会先保存,再依次检测连通、余额和价格。
  6. 「代理换码密码」和「发给代理的换码链接」是给代理用的可选功能,可以先不填。

注意:点「生产 · zovocard.com」或「沙盒 · sandbox」按钮,只是把 Base URL 填好,并不会保存,要点「保存」或「一键检测」才生效。沙盒(sandbox.zovocard.com)的账号、密钥和数据都和生产环境隔离,两边的密钥不能混用。官方文档建议新代理先用沙盒密钥在沙盒里联调;沙盒用不了时,可以直接用生产环境,但测试时按 6.10 只发 1 张最便宜的卡密。

点「一键检测」后,会弹出「连通检测」窗口:

连通检测结果

  • 顶部显示绿色对勾和「卡台可达」,说明连通正常。
  • 下面几格中,site、openapi、cdk 是三个地址,probed 是实际探测的接口,http 为 200 表示密钥有效,egress 是服务器的出口 IP。
  • http 为 401 时,提示「主机可达;API Key 无效或未配置」;为 403 时,提示「主机可达;可能 IP 不在白名单」,需要把出口 IP 加进卡台白名单。

检测全部通过后,页面底部的三个状态卡显示如下:

检测通过后的状态卡

点开「服务费(实时)」,可以看到卡台下发的套餐清单、每张卡密的服务费,部分套餐还会显示「兑换垫付」金额。

实时服务费

检测通过的标准:连通状态显示「正常」;可消费余额能读出数字;服务费(实时)能读出,点开能看到套餐清单。

检测结果 可能的原因 处理方法
异常,提示 401 API 密钥填错、不完整,或者已经停用 重新复制 sk_…,注意不要带空格
异常,提示 403 出口 IP 没有加进白名单,或者填错了 回到卡台开发者页,填入页面上显示的出口 IP 并保存
异常,超时 服务器无法访问公网,或者被防火墙拦截 检查服务器的出站网络
提示 429 调用太频繁 等一分钟再点

6.9 配置回调(Webhook)

回调只是通知,不配置也能正常使用,买家页面会自动轮询兑换结果。配置后,后台的订单状态会更新得更及时。订单状态仍以订单查询为准。

这一步需要在 CDK 站后台和卡台之间来回操作:

  1. 在 CDK 站后台点顶部菜单的「Webhook」,复制页面上的「回调 URL」,格式是 https://你的域名/api/v1/webhooks/cardplatform。

CDK 站后台的 Webhook 页

  1. 登录卡台,进入开发者页,在这个密钥那一行点「Webhook」,粘贴刚才复制的地址(必须是 https 公网地址),订阅事件勾选 gpt_direct.* 和 cdk.*,保存。

在卡台为密钥配置 Webhook

  1. 第一次保存非空的回调地址时,卡台会为这个密钥生成签名密钥(whsec_ 开头),在开发者页可以看到。复制它,回到 CDK 站后台的 Webhook 页,粘贴到「Webhook Secret」,点「保存 Secret」。
  2. 在后台点「刷新事件」。之后每当订单有变化,「最近事件」表里会多出一行,包含类型、幂等键、时间和摘要。重复到达的事件会按幂等键去重。

提示:如果没有填 Secret,页面会提示「尚未配置 webhook_secret:卡台回调会被 503/401 拒绝」。CDK 站用这个密钥校验每个回调请求头里的 X-Signature(HMAC-SHA256),签名不对的请求一律拒收。

6.10 验收

发码之前逐项确认:

  • 浏览器打开 https://你的域名,地址栏有锁形图标,页面正常;在服务器上执行 curl -fsS https://你的域名/health,返回 "status":"ok"。
  • 打开 https://你的域名/ops/setup 会跳到登录页。
  • 能用保存的管理员密码登录后台。
  • 「卡台接入」一键检测通过,可消费余额能读出数字。
  • 余额充足。发码后买家每兑换一张,都会用到你名下的卡和余额。
  • 先发 1 张最便宜套餐的测试卡密,用你自己没有会员的测试账号完整兑换一次,订单到达「已完成」(见第 7 章)。
  • 清楚怎么看日志、重启、升级和备份(见 6.11)。

在服务器上自检(IP 为示例)

6.11 日常维护和常见问题

常用命令,都在 /opt/cdk-recharge 目录下执行:

操作 命令
查看实时日志 docker compose logs -f
重启 docker compose restart
停止 docker compose down
查看状态 docker compose ps
升级 用同一个域名再运行一次官方部署脚本。脚本会拉取新代码、保留已有的 .env,然后重建并重启

备份:数据库在名为 cdk_data 的 Docker 卷里(容器内的 /app/data),建议每周备份一次。备份时站点会停止几秒:

mkdir -p /root/cdk-backups && cd /opt/cdk-recharge
docker compose stop cdk
docker run --rm --volumes-from cdk-recharge -v /root/cdk-backups:/backup alpine:3.22 \
  sh -c 'tar -C /app/data -czf /backup/cdk-data-$(date +%F).tgz .'
docker compose start cdk

注意:后台「总览」页的「一键无痕更新」是给二进制部署方式用的。用 Docker 部署的,请按上表重新运行官方脚本来升级。

问题 原因和处理方法
找不到 Setup Token,日志里没有 Setup Token 只在第一次启动时打印,容器重建过(例如又运行了一次脚本)就看不到了。因为还没有完成安装,站点里没有数据,可以这样重来:执行 docker compose down,用 docker volume ls 找到名字里带 cdk_data 的数据卷,执行 docker volume rm 卷名 删除它,再执行 docker compose up -d,日志里会出现新的 Setup Token。不要删除 Caddy 的数据卷,里面存着 HTTPS 证书,重复申请可能被限流
浏览器提示证书错误或打不开 检查域名是否已解析到服务器 IP,80 和 443 是否已放行。如果域名开了代理或 CDN,先改成「仅 DNS」,等证书签发成功后再决定是否开启
忘记管理员密码 后台只能在登录后修改密码,没有邮件找回功能。所以安装时一定要把密码存进密码管理器
后台检测卡台报错 见 6.8 的检测结果表
买家兑换时提示会话无效 兑换会话 15 分钟内有效,而且预览、预检和兑换必须来自同一个出口 IP。让买家从第一步重新开始
磁盘空间越来越少 用 df -h / 查看磁盘,用 docker system df 查看 Docker 占用的空间;docker image prune -f 可以清理不再使用的旧镜像,不会删除正在使用的镜像和数据卷

第 7 章 日常操作:发码、兑换和对账

开始本章之前,请确认第 6 章已经完成:站点能正常打开,「卡台接入」一键检测通过,卡台余额充足。本章介绍部署完成后的日常操作:发码、交给买家、买家兑换、对账。

要做的事 位置 章节
发一批卡密 CDK 站后台「CDK卡密」页的「购买并生成」 7.2
查看、复制、导出、备注、禁用卡密 CDK 站后台「CDK卡密」页的「CDK 列表」 7.3
设置卡密前缀;删除没卖出的卡密并退回服务费 卡台「直充协议 → 我的 CDK」 7.4
把卡密交给买家,告诉买家怎么兑换 买家页 https://你的域名/recharge 7.5、7.6
查看订单、对账 CDK 站后台「兑换对账」「总览」 7.7
处理问题 见常见问题 7.9

7.1 费用和发码前的检查

协议的工作流程

官方文档对费用的规定如下:

时间 由谁支付 支付什么
发码时 你(发码人),从卡台可消费余额中扣除 服务费,按张收取,金额以账户的实时配置为准。后台「卡台接入」页的「服务费(实时)」可以查看,演示数据中是每张 $0.15
买家兑换时 你(CDK 所有者) 卡片注资和订阅实付,即用你名下的卡和余额付款,为买家开通账号。文档原文:「兑换时的卡片注资与订阅实付由 CDK 所有者承担」

也就是说,发出 100 张卡密并不是只花 100 张的服务费,买家每兑换一张,你的卡和余额就会被用掉一次。演示数据中,一张 Plus 的兑换垫付约为 PHP 982(十几美元),实际金额以页面为准。余额不足时,买家的兑换会失败。

发码前确认以下几点:

  • 后台「卡台接入」一键检测通过,连通状态正常,可消费余额能读出数字。
  • 余额足够支付近期会被兑换的卡密。
  • 第一次使用时只发 1 张最便宜的套餐,用自己一个没有会员的测试账号完整兑换一次(见 7.6),确认订单能到「已完成」,再正式发码。
  • 兑换时用哪张卡,由卡台「直充协议 → 用卡规则」的设置决定(见 3.10)。不熟悉的话保持默认。

7.2 发码

登录 CDK 站后台(https://你的域名/ops/login),点顶部菜单的「CDK卡密」,页面最上方是「购买并生成」区域。

「购买并生成」区域

  1. 产品保持 ChatGPT。
  2. 选择套餐:点一张套餐卡片(Go、Plus、Pro 5x、Pro 20x、Pro 50x 等)。卡片上写有每张卡密的服务费,部分卡片还写有「兑换垫付 PHP …」,即买家兑换时你大约要垫付的金额。套餐清单由卡台实时下发:卡台上新的套餐会自动出现在这里,没有出现的就是你的账号目前不能卖的。
  3. 数量:用「−」「+」按钮或直接输入,旁边有 1、10、50、100、200 几个快捷按钮。单次最多 200 张(开放 API 文档 §6.18.6)。
  4. 付款地区:从下拉列表中选择菲律宾(PHP)、美国(USD)、日本(JPY)、智利(CLP)或埃及(EGP),不选时为「默认(菲律宾)」。可选的地区以下拉列表为准。

付款地区下拉列表

注意:付款地区在发码时就确定了。按官方文档,预检和兑换都沿用卡密上保存的付款地区,买家兑换时不能更改。要卖智利的卡密,就在这里选智利再发码。

  1. 勾选「确认承担兑换资金」。不勾选的话无法购买,页面会提示「勾选「确认承担兑换资金」后再购买。实付由本账户承担,服务费从卡台余额扣除。」
  2. 点最右侧的按钮。按钮上写明了本次的张数、套餐和总服务费,例如「购买 10 张 Plus · $1.50」。核对无误后点一次。

发码成功后的页面:

发码成功

  • 绿色提示条「成功 10 张完整码(每条约 24 字符)· 服务器已存 10」,说明这批卡密已经保存到你的 CDK 站,之后随时能查到。
  • 下面的文本框里是本批的完整卡密,一行一张。点「复制」复制整批,点「导出」下载为 .txt 文件。发码成功时,站点也会尝试自动把整批卡密复制到剪贴板。
  • 先把卡密保存到安全的位置,再做别的事。

警告:完整且未使用的卡密可以直接兑换会员,和现金一样,不要发到公开的群里,也不要出现在截图和日志中。帮助中心也提醒「不要在聊天群公开未使用的码」。

提示:发码时如果网络卡住或页面提示超时,不要再点购买。官方要求结果不确定时先查列表,不能用新的请求重复购码。CDK 站会自动到卡台找回可能已经发出的卡密,并提示「发码请求未完成,已从卡台找回 N 张完整码。不要再点购买。」看到这条提示后,到列表里核对张数。如果报错中带有「可能是 IP 未进白名单」,按 6.8 把本机出口 IP 加进卡台白名单。

7.3 管理卡密

在「CDK卡密」页往下,是「CDK 列表」。

CDK 列表

位置 说明
右上角的切换按钮 「本站完整码库」读取本站保存的完整卡密,并向卡台核对当前页的状态;「卡台状态列表」直接列出卡台上的记录
搜索框、「状态」「套餐」下拉、「查询」 按备注、完整卡密、ID 或前缀搜索,按状态和套餐筛选
「从卡台同步完整码」 把卡台上有、本站还没有的卡密同步下来
「卡密」列 点卡密即可复制。标签「完整」表示完整卡密;「仅前缀」表示本站只存了前缀,不能用来兑换
「区域」列 发码时选择的付款地区
「服务费」列 发这张卡密时扣的服务费
「备注」列 点「添加备注…」可以写一句说明,例如卖给了谁。备注只保存在你自己的站点,不会同步到卡台

卡密有 6 种状态(开放 API 文档 §6.18.6):

页面显示 状态值 含义 处理方式
未使用 unused 可以兑换 正常出售
预留中 reserved 有一笔进行中的兑换订单 等待结果,不要改动,也不要另发给别人
已消耗 consumed 兑换成功,付款已确认 已完成,不能再兑换、重新启用或删除退费
待审核 review 有扣款证据或结果不确定,系统保留待核验 不要重发,也不要重试,到「兑换对账」查看原订单(见 7.7)
已冻结 frozen 暂时冻结,不能兑换 需要时在卡台解冻(见 7.4)
已禁用 disabled 你主动停用 需要恢复时点「解除禁用」

兑换失败后,卡密会回到「未使用」,可以再次兑换。官方文档的说法是「只有 CDK 回到 unused 才能再次兑换」。失败的订单是终态,但不能只凭失败状态就认为卡密已经释放、钱已经退回,还要看这张卡密当前的状态(见 7.7)。

复制、导出和批量操作

「复制 / 导出」下拉菜单

  • 「复制 / 导出」下拉菜单中有:复制选中、导出选中(.txt)、复制本页、导出本站全部、复制本站全部。建议每次发码后都用「导出本站全部」备份一份。
  • 勾选列表左侧的多行后,可以用「批量操作」:批量备注、去除备注、批量禁用、解除禁用、同步完整码等。

禁用卡密

每行右侧的「操作」菜单

每行最右侧的「操作」菜单中有:复制完整码、编辑备注、禁用。只有「未使用」的卡密可以禁用,已禁用的卡密在这里显示「解除禁用」。点「禁用」后会弹出确认框,提示「确定禁用 ID ××××?禁用后不可兑换(不退服务费)。」(×××× 为卡密编号)。

  • 禁用只是暂停兑换,发码时的服务费不退,之后可以解除禁用。
  • 要作废一张没卖出去的卡密并退回服务费,需要用卡台上的「删除并退款」,见 7.4。

7.4 在卡台管理卡密:前缀、冻结和删除退款

以下三项操作在卡台(zovocard.com)完成:登录卡台,进入左侧菜单的「商城与工具 → 直充协议」,点子页签「我的 CDK」。

卡台的「我的 CDK」页

这一页显示你账号名下的卡密,范围比 CDK 站后台大:CDK 站后台只能看到这个 API 密钥签发的卡密,以及你在官网直接购买、没有绑定任何 App 的卡密(开放 API 文档 §6.18.6)。日常发码和管理用 CDK 站后台;设置前缀、冻结、删除退款在这一页操作。

设置卡密前缀(可选)

在页面上方的「CDK品牌前缀」中填写 1 到 8 位字母或数字,首位必须是字母,系统会自动转为大写,然后点「保存」。例如填 UUU,之后发出的 Plus 卡密格式为 UUUPLUS-XXXXXXXXXX-XXXXXXXXXX,Pro 5x 为 UUU5X-…。页面下方会显示各套餐的格式预览。

  • 前缀只影响之后发的卡密,已经发出的卡密保持原样,照常可以兑换。
  • 套餐以卡密的实际信息为准,不要根据前缀判断套餐。
  • 清空前缀后恢复默认的 ZC-… 格式。

在卡台购买卡密

这一页也可以购买卡密:选择套餐,勾选「我确认承担该 CDK 的开卡、充值和订阅实付」,选择数量,点购买。确认框会写明这次要扣的服务费。下图的演示账号服务费为 0,所以显示「将扣除 0.00 U 服务费」,实际以页面为准。

购买前的确认框

在卡台购买的卡密和在 CDK 站发出的是同一种,都能在你的 CDK 站兑换。本文以自己的 CDK 站为主,日常发码建议在 CDK 站后台操作。另外,官方文档说明,在官网直接购买的卡密,兑换后的 Webhook 通知不会推送给你后来创建的 API 密钥,只能通过订单查询对账。CDK 站后台的「兑换对账」就是用订单查询做的,对账以它为准(见 7.7)。

冻结、解冻、删除并退款

勾选一行或多行,点每行右侧的「操作」:

批量操作按钮和单行「操作」菜单

操作 效果
冻结、解冻 冻结后这张卡密暂时不能兑换,可以随时解冻。弹窗提示「冻结后该 CDK 暂不可兑换,可随时解冻」
删除并退款 卡密永久作废,已付的服务费退回余额。弹窗提示「删除后卡密永久失效,已付服务费 {费用} U 将退回你的余额」
批量禁用、批量删除 勾选多行后出现在表格上方;批量删除时,已购买的卡密会退回服务费

帮助中心「CDK 发码、兑换与删除退款」的说明:

  1. 停用不等于删除退款,停用只是限制使用,不退钱。
  2. 能否删除退费由页面校验决定。处理中和已付款(已消耗)的卡密不能删除,也不能重复兑换。
  3. 删除退费成功后,应该能在卡台的「财务明细」里查到这笔退款,请核对。

7.5 把卡密交给买家

买家使用你自己域名下的页面:

地址 用途
https://你的域名/ 买家首页,有充值提交(兑换)、批量兑换、卡密查询、账单查询四个入口
https://你的域名/recharge 单张兑换,最常用
https://你的域名/batch 批量兑换
https://你的域名/history 卡密查询
https://你的域名/billing 账单查询

买家首页

后台地址 /ops 不要发给买家。买家页左上角显示的站点名称可以修改,见 7.8。

交付卡密时,把完整卡密(一行一张)和兑换网址一起发给买家,同时附上兑换说明。下面这段可以直接复制使用:

兑换说明

  1. 打开兑换网址 https://你的域名/recharge,在「输入 CDK」框中粘贴卡密,点「预览 / 下一步」。
  2. 在浏览器里登录要升级的 ChatGPT 账号,新开一个标签页打开 https://chatgpt.com/api/auth/session,按 Ctrl+A 全选、Ctrl+C 复制整页内容。
  3. 回到兑换页,把内容粘贴到「Session」框中,点「预检」。
  4. 核对页面显示的账号邮箱和目标套餐,无误后点「兑换」。
  5. 页面显示「开通完成」后,回到 ChatGPT 刷新页面确认。

注意:整个过程请使用同一个浏览器和同一个网络,中途不要切换设备或开关代理;兑换页的会话 15 分钟内有效,超时请从第 1 步重新开始;点「兑换」后请等待结果,不要重复点击或刷新;Session 相当于账号的登录凭证,只粘贴到兑换页,不要发给任何人;输入框里灰色的示例格式(如 SXC-XXXX-…)只是占位提示,以收到的卡密为准。

7.6 买家的兑换流程

这一节说明买家在兑换页上看到的内容,方便你指导买家和排查问题。建议先用自己的测试账号完整走一遍。

第 1 步:验证卡密

兑换页第 1 步

页面上方有四个页签:立即兑换、批量充值、卡密查询、账单查询,下面是四个步骤:验证卡密、填写凭证、确认兑换、查看结果。在「输入 CDK」中粘贴卡密,点「预览 / 下一步」。

  • 卡密有效时进入第 2 步。
  • 卡密无效、已使用或已停用时,页面会直接提示,例如「CDK 无效或不可用」「CDK 已使用或正在兑换」「CDK 已停用」。

这一步会为买家创建一个 15 分钟的兑换会话。之后的预检、兑换和查询结果,都必须来自同一个出口 IP 和同一台设备(CDK 接入文档 §6.18.8)。

第 2 步:填写凭证

兑换页第 2 步

  • 默认是「Session」方式:按页面说明打开 chatgpt.com/api/auth/session,复制整页内容,其中必须包含 sessionToken。只粘贴 eyJ 开头的 Access Token 会被拒绝,页面也注明「已禁用纯 Access Token」。
  • 也可以切换到「邮箱」方式,填写邮箱和邮箱密码,本文不展开。
  • 粘贴后点「预检」。

粘贴 Session 后点「预检」(示例数据)

第 3 步:确认兑换

兑换页第 3 步

预检通过后,页面显示账号的邮箱、目标套餐、当前套餐和订阅状态等信息。请买家核对两项:邮箱是否正确,目标套餐是否是想要的。显示「上游未提供」的字段,表示卡台没有返回相应的信息,不影响兑换。

  • 如果账号已经有同档或更高档的套餐,页面会出现黄色提示,按钮变为「当前套餐已满足」,这次不能重复购买。这是对买家的保护,不要强行重试。
  • 页面上方的说明是「结果不确定或 review 时请勿重复提交,请轮询结果」。核对无误后,点一次「兑换」。

第 4 步:查看进度

兑换页第 4 步

页面大约每 3 秒自动刷新一次。最上面是当前状态(英文原值)和所处阶段,中间四格是进度(受理、开卡/资金、支付、开通),下面的「处理明细」是每一步的时间线。常见状态:

状态 含义 处理方式
awaiting_card、funding_pending、dispatching、queued 已受理,正在选卡、给卡注资、派发 等待,不要重复提交
running、pending、plus_paid 正在支付、开通或核对 继续等待
各类 review 结果待核验 不要重试,联系发码方(你)在后台对账
completed 开通成功 到 ChatGPT 刷新确认
declined、failed_precharge、cancelled 失败或已取消,属于终态 查看明细里的原因;卡密可能已经回到「未使用」,需要在后台核对(见 7.7)

兑换成功

出现绿色提示「开通完成,请到 ChatGPT 账号确认套餐。」就表示成功了。买家刷新 ChatGPT 后,左下角的「免费版」会变成订阅的套餐名。页面底部的「再兑一张」用于继续兑换下一张。

刷新页面不会丢失进度。买家关掉页面后,用同一个浏览器和网络重新输入这张卡密,页面会尝试恢复进度;换了设备就无法恢复,这时到后台「兑换对账」查询这张卡密的订单。

买家页的其他功能

卡密查询(/history):查询卡密是否已使用、充值到了哪个邮箱,不返回 Session 和 token。

卡密查询

批量查询一次最多 100 张,每行一张,也可以用空格或逗号分隔。结果按「使用成功、使用失败、未使用、处理中、未找到」分类计数,可以「复制已用邮箱」和「导出 CSV」。

批量查询

注意:这里显示的是 CDK 站自己记录的摘要,不是对账凭证,官方文档 §6.20 也是这样说明的。例如处理中的卡密,这里可能显示「未找到」或「未知」;对于卡台发出的卡密,「使用时间」一列一般显示「—」。卡密的实际状态以后台「兑换对账」为准。

批量兑换(/batch):一次为多个账号兑换。

批量兑换的输入页

操作顺序:每行粘贴一张卡密(最多 1000 张),选择「Session」或「邮箱密码」,需要时用「导入 Excel / CSV」(自动识别 session 列),然后点「批量验证并开始」,系统会先逐张验证卡密。之后按页面的配对规则,第 1 张有效卡密对应第 1 条 Session,依次类推:逐张粘贴 Session 并点「提交并继续下一张」,导入了 Excel 的可以用「一键自动提交」。

批量兑换进行中

全部提交后,下方的「实时进度」中每张卡密占一行,显示账号、银行卡尾号和状态。有兑换成功的,会出现「导出本批成功号」按钮。

批量兑换完成

注意:页面顶部有一行说明「X 卡密请配对 X Cookie JSON……不要使用 ChatGPT Session」,这是针对 X(Twitter)卡密的。ChatGPT 卡密仍然使用 Session。

另外,批量兑换不要一次提交太多。官方文档规定公开兑换接口按 IP 限流:预览每分钟 30 次,兑换每分钟 20 次,查询结果每分钟 60 次。自托管站由你的服务器统一请求卡台,所以这个额度由整个站点的买家共用(根据官方文档和站点源码推算)。一次提交几百张,或者很多买家同时停在进度页,都可能触发 429。请分批提交,每批几十张,遇到 429 等一两分钟再试。

账单查询(/billing):用兑换过的卡密(系统使用兑换预检时保存的 Session),或者直接粘贴 Session,查询订阅状态和账单链接。

账单查询

账单数据来自 ChatGPT,由服务器用买家的 Session 请求 chatgpt.com 获得,不经过卡台。如果服务器所在机房访问不了 ChatGPT,这里会查询失败,但不影响兑换。用邮箱方式兑换的卡密没有保存 Session,只能改用「Session 查询」。

7.7 对账

总览

后台总览

后台「总览」页上方的四个数字:CDK 总数、可用 CDK(未使用)、已兑换(已消耗)、兑换订单。这些数字都是实时从卡台查询的,不是本站自己统计的。

兑换对账

点顶部菜单的「兑换对账」:

「兑换对账」页

列 说明
订单、CDK 订单号;这笔订单使用的卡密(只显示前缀),以及这张卡密现在的状态:已消耗、预留中、已释放、未使用、已冻结或已禁用
用户邮箱 开通的账号,已由卡台脱敏,如 al***@example.com
使用卡片 这笔订单用的卡,只显示 BIN 和后四位,如 537872****8519
消耗金额 买家账号实付的金额和币种,下面的小字是服务费
订单状态 状态标签和阶段的英文原值
开通时间 开通时间和创建时间
操作 「详情」;有卡的行还有「删卡」

页面顶部可以按订单状态筛选,也可以按邮箱关键字筛选(只筛选当前页)。订单状态的含义(CDK 接入文档 §6.18.8):

状态 含义 处理方式
queued、awaiting_card、funding_pending、dispatching、running、requires_action、pending、plus_paid、各类 review 处理中或待核验 继续查询同一个订单,不要重新兑换或重新付款
completed 套餐开通流程完成 成功
declined、failed_precharge、cancelled 失败或已取消,属于终态 不能只凭失败状态认为卡密已释放、钱已退回,还要核对卡密状态、资金状态和服务费状态(见下文的订单详情)

订单状态与处理方式

订单详情

点「详情」,查看一笔订单的完整信息:

订单详情

字段 说明
CDK 前缀、CDK 状态 是哪张卡密,现在是什么状态
用户邮箱、使用卡片、卡 ID 给哪个账号开通,用的哪张卡
卡充值额、实付、服务费 这笔订单给卡充了多少钱,买家账号实付多少,服务费是否已结算(settled 表示已结算)
订单状态、支付状态、资金状态 订单进行到哪一步,资金是否到位,如 card_ready / settled
创建、开通、更新、client_request_id 各个时间点和这次请求的编号。联系客服时提供订单号和时间
「删除虚拟卡(余额退回)」 通过卡台永久注销这张卡,卡内余额退回平台余额,操作不可撤销。只在确定要销卡时使用

注意:「消耗金额」「实付」等金额是按「币种最小单位除以 100」显示的。日元、智利比索这类没有小数位的币种,金额可能显示错误(官方文档也提醒,金额单位不能固定除以 100)。这两个地区的订单,金额以卡台「财务明细」中的记录为准。另外,「卡充值额」一栏有时会标注买家的币种(如 PHP),而卡台给卡注资使用的是美元,核对资金请看卡台的卡详情和财务明细。

Webhook 事件

点顶部菜单的「Webhook」(配置方法见 6.9)。订单每发生一次变化,「最近事件」表中就会新增一行:

Webhook 页

事件类型 触发时机
gpt_direct.completed 订单首次进入 completed(成功)
gpt_direct.failed 订单首次进入 declined 或 failed_precharge(失败)
gpt_direct.cancelled 订单首次进入 cancelled
cdk.reserved、cdk.consumed、cdk.released 卡密被预留、成功消耗、失败后释放
cdk.frozen、cdk.unfrozen、cdk.disabled 卡密被冻结、解冻、停用

回调只是通知,可能收不到,也可能晚到或重复到(帮助中心「回调未收到与订单补查」)。订单的最终状态以「兑换对账」的查询结果为准,不要只根据回调判断订单失败。

选卡配置和审计

  • 选卡配置:兑换时按什么顺序选择卡头。不熟悉的话保持默认,点一次页面上的「立即同步」,确认卡头显示「在线」即可。在这里点「保存」,会把顺序写入你卡台账户的「用卡规则」,影响之后的所有选卡,不只是新发的卡密,所以不要随意修改。

选卡配置

  • 审计:记录谁在什么时间、从哪个 IP 做了什么操作,包括登录、修改密码、发码、禁用、卡台回调等。出现异常时可以在这里查。

审计日志

7.8 修改站点名称

在后台点「外观」。「站点名称」和「副标题」就是买家页左上角显示的两行文字,默认是 Recharge Portal 和 Account Upgrade Service。改成你自己的名称后,点页面下方的「保存品牌与主题」。下面还可以选择整站的主题。

「外观」页

7.9 常见问题

现象 原因 处理方法
买家提示会话无效或会话过期 兑换会话只有 15 分钟,而且预览、预检和兑换必须来自同一个出口 IP 和同一台设备 让买家用同一个浏览器和网络,从第 1 步重新开始
买家提示「CDK 已使用或正在兑换」 卡密已经用过,或者有一笔订单正在处理 不要补发新卡密。先到「兑换对账」查这张卡密的订单:正在处理的就等待;已经成功的,请买家到 ChatGPT 确认
订单长时间停在 running、pending 或 review 支付结果还在核对 继续查询同一个订单,不要让买家重新兑换。需要的话,带上订单号和时间联系卡台客服,不要发送 Session
订单失败(declined、failed_precharge 等) 卡被拒、余额不足、风控等 先看订单明细里的原因,再到「CDK卡密」查这张卡密是否回到「未使用」。回到「未使用」才能让买家重新兑换;如果是「待审核」,不要改动,继续对账
买家说兑换成功但 ChatGPT 没有变化 订阅生效有延迟 请买家等几分钟再刷新。以订单状态是否为 completed 为准,不要因为等得久就让买家重新兑换
买家提示账号已有套餐、不能购买 账号已有同档或更高档的订阅 这是保护机制,不要强行重试。请买家换一个账号,或者等原订阅到期
兑换时提示 429 或请求过于频繁 公开接口按 IP 限流,整个站点共用一个额度(见 7.6) 等一两分钟再试,批量兑换请分批提交
买家换了浏览器或手机后兑换失败 兑换会话绑定了出口 IP 和设备 回到原来的浏览器继续;换设备的话从头开始
兑换一直失败,提示余额或授权不足 你的卡台可消费余额不够,兑换要用到你的余额 先按第 1 章充值,再请买家重试
后台「卡台接入」检测不通过 见 6.8 的检测结果表 401 检查密钥,403 检查白名单,超时检查服务器的出站网络
需要查明一张卡密的去向 在「CDK卡密」中搜索这张卡密的状态,在「兑换对账」中按订单查询,再到卡台「财务明细」核对资金

警告:向任何人求助(包括客服和 AI 助手)时,只提供订单号、时间、问题描述和打码后的截图。不要提供管理员密码、API 密钥(sk_)、签名密钥(whsec_)、完整卡密和买家的完整 Session。

7.10 日常检查

每天:

  • 在后台「总览」查看兑换订单数和可用 CDK 数。
  • 在「兑换对账」按状态筛选,检查有没有长时间停在 running、pending 或 review 的订单。
  • 查看「卡台接入」中的可消费余额,确认够第二天使用。

每周:

  • 在「CDK卡密」中用「复制 / 导出」的「导出本站全部」备份一次卡密。
  • 按 6.11 的命令备份数据库,并检查服务器的磁盘空间。
  • 关注官方频道的公告,页面和接口有更新时,对照本文检查。

7.11 用 API 发码和对账

如果选择自己对接(见 4.3),发码和对账也可以通过 API 完成。下面是最常用的几个官方接口,完整字段见开放 API 文档 §6.18.6 和 §6.18.7。基础地址为 https://zovocard.com/openapi/v1,请求头带 X-API-Key: sk_…,写操作带唯一的 Idempotency-Key;调用方服务器的出口 IP 必须在这个密钥的白名单里(见第 5 章)。

用 API 发 2 张 Plus 卡密的示例(密钥和卡密为虚构)

操作 请求 说明
发码 POST /gpt-direct/cdks<br>正文:{"plan":"plus","count":2,"funding_confirmed":true,"payment_country":"PH"} funding_confirmed 必须为 true,表示由你承担兑换资金;单次最多 200 张;整批成功或整批回滚;成功后返回 data.issued[],每项包含 id、code、code_prefix、plan、fee_amount_minor(美分)
查询卡密 GET /gpt-direct/cdks?page=1&page_size=20&status=unused page_size 最大 200;可以按 status、plan、q 过滤;只能看到这个密钥签发的卡密,以及官网购买、未绑定 App 的卡密
停用和恢复 POST /gpt-direct/cdks/{id}/disable、/enable;批量:/cdks/batch-disable、/batch-enable({"ids":[101,102]},最多 100 个) 停用不退发码服务费;批量操作逐项处理,HTTP 200 不代表全部成功,要检查 failed
对账 GET /gpt-direct/cdk-orders?page=1&page_size=20;单笔:/cdk-orders/{order_id} page_size 最大 100;支持按 status、cdk_id、updated_after 过滤;单笔查询包含公开时间线 events
卡密前缀 GET、PUT /gpt-direct/cdk-branding,正文 {"brand_prefix":"UUU"} 1 到 8 位字母或数字,首位为字母;只影响之后发的卡密
买家兑换(公开接口,不需要 API 密钥) POST https://zovocard.com/api/v1/cdk/preview,然后依次调用 /preflight、/redeem,最后 GET /result?token= 四步必须来自同一个出口 IP,使用同一个 X-Redemption-Device,会话 15 分钟;调用 redeem 后只查询结果,不重复提交

编程时需要注意的几点(均出自官方文档):

  1. 保存并原样提交完整的 code,不要只保存 code_prefix,也不要限制卡密长度;套餐以返回的 plan 为准,不要从前缀推断。
  2. 发码请求出现网络错误或超时时,先查询列表确认是否已经发出,不能换一个新的 Idempotency-Key 重新请求,否则会重复购码。
  3. 兑换「已受理」(awaiting_card 等)不代表成功,只有 completed 才是成功;review、pending 等状态继续查询原订单,不要重新兑换。
  4. 失败是终态,但不能只凭失败状态推断卡密已释放或钱已退回,还要看 cdk_status、funding_hold_status、service_fee_status。只有卡密回到 unused 才能再次兑换。
  5. 回调只是通知,要用订单查询(按 updated_after 分页)补全遗漏的事件,并按 event_id 去重。

附录 A 常见错误

程序里请按 error_code 判断错误,不要匹配 msg 的文字:文字可能会改,error_code 保持不变。完整的对照表见官方《开放 API 文档》附录 A。

A.1 通用

HTTP 提示 含义 处理方法
401 缺少 API Key,或 Key 无效、已禁用 密钥有问题 先修正密钥,不要重试
403 该密钥尚未配置 IP 白名单;当前 IP 不在白名单内 白名单没有填写或填错了 在开发者页补填服务器的出口 IP(见 5.3)
403 RECHARGE_REQUIRED 账户还没有已入账的充值 先充值
403 FORBIDDEN 子账户被冻结,或者没有这项操作的权限 联系主账户或客服
429 调用过于频繁 触发限流 稍等,按指数退避重试
400 insufficient_balance 余额或风险保证金不足 先充值
500、503 internal_error、channel_unavailable 服务端错误,或者渠道暂时熔断 稍后重试;写操作重试时必须带同一个 Idempotency-Key
202 无 已受理,还不是成功 继续查询,不要重复提交

A.2 直充和兑换

error_code 含义 处理方法
GPT_DIRECT_ACCESS_DENIED 没有开通直充权限 由管理员开通,或者会员等级达到超级 SVIP 及以上
GPT_SESSION_INVALID、SESSION_REQUIRED 凭据无效或缺失 重新复制完整 Session,再检查凭据
GPT_PLAN_ALREADY_ACTIVE 目标账号的套餐还在有效期内 不要重试扣款,换账号或者等套餐到期
PRECHECK_REJECTED 账号预检没有通过 按页面提示处理,必要时换账号
GPT_PRICE_UNCONFIRMED 报价没有确认 重新检查凭据,获取最新报价
INSUFFICIENT_BALANCE 余额不足(包括服务费) 先充值
GPT_PREFLIGHT_RATE_LIMITED 预检太频繁 等一会儿再检查
IDEMPOTENCY_CONFLICT(HTTP 409) 同一个请求编号对应了不同的参数 先查询原订单,不要换新的编号重新提交
CDK_UNAVAILABLE 卡密已经使用或正在兑换 查询已有的订单,不要重复兑换
REDEMPTION_SESSION_INVALID 兑换会话过期(15 分钟),或者出口 IP、设备变了 先确认之前的请求没有建单,再重新预览和预检
GPT_DIRECT_UNAVAILABLE、GPT_DIRECT_PAUSED(HTTP 503) 直充服务暂时不可用,或者已暂停 留意官方频道的公告,稍后再试,不要反复提交
GPT_CREDIT_REQUIRES_SUBSCRIPTION 购买 Codex 点数要求账号已有生效的订阅 先开通 Plus 或 Pro,再购买点数
GPT_RENEW_TARGET_NOT_PRO、GPT_RENEW_SUBSCRIPTION_EXPIRED 「Pro 20x 续费」要求账号当前就在 Pro 20x 且没有到期 这类失败重试也不会成功,改选普通的 Pro 20x
CDK_DISABLE_REJECTED(HTTP 409) 只能禁用「未使用」的卡密 先查看这张卡密当前的状态

A.3 订单状态

订单状态与处理方式


附录 B 官方资料

资料 获取位置 本文引用的部分
《开放 API 文档》 卡台「开发者」页的「接口文档」,点「下载 Markdown」 §0 账户约束,§1 至 §4 接入说明,§6.18 GPT 直充与 CDK,§7 回调,附录 A、B
《CDK 卡密系统接入文档》 卡台「开发者」页 →「进入隐藏功能」→「CDK 接入」,下载文档(.md) 发码、兑换四步、订单对账、自托管 CDK 站(§6.20)
帮助中心 https://help.zovocard.com/zhcn/help/ 「GPT直充教程」「CDK 发码、兑换与删除退款」「开放 API 接入前准备」「回调未收到与订单补查」「注册、登录与账户安全」「为平台账户充值」「账户余额与卡片充值」
官方自托管 CDK 项目 https://github.com/zovocard/zovo_card_cdk_auto deploy/docker-deploy.sh、docker-compose.yml、deploy/app.env.example
官方频道和群 https://t.me/spacex_card_visa、https://t.me/spacex_card2 公告、更新和咨询

本文根据卡台官方文档整理。页面和接口会更新,请以官网的最新页面和官方文档为准;发现内容和实际页面不一致的,欢迎向官方反馈。

CDK开放API自托管