0 代理费,所有会员都可以用自己的商户 ID + 商户密钥对接:拉商品和拿货价、查库存、询价、下单(扣余额)、查单取卡密。全部 POST、表单编码(application/x-www-form-urlencoded)、返回 JSON。
app_id(商户 ID)和 sign(签名),其余业务参数按接口填。sign → 去掉值为空字符串的参数 → 按参数名 ASCII 升序排序 → 拼成 k1=v1&k2=v2…(值用原文,不做 URL 编码;数组参数写成 sku[颜色]=红 这种形式)→ 末尾追加 &key=商户密钥 → 取 MD5,32 位小写。// PHP 签名参考实现(和服务端完全一致)
function yy_sign(array $data, string $appKey): string {
unset($data['sign']);
ksort($data);
foreach ($data as $k => $v) { if ($v === '') unset($data[$k]); }
return md5(urldecode(http_build_query($data) . '&key=' . $appKey));
}
返回格式统一:成功 {"code":200,"msg":"success","data":…};失败 {"code":0,"msg":"原因"}。下面"参数"不含每个接口都要带的 app_id、sign。
连接测试:验证商户 ID / 密钥是否正确,顺便取余额。
| 参数 | 说明 |
|---|---|
| (无) | 只带 app_id、sign |
返回 data.shopName 店名、data.balance 你的余额(元)。
商品列表(按分类分组),只列对接开放、在售、对你可见的商品。
| 参数 | 说明 |
|---|---|
| (无) |
返回 data[] = 分类 {id,name,…,children:[商品]};商品字段:id, name, code(对接用), price(零售价), user_price, delivery_way(0 自动发货 / 1 订单页填信息开通), stock(自动发货商品的库存数), minimum, maximum(单次最多件数,目前都是 2), contact_type, widget, description, cover …。拿货价不在这里,用下面的 inventory / valuation 取。
单个商品的库存 + 你的拿货价(最常用)。
| 参数 | 说明 |
|---|---|
sharedCode | 商品 code(注意参数名是 sharedCode) |
race | 可选,种类名;本站商品没有种类,留空 |
返回 data.count 库存(自动发货商品才有意义,填信息开通的商品为 0 不代表缺货)、data.factory_price 你的拿货价、data.price 零售价、data.delivery_way、data.draft_status。
只查库存。
| 参数 | 说明 |
|---|---|
code | 商品 code |
race / sku | 可选 |
返回 data.stock。
询价:按你的拿货价算 N 件的总价(下单前核对金额用)。
| 参数 | 说明 |
|---|---|
code | 商品 code |
num | 件数(1~2) |
race / sku / card_id | 可选 |
返回 data.price 总价(元)、data.currency_code(CNY)。
下单并用余额付款。自动发货商品(ChatGPT Plus 月卡)立刻返回卡密;填信息开通的商品返回订单号,平均 2 分钟开通好,开通后用查单接口取结果。
| 参数 | 说明 |
|---|---|
shared_code | 商品 code(注意参数名是 shared_code) |
num | 件数,1~2 |
contact | 客户联系方式(邮箱 / 微信号 / 手机),至少 3 个字符;也用于订单查询和老客识别,建议填客户真实联系方式 |
request_no | 可选但强烈建议:你自己生成的唯一请求号(≤19 位),同一个 request_no 不会重复下单,网络超时重试时用它防止扣两次 |
race / sku / card_id / password | 可选;本站商品都不需要 |
返回 data.tradeNo 订单号(18 位数字)、data.amount 实扣金额(= 拿货价 × 件数)、data.secret 卡密 / 发货内容(自动发货商品:一键开通链接,多件用换行分隔;填信息开通的商品此时为空)、data.url 订单页、data.leave_message 商品留言。余额不足返回 code 0 + "余额不足"。
查单 / 取卡密。只能查你自己账号下的单。
| 参数 | 说明 |
|---|---|
tradeNo | 订单号(trade 返回的 tradeNo,18 位数字);它也参与签名 |
返回 data.status(1 已付款)、data.secret 卡密 / 发货内容(填信息开通的商品开通前为 null,开通后是开通结果说明)、data.widget 下单附加信息。建议填信息开通的商品每 5~10 分钟轮询一次,不要秒级轮询(会撞限速)。
没有主动回调(开通完成不会推送到你的服务器),请用查单接口轮询;需要回调的可以在代搭建(¥500)时一起定制。
对接时认 code 不认 ID;code 永久不变。拿货价以 inventory 接口返回的 factory_price 为准,这里是当前值。
| 商品 | code | 零售价 | 拿货价 | 发货 |
|---|---|---|---|---|
| ChatGPT Plus1个月 | 55E12C278B07774A |
¥129 | ¥112 | 自动(秒发) |
| ChatGPT Plus3个月 | FB39947B34579C54 |
¥387 | ¥336 | 自动(秒发) |
| ChatGPT Plus6个月 | 1D2B0DAC700002E1 |
¥774 | ¥672 | 自动(秒发) |
| ChatGPT Plus12个月 | 4C0E8D7FAB3FCAC1 |
¥1,548 | ¥1,344 | 订单页填信息,平均 2 分钟 |
| ChatGPT Pro100美金档位 · 1个月 | CC85C88807CE8B20 |
¥699 | ¥649 | 订单页填信息,平均 2 分钟 |
| ChatGPT Pro200美金档位 · 1个月 | 63656B2249D92C90 |
¥1,399 | ¥1,029 | 订单页填信息,平均 2 分钟 |
| ChatGPT Pro500美金档位 · 1个月 | C9B86C93E6768B39 |
¥3,499 | ¥3,299 | 订单页填信息,平均 2 分钟 |
| Claude Pro1个月 | C45AF527D1C36ECE |
¥159 | ¥140 | 订单页填信息,平均 2 分钟 |
| Claude Max 5x1个月 | DCE162A9CA44F2D0 |
¥900 | ¥829 | 订单页填信息,平均 2 分钟 |
| Claude Max 20x1个月 | A98BB07DAD0C8B5A |
¥1,800 | ¥1,739 | 订单页填信息,平均 2 分钟 |
| Grok Premium三合一 · 1个月 | 38538C632D44BEAB |
¥239 | ¥239 | 订单页填信息,平均 2 分钟 |
| Grok Plus三合一 · 1个月 | 52A655164E0FE576 |
¥70 | ¥70 | 订单页填信息,平均 2 分钟 |
| Grok Super三合一 · 1个月 | 129C81F4BC6FF574 |
¥749 | ¥749 | 订单页填信息,平均 2 分钟 |
| Grok Ultra三合一 · 1个月 | 864F2371131B3733 |
¥1,499 | ¥1,499 | 订单页填信息,平均 2 分钟 |
| Gemini Pro18个月 | 8DCDF52BAB295BC7 |
¥99 | ¥49 | 订单页填信息,平均 2 分钟 |
items 把商品同步到你的系统(存 code、name、price、delivery_way);每天或每小时同步一次价格。inventory(拿库存 + 拿货价)或 valuation(拿总价),自动发货商品 count 为 0 时先别收客户的钱。trade 下单,带唯一 request_no。自动发货商品直接把返回的 secret(一键开通链接)发给客户;客户点开链接按提示粘贴 ChatGPT session,约 2 分钟自己开好。https://kw.yaoyao.chat/user/index/query?tradeNo=订单号 发给客户,客户在页面上按提示填开通代码(ChatGPT session / Claude 组织 ID / Grok sso),平均 2 分钟开通好;你用 query(带 tradeNo)轮询,secret 有值即完成。request_no 重试 trade,不会重复扣款;仍不确定就按 contact 在商城「订单查询」核对。| 返回 | 含义 / 处理 |
|---|---|
{"code":200} | 成功,看 data |
{"code":0,"msg":"商户ID不存在"} | app_id 填错 |
{"code":0,"msg":"密钥错误"} | 签名不对:检查密钥、参数排序、空值是否去掉、是否把 sign 自己也拼进去了 |
{"code":0,"msg":"该商品未开放对接"} / 商品不存在 | code 写错,或该商品暂未开放 |
{"code":0,"msg":"库存不足"} / 当前商品已停售 | 自动发货商品没货 / 商品下架,等补货或换商品 |
{"code":0,"msg":"余额不足"} | 去充值中心充值 |
{"code":0,"msg":"请求过于频繁…"} | 同一商户 ID 每分钟超过 60 次,等 60 秒 |
| HTTP 429 | 同一来源 IP 每分钟超过 120 次(突发 30),等 60 秒;多台机器调用请分开 IP |
调用方 IP 不在该账号的对接白名单内 | 去 对接白名单 把这个 IP 加进去 |
| HTTP 404 | 路径写错(注意大小写和 /shared/ 前缀);建议请求带上你系统名的 User-Agent,方便排查 |
每次调用都会记日志(时间、IP、路径、状态);异常刷接口、猜密钥会被封 IP。
把 你的商户ID、你的商户密钥 换成个人资料页里的值。示例商品 code 用的是 ChatGPT Plus 1 个月(55E12C278B07774A)。
curl -X POST https://kw.yaoyao.chat/shared/commodity/inventory \
-A "my-shop/1.0" \
-d "app_id=你的商户ID" -d "sharedCode=55E12C278B07774A" \
-d "sign=算好的32位小写md5"
<?php
$base = 'https://kw.yaoyao.chat';
$appId = '你的商户ID';
$appKey = '你的商户密钥';
function yy_sign(array $data, string $appKey): string {
unset($data['sign']); ksort($data);
foreach ($data as $k => $v) { if ($v === '') unset($data[$k]); }
return md5(urldecode(http_build_query($data) . '&key=' . $appKey));
}
function yy_call(string $path, array $data): array {
global $base, $appId, $appKey;
$data['app_id'] = $appId;
$data['sign'] = yy_sign($data, $appKey);
$ch = curl_init($base . $path);
curl_setopt_array($ch, [CURLOPT_POST => true, CURLOPT_POSTFIELDS => http_build_query($data),
CURLOPT_RETURNTRANSFER => true, CURLOPT_USERAGENT => 'my-shop/1.0', CURLOPT_TIMEOUT => 30]);
$r = json_decode((string)curl_exec($ch), true); curl_close($ch);
return is_array($r) ? $r : ['code' => 0, 'msg' => '网络错误'];
}
// 1 连接测试
print_r(yy_call('/shared/authentication/connect', []));
// 2 库存 + 拿货价
print_r(yy_call('/shared/commodity/inventory', ['sharedCode' => '55E12C278B07774A']));
// 3 下单(余额支付)
$r = yy_call('/shared/commodity/trade', [
'shared_code' => '55E12C278B07774A', 'num' => 1,
'contact' => 'customer@example.com', 'request_no' => (string)time() . rand(100, 999),
]);
if (($r['code'] ?? 0) == 200) {
echo "订单号 {$r['data']['tradeNo']},卡密:{$r['data']['secret']}\n";
// 4 查单(填信息开通的商品轮询用)
print_r(yy_call('/shared/commodity/query', ['tradeNo' => $r['data']['tradeNo']]));
} else {
echo "失败:{$r['msg']}\n";
}
import hashlib, time, random, requests
BASE = 'https://kw.yaoyao.chat'
APP_ID = '你的商户ID'
APP_KEY = '你的商户密钥'
def sign(data: dict) -> str:
items = sorted((k, str(v)) for k, v in data.items() if k != 'sign' and str(v) != '')
raw = '&'.join(f'{k}={v}' for k, v in items) + '&key=' + APP_KEY
return hashlib.md5(raw.encode('utf-8')).hexdigest()
def call(path: str, data: dict | None = None) -> dict:
data = dict(data or {}, app_id=APP_ID)
data['sign'] = sign(data)
r = requests.post(BASE + path, data=data, headers={'User-Agent': 'my-shop/1.0'}, timeout=30)
return r.json()
print(call('/shared/authentication/connect'))
print(call('/shared/commodity/inventory', {'sharedCode': '55E12C278B07774A'}))
r = call('/shared/commodity/trade', {'shared_code': '55E12C278B07774A', 'num': 1,
'contact': 'customer@example.com', 'request_no': f'{int(time.time())}{random.randint(100, 999)}'})
print(r)
if r.get('code') == 200:
print(call('/shared/commodity/query', {'tradeNo': r['data']['tradeNo']}))
签名提示:Python 示例把所有值当字符串拼接,和 PHP 的 http_build_query + urldecode 结果一致;如果你要传数组参数(sku),按 sku[键]=值 的形式拼进去再排序。
https://kw.yaoyao.chat,商户 ID、密钥填你在本站个人资料页的值。不会接、没有技术:付 ¥500(支付宝)瑶瑶代搭建——帮你把 API 接到你的系统,或直接给你开一个白标分站(你的域名、共享库存、零售价你定)。详情见 代理合作说明,扫码加瑶瑶企业微信备注「API」。
