"use client";
import {
DocCode,
DocEndpoint,
DocPage,
DocPageHeader,
DocParagraph,
DocSection,
DocTable,
DocList,
DocOrderedList,
DocNote,
} from "@/components/docs/doc-ui";
const CURL_PLAYER_ME = `curl -sS "https://{lottery_api}/api/v1/player/me" \\
-H "Authorization: Bearer {JWT}" \\
-H "Accept: application/json"`;
const CURL_WALLET_BALANCE = `curl -sS "https://{wallet_host}/wallet/balance?site_code=demo&site_player_id=100001¤cy_code=NPR" \\
-H "Authorization: Bearer {wallet_api_key}"`;
const CURL_WALLET_DEBIT = `curl -sS -X POST "https://{wallet_host}/wallet/debit-for-lottery" \\
-H "Authorization: Bearer {wallet_api_key}" \\
-H "Content-Type: application/json" \\
-d '{
"site_code": "demo",
"site_player_id": "100001",
"player_id": 42,
"currency_code": "NPR",
"amount_minor": 100,
"idempotent_key": "accept-debit-001"
}'`;
const IFRAME_EXAMPLE = `
主站集成
`;
const JWT_SIGN_TS = `const header = base64url(JSON.stringify({ alg: "HS256", typ: "JWT" }));
const payload = base64url(JSON.stringify({
site_code: "demo",
site_player_id: "100001",
iat: Math.floor(Date.now() / 1000),
exp: Math.floor(Date.now() / 1000) + 300,
}));
const sig = hmacSha256Base64url(\`\${header}.\${payload}\`, SSO_JWT_SECRET);
const token = \`\${header}.\${payload}.\${sig}\`;`;
export function ApiReferenceDocScreen(): React.ReactElement {
return (
金额一律使用最小货币单位整数(minor),如 2000 = 20.00。编码 UTF-8 JSON。
最小验证步骤:
{CURL_PLAYER_ME}
{CURL_WALLET_BALANCE}
{CURL_WALLET_DEBIT}
测试与生产环境的 site_code、密钥、域名须完全隔离。生产环境 wallet_api_url 仅允许 HTTPS 公网地址,拒绝 localhost / 私网 IP。
采用 HS256 JWT。主站签发,彩票验签。
{JWT_SIGN_TS}
方式 A — URL 跳转:
{`https://{lottery_h5_base_url}/?token={JWT}`}
方式 B — iframe 嵌入:
{``}
首次有效 JWT 调用 GET /api/v1/player/me 时自动建档。username / nickname 由彩票生成,不从主站同步。
{`GET /api/v1/player/me
Authorization: Bearer {JWT}
Accept-Language: zh`}
彩票不提供「登录换票」接口。主站登录后自行签发 JWT,玩家 API 统一用 Authorization: Bearer 携带。
",
"彩票 H5 加载白名单后发送 LOTTERY_READY",
"主站监听 message,校验 origin 后发送 MAIN_INIT_TOKEN",
"彩票 H5 保存 token,调用 /api/v1/player/me 入场",
"Token 将过期时:彩票发 LOTTERY_TOKEN_NEEDED → 主站续签后发 MAIN_REFRESH_TOKEN",
]}
/>
postMessage 第二参数须为具体 origin(如 https://www.partner.com),禁止使用 *。
收到 MAIN_INIT_TOKEN 后彩票子页不再发送 LOTTERY_READY,避免重复下发 token。
{IFRAME_EXAMPLE}
由客户实现。彩票服务端调用。鉴权:Authorization: Bearer {"{wallet_api_key}"}。
{`{
"success": true,
"data": { "main_balance": 500000, "currency_code": "NPR" }
}`}
{`{
"success": true,
"external_ref_no": "MW-001",
"data": { "main_balance": 498000, "currency_code": "NPR" }
}`}
请求体与扣款相同。用于转出或失败回滚加款。
idempotent_key:相同键 + 相同操作须返回首次 JSON(HTTP 200),禁止重复记账;同键不同操作/金额 → success: false。
);
}