开发者/快速开始

CardV 商户 API

CardV 面向企业批发礼品卡、游戏充值、eSIM 等预付数字商品。通过商户 API,你的系统可以自动完成采购:查余额、找商品、看价格、下单,然后拿到卡密。货款从你在 CardV 的预付钱包中扣除。加款、查看历史订单等其他操作,都在商户后台完成。

#文档目录

文档内容
认证与签名请求头、请求签名、API Key 管理
商品与下单余额、汇率、商品、价格、下单、卡密
话费充值手机充值:运营商、报价、充值订单
通用约定金额、时间、编号、频率限制、错误
Webhook 通知订单完成后推送到你服务器的通知
沙盒环境联调测试与上线检查清单
安全如何保护密钥和卡密

#环境

正式环境(Live)沙盒环境(Sandbox)
API 地址https://b2b.cardv.net/api/v1https://sandbox.cardv.net/api/v1
商户后台https://b2b.cardv.net/portal/同一个后台,顶部切换到 Sandbox

沙盒是一套独立的测试环境,里面用的是测试金。两个环境的 API Key、余额、订单和商品编号都互不相通。

#快速开始

  1. 注册:在商户后台申请商户账号,并验证邮箱。

  2. 等待审核:CardV 审核你的企业资料,通过后你会拿到商户号(Merchant ID),例如 M00000001。

  3. 进入沙盒:登录商户后台,在顶部切换到 Sandbox。系统会送你 1,000 USD 测试金。

  4. 创建 API Key:在后台进入 Integrations → API keys。创建一个 Key。后台只会显示一次 Key ID 和签名密钥,请把签名密钥保存到你的密钥管理系统里。

  5. 查询余额:

    Shell
    export CARDV_BASE=https://sandbox.cardv.net
    export CARDV_KEY_ID=ck_test_...            # shown in the Portal
    export CARDV_SIGNING_SECRET=cs_test_...    # from your secret store
    
    cardv_get() {  # every call is signed, see Authentication
      local ts nonce sig
      ts=$(date +%s); nonce=$(openssl rand -hex 16)
      sig=$(printf 'GET\n%s\n%s\n%s\n%s' "$1" "$ts" "$nonce" \
        e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 \
        | openssl dgst -sha256 -hmac "$CARDV_SIGNING_SECRET" -hex | sed 's/^.*= //')
      curl -sS "$CARDV_BASE$1" -H "X-Key-Id: $CARDV_KEY_ID" \
        -H "X-Timestamp: $ts" -H "X-Nonce: $nonce" -H "X-Signature: $sig"
    }
    
    cardv_get "/api/v1/balance"
  6. 查找商品:

    Shell
    cardv_get "/api/v1/skus?search=steam&limit=20"

    选一个 "availability": "available"(可售)的商品,记下它的 sku_id。

  7. 获取价格:

    Shell
    cardv_get "/api/v1/skus/S000001/quote?quantity=1"

    记下 merchant_price,这就是你购买一件的价格。

  8. 下单:和所有请求一样,需要签名。用认证与签名里的示例代码,发送下面的内容:

    JSON
    {
      "external_order_id": "TEST-0001",
      "items": [
        {"sku_id": "S000001", "quantity": 1, "expected_unit_price": "9.25"}
      ]
    }

    成功后返回 HTTP 201,以及 CardV 订单号,例如 O-00001234。

  9. 获取卡密:调用 GET/api/v1/orders/O-00001234,直到订单状态变为 succeeded。卡密在 items[].deliveries[] 里:card_number、pin_code 和 redeem_url。你也可以配置 Webhook,在订单完成时收到通知。

  10. 上线:完成沙盒测试清单后切换到正式环境。

以上编号和价格只是示例,请以你账户实际返回的数据为准。

#接口一览

API 一共只有 16 个接口,路径都以 /api/v1 开头。

接口用途需要签名
GET/account查看企业信息和 API 开通状态否
GET/balance查看可用余额否
GET/fx-ratesUSD 汇率(店铺用其他币种标价时)否
GET/products商品列表,每个商品带全部 SKU否
GET/products/{product_id}单个商品,含 SKU 与完整说明否
GET/skus可购买的商品列表(含你的价格)否
GET/skus/{sku_id}单个商品详情否
GET/skus/{sku_id}/quote按数量查询当前价格否
POST/orders下单,从钱包扣款是
GET/orders/{order_id}查询订单状态和卡密否
GET/recharge/countries可以充值的国家否
GET/recharge/operators某个国家的运营商和金额否
POST/recharge/quote查询一笔话费充值的价格是
POST/recharge/orders给手机号充值,从钱包扣款是
GET/recharge/orders充值订单列表否
GET/recharge/orders/{order_id}查询充值订单状态否

用 API Key 调用其他任何接口,都会返回 HTTP 403:

JSON
{"detail": "This operation is only available in the Merchant Portal."}

话费充值的说明见话费充值。

#编号说明

编号示例说明
商户号(Merchant ID)M00000001你的商户编号,永久不变。
SKU 编号(可购买的商品)S000456报价和下单都用它。
CardV 订单号O-00001234请和你自己的订单一起保存。
商户订单号SHOP-10001由你自己生成,对应字段 external_order_id。

编号请按文本保存,不要去解析其中的数字。详见通用约定。

#在商户后台完成的操作

  • 钱包加款,以及余额不足提醒
  • 历史订单查询和导出
  • 订单发票
  • 资金流水与对账
  • Webhook 配置、推送记录和重新推送
  • API Key 管理
  • IP 白名单
  • 团队成员与角色
  • 操作日志
  • 两步验证(2FA)
  • 在正式环境和沙盒之间切换

#兼容性与支持

我们可能会在不另行通知的情况下,新增返回字段和新的状态值。遇到不认识的字段请直接忽略;遇到不认识的订单状态,一律按"尚未完成"处理。不要依赖错误信息的具体措辞。

如需帮助,请发邮件至 [email protected],写明商户号、环境、相关订单号、发生时间(UTC)和 HTTP 状态码。切勿在邮件中发送 API Key、签名、Webhook 密钥或卡密。

接入遇到问题?请发送邮件至 [email protected],并附上 Merchant ID 与订单号或请求 ID。