开卡发票 —— 这一款卡对这个会员的报价与准入
代会员调用 · 必带
x-on-behalf-of
做开卡确认页用这一条。 没有它,终端用户要等POST /v1/cards/applications 扣完钱才第一次看见价钱。
与 GET /v1/cards/products 的分工:那一条是目录(不带会员上下文,给「有哪些卡」那一屏用),这一条是发票。
── issue_fee 与 shipping_fee 分开,不要自己并成一个总价 ──
- 费率表要能分行列出来:闷在开卡费里的话,用户看到实体卡 20 USD却不知道自己在为运费付钱;
- 「免费配送」这条卖点跟着
shipping_fee == 0走 ——在界面上写死那句话,等于承诺一件我方后台随时能改掉的事。
虚拟卡的 shipping_fee 恒为 "0"(没有东西可寄)。
── shipping_by_address:邮费按收货国家算 ──实体卡才有。用户在发票页一改地址,邮费那一行与合计要立刻跟着变,而你不该为此再打一次请求。
⚠
deliverable: false的地址请明确标出来并禁用支付,不要悄悄按 0 元邮费放行 —— 那会让用户付完钱才知道寄不到。
reason分两档:card_country_not_supported(这个国家不发这张卡)与
card_not_deliverable(发得了但寄不到)。
── can_apply 与 reason 一起给 ──只给 false 的话你只能显示一句「暂不可用」,而这几档的处置完全不同:缺实名要引导去实名,card_address_required 要引导去添加邮寄地址,供应商不可用则该显示「稍后再试」。
路径参数
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
id |
string | 必填 | 卡产品 id(GET /v1/cards/products 给的那个)。带不带 cpd_ 前缀都收。 |
请求头
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
x-on-behalf-of |
string | 必填 |
响应
200OK
{
"product_id": "cpd_12",
"form_factor": "physical",
"fee_asset": "USDT",
"ledger_scale": 6,
"display_scale": 2,
"issue_fee": "20.00",
"shipping_fee": "8.00",
"can_apply": true,
"reason": "",
"shipping_by_address": [
{
"address_id": "sad_6b1f0c72-9a3e-4d15-8f27-c4e0b9a31d68",
"country": "HK",
"is_default": true,
"shipping_fee": "8.00",
"total": "28.00",
"deliverable": true,
"reason": ""
}
]
}404
not_found 产品不存在、未启用、或没对你开放请求
curl -X GET 'https://api.zise.com/v1/cards/products/{id}/quote' \
-H 'x-auth-token: Bearer $TOKEN' \
-H 'x-on-behalf-of: $MEMBER_ID'const res = await fetch("https://api.zise.com/v1/cards/products/{id}/quote", {
method: "GET",
headers: {
"x-auth-token": "Bearer $TOKEN",
"x-on-behalf-of": "$MEMBER_ID",
},
});
// 金额按字符串读,别让它变成 number
const data = await res.json();import requests
res = requests.get(
"https://api.zise.com/v1/cards/products/{id}/quote",
headers={
"x-auth-token": "Bearer $TOKEN",
"x-on-behalf-of": "$MEMBER_ID",
},
)
# 金额用 Decimal(str(...)),不要 float
data = res.json()req, _ := http.NewRequest("GET", "https://api.zise.com/v1/cards/products/{id}/quote",
nil)
req.Header.Set("x-auth-token", "Bearer $TOKEN")
req.Header.Set("x-on-behalf-of", "$MEMBER_ID")
res, err := http.DefaultClient.Do(req)
// 金额字段用 string 接,不要 float64HttpRequest req = HttpRequest.newBuilder()
.uri(URI.create("https://api.zise.com/v1/cards/products/{id}/quote"))
.header("x-auth-token", "Bearer $TOKEN")
.header("x-on-behalf-of", "$MEMBER_ID")
.method("GET", HttpRequest.BodyPublishers.noBody())
.build();
// 金额字段用 String / BigDecimal,不要 double$ch = curl_init('https://api.zise.com/v1/cards/products/{id}/quote');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'x-auth-token: Bearer $TOKEN',
'x-on-behalf-of: $MEMBER_ID',
],
]);
$res = curl_exec($ch);
// 金额用 bcmath / 字符串,不要 floatval
200
{
"product_id": "cpd_12",
"form_factor": "physical",
"fee_asset": "USDT",
"ledger_scale": 6,
"display_scale": 2,
"issue_fee": "20.00",
"shipping_fee": "8.00",
"can_apply": true,
"reason": "",
"shipping_by_address": [
{
"address_id": "sad_6b1f0c72-9a3e-4d15-8f27-c4e0b9a31d68",
"country": "HK",
"is_default": true,
"shipping_fee": "8.00",
"total": "28.00",
"deliverable": true,
"reason": ""
}
]
}