"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。 ); }