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

第 4 章 协议简介
4.1 工作流程

- 你在卡台或自己的 CDK 站发一批卡密,选好套餐、数量和付款地区。
- 把卡密卖给买家,渠道不限,发卡网、群聊、私聊都可以。
- 买家拿着卡密和自己 ChatGPT 账号的完整 Session,到你的 CDK 站(或你对接的页面)兑换。
- 站点依次调用卡台的预览、预检和兑换接口,之后只查询结果。
- 卡台用你名下的卡付款,买家的账号开通。
- 买家在结果页看到开通完成,你在后台对账。
费用的承担方式(CDK 接入文档 §6.18.6):
- 发码时按张扣服务费,金额以账户的实时配置为准。
- 买家兑换时,卡片注资和订阅实付由 CDK 所有者,也就是发码人承担。
所以卡密每被兑换一张,你名下的卡和余额就会被用掉一次,发码前请确认余额充足。
4.2 确认账号权限
开放 API 文档 §6.18.1 规定,账户需要是正常的主账户、没有卡片操作限制,并且已经有一笔入账的充值,同时满足下面任意一条:
- 管理员手工开通了 GPT 直充;
- 是管理员账户;
- 会员等级达到超级 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 密钥
- 在「我的 API 密钥」区域点「+ 创建密钥」。按钮左边的数字框是新密钥的消费限额,0 表示不限制,可以先填,也可以创建后再改。
- 列表里新增一行,其中:
- App ID:
ak_开头,是公开的标识; - App Secret:
sk_开头,相当于密码。
- App ID:

警告:App Secret 只完整显示这一次,页面提示「创建后仅完整显示一次,遗失请删除重建」。创建后马上复制,保存在密码管理器或服务器上只有你能读的文件里,不要截图,也不要发到群里。
5.3 设置 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 站用不到。
- 回调地址填你自己的接收接口,不是卡台官网的地址。

回调地址要等第 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 章。

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

第一次连接会询问是否信任这台服务器,输入 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。

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

脚本运行失败时,先看最后几行的报错:
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"

只复制冒号后面的那一串,共 24 位字母和数字。
注意:Setup Token 只打印这一次。完成安装之前,不要重复运行脚本,也不要重建容器,否则旧日志会被清掉,再也找不到这个 Token。如果已经错过,处理方法见 6.11。
6.6 运行安装向导,创建管理员
在浏览器中打开 https://你的域名/ops/setup。

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

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

- 「登录密码(请复制)」一栏就是生成的密码。页面提示「安装成功,已自动登录。请立刻复制保存下面的密码(只显示一次)」。
- 点「复制账号密码」,粘贴到密码管理器里。
- 勾选「我已安全保存密码」。
- 点「进入运营后台」。
提示:本文测试的版本中,点「进入运营后台」后页面没有跳转。这时实际上已经登录,在地址栏打开
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 密钥
点顶部菜单的「卡台接入」。

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

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

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

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卡密」,页面最上方是「购买并生成」区域。

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

注意:付款地区在发码时就确定了。按官方文档,预检和兑换都沿用卡密上保存的付款地区,买家兑换时不能更改。要卖智利的卡密,就在这里选智利再发码。
- 勾选「确认承担兑换资金」。不勾选的话无法购买,页面会提示「勾选「确认承担兑换资金」后再购买。实付由本账户承担,服务费从卡台余额扣除。」
- 点最右侧的按钮。按钮上写明了本次的张数、套餐和总服务费,例如「购买 10 张 Plus · $1.50」。核对无误后点一次。
发码成功后的页面:

- 绿色提示条「成功 10 张完整码(每条约 24 字符)· 服务器已存 10」,说明这批卡密已经保存到你的 CDK 站,之后随时能查到。
- 下面的文本框里是本批的完整卡密,一行一张。点「复制」复制整批,点「导出」下载为
.txt文件。发码成功时,站点也会尝试自动把整批卡密复制到剪贴板。 - 先把卡密保存到安全的位置,再做别的事。
警告:完整且未使用的卡密可以直接兑换会员,和现金一样,不要发到公开的群里,也不要出现在截图和日志中。帮助中心也提醒「不要在聊天群公开未使用的码」。
提示:发码时如果网络卡住或页面提示超时,不要再点购买。官方要求结果不确定时先查列表,不能用新的请求重复购码。CDK 站会自动到卡台找回可能已经发出的卡密,并提示「发码请求未完成,已从卡台找回 N 张完整码。不要再点购买。」看到这条提示后,到列表里核对张数。如果报错中带有「可能是 IP 未进白名单」,按 6.8 把本机出口 IP 加进卡台白名单。
7.3 管理卡密
在「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 站后台只能看到这个 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 发码、兑换与删除退款」的说明:
- 停用不等于删除退款,停用只是限制使用,不退钱。
- 能否删除退费由页面校验决定。处理中和已付款(已消耗)的卡密不能删除,也不能重复兑换。
- 删除退费成功后,应该能在卡台的「财务明细」里查到这笔退款,请核对。
7.5 把卡密交给买家
买家使用你自己域名下的页面:
| 地址 | 用途 |
|---|---|
https://你的域名/ |
买家首页,有充值提交(兑换)、批量兑换、卡密查询、账单查询四个入口 |
https://你的域名/recharge |
单张兑换,最常用 |
https://你的域名/batch |
批量兑换 |
https://你的域名/history |
卡密查询 |
https://你的域名/billing |
账单查询 |

后台地址 /ops 不要发给买家。买家页左上角显示的站点名称可以修改,见 7.8。
交付卡密时,把完整卡密(一行一张)和兑换网址一起发给买家,同时附上兑换说明。下面这段可以直接复制使用:
兑换说明
- 打开兑换网址
https://你的域名/recharge,在「输入 CDK」框中粘贴卡密,点「预览 / 下一步」。- 在浏览器里登录要升级的 ChatGPT 账号,新开一个标签页打开
https://chatgpt.com/api/auth/session,按 Ctrl+A 全选、Ctrl+C 复制整页内容。- 回到兑换页,把内容粘贴到「Session」框中,点「预检」。
- 核对页面显示的账号邮箱和目标套餐,无误后点「兑换」。
- 页面显示「开通完成」后,回到 ChatGPT 刷新页面确认。
注意:整个过程请使用同一个浏览器和同一个网络,中途不要切换设备或开关代理;兑换页的会话 15 分钟内有效,超时请从第 1 步重新开始;点「兑换」后请等待结果,不要重复点击或刷新;Session 相当于账号的登录凭证,只粘贴到兑换页,不要发给任何人;输入框里灰色的示例格式(如
SXC-XXXX-…)只是占位提示,以收到的卡密为准。
7.6 买家的兑换流程
这一节说明买家在兑换页上看到的内容,方便你指导买家和排查问题。建议先用自己的测试账号完整走一遍。
第 1 步:验证卡密

页面上方有四个页签:立即兑换、批量充值、卡密查询、账单查询,下面是四个步骤:验证卡密、填写凭证、确认兑换、查看结果。在「输入 CDK」中粘贴卡密,点「预览 / 下一步」。
- 卡密有效时进入第 2 步。
- 卡密无效、已使用或已停用时,页面会直接提示,例如「CDK 无效或不可用」「CDK 已使用或正在兑换」「CDK 已停用」。
这一步会为买家创建一个 15 分钟的兑换会话。之后的预检、兑换和查询结果,都必须来自同一个出口 IP 和同一台设备(CDK 接入文档 §6.18.8)。
第 2 步:填写凭证

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

第 3 步:确认兑换

预检通过后,页面显示账号的邮箱、目标套餐、当前套餐和订阅状态等信息。请买家核对两项:邮箱是否正确,目标套餐是否是想要的。显示「上游未提供」的字段,表示卡台没有返回相应的信息,不影响兑换。
- 如果账号已经有同档或更高档的套餐,页面会出现黄色提示,按钮变为「当前套餐已满足」,这次不能重复购买。这是对买家的保护,不要强行重试。
- 页面上方的说明是「结果不确定或 review 时请勿重复提交,请轮询结果」。核对无误后,点一次「兑换」。
第 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)。订单每发生一次变化,「最近事件」表中就会新增一行:

| 事件类型 | 触发时机 |
|---|---|
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 章)。

| 操作 | 请求 | 说明 |
|---|---|---|
| 发码 | 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 后只查询结果,不重复提交 |
编程时需要注意的几点(均出自官方文档):
- 保存并原样提交完整的
code,不要只保存code_prefix,也不要限制卡密长度;套餐以返回的plan为准,不要从前缀推断。 - 发码请求出现网络错误或超时时,先查询列表确认是否已经发出,不能换一个新的
Idempotency-Key重新请求,否则会重复购码。 - 兑换「已受理」(
awaiting_card等)不代表成功,只有completed才是成功;review、pending等状态继续查询原订单,不要重新兑换。 - 失败是终态,但不能只凭失败状态推断卡密已释放或钱已退回,还要看
cdk_status、funding_hold_status、service_fee_status。只有卡密回到unused才能再次兑换。 - 回调只是通知,要用订单查询(按
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 | 公告、更新和咨询 |
本文根据卡台官方文档整理。页面和接口会更新,请以官网的最新页面和官方文档为准;发现内容和实际页面不一致的,欢迎向官方反馈。