UPI-GIT5 API接入文档

UPI · INDIA · INR

UPI-GIT5 API 接入文档

通过提链 CDK 建立隔离会话,批量创建提链任务,并在同一租户作用域内跟踪任务和自动支付状态。

BASE URL https://rustupi.agiapi.top
当前协议
HTTPS
当前端口
443
请求格式
application/json
字符编码
UTF-8
批次上限
5000 个任务
异步响应
HTTP 202

所有公开接口统一使用固定入口。代码示例、OpenAPI 定义与第三方项目均以 https://rustupi.agiapi.top 为基础 URL。

AUTHENTICATION

鉴权与租户隔离

每个提链 CDK 对应一个独立租户。先创建 12 小时页面会话,再将返回的令牌放入后续请求头。

1验证 CDKPOST /api/link-cdk/status
2创建会话POST /api/link-cdk/session
3携带令牌X-Link-CDK-Session
4访问本租户任务/api/upi-git5/*
创建提链 CDK 会话
curl -X POST 'https://rustupi.agiapi.top/api/link-cdk/session' \
  -H 'Content-Type: application/json' \
  -d '{"code":"LINK_CDK"}'
后续请求头X-Link-CDK-Session: SESSION_TOKEN

QUICK START

批量提链完整流程

  1. 创建会话使用提链 CDK 换取 SESSION_TOKEN。
  2. 保存支付 CDK调用 /api/payment/configure 登录选定支付平台并读取额度。
  3. 开启自动支付调用 /api/payment/settings,提交布尔值 enabled: true。
  4. 创建批次提交 Access Token、代理列表及同一个 payment_provider_id。
  5. 轮询进度使用返回的 batch_id 获取提链和支付状态。
  6. 处理结果读取 jobs[].result 和 jobs[].payment,直到支付进入终态。

关键请求参数

接口参数类型要求说明
/link-cdk/sessioncodestring必填有效且未禁用的提链 CDK
/payment/configureprovider_idstring必填foarge、xxsyun、astrascan 或 cdkscan
/payment/configurecdkstring必填对应支付平台的支付 CDK
/payment/settingsprovider_idstring必填必须与已配置平台及批次平台一致
/payment/settingsenabledboolean必填传入 JSON 布尔值 true 开启自动支付
/upi-git5/batchtokensstring[]必填Access Token 数组,最多 5000 条
/upi-git5/batchentry_proxiesstring[]必填代理数组,最多 5000 条
/upi-git5/batchlink_cdkstring必填必须与请求头会话绑定的提链 CDK 一致
/upi-git5/batchpayment_provider_idstring自动支付必填必须与配置并开启的平台一致,默认 foarge
/upi-git5/batchuse_promoboolean选填严格 0 元模式固定为 true;传 false 将拒绝请求
/upi-git5/batchpromo_campaignstring选填默认 plus-1-month-free
/batch/{id}/progresssummary_onlyboolean选填只返回批次计数,不返回任务数组;大批次轮询优先使用
/batch/{id}/progresssincenumber选填传入上次响应的 cursor,只返回之后变化的任务
/batch/{id}/progressresultstring选填none、compact 或 full;高并发轮询使用 compact
/batch/{id}/progressinclude_paymentboolean选填是否携带 payment;只看提链状态时设为 false
/batch/{id}/progressoffsetinteger选填稳定变化集的分页偏移,默认 0
/batch/{id}/progresslimitinteger选填每页最多 1000 条;终态批次分页导出时读取 next_offset
JavaScript 提链 + 自动支付完整示例
const BASE_URL = 'https://rustupi.agiapi.top';
const LINK_CDK = 'LINK_CDK';
const PAYMENT_PROVIDER_ID = 'foarge';

const sessionResponse = await fetch(`${BASE_URL}/api/link-cdk/session`, {
  method: 'POST',
  headers: {'Content-Type': 'application/json'},
  body: JSON.stringify({code: LINK_CDK})
});
const session = await sessionResponse.json();
if (!sessionResponse.ok) throw new Error(session.error?.message || '会话创建失败');

const headers = {
  'Content-Type': 'application/json',
  'X-Link-CDK-Session': session.token
};

async function scopedRequest(path, options = {}) {
  const response = await fetch(`${BASE_URL}${path}`, {
    ...options,
    headers: {...headers, ...(options.headers || {})}
  });
  const data = await response.json();
  if (!response.ok) {
    throw new Error(data.error?.message || data.error || `HTTP ${response.status}`);
  }
  return {response, data};
}

// 1. 保存并登录支付平台 CDK,同时取得剩余次数。
const configured = await scopedRequest('/api/payment/configure', {
  method: 'POST',
  body: JSON.stringify({
    provider_id: PAYMENT_PROVIDER_ID,
    cdk: 'PAYMENT_CDK'
  })
});
if (!configured.data.quota_known || configured.data.quota_blocked) {
  throw new Error('支付 CDK 额度不可用');
}

// 2. 开启当前提链 CDK 租户的自动支付。
await scopedRequest('/api/payment/settings', {
  method: 'POST',
  body: JSON.stringify({
    provider_id: PAYMENT_PROVIDER_ID,
    enabled: true
  })
});

// 3. 创建提链批次。平台标识必须与上面配置的平台一致。
const batchResponse = await fetch(`${BASE_URL}/api/upi-git5/batch`, {
  method: 'POST',
  headers,
  body: JSON.stringify({
    tokens: ['ACCESS_TOKEN'],
    entry_proxies: ['socks5://HOST:PORT'],
    link_cdk: LINK_CDK,
    payment_provider_id: PAYMENT_PROVIDER_ID,
    use_promo: true,
    promo_campaign: 'plus-1-month-free'
  })
});
const batch = await batchResponse.json();
if (batchResponse.status !== 202) {
  throw new Error(batch.error?.message || batch.error || '批次创建失败');
}

// 4. 使用游标增量轮询。Map 保存本地状态,不创建任务卡片 DOM。
const paymentTerminal = new Set([
  'completed', 'failed', 'expired', 'cancelled',
  'quota_insufficient', 'submit_failed', 'tracking_failed'
]);
const jobs = new Map(batch.jobs.map(job => [job.job_id, job]));
let cursor = 0;
let snapshot;
let finished;
do {
  await new Promise(resolve => setTimeout(resolve, 3000));
  ({data: snapshot} = await scopedRequest(
    `/api/upi-git5/batch/${batch.batch_id}/progress?`
      + new URLSearchParams({
          since: String(cursor),
          result: 'compact',
          include_payment: 'true'
        }),
    {method: 'GET'}
  ));
  for (const job of snapshot.jobs) jobs.set(job.id, {...jobs.get(job.id), ...job});
  cursor = snapshot.cursor;
  finished = !snapshot.running && snapshot.payment_active === 0;
} while (!finished);

for (const job of jobs.values()) {
  console.log({
    email: job.account_email,
    link_status: job.status,
    payment_status: job.payment?.status,
    payment_order_id: job.payment?.order_id,
    payment_error: job.payment?.error
  });
}

超大批次低开销轮询

只需要批次完成度时使用汇总模式;该请求不序列化任务结果、支付对象和日志,适合 1000 至 5000 任务批次。活动批次读取任务变化时不设置分页参数,避免任务持续更新导致分页窗口变化;批次进入终态后再使用 offset 与 limit 分页导出。

汇总轮询请求
GET /api/upi-git5/batch/BATCH_ID/progress?summary_only=true&result=none&include_payment=false
X-Link-CDK-Session: SESSION_TOKEN

{
  "batch_size": 5000,
  "completed": 3200,
  "succeeded": 2810,
  "failed": 390,
  "running": true,
  "payment_active": 146,
  "jobs": []
}

ENDPOINT REFERENCE

接口目录

24 个接口

STATE MACHINE

状态枚举

对象状态含义
提链任务queued等待全站及当前 CDK 并发调度
提链任务running任务正在执行
提链任务done成功出链,结果位于 result
提链任务error任务失败,原因位于 error
提链任务cancelled任务已停止
支付not_submitted尚未提交或自动提交关闭
支付queued / submission_waiting进入支付队列或等待平台限速
支付submitting正在向支付平台创建订单
支付tracking_retrying订单状态查询处理中
支付completed支付成功
支付failed / expired / cancelled支付终态
支付quota_insufficient / submit_failed / tracking_failed额度、提交或查询失败

ERROR HANDLING

错误处理

优先读取结构化错误的 error.message;兼容少数参数校验接口返回的字符串型 error。

结构化错误
{
  "ok": false,
  "error": {
    "code": "ERROR_CODE",
    "message": "错误说明"
  }
}
兼容错误
{
  "error": "错误说明"
}
HTTP处理方式
400修正请求字段、平台标识或 CDK 配置
401重新创建提链 CDK 页面会话
403当前 CDK 不可用,或资源不属于当前租户
404任务、批次、CDK 或二维码不存在
409额度正在占用、CDK 正忙或状态冲突
429读取 Retry-After 后重新提交
502支付平台网络错误或返回内容无效

INTEGRATION NOTES

接入约定

  • Rust API v1.2 兼容 Python upi_server 实际注册的 24 个公开操作;现有项目保留方法、路径、请求字段、响应码和 X-Link-CDK-Session,只需将 Base URL 指向 Rust 服务。旧文档另外列出的姓名 GET/POST 与 CAPTCHA 入口也已兼容;未注册到 upi_server 的 POST /api/checkout,Rust 以提链 CDK 会话兼容入口提供。
  • 第三方程序统一使用公开服务地址 https://rustupi.agiapi.top。
  • 创建批次时,请求体的 link_cdk 必须与 X-Link-CDK-Session 对应的 CDK 一致。
  • 任务、批次、支付配置和支付 CDK 均按提链 CDK 隔离,跨租户访问返回 403。
  • 批次创建和支付手动提交返回 202 Accepted,需要继续轮询状态。
  • 支付平台标识为 foarge、xxsyun、astrascan、cdkscan,默认使用 foarge。
  • GET /api/checkout-qr 成功时返回 image/png,不要按 JSON 解析。
  • 批次轻量轮询使用 /progress;只有需要完整日志时才读取批次详情。
  • 高并发客户端先用 summary_only=true 读取计数;需要任务变化时传入上次 cursor 作为 since。
  • 实时任务回收使用 result=compact;仅在诊断单个任务时调用 /checkout-progress 或完整批次详情。
  • 轮询间隔使用 3 至 5 秒并加入随机抖动;收到 429 时严格遵循 Retry-After。
  • 不可融合 CDK 可以作为目标 CDK 接收额度,但不能作为来源 CDK 转出额度。
  • 同一支付订单会绑定提交时的平台和支付 CDK,后续更换当前支付 CDK 不影响既有订单查询。