[{"data":1,"prerenderedAt":8067},["ShallowReactive",2],{"navigation-en":3,"en:\u002Freference\u002Fcode-samples":193,"en:\u002Freference\u002Fcode-samples:surround":8062},[4,20,51,77,95,110,133,158,172],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":6},"Getting Started",false,"\u002Fgetting-started","1.getting-started",[10,15],{"title":11,"path":12,"stem":13,"icon":14},"Portal Preparation","\u002Fgetting-started\u002Fportal-setup","1.getting-started\u002F1.portal-setup","i-lucide-rocket",{"title":16,"path":17,"stem":18,"icon":19},"Quickstart","\u002Fgetting-started\u002Fquickstart","1.getting-started\u002F2.quickstart","i-lucide-zap",{"title":21,"icon":22,"path":23,"stem":24,"children":25,"page":6},"Core Concepts","i-lucide-key-round","\u002Fconcepts","2.concepts",[26,31,36,41,46],{"title":27,"path":28,"stem":29,"icon":30},"Authentication","\u002Fconcepts\u002Fauthentication","2.concepts\u002F1.authentication","i-lucide-fingerprint",{"title":32,"path":33,"stem":34,"icon":35},"IP Allowlist","\u002Fconcepts\u002Fip-allowlist","2.concepts\u002F2.ip-allowlist","i-lucide-shield-check",{"title":37,"path":38,"stem":39,"icon":40},"Money Format","\u002Fconcepts\u002Fmoney","2.concepts\u002F3.money","i-lucide-banknote",{"title":42,"path":43,"stem":44,"icon":45},"Idempotency","\u002Fconcepts\u002Fidempotency","2.concepts\u002F4.idempotency","i-lucide-repeat",{"title":47,"path":48,"stem":49,"icon":50},"Error envelope & codes","\u002Fconcepts\u002Ferrors","2.concepts\u002F5.errors","i-lucide-octagon-alert",{"title":52,"icon":53,"path":54,"stem":55,"children":56,"page":6},"Deposits","i-lucide-arrow-down-to-line","\u002Fdeposits","3.deposits",[57,62,67,72],{"title":58,"path":59,"stem":60,"icon":61},"Deposit Overview & State Machine","\u002Fdeposits\u002Foverview","3.deposits\u002F1.overview","i-lucide-info",{"title":63,"path":64,"stem":65,"icon":66},"Create a Deposit","\u002Fdeposits\u002Fcreate","3.deposits\u002F2.create","i-lucide-plus",{"title":68,"path":69,"stem":70,"icon":71},"Get a Deposit","\u002Fdeposits\u002Fretrieve","3.deposits\u002F3.retrieve","i-lucide-search",{"title":73,"path":74,"stem":75,"icon":76},"Cancel a Deposit","\u002Fdeposits\u002Fcancel","3.deposits\u002F4.cancel","i-lucide-x",{"title":78,"icon":79,"path":80,"stem":81,"children":82,"page":6},"Withdrawals","i-lucide-arrow-up-from-line","\u002Fwithdrawals","4.withdrawals",[83,87,91],{"title":84,"path":85,"stem":86,"icon":61},"Withdrawal Overview","\u002Fwithdrawals\u002Foverview","4.withdrawals\u002F1.overview",{"title":88,"path":89,"stem":90,"icon":66},"Create a Withdrawal","\u002Fwithdrawals\u002Fcreate","4.withdrawals\u002F2.create",{"title":92,"path":93,"stem":94,"icon":71},"Get & List Withdrawals","\u002Fwithdrawals\u002Fretrieve","4.withdrawals\u002F3.retrieve",{"title":96,"icon":97,"path":98,"stem":99,"children":100,"page":6},"Balance & Banks","i-lucide-wallet","\u002Fbalance","5.balance",[101,105],{"title":102,"path":103,"stem":104,"icon":97},"Get Balance","\u002Fbalance\u002Fget-balance","5.balance\u002F1.get-balance",{"title":106,"path":107,"stem":108,"icon":109},"Bank List","\u002Fbalance\u002Fbanks","5.balance\u002F2.banks","i-lucide-landmark",{"title":111,"icon":112,"path":113,"stem":114,"children":115,"page":6},"Webhooks","i-lucide-webhook","\u002Fwebhooks","6.webhooks",[116,120,125,129],{"title":117,"path":118,"stem":119,"icon":61},"Webhook Overview","\u002Fwebhooks\u002Foverview","6.webhooks\u002F1.overview",{"title":121,"path":122,"stem":123,"icon":124},"Event Catalog & Payloads","\u002Fwebhooks\u002Fevents","6.webhooks\u002F2.events","i-lucide-list",{"title":126,"path":127,"stem":128,"icon":35},"Signature Verification","\u002Fwebhooks\u002Fsignature-verification","6.webhooks\u002F3.signature-verification",{"title":130,"path":131,"stem":132,"icon":45},"Endpoint Requirements, Retries & SSRF","\u002Fwebhooks\u002Fdelivery-and-retries","6.webhooks\u002F4.delivery-and-retries",{"title":134,"icon":135,"path":136,"stem":137,"children":138,"page":6},"Sandbox","i-lucide-flask-conical","\u002Fsandbox","7.sandbox",[139,143,148,153],{"title":140,"path":141,"stem":142,"icon":61},"Test Mode Overview","\u002Fsandbox\u002Foverview","7.sandbox\u002F1.overview",{"title":144,"path":145,"stem":146,"icon":147},"Simulate Transfer","\u002Fsandbox\u002Fsimulate-transfer","7.sandbox\u002F2.simulate-transfer","i-lucide-banknote-arrow-down",{"title":149,"path":150,"stem":151,"icon":152},"Top-up & Reset","\u002Fsandbox\u002Ftop-up-and-reset","7.sandbox\u002F3.top-up-and-reset","i-lucide-rotate-ccw",{"title":154,"path":155,"stem":156,"icon":157},"End-to-End Test Flow","\u002Fsandbox\u002Fe2e-test-flow","7.sandbox\u002F4.e2e-test-flow","i-lucide-list-checks",{"title":159,"icon":14,"path":160,"stem":161,"children":162,"page":6},"Go-live","\u002Fgo-live","8.go-live",[163,167],{"title":164,"path":165,"stem":166,"icon":157},"Go-live Checklist","\u002Fgo-live\u002Fchecklist","8.go-live\u002F1.checklist",{"title":168,"path":169,"stem":170,"icon":171},"Contact & Support","\u002Fgo-live\u002Fsupport","8.go-live\u002F2.support","i-lucide-life-buoy",{"title":173,"icon":174,"path":175,"stem":176,"children":177,"page":6},"Reference","i-lucide-book-marked","\u002Freference","9.reference",[178,183,188],{"title":179,"path":180,"stem":181,"icon":182},"Endpoint Catalog","\u002Freference\u002Fendpoints","9.reference\u002F1.endpoints","i-lucide-table",{"title":184,"path":185,"stem":186,"icon":187},"Code Samples (Node.js & PHP)","\u002Freference\u002Fcode-samples","9.reference\u002F2.code-samples","i-lucide-code",{"title":189,"path":190,"stem":191,"icon":192},"Status Values & Glossary","\u002Freference\u002Fglossary-states","9.reference\u002F3.glossary-states","i-lucide-book-a",{"id":194,"title":184,"badge":195,"body":196,"description":8056,"extension":8057,"links":195,"meta":8058,"method":195,"navigation":8059,"path":185,"seo":8060,"stem":186,"__hash__":8061},"docs_en\u002F9.reference\u002F2.code-samples.md",null,{"type":197,"value":198,"toc":8050},"minimark",[199,212,217,256,260,264,4934,4938,6540,6544,6557,8043,8046],[200,201,202,203,207,208,211],"p",{},"The samples below are ",[204,205,206],"strong",{},"merchant-side"," reference code ready to adapt. They cover: automatic HMAC signing, create\u002Fget\u002Fcancel deposit, create\u002Fget withdrawal, check balance, fetch the bank list, and ",[204,209,210],{},"receive + verify a webhook",".",[213,214,216],"h2",{"id":215},"before-you-start","Before you start",[218,219,220],"caution",{},[221,222,223,236,246],"ul",{},[224,225,226,227,235],"li",{},"This code is a starting skeleton — in production add ",[204,228,229,230,234],{},"retry\u002Ftimeout, logging, and storage of the idempotency-key and ",[231,232,233],"code",{},"event_id"," in your DB to prevent reprocessing",", per your own system.",[224,237,238,245],{},[204,239,240,241,244],{},"Store the ",[231,242,243],{},"secret"," \u002F webhook secret in a secret store \u002F env"," — never hardcode them in source.",[224,247,248,251,252,255],{},[204,249,250],{},"The idempotency key must be stable per item:"," when retrying the same request (timeout\u002F5xx) you must send the ",[204,253,254],{},"same key + same body"," — do not randomize a new key on every call. The samples therefore \"take the key as an argument\" (bind it to your order id).",[257,258],"placeholder-note",{"value":259},"confirm the runtime the merchant actually uses — the Node.js code uses global `fetch` (requires Node.js 18+); PHP uses ext-curl",[213,261,263],{"id":262},"s2s-client-hmac-signing-api-calls","S2S Client — HMAC signing + API calls",[265,266,267,3076],"code-group",{},[268,269,275],"pre",{"className":270,"code":271,"filename":272,"language":273,"meta":274,"style":274},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { createHash, createHmac, randomUUID, timingSafeEqual } from \"crypto\";\n\nexport interface UnknownPayConfig {\n  baseUrl: string; \u002F\u002F เช่น \"https:\u002F\u002Fapi.unkpay.co\"\n  apiKey: string;  \u002F\u002F X-Api-Key เช่น \"unk_live_...\" หรือ \"unk_test_...\"\n  secret: string;  \u002F\u002F secret สำหรับเซ็น HMAC (show-once จาก Portal)\n}\n\nexport interface ApiError { code: string; message: string; request_id?: string }\n\nexport class UnknownPayError extends Error {\n  constructor(\n    public status: number,\n    public code: string,\n    message: string,\n    public requestId?: string,\n  ) {\n    super(message);\n    this.name = \"UnknownPayError\";\n  }\n}\n\nexport class UnknownPayClient {\n  constructor(private cfg: UnknownPayConfig) {}\n\n  \u002F** canonical string ที่ต้องเซ็น: METHOD\\n\u003Cpath+query>\\n\u003Cts>\\nsha256hex(body) *\u002F\n  private sign(method: string, target: string, ts: string, rawBody: string): string {\n    const bodyHash = createHash(\"sha256\").update(rawBody, \"utf8\").digest(\"hex\");\n    const canonical = `${method}\\n${target}\\n${ts}\\n${bodyHash}`;\n    return createHmac(\"sha256\", this.cfg.secret).update(canonical, \"utf8\").digest(\"hex\");\n  }\n\n  \u002F** เรียก S2S endpoint ใด ๆ โดยเซ็น HMAC ให้อัตโนมัติ *\u002F\n  private async request\u003CT>(\n    method: \"GET\" | \"POST\",\n    target: string, \u002F\u002F เช่น \"\u002Fv1\u002Fdeposits\" (รวม query ถ้ามี — ต้องตรงกับที่ยิงจริง)\n    opts: { body?: unknown; idempotencyKey?: string } = {},\n  ): Promise\u003CT> {\n    \u002F\u002F สร้าง JSON \"ครั้งเดียว\" แล้วใช้ทั้งเซ็นและส่ง — ห้าม re-serialize ภายหลัง (ไบต์ต้องตรงกัน)\n    const rawBody = opts.body === undefined ? \"\" : JSON.stringify(opts.body);\n    const ts = Math.floor(Date.now() \u002F 1000).toString();\n    const signature = this.sign(method, target, ts, rawBody);\n\n    const headers: Record\u003Cstring, string> = {\n      \"X-Api-Key\": this.cfg.apiKey,\n      \"X-Signature\": signature,\n      \"X-Timestamp\": ts,\n    };\n    if (rawBody) headers[\"Content-Type\"] = \"application\u002Fjson\";\n    if (opts.idempotencyKey) headers[\"Idempotency-Key\"] = opts.idempotencyKey;\n\n    const res = await fetch(this.cfg.baseUrl + target, {\n      method,\n      headers,\n      body: rawBody || undefined, \u002F\u002F ส่ง \"ไบต์เดิม\" ที่เพิ่งเซ็น\n    });\n\n    const text = await res.text();\n    const json = text ? JSON.parse(text) : {};\n    if (!res.ok) {\n      const e: ApiError = json.error ?? { code: \"UNKNOWN\", message: text };\n      throw new UnknownPayError(res.status, e.code, e.message, e.request_id);\n    }\n    return json as T;\n  }\n\n  \u002F\u002F ---------- Deposit ----------\n  createDeposit(input: CreateDepositInput, idempotencyKey: string): Promise\u003CDeposit> {\n    return this.request(\"POST\", \"\u002Fv1\u002Fdeposits\", { body: input, idempotencyKey });\n  }\n  getDeposit(id: string): Promise\u003CDeposit> {\n    return this.request(\"GET\", `\u002Fv1\u002Fdeposits\u002F${id}`);\n  }\n  cancelDeposit(id: string): Promise\u003CDeposit> {\n    return this.request(\"POST\", `\u002Fv1\u002Fdeposits\u002F${id}\u002Fcancel`); \u002F\u002F ไม่ต้องมี Idempotency-Key\n  }\n\n  \u002F\u002F ---------- Withdrawal ----------\n  createWithdrawal(input: CreateWithdrawalInput, idempotencyKey: string): Promise\u003CWithdrawal> {\n    return this.request(\"POST\", \"\u002Fv1\u002Fwithdrawals\", { body: input, idempotencyKey });\n  }\n  getWithdrawal(id: string): Promise\u003CWithdrawal> {\n    return this.request(\"GET\", `\u002Fv1\u002Fwithdrawals\u002F${id}`);\n  }\n\n  \u002F\u002F ---------- Balance \u002F Banks ----------\n  getBalance(): Promise\u003CBalance> {\n    return this.request(\"GET\", \"\u002Fv1\u002Fbalance\");\n  }\n  getBanks(): Promise\u003CRecord\u003Cstring, Bank>> {\n    return this.request(\"GET\", \"\u002Fv1\u002Fbanks\"); \u002F\u002F public — เซ็นไปด้วยก็ไม่เป็นไร\n  }\n}\n\n\u002F\u002F ---------- Types (money ทุก field = สตริงบาท เช่น \"100.50\") ----------\nexport interface CreateDepositInput {\n  amount: string;                        \u002F\u002F บาท เช่น \"100.50\"\n  payer_bank_provider: string;           \u002F\u002F bank_code เช่น \"KBANK\" (required ทั้ง 2 method)\n  payer_bank_account_name: string;       \u002F\u002F required\n  payer_bank_account_number: string;     \u002F\u002F required\n  currency?: string;                     \u002F\u002F default \"THB\"\n  payment_method_type?: \"PROMPTPAY_QR\" | \"BANK_TRANSFER\"; \u002F\u002F default PROMPTPAY_QR\n  additional_data?: { description?: string };\n  user_ref?: string;                     \u002F\u002F reference ของร้านค้า (echo กลับใน webhook)\n  callback_meta?: Record\u003Cstring, unknown>;\n}\n\nexport interface Deposit {\n  id: string;\n  amount: string;\n  expected_amount: string;               \u002F\u002F ⚠️ ยอดที่ลูกค้าต้องโอนเป๊ะ\n  matched_amount: string | null;\n  currency: string;\n  status: \"PENDING\" | \"CREDITED\" | \"EXPIRED\" | \"CANCELLED\";\n  payment_method_type: string;\n  pay_to: {\n    bank: string;\n    account_holder: string;\n    account_no?: string;                 \u002F\u002F เฉพาะ BANK_TRANSFER\n    qr_payload?: string;                 \u002F\u002F เฉพาะ PROMPTPAY_QR (เอาไปสร้าง QR)\n  };\n  payer: { bank: string; account_no: string; name: string };\n  display_expires_at: string;\n  match_window_until: string;\n}\n\nexport interface CreateWithdrawalInput {\n  amount: string;                        \u002F\u002F ยอดที่ปลายทางได้รับ (net) บาท\n  receiver_bank_provider: string;        \u002F\u002F bank_code ปลายทาง เช่น \"SCB\"\n  receiver_bank_account_name: string;\n  receiver_bank_account_number: string;\n  currency?: string;                     \u002F\u002F default \"THB\"\n  kind?: \"customer\";                     \u002F\u002F default \"customer\" (ค่าอื่น → 422 INVALID_KIND)\n  additional?: { description?: string; reference_user_id?: string };\n}\n\nexport interface Withdrawal {\n  id: string;\n  amount: string;\n  fee: string;\n  net_payout: string;\n  currency: string;\n  receiver_bank_provider: string;\n  destination: { bank: string; account_no: string; name: string };\n  kind: string;\n  status: \"PENDING\" | \"APPROVED\" | \"PROCESSING\" | \"IN_PROGRESS\" | \"SUCCESS\" | \"FAILED\" | \"REJECTED\";\n}\n\nexport interface Balance { available: string; pending: string; currency: string }\nexport interface Bank {\n  bank_code: string; bank_number: string;\n  name_th: string; fullname_th: string; name_en: string;\n}\n","Node.js (unknownpay.ts)","ts","",[231,276,277,329,336,353,373,388,403,409,414,455,460,479,488,506,519,531,545,553,570,591,597,602,607,619,641,646,652,704,768,817,882,887,892,898,918,945,960,994,1012,1018,1071,1120,1155,1160,1188,1212,1228,1244,1250,1292,1331,1336,1373,1381,1389,1408,1418,1423,1446,1478,1501,1550,1599,1605,1620,1625,1630,1636,1673,1721,1726,1753,1788,1793,1819,1861,1866,1871,1877,1913,1959,1964,1990,2024,2029,2034,2040,2060,2090,2095,2124,2157,2162,2167,2172,2178,2189,2204,2219,2234,2249,2264,2293,2312,2327,2348,2353,2358,2370,2382,2393,2408,2425,2436,2480,2491,2501,2513,2525,2540,2555,2561,2598,2610,2622,2627,2632,2643,2657,2672,2684,2696,2709,2729,2756,2761,2766,2778,2789,2800,2812,2824,2835,2846,2880,2891,2960,2965,2970,3009,3020,3041,3071],{"__ignoreMap":274},[278,279,282,286,290,294,297,300,302,305,307,310,313,316,319,323,326],"span",{"class":280,"line":281},"line",1,[278,283,285],{"class":284},"s7zQu","import",[278,287,289],{"class":288},"sMK4o"," {",[278,291,293],{"class":292},"sTEyZ"," createHash",[278,295,296],{"class":288},",",[278,298,299],{"class":292}," createHmac",[278,301,296],{"class":288},[278,303,304],{"class":292}," randomUUID",[278,306,296],{"class":288},[278,308,309],{"class":292}," timingSafeEqual",[278,311,312],{"class":288}," }",[278,314,315],{"class":284}," from",[278,317,318],{"class":288}," \"",[278,320,322],{"class":321},"sfazB","crypto",[278,324,325],{"class":288},"\"",[278,327,328],{"class":288},";\n",[278,330,332],{"class":280,"line":331},2,[278,333,335],{"emptyLinePlaceholder":334},true,"\n",[278,337,339,342,346,350],{"class":280,"line":338},3,[278,340,341],{"class":284},"export",[278,343,345],{"class":344},"spNyl"," interface",[278,347,349],{"class":348},"sBMFI"," UnknownPayConfig",[278,351,352],{"class":288}," {\n",[278,354,356,360,363,366,369],{"class":280,"line":355},4,[278,357,359],{"class":358},"swJcz","  baseUrl",[278,361,362],{"class":288},":",[278,364,365],{"class":348}," string",[278,367,368],{"class":288},";",[278,370,372],{"class":371},"sHwdD"," \u002F\u002F เช่น \"https:\u002F\u002Fapi.unkpay.co\"\n",[278,374,376,379,381,383,385],{"class":280,"line":375},5,[278,377,378],{"class":358},"  apiKey",[278,380,362],{"class":288},[278,382,365],{"class":348},[278,384,368],{"class":288},[278,386,387],{"class":371},"  \u002F\u002F X-Api-Key เช่น \"unk_live_...\" หรือ \"unk_test_...\"\n",[278,389,391,394,396,398,400],{"class":280,"line":390},6,[278,392,393],{"class":358},"  secret",[278,395,362],{"class":288},[278,397,365],{"class":348},[278,399,368],{"class":288},[278,401,402],{"class":371},"  \u002F\u002F secret สำหรับเซ็น HMAC (show-once จาก Portal)\n",[278,404,406],{"class":280,"line":405},7,[278,407,408],{"class":288},"}\n",[278,410,412],{"class":280,"line":411},8,[278,413,335],{"emptyLinePlaceholder":334},[278,415,417,419,421,424,426,429,431,433,435,438,440,442,444,447,450,452],{"class":280,"line":416},9,[278,418,341],{"class":284},[278,420,345],{"class":344},[278,422,423],{"class":348}," ApiError",[278,425,289],{"class":288},[278,427,428],{"class":358}," code",[278,430,362],{"class":288},[278,432,365],{"class":348},[278,434,368],{"class":288},[278,436,437],{"class":358}," message",[278,439,362],{"class":288},[278,441,365],{"class":348},[278,443,368],{"class":288},[278,445,446],{"class":358}," request_id",[278,448,449],{"class":288},"?:",[278,451,365],{"class":348},[278,453,454],{"class":288}," }\n",[278,456,458],{"class":280,"line":457},10,[278,459,335],{"emptyLinePlaceholder":334},[278,461,463,465,468,471,474,477],{"class":280,"line":462},11,[278,464,341],{"class":284},[278,466,467],{"class":344}," class",[278,469,470],{"class":348}," UnknownPayError",[278,472,473],{"class":344}," extends",[278,475,476],{"class":348}," Error",[278,478,352],{"class":288},[278,480,482,485],{"class":280,"line":481},12,[278,483,484],{"class":344},"  constructor",[278,486,487],{"class":288},"(\n",[278,489,491,494,498,500,503],{"class":280,"line":490},13,[278,492,493],{"class":344},"    public",[278,495,497],{"class":496},"sHdIc"," status",[278,499,362],{"class":288},[278,501,502],{"class":348}," number",[278,504,505],{"class":288},",\n",[278,507,509,511,513,515,517],{"class":280,"line":508},14,[278,510,493],{"class":344},[278,512,428],{"class":496},[278,514,362],{"class":288},[278,516,365],{"class":348},[278,518,505],{"class":288},[278,520,522,525,527,529],{"class":280,"line":521},15,[278,523,524],{"class":496},"    message",[278,526,362],{"class":288},[278,528,365],{"class":348},[278,530,505],{"class":288},[278,532,534,536,539,541,543],{"class":280,"line":533},16,[278,535,493],{"class":344},[278,537,538],{"class":496}," requestId",[278,540,449],{"class":288},[278,542,365],{"class":348},[278,544,505],{"class":288},[278,546,548,551],{"class":280,"line":547},17,[278,549,550],{"class":288},"  )",[278,552,352],{"class":288},[278,554,556,559,562,565,568],{"class":280,"line":555},18,[278,557,558],{"class":292},"    super",[278,560,561],{"class":358},"(",[278,563,564],{"class":292},"message",[278,566,567],{"class":358},")",[278,569,328],{"class":288},[278,571,573,576,579,582,584,587,589],{"class":280,"line":572},19,[278,574,575],{"class":288},"    this.",[278,577,578],{"class":292},"name",[278,580,581],{"class":288}," =",[278,583,318],{"class":288},[278,585,586],{"class":321},"UnknownPayError",[278,588,325],{"class":288},[278,590,328],{"class":288},[278,592,594],{"class":280,"line":593},20,[278,595,596],{"class":288},"  }\n",[278,598,600],{"class":280,"line":599},21,[278,601,408],{"class":288},[278,603,605],{"class":280,"line":604},22,[278,606,335],{"emptyLinePlaceholder":334},[278,608,610,612,614,617],{"class":280,"line":609},23,[278,611,341],{"class":284},[278,613,467],{"class":344},[278,615,616],{"class":348}," UnknownPayClient",[278,618,352],{"class":288},[278,620,622,624,626,629,632,634,636,638],{"class":280,"line":621},24,[278,623,484],{"class":344},[278,625,561],{"class":288},[278,627,628],{"class":344},"private",[278,630,631],{"class":496}," cfg",[278,633,362],{"class":288},[278,635,349],{"class":348},[278,637,567],{"class":288},[278,639,640],{"class":288}," {}\n",[278,642,644],{"class":280,"line":643},25,[278,645,335],{"emptyLinePlaceholder":334},[278,647,649],{"class":280,"line":648},26,[278,650,651],{"class":371},"  \u002F** canonical string ที่ต้องเซ็น: METHOD\\n\u003Cpath+query>\\n\u003Cts>\\nsha256hex(body) *\u002F\n",[278,653,655,658,661,663,666,668,670,672,675,677,679,681,684,686,688,690,693,695,697,700,702],{"class":280,"line":654},27,[278,656,657],{"class":344},"  private",[278,659,660],{"class":358}," sign",[278,662,561],{"class":288},[278,664,665],{"class":496},"method",[278,667,362],{"class":288},[278,669,365],{"class":348},[278,671,296],{"class":288},[278,673,674],{"class":496}," target",[278,676,362],{"class":288},[278,678,365],{"class":348},[278,680,296],{"class":288},[278,682,683],{"class":496}," ts",[278,685,362],{"class":288},[278,687,365],{"class":348},[278,689,296],{"class":288},[278,691,692],{"class":496}," rawBody",[278,694,362],{"class":288},[278,696,365],{"class":348},[278,698,699],{"class":288},"):",[278,701,365],{"class":348},[278,703,352],{"class":288},[278,705,707,710,713,715,718,720,722,725,727,729,731,734,736,739,741,743,746,748,750,752,755,757,759,762,764,766],{"class":280,"line":706},28,[278,708,709],{"class":344},"    const",[278,711,712],{"class":292}," bodyHash",[278,714,581],{"class":288},[278,716,293],{"class":717},"s2Zo4",[278,719,561],{"class":358},[278,721,325],{"class":288},[278,723,724],{"class":321},"sha256",[278,726,325],{"class":288},[278,728,567],{"class":358},[278,730,211],{"class":288},[278,732,733],{"class":717},"update",[278,735,561],{"class":358},[278,737,738],{"class":292},"rawBody",[278,740,296],{"class":288},[278,742,318],{"class":288},[278,744,745],{"class":321},"utf8",[278,747,325],{"class":288},[278,749,567],{"class":358},[278,751,211],{"class":288},[278,753,754],{"class":717},"digest",[278,756,561],{"class":358},[278,758,325],{"class":288},[278,760,761],{"class":321},"hex",[278,763,325],{"class":288},[278,765,567],{"class":358},[278,767,328],{"class":288},[278,769,771,773,776,778,781,783,786,789,792,795,797,799,801,803,805,807,809,812,815],{"class":280,"line":770},29,[278,772,709],{"class":344},[278,774,775],{"class":292}," canonical",[278,777,581],{"class":288},[278,779,780],{"class":288}," `${",[278,782,665],{"class":292},[278,784,785],{"class":288},"}",[278,787,788],{"class":292},"\\n",[278,790,791],{"class":288},"${",[278,793,794],{"class":292},"target",[278,796,785],{"class":288},[278,798,788],{"class":292},[278,800,791],{"class":288},[278,802,273],{"class":292},[278,804,785],{"class":288},[278,806,788],{"class":292},[278,808,791],{"class":288},[278,810,811],{"class":292},"bodyHash",[278,813,814],{"class":288},"}`",[278,816,328],{"class":288},[278,818,820,823,825,827,829,831,833,835,838,841,843,845,847,849,851,853,856,858,860,862,864,866,868,870,872,874,876,878,880],{"class":280,"line":819},30,[278,821,822],{"class":284},"    return",[278,824,299],{"class":717},[278,826,561],{"class":358},[278,828,325],{"class":288},[278,830,724],{"class":321},[278,832,325],{"class":288},[278,834,296],{"class":288},[278,836,837],{"class":288}," this.",[278,839,840],{"class":292},"cfg",[278,842,211],{"class":288},[278,844,243],{"class":292},[278,846,567],{"class":358},[278,848,211],{"class":288},[278,850,733],{"class":717},[278,852,561],{"class":358},[278,854,855],{"class":292},"canonical",[278,857,296],{"class":288},[278,859,318],{"class":288},[278,861,745],{"class":321},[278,863,325],{"class":288},[278,865,567],{"class":358},[278,867,211],{"class":288},[278,869,754],{"class":717},[278,871,561],{"class":358},[278,873,325],{"class":288},[278,875,761],{"class":321},[278,877,325],{"class":288},[278,879,567],{"class":358},[278,881,328],{"class":288},[278,883,885],{"class":280,"line":884},31,[278,886,596],{"class":288},[278,888,890],{"class":280,"line":889},32,[278,891,335],{"emptyLinePlaceholder":334},[278,893,895],{"class":280,"line":894},33,[278,896,897],{"class":371},"  \u002F** เรียก S2S endpoint ใด ๆ โดยเซ็น HMAC ให้อัตโนมัติ *\u002F\n",[278,899,901,903,906,909,912,915],{"class":280,"line":900},34,[278,902,657],{"class":344},[278,904,905],{"class":344}," async",[278,907,908],{"class":358}," request",[278,910,911],{"class":288},"\u003C",[278,913,914],{"class":348},"T",[278,916,917],{"class":288},">(\n",[278,919,921,924,926,928,931,933,936,938,941,943],{"class":280,"line":920},35,[278,922,923],{"class":496},"    method",[278,925,362],{"class":288},[278,927,318],{"class":288},[278,929,930],{"class":321},"GET",[278,932,325],{"class":288},[278,934,935],{"class":288}," |",[278,937,318],{"class":288},[278,939,940],{"class":321},"POST",[278,942,325],{"class":288},[278,944,505],{"class":288},[278,946,948,951,953,955,957],{"class":280,"line":947},36,[278,949,950],{"class":496},"    target",[278,952,362],{"class":288},[278,954,365],{"class":348},[278,956,296],{"class":288},[278,958,959],{"class":371}," \u002F\u002F เช่น \"\u002Fv1\u002Fdeposits\" (รวม query ถ้ามี — ต้องตรงกับที่ยิงจริง)\n",[278,961,963,966,968,970,973,975,978,980,983,985,987,989,991],{"class":280,"line":962},37,[278,964,965],{"class":496},"    opts",[278,967,362],{"class":288},[278,969,289],{"class":288},[278,971,972],{"class":358}," body",[278,974,449],{"class":288},[278,976,977],{"class":348}," unknown",[278,979,368],{"class":288},[278,981,982],{"class":358}," idempotencyKey",[278,984,449],{"class":288},[278,986,365],{"class":348},[278,988,312],{"class":288},[278,990,581],{"class":288},[278,992,993],{"class":288}," {},\n",[278,995,997,1000,1003,1005,1007,1010],{"class":280,"line":996},38,[278,998,999],{"class":288},"  ):",[278,1001,1002],{"class":348}," Promise",[278,1004,911],{"class":288},[278,1006,914],{"class":348},[278,1008,1009],{"class":288},">",[278,1011,352],{"class":288},[278,1013,1015],{"class":280,"line":1014},39,[278,1016,1017],{"class":371},"    \u002F\u002F สร้าง JSON \"ครั้งเดียว\" แล้วใช้ทั้งเซ็นและส่ง — ห้าม re-serialize ภายหลัง (ไบต์ต้องตรงกัน)\n",[278,1019,1021,1023,1025,1027,1030,1032,1035,1038,1041,1044,1047,1050,1053,1055,1058,1060,1063,1065,1067,1069],{"class":280,"line":1020},40,[278,1022,709],{"class":344},[278,1024,692],{"class":292},[278,1026,581],{"class":288},[278,1028,1029],{"class":292}," opts",[278,1031,211],{"class":288},[278,1033,1034],{"class":292},"body",[278,1036,1037],{"class":288}," ===",[278,1039,1040],{"class":288}," undefined",[278,1042,1043],{"class":288}," ?",[278,1045,1046],{"class":288}," \"\"",[278,1048,1049],{"class":288}," :",[278,1051,1052],{"class":292}," JSON",[278,1054,211],{"class":288},[278,1056,1057],{"class":717},"stringify",[278,1059,561],{"class":358},[278,1061,1062],{"class":292},"opts",[278,1064,211],{"class":288},[278,1066,1034],{"class":292},[278,1068,567],{"class":358},[278,1070,328],{"class":288},[278,1072,1074,1076,1078,1080,1083,1085,1088,1090,1093,1095,1098,1101,1104,1108,1110,1112,1115,1118],{"class":280,"line":1073},41,[278,1075,709],{"class":344},[278,1077,683],{"class":292},[278,1079,581],{"class":288},[278,1081,1082],{"class":292}," Math",[278,1084,211],{"class":288},[278,1086,1087],{"class":717},"floor",[278,1089,561],{"class":358},[278,1091,1092],{"class":292},"Date",[278,1094,211],{"class":288},[278,1096,1097],{"class":717},"now",[278,1099,1100],{"class":358},"() ",[278,1102,1103],{"class":288},"\u002F",[278,1105,1107],{"class":1106},"sbssI"," 1000",[278,1109,567],{"class":358},[278,1111,211],{"class":288},[278,1113,1114],{"class":717},"toString",[278,1116,1117],{"class":358},"()",[278,1119,328],{"class":288},[278,1121,1123,1125,1128,1130,1132,1135,1137,1139,1141,1143,1145,1147,1149,1151,1153],{"class":280,"line":1122},42,[278,1124,709],{"class":344},[278,1126,1127],{"class":292}," signature",[278,1129,581],{"class":288},[278,1131,837],{"class":288},[278,1133,1134],{"class":717},"sign",[278,1136,561],{"class":358},[278,1138,665],{"class":292},[278,1140,296],{"class":288},[278,1142,674],{"class":292},[278,1144,296],{"class":288},[278,1146,683],{"class":292},[278,1148,296],{"class":288},[278,1150,692],{"class":292},[278,1152,567],{"class":358},[278,1154,328],{"class":288},[278,1156,1158],{"class":280,"line":1157},43,[278,1159,335],{"emptyLinePlaceholder":334},[278,1161,1163,1165,1168,1170,1173,1175,1178,1180,1182,1184,1186],{"class":280,"line":1162},44,[278,1164,709],{"class":344},[278,1166,1167],{"class":292}," headers",[278,1169,362],{"class":288},[278,1171,1172],{"class":348}," Record",[278,1174,911],{"class":288},[278,1176,1177],{"class":348},"string",[278,1179,296],{"class":288},[278,1181,365],{"class":348},[278,1183,1009],{"class":288},[278,1185,581],{"class":288},[278,1187,352],{"class":288},[278,1189,1191,1194,1197,1199,1201,1203,1205,1207,1210],{"class":280,"line":1190},45,[278,1192,1193],{"class":288},"      \"",[278,1195,1196],{"class":358},"X-Api-Key",[278,1198,325],{"class":288},[278,1200,362],{"class":288},[278,1202,837],{"class":288},[278,1204,840],{"class":292},[278,1206,211],{"class":288},[278,1208,1209],{"class":292},"apiKey",[278,1211,505],{"class":288},[278,1213,1215,1217,1220,1222,1224,1226],{"class":280,"line":1214},46,[278,1216,1193],{"class":288},[278,1218,1219],{"class":358},"X-Signature",[278,1221,325],{"class":288},[278,1223,362],{"class":288},[278,1225,1127],{"class":292},[278,1227,505],{"class":288},[278,1229,1231,1233,1236,1238,1240,1242],{"class":280,"line":1230},47,[278,1232,1193],{"class":288},[278,1234,1235],{"class":358},"X-Timestamp",[278,1237,325],{"class":288},[278,1239,362],{"class":288},[278,1241,683],{"class":292},[278,1243,505],{"class":288},[278,1245,1247],{"class":280,"line":1246},48,[278,1248,1249],{"class":288},"    };\n",[278,1251,1253,1256,1259,1261,1264,1267,1270,1272,1275,1277,1280,1283,1285,1288,1290],{"class":280,"line":1252},49,[278,1254,1255],{"class":284},"    if",[278,1257,1258],{"class":358}," (",[278,1260,738],{"class":292},[278,1262,1263],{"class":358},") ",[278,1265,1266],{"class":292},"headers",[278,1268,1269],{"class":358},"[",[278,1271,325],{"class":288},[278,1273,1274],{"class":321},"Content-Type",[278,1276,325],{"class":288},[278,1278,1279],{"class":358},"] ",[278,1281,1282],{"class":288},"=",[278,1284,318],{"class":288},[278,1286,1287],{"class":321},"application\u002Fjson",[278,1289,325],{"class":288},[278,1291,328],{"class":288},[278,1293,1295,1297,1299,1301,1303,1306,1308,1310,1312,1314,1317,1319,1321,1323,1325,1327,1329],{"class":280,"line":1294},50,[278,1296,1255],{"class":284},[278,1298,1258],{"class":358},[278,1300,1062],{"class":292},[278,1302,211],{"class":288},[278,1304,1305],{"class":292},"idempotencyKey",[278,1307,1263],{"class":358},[278,1309,1266],{"class":292},[278,1311,1269],{"class":358},[278,1313,325],{"class":288},[278,1315,1316],{"class":321},"Idempotency-Key",[278,1318,325],{"class":288},[278,1320,1279],{"class":358},[278,1322,1282],{"class":288},[278,1324,1029],{"class":292},[278,1326,211],{"class":288},[278,1328,1305],{"class":292},[278,1330,328],{"class":288},[278,1332,1334],{"class":280,"line":1333},51,[278,1335,335],{"emptyLinePlaceholder":334},[278,1337,1339,1341,1344,1346,1349,1352,1354,1357,1359,1361,1364,1367,1369,1371],{"class":280,"line":1338},52,[278,1340,709],{"class":344},[278,1342,1343],{"class":292}," res",[278,1345,581],{"class":288},[278,1347,1348],{"class":284}," await",[278,1350,1351],{"class":717}," fetch",[278,1353,561],{"class":358},[278,1355,1356],{"class":288},"this.",[278,1358,840],{"class":292},[278,1360,211],{"class":288},[278,1362,1363],{"class":292},"baseUrl",[278,1365,1366],{"class":288}," +",[278,1368,674],{"class":292},[278,1370,296],{"class":288},[278,1372,352],{"class":288},[278,1374,1376,1379],{"class":280,"line":1375},53,[278,1377,1378],{"class":292},"      method",[278,1380,505],{"class":288},[278,1382,1384,1387],{"class":280,"line":1383},54,[278,1385,1386],{"class":292},"      headers",[278,1388,505],{"class":288},[278,1390,1392,1395,1397,1399,1402,1405],{"class":280,"line":1391},55,[278,1393,1394],{"class":358},"      body",[278,1396,362],{"class":288},[278,1398,692],{"class":292},[278,1400,1401],{"class":288}," ||",[278,1403,1404],{"class":288}," undefined,",[278,1406,1407],{"class":371}," \u002F\u002F ส่ง \"ไบต์เดิม\" ที่เพิ่งเซ็น\n",[278,1409,1411,1414,1416],{"class":280,"line":1410},56,[278,1412,1413],{"class":288},"    }",[278,1415,567],{"class":358},[278,1417,328],{"class":288},[278,1419,1421],{"class":280,"line":1420},57,[278,1422,335],{"emptyLinePlaceholder":334},[278,1424,1426,1428,1431,1433,1435,1437,1439,1442,1444],{"class":280,"line":1425},58,[278,1427,709],{"class":344},[278,1429,1430],{"class":292}," text",[278,1432,581],{"class":288},[278,1434,1348],{"class":284},[278,1436,1343],{"class":292},[278,1438,211],{"class":288},[278,1440,1441],{"class":717},"text",[278,1443,1117],{"class":358},[278,1445,328],{"class":288},[278,1447,1449,1451,1454,1456,1458,1460,1462,1464,1467,1469,1471,1473,1475],{"class":280,"line":1448},59,[278,1450,709],{"class":344},[278,1452,1453],{"class":292}," json",[278,1455,581],{"class":288},[278,1457,1430],{"class":292},[278,1459,1043],{"class":288},[278,1461,1052],{"class":292},[278,1463,211],{"class":288},[278,1465,1466],{"class":717},"parse",[278,1468,561],{"class":358},[278,1470,1441],{"class":292},[278,1472,1263],{"class":358},[278,1474,362],{"class":288},[278,1476,1477],{"class":288}," {};\n",[278,1479,1481,1483,1485,1488,1491,1493,1496,1498],{"class":280,"line":1480},60,[278,1482,1255],{"class":284},[278,1484,1258],{"class":358},[278,1486,1487],{"class":288},"!",[278,1489,1490],{"class":292},"res",[278,1492,211],{"class":288},[278,1494,1495],{"class":292},"ok",[278,1497,1263],{"class":358},[278,1499,1500],{"class":288},"{\n",[278,1502,1504,1507,1510,1512,1514,1516,1518,1520,1523,1526,1528,1530,1532,1534,1537,1539,1541,1543,1545,1547],{"class":280,"line":1503},61,[278,1505,1506],{"class":344},"      const",[278,1508,1509],{"class":292}," e",[278,1511,362],{"class":288},[278,1513,423],{"class":348},[278,1515,581],{"class":288},[278,1517,1453],{"class":292},[278,1519,211],{"class":288},[278,1521,1522],{"class":292},"error",[278,1524,1525],{"class":288}," ??",[278,1527,289],{"class":288},[278,1529,428],{"class":358},[278,1531,362],{"class":288},[278,1533,318],{"class":288},[278,1535,1536],{"class":321},"UNKNOWN",[278,1538,325],{"class":288},[278,1540,296],{"class":288},[278,1542,437],{"class":358},[278,1544,362],{"class":288},[278,1546,1430],{"class":292},[278,1548,1549],{"class":288}," };\n",[278,1551,1553,1556,1559,1561,1563,1565,1567,1570,1572,1574,1576,1578,1580,1582,1584,1586,1588,1590,1592,1595,1597],{"class":280,"line":1552},62,[278,1554,1555],{"class":284},"      throw",[278,1557,1558],{"class":288}," new",[278,1560,470],{"class":717},[278,1562,561],{"class":358},[278,1564,1490],{"class":292},[278,1566,211],{"class":288},[278,1568,1569],{"class":292},"status",[278,1571,296],{"class":288},[278,1573,1509],{"class":292},[278,1575,211],{"class":288},[278,1577,231],{"class":292},[278,1579,296],{"class":288},[278,1581,1509],{"class":292},[278,1583,211],{"class":288},[278,1585,564],{"class":292},[278,1587,296],{"class":288},[278,1589,1509],{"class":292},[278,1591,211],{"class":288},[278,1593,1594],{"class":292},"request_id",[278,1596,567],{"class":358},[278,1598,328],{"class":288},[278,1600,1602],{"class":280,"line":1601},63,[278,1603,1604],{"class":288},"    }\n",[278,1606,1608,1610,1612,1615,1618],{"class":280,"line":1607},64,[278,1609,822],{"class":284},[278,1611,1453],{"class":292},[278,1613,1614],{"class":284}," as",[278,1616,1617],{"class":348}," T",[278,1619,328],{"class":288},[278,1621,1623],{"class":280,"line":1622},65,[278,1624,596],{"class":288},[278,1626,1628],{"class":280,"line":1627},66,[278,1629,335],{"emptyLinePlaceholder":334},[278,1631,1633],{"class":280,"line":1632},67,[278,1634,1635],{"class":371},"  \u002F\u002F ---------- Deposit ----------\n",[278,1637,1639,1642,1644,1647,1649,1652,1654,1656,1658,1660,1662,1664,1666,1669,1671],{"class":280,"line":1638},68,[278,1640,1641],{"class":358},"  createDeposit",[278,1643,561],{"class":288},[278,1645,1646],{"class":496},"input",[278,1648,362],{"class":288},[278,1650,1651],{"class":348}," CreateDepositInput",[278,1653,296],{"class":288},[278,1655,982],{"class":496},[278,1657,362],{"class":288},[278,1659,365],{"class":348},[278,1661,699],{"class":288},[278,1663,1002],{"class":348},[278,1665,911],{"class":288},[278,1667,1668],{"class":348},"Deposit",[278,1670,1009],{"class":288},[278,1672,352],{"class":288},[278,1674,1676,1678,1680,1683,1685,1687,1689,1691,1693,1695,1698,1700,1702,1704,1706,1708,1711,1713,1715,1717,1719],{"class":280,"line":1675},69,[278,1677,822],{"class":284},[278,1679,837],{"class":288},[278,1681,1682],{"class":717},"request",[278,1684,561],{"class":358},[278,1686,325],{"class":288},[278,1688,940],{"class":321},[278,1690,325],{"class":288},[278,1692,296],{"class":288},[278,1694,318],{"class":288},[278,1696,1697],{"class":321},"\u002Fv1\u002Fdeposits",[278,1699,325],{"class":288},[278,1701,296],{"class":288},[278,1703,289],{"class":288},[278,1705,972],{"class":358},[278,1707,362],{"class":288},[278,1709,1710],{"class":292}," input",[278,1712,296],{"class":288},[278,1714,982],{"class":292},[278,1716,312],{"class":288},[278,1718,567],{"class":358},[278,1720,328],{"class":288},[278,1722,1724],{"class":280,"line":1723},70,[278,1725,596],{"class":288},[278,1727,1729,1732,1734,1737,1739,1741,1743,1745,1747,1749,1751],{"class":280,"line":1728},71,[278,1730,1731],{"class":358},"  getDeposit",[278,1733,561],{"class":288},[278,1735,1736],{"class":496},"id",[278,1738,362],{"class":288},[278,1740,365],{"class":348},[278,1742,699],{"class":288},[278,1744,1002],{"class":348},[278,1746,911],{"class":288},[278,1748,1668],{"class":348},[278,1750,1009],{"class":288},[278,1752,352],{"class":288},[278,1754,1756,1758,1760,1762,1764,1766,1768,1770,1772,1775,1778,1780,1782,1784,1786],{"class":280,"line":1755},72,[278,1757,822],{"class":284},[278,1759,837],{"class":288},[278,1761,1682],{"class":717},[278,1763,561],{"class":358},[278,1765,325],{"class":288},[278,1767,930],{"class":321},[278,1769,325],{"class":288},[278,1771,296],{"class":288},[278,1773,1774],{"class":288}," `",[278,1776,1777],{"class":321},"\u002Fv1\u002Fdeposits\u002F",[278,1779,791],{"class":288},[278,1781,1736],{"class":292},[278,1783,814],{"class":288},[278,1785,567],{"class":358},[278,1787,328],{"class":288},[278,1789,1791],{"class":280,"line":1790},73,[278,1792,596],{"class":288},[278,1794,1796,1799,1801,1803,1805,1807,1809,1811,1813,1815,1817],{"class":280,"line":1795},74,[278,1797,1798],{"class":358},"  cancelDeposit",[278,1800,561],{"class":288},[278,1802,1736],{"class":496},[278,1804,362],{"class":288},[278,1806,365],{"class":348},[278,1808,699],{"class":288},[278,1810,1002],{"class":348},[278,1812,911],{"class":288},[278,1814,1668],{"class":348},[278,1816,1009],{"class":288},[278,1818,352],{"class":288},[278,1820,1822,1824,1826,1828,1830,1832,1834,1836,1838,1840,1842,1844,1846,1848,1851,1854,1856,1858],{"class":280,"line":1821},75,[278,1823,822],{"class":284},[278,1825,837],{"class":288},[278,1827,1682],{"class":717},[278,1829,561],{"class":358},[278,1831,325],{"class":288},[278,1833,940],{"class":321},[278,1835,325],{"class":288},[278,1837,296],{"class":288},[278,1839,1774],{"class":288},[278,1841,1777],{"class":321},[278,1843,791],{"class":288},[278,1845,1736],{"class":292},[278,1847,785],{"class":288},[278,1849,1850],{"class":321},"\u002Fcancel",[278,1852,1853],{"class":288},"`",[278,1855,567],{"class":358},[278,1857,368],{"class":288},[278,1859,1860],{"class":371}," \u002F\u002F ไม่ต้องมี Idempotency-Key\n",[278,1862,1864],{"class":280,"line":1863},76,[278,1865,596],{"class":288},[278,1867,1869],{"class":280,"line":1868},77,[278,1870,335],{"emptyLinePlaceholder":334},[278,1872,1874],{"class":280,"line":1873},78,[278,1875,1876],{"class":371},"  \u002F\u002F ---------- Withdrawal ----------\n",[278,1878,1880,1883,1885,1887,1889,1892,1894,1896,1898,1900,1902,1904,1906,1909,1911],{"class":280,"line":1879},79,[278,1881,1882],{"class":358},"  createWithdrawal",[278,1884,561],{"class":288},[278,1886,1646],{"class":496},[278,1888,362],{"class":288},[278,1890,1891],{"class":348}," CreateWithdrawalInput",[278,1893,296],{"class":288},[278,1895,982],{"class":496},[278,1897,362],{"class":288},[278,1899,365],{"class":348},[278,1901,699],{"class":288},[278,1903,1002],{"class":348},[278,1905,911],{"class":288},[278,1907,1908],{"class":348},"Withdrawal",[278,1910,1009],{"class":288},[278,1912,352],{"class":288},[278,1914,1916,1918,1920,1922,1924,1926,1928,1930,1932,1934,1937,1939,1941,1943,1945,1947,1949,1951,1953,1955,1957],{"class":280,"line":1915},80,[278,1917,822],{"class":284},[278,1919,837],{"class":288},[278,1921,1682],{"class":717},[278,1923,561],{"class":358},[278,1925,325],{"class":288},[278,1927,940],{"class":321},[278,1929,325],{"class":288},[278,1931,296],{"class":288},[278,1933,318],{"class":288},[278,1935,1936],{"class":321},"\u002Fv1\u002Fwithdrawals",[278,1938,325],{"class":288},[278,1940,296],{"class":288},[278,1942,289],{"class":288},[278,1944,972],{"class":358},[278,1946,362],{"class":288},[278,1948,1710],{"class":292},[278,1950,296],{"class":288},[278,1952,982],{"class":292},[278,1954,312],{"class":288},[278,1956,567],{"class":358},[278,1958,328],{"class":288},[278,1960,1962],{"class":280,"line":1961},81,[278,1963,596],{"class":288},[278,1965,1967,1970,1972,1974,1976,1978,1980,1982,1984,1986,1988],{"class":280,"line":1966},82,[278,1968,1969],{"class":358},"  getWithdrawal",[278,1971,561],{"class":288},[278,1973,1736],{"class":496},[278,1975,362],{"class":288},[278,1977,365],{"class":348},[278,1979,699],{"class":288},[278,1981,1002],{"class":348},[278,1983,911],{"class":288},[278,1985,1908],{"class":348},[278,1987,1009],{"class":288},[278,1989,352],{"class":288},[278,1991,1993,1995,1997,1999,2001,2003,2005,2007,2009,2011,2014,2016,2018,2020,2022],{"class":280,"line":1992},83,[278,1994,822],{"class":284},[278,1996,837],{"class":288},[278,1998,1682],{"class":717},[278,2000,561],{"class":358},[278,2002,325],{"class":288},[278,2004,930],{"class":321},[278,2006,325],{"class":288},[278,2008,296],{"class":288},[278,2010,1774],{"class":288},[278,2012,2013],{"class":321},"\u002Fv1\u002Fwithdrawals\u002F",[278,2015,791],{"class":288},[278,2017,1736],{"class":292},[278,2019,814],{"class":288},[278,2021,567],{"class":358},[278,2023,328],{"class":288},[278,2025,2027],{"class":280,"line":2026},84,[278,2028,596],{"class":288},[278,2030,2032],{"class":280,"line":2031},85,[278,2033,335],{"emptyLinePlaceholder":334},[278,2035,2037],{"class":280,"line":2036},86,[278,2038,2039],{"class":371},"  \u002F\u002F ---------- Balance \u002F Banks ----------\n",[278,2041,2043,2046,2049,2051,2053,2056,2058],{"class":280,"line":2042},87,[278,2044,2045],{"class":358},"  getBalance",[278,2047,2048],{"class":288},"():",[278,2050,1002],{"class":348},[278,2052,911],{"class":288},[278,2054,2055],{"class":348},"Balance",[278,2057,1009],{"class":288},[278,2059,352],{"class":288},[278,2061,2063,2065,2067,2069,2071,2073,2075,2077,2079,2081,2084,2086,2088],{"class":280,"line":2062},88,[278,2064,822],{"class":284},[278,2066,837],{"class":288},[278,2068,1682],{"class":717},[278,2070,561],{"class":358},[278,2072,325],{"class":288},[278,2074,930],{"class":321},[278,2076,325],{"class":288},[278,2078,296],{"class":288},[278,2080,318],{"class":288},[278,2082,2083],{"class":321},"\u002Fv1\u002Fbalance",[278,2085,325],{"class":288},[278,2087,567],{"class":358},[278,2089,328],{"class":288},[278,2091,2093],{"class":280,"line":2092},89,[278,2094,596],{"class":288},[278,2096,2098,2101,2103,2105,2107,2110,2112,2114,2116,2119,2122],{"class":280,"line":2097},90,[278,2099,2100],{"class":358},"  getBanks",[278,2102,2048],{"class":288},[278,2104,1002],{"class":348},[278,2106,911],{"class":288},[278,2108,2109],{"class":348},"Record",[278,2111,911],{"class":288},[278,2113,1177],{"class":348},[278,2115,296],{"class":288},[278,2117,2118],{"class":348}," Bank",[278,2120,2121],{"class":288},">>",[278,2123,352],{"class":288},[278,2125,2127,2129,2131,2133,2135,2137,2139,2141,2143,2145,2148,2150,2152,2154],{"class":280,"line":2126},91,[278,2128,822],{"class":284},[278,2130,837],{"class":288},[278,2132,1682],{"class":717},[278,2134,561],{"class":358},[278,2136,325],{"class":288},[278,2138,930],{"class":321},[278,2140,325],{"class":288},[278,2142,296],{"class":288},[278,2144,318],{"class":288},[278,2146,2147],{"class":321},"\u002Fv1\u002Fbanks",[278,2149,325],{"class":288},[278,2151,567],{"class":358},[278,2153,368],{"class":288},[278,2155,2156],{"class":371}," \u002F\u002F public — เซ็นไปด้วยก็ไม่เป็นไร\n",[278,2158,2160],{"class":280,"line":2159},92,[278,2161,596],{"class":288},[278,2163,2165],{"class":280,"line":2164},93,[278,2166,408],{"class":288},[278,2168,2170],{"class":280,"line":2169},94,[278,2171,335],{"emptyLinePlaceholder":334},[278,2173,2175],{"class":280,"line":2174},95,[278,2176,2177],{"class":371},"\u002F\u002F ---------- Types (money ทุก field = สตริงบาท เช่น \"100.50\") ----------\n",[278,2179,2181,2183,2185,2187],{"class":280,"line":2180},96,[278,2182,341],{"class":284},[278,2184,345],{"class":344},[278,2186,1651],{"class":348},[278,2188,352],{"class":288},[278,2190,2192,2195,2197,2199,2201],{"class":280,"line":2191},97,[278,2193,2194],{"class":358},"  amount",[278,2196,362],{"class":288},[278,2198,365],{"class":348},[278,2200,368],{"class":288},[278,2202,2203],{"class":371},"                        \u002F\u002F บาท เช่น \"100.50\"\n",[278,2205,2207,2210,2212,2214,2216],{"class":280,"line":2206},98,[278,2208,2209],{"class":358},"  payer_bank_provider",[278,2211,362],{"class":288},[278,2213,365],{"class":348},[278,2215,368],{"class":288},[278,2217,2218],{"class":371},"           \u002F\u002F bank_code เช่น \"KBANK\" (required ทั้ง 2 method)\n",[278,2220,2222,2225,2227,2229,2231],{"class":280,"line":2221},99,[278,2223,2224],{"class":358},"  payer_bank_account_name",[278,2226,362],{"class":288},[278,2228,365],{"class":348},[278,2230,368],{"class":288},[278,2232,2233],{"class":371},"       \u002F\u002F required\n",[278,2235,2237,2240,2242,2244,2246],{"class":280,"line":2236},100,[278,2238,2239],{"class":358},"  payer_bank_account_number",[278,2241,362],{"class":288},[278,2243,365],{"class":348},[278,2245,368],{"class":288},[278,2247,2248],{"class":371},"     \u002F\u002F required\n",[278,2250,2252,2255,2257,2259,2261],{"class":280,"line":2251},101,[278,2253,2254],{"class":358},"  currency",[278,2256,449],{"class":288},[278,2258,365],{"class":348},[278,2260,368],{"class":288},[278,2262,2263],{"class":371},"                     \u002F\u002F default \"THB\"\n",[278,2265,2267,2270,2272,2274,2277,2279,2281,2283,2286,2288,2290],{"class":280,"line":2266},102,[278,2268,2269],{"class":358},"  payment_method_type",[278,2271,449],{"class":288},[278,2273,318],{"class":288},[278,2275,2276],{"class":321},"PROMPTPAY_QR",[278,2278,325],{"class":288},[278,2280,935],{"class":288},[278,2282,318],{"class":288},[278,2284,2285],{"class":321},"BANK_TRANSFER",[278,2287,325],{"class":288},[278,2289,368],{"class":288},[278,2291,2292],{"class":371}," \u002F\u002F default PROMPTPAY_QR\n",[278,2294,2296,2299,2301,2303,2306,2308,2310],{"class":280,"line":2295},103,[278,2297,2298],{"class":358},"  additional_data",[278,2300,449],{"class":288},[278,2302,289],{"class":288},[278,2304,2305],{"class":358}," description",[278,2307,449],{"class":288},[278,2309,365],{"class":348},[278,2311,1549],{"class":288},[278,2313,2315,2318,2320,2322,2324],{"class":280,"line":2314},104,[278,2316,2317],{"class":358},"  user_ref",[278,2319,449],{"class":288},[278,2321,365],{"class":348},[278,2323,368],{"class":288},[278,2325,2326],{"class":371},"                     \u002F\u002F reference ของร้านค้า (echo กลับใน webhook)\n",[278,2328,2330,2333,2335,2337,2339,2341,2343,2345],{"class":280,"line":2329},105,[278,2331,2332],{"class":358},"  callback_meta",[278,2334,449],{"class":288},[278,2336,1172],{"class":348},[278,2338,911],{"class":288},[278,2340,1177],{"class":348},[278,2342,296],{"class":288},[278,2344,977],{"class":348},[278,2346,2347],{"class":288},">;\n",[278,2349,2351],{"class":280,"line":2350},106,[278,2352,408],{"class":288},[278,2354,2356],{"class":280,"line":2355},107,[278,2357,335],{"emptyLinePlaceholder":334},[278,2359,2361,2363,2365,2368],{"class":280,"line":2360},108,[278,2362,341],{"class":284},[278,2364,345],{"class":344},[278,2366,2367],{"class":348}," Deposit",[278,2369,352],{"class":288},[278,2371,2373,2376,2378,2380],{"class":280,"line":2372},109,[278,2374,2375],{"class":358},"  id",[278,2377,362],{"class":288},[278,2379,365],{"class":348},[278,2381,328],{"class":288},[278,2383,2385,2387,2389,2391],{"class":280,"line":2384},110,[278,2386,2194],{"class":358},[278,2388,362],{"class":288},[278,2390,365],{"class":348},[278,2392,328],{"class":288},[278,2394,2396,2399,2401,2403,2405],{"class":280,"line":2395},111,[278,2397,2398],{"class":358},"  expected_amount",[278,2400,362],{"class":288},[278,2402,365],{"class":348},[278,2404,368],{"class":288},[278,2406,2407],{"class":371},"               \u002F\u002F ⚠️ ยอดที่ลูกค้าต้องโอนเป๊ะ\n",[278,2409,2411,2414,2416,2418,2420,2423],{"class":280,"line":2410},112,[278,2412,2413],{"class":358},"  matched_amount",[278,2415,362],{"class":288},[278,2417,365],{"class":348},[278,2419,935],{"class":288},[278,2421,2422],{"class":348}," null",[278,2424,328],{"class":288},[278,2426,2428,2430,2432,2434],{"class":280,"line":2427},113,[278,2429,2254],{"class":358},[278,2431,362],{"class":288},[278,2433,365],{"class":348},[278,2435,328],{"class":288},[278,2437,2439,2442,2444,2446,2449,2451,2453,2455,2458,2460,2462,2464,2467,2469,2471,2473,2476,2478],{"class":280,"line":2438},114,[278,2440,2441],{"class":358},"  status",[278,2443,362],{"class":288},[278,2445,318],{"class":288},[278,2447,2448],{"class":321},"PENDING",[278,2450,325],{"class":288},[278,2452,935],{"class":288},[278,2454,318],{"class":288},[278,2456,2457],{"class":321},"CREDITED",[278,2459,325],{"class":288},[278,2461,935],{"class":288},[278,2463,318],{"class":288},[278,2465,2466],{"class":321},"EXPIRED",[278,2468,325],{"class":288},[278,2470,935],{"class":288},[278,2472,318],{"class":288},[278,2474,2475],{"class":321},"CANCELLED",[278,2477,325],{"class":288},[278,2479,328],{"class":288},[278,2481,2483,2485,2487,2489],{"class":280,"line":2482},115,[278,2484,2269],{"class":358},[278,2486,362],{"class":288},[278,2488,365],{"class":348},[278,2490,328],{"class":288},[278,2492,2494,2497,2499],{"class":280,"line":2493},116,[278,2495,2496],{"class":358},"  pay_to",[278,2498,362],{"class":288},[278,2500,352],{"class":288},[278,2502,2504,2507,2509,2511],{"class":280,"line":2503},117,[278,2505,2506],{"class":358},"    bank",[278,2508,362],{"class":288},[278,2510,365],{"class":348},[278,2512,328],{"class":288},[278,2514,2516,2519,2521,2523],{"class":280,"line":2515},118,[278,2517,2518],{"class":358},"    account_holder",[278,2520,362],{"class":288},[278,2522,365],{"class":348},[278,2524,328],{"class":288},[278,2526,2528,2531,2533,2535,2537],{"class":280,"line":2527},119,[278,2529,2530],{"class":358},"    account_no",[278,2532,449],{"class":288},[278,2534,365],{"class":348},[278,2536,368],{"class":288},[278,2538,2539],{"class":371},"                 \u002F\u002F เฉพาะ BANK_TRANSFER\n",[278,2541,2543,2546,2548,2550,2552],{"class":280,"line":2542},120,[278,2544,2545],{"class":358},"    qr_payload",[278,2547,449],{"class":288},[278,2549,365],{"class":348},[278,2551,368],{"class":288},[278,2553,2554],{"class":371},"                 \u002F\u002F เฉพาะ PROMPTPAY_QR (เอาไปสร้าง QR)\n",[278,2556,2558],{"class":280,"line":2557},121,[278,2559,2560],{"class":288},"  };\n",[278,2562,2564,2567,2569,2571,2574,2576,2578,2580,2583,2585,2587,2589,2592,2594,2596],{"class":280,"line":2563},122,[278,2565,2566],{"class":358},"  payer",[278,2568,362],{"class":288},[278,2570,289],{"class":288},[278,2572,2573],{"class":358}," bank",[278,2575,362],{"class":288},[278,2577,365],{"class":348},[278,2579,368],{"class":288},[278,2581,2582],{"class":358}," account_no",[278,2584,362],{"class":288},[278,2586,365],{"class":348},[278,2588,368],{"class":288},[278,2590,2591],{"class":358}," name",[278,2593,362],{"class":288},[278,2595,365],{"class":348},[278,2597,1549],{"class":288},[278,2599,2601,2604,2606,2608],{"class":280,"line":2600},123,[278,2602,2603],{"class":358},"  display_expires_at",[278,2605,362],{"class":288},[278,2607,365],{"class":348},[278,2609,328],{"class":288},[278,2611,2613,2616,2618,2620],{"class":280,"line":2612},124,[278,2614,2615],{"class":358},"  match_window_until",[278,2617,362],{"class":288},[278,2619,365],{"class":348},[278,2621,328],{"class":288},[278,2623,2625],{"class":280,"line":2624},125,[278,2626,408],{"class":288},[278,2628,2630],{"class":280,"line":2629},126,[278,2631,335],{"emptyLinePlaceholder":334},[278,2633,2635,2637,2639,2641],{"class":280,"line":2634},127,[278,2636,341],{"class":284},[278,2638,345],{"class":344},[278,2640,1891],{"class":348},[278,2642,352],{"class":288},[278,2644,2646,2648,2650,2652,2654],{"class":280,"line":2645},128,[278,2647,2194],{"class":358},[278,2649,362],{"class":288},[278,2651,365],{"class":348},[278,2653,368],{"class":288},[278,2655,2656],{"class":371},"                        \u002F\u002F ยอดที่ปลายทางได้รับ (net) บาท\n",[278,2658,2660,2663,2665,2667,2669],{"class":280,"line":2659},129,[278,2661,2662],{"class":358},"  receiver_bank_provider",[278,2664,362],{"class":288},[278,2666,365],{"class":348},[278,2668,368],{"class":288},[278,2670,2671],{"class":371},"        \u002F\u002F bank_code ปลายทาง เช่น \"SCB\"\n",[278,2673,2675,2678,2680,2682],{"class":280,"line":2674},130,[278,2676,2677],{"class":358},"  receiver_bank_account_name",[278,2679,362],{"class":288},[278,2681,365],{"class":348},[278,2683,328],{"class":288},[278,2685,2687,2690,2692,2694],{"class":280,"line":2686},131,[278,2688,2689],{"class":358},"  receiver_bank_account_number",[278,2691,362],{"class":288},[278,2693,365],{"class":348},[278,2695,328],{"class":288},[278,2697,2699,2701,2703,2705,2707],{"class":280,"line":2698},132,[278,2700,2254],{"class":358},[278,2702,449],{"class":288},[278,2704,365],{"class":348},[278,2706,368],{"class":288},[278,2708,2263],{"class":371},[278,2710,2712,2715,2717,2719,2722,2724,2726],{"class":280,"line":2711},133,[278,2713,2714],{"class":358},"  kind",[278,2716,449],{"class":288},[278,2718,318],{"class":288},[278,2720,2721],{"class":321},"customer",[278,2723,325],{"class":288},[278,2725,368],{"class":288},[278,2727,2728],{"class":371},"                     \u002F\u002F default \"customer\" (ค่าอื่น → 422 INVALID_KIND)\n",[278,2730,2732,2735,2737,2739,2741,2743,2745,2747,2750,2752,2754],{"class":280,"line":2731},134,[278,2733,2734],{"class":358},"  additional",[278,2736,449],{"class":288},[278,2738,289],{"class":288},[278,2740,2305],{"class":358},[278,2742,449],{"class":288},[278,2744,365],{"class":348},[278,2746,368],{"class":288},[278,2748,2749],{"class":358}," reference_user_id",[278,2751,449],{"class":288},[278,2753,365],{"class":348},[278,2755,1549],{"class":288},[278,2757,2759],{"class":280,"line":2758},135,[278,2760,408],{"class":288},[278,2762,2764],{"class":280,"line":2763},136,[278,2765,335],{"emptyLinePlaceholder":334},[278,2767,2769,2771,2773,2776],{"class":280,"line":2768},137,[278,2770,341],{"class":284},[278,2772,345],{"class":344},[278,2774,2775],{"class":348}," Withdrawal",[278,2777,352],{"class":288},[278,2779,2781,2783,2785,2787],{"class":280,"line":2780},138,[278,2782,2375],{"class":358},[278,2784,362],{"class":288},[278,2786,365],{"class":348},[278,2788,328],{"class":288},[278,2790,2792,2794,2796,2798],{"class":280,"line":2791},139,[278,2793,2194],{"class":358},[278,2795,362],{"class":288},[278,2797,365],{"class":348},[278,2799,328],{"class":288},[278,2801,2803,2806,2808,2810],{"class":280,"line":2802},140,[278,2804,2805],{"class":358},"  fee",[278,2807,362],{"class":288},[278,2809,365],{"class":348},[278,2811,328],{"class":288},[278,2813,2815,2818,2820,2822],{"class":280,"line":2814},141,[278,2816,2817],{"class":358},"  net_payout",[278,2819,362],{"class":288},[278,2821,365],{"class":348},[278,2823,328],{"class":288},[278,2825,2827,2829,2831,2833],{"class":280,"line":2826},142,[278,2828,2254],{"class":358},[278,2830,362],{"class":288},[278,2832,365],{"class":348},[278,2834,328],{"class":288},[278,2836,2838,2840,2842,2844],{"class":280,"line":2837},143,[278,2839,2662],{"class":358},[278,2841,362],{"class":288},[278,2843,365],{"class":348},[278,2845,328],{"class":288},[278,2847,2849,2852,2854,2856,2858,2860,2862,2864,2866,2868,2870,2872,2874,2876,2878],{"class":280,"line":2848},144,[278,2850,2851],{"class":358},"  destination",[278,2853,362],{"class":288},[278,2855,289],{"class":288},[278,2857,2573],{"class":358},[278,2859,362],{"class":288},[278,2861,365],{"class":348},[278,2863,368],{"class":288},[278,2865,2582],{"class":358},[278,2867,362],{"class":288},[278,2869,365],{"class":348},[278,2871,368],{"class":288},[278,2873,2591],{"class":358},[278,2875,362],{"class":288},[278,2877,365],{"class":348},[278,2879,1549],{"class":288},[278,2881,2883,2885,2887,2889],{"class":280,"line":2882},145,[278,2884,2714],{"class":358},[278,2886,362],{"class":288},[278,2888,365],{"class":348},[278,2890,328],{"class":288},[278,2892,2894,2896,2898,2900,2902,2904,2906,2908,2911,2913,2915,2917,2920,2922,2924,2926,2929,2931,2933,2935,2938,2940,2942,2944,2947,2949,2951,2953,2956,2958],{"class":280,"line":2893},146,[278,2895,2441],{"class":358},[278,2897,362],{"class":288},[278,2899,318],{"class":288},[278,2901,2448],{"class":321},[278,2903,325],{"class":288},[278,2905,935],{"class":288},[278,2907,318],{"class":288},[278,2909,2910],{"class":321},"APPROVED",[278,2912,325],{"class":288},[278,2914,935],{"class":288},[278,2916,318],{"class":288},[278,2918,2919],{"class":321},"PROCESSING",[278,2921,325],{"class":288},[278,2923,935],{"class":288},[278,2925,318],{"class":288},[278,2927,2928],{"class":321},"IN_PROGRESS",[278,2930,325],{"class":288},[278,2932,935],{"class":288},[278,2934,318],{"class":288},[278,2936,2937],{"class":321},"SUCCESS",[278,2939,325],{"class":288},[278,2941,935],{"class":288},[278,2943,318],{"class":288},[278,2945,2946],{"class":321},"FAILED",[278,2948,325],{"class":288},[278,2950,935],{"class":288},[278,2952,318],{"class":288},[278,2954,2955],{"class":321},"REJECTED",[278,2957,325],{"class":288},[278,2959,328],{"class":288},[278,2961,2963],{"class":280,"line":2962},147,[278,2964,408],{"class":288},[278,2966,2968],{"class":280,"line":2967},148,[278,2969,335],{"emptyLinePlaceholder":334},[278,2971,2973,2975,2977,2980,2982,2985,2987,2989,2991,2994,2996,2998,3000,3003,3005,3007],{"class":280,"line":2972},149,[278,2974,341],{"class":284},[278,2976,345],{"class":344},[278,2978,2979],{"class":348}," Balance",[278,2981,289],{"class":288},[278,2983,2984],{"class":358}," available",[278,2986,362],{"class":288},[278,2988,365],{"class":348},[278,2990,368],{"class":288},[278,2992,2993],{"class":358}," pending",[278,2995,362],{"class":288},[278,2997,365],{"class":348},[278,2999,368],{"class":288},[278,3001,3002],{"class":358}," currency",[278,3004,362],{"class":288},[278,3006,365],{"class":348},[278,3008,454],{"class":288},[278,3010,3012,3014,3016,3018],{"class":280,"line":3011},150,[278,3013,341],{"class":284},[278,3015,345],{"class":344},[278,3017,2118],{"class":348},[278,3019,352],{"class":288},[278,3021,3023,3026,3028,3030,3032,3035,3037,3039],{"class":280,"line":3022},151,[278,3024,3025],{"class":358},"  bank_code",[278,3027,362],{"class":288},[278,3029,365],{"class":348},[278,3031,368],{"class":288},[278,3033,3034],{"class":358}," bank_number",[278,3036,362],{"class":288},[278,3038,365],{"class":348},[278,3040,328],{"class":288},[278,3042,3044,3047,3049,3051,3053,3056,3058,3060,3062,3065,3067,3069],{"class":280,"line":3043},152,[278,3045,3046],{"class":358},"  name_th",[278,3048,362],{"class":288},[278,3050,365],{"class":348},[278,3052,368],{"class":288},[278,3054,3055],{"class":358}," fullname_th",[278,3057,362],{"class":288},[278,3059,365],{"class":348},[278,3061,368],{"class":288},[278,3063,3064],{"class":358}," name_en",[278,3066,362],{"class":288},[278,3068,365],{"class":348},[278,3070,328],{"class":288},[278,3072,3074],{"class":280,"line":3073},153,[278,3075,408],{"class":288},[268,3077,3082],{"className":3078,"code":3079,"filename":3080,"language":3081,"meta":274,"style":274},"language-php shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003C?php\n\nclass UnknownPayException extends \\Exception\n{\n    public function __construct(\n        public int $status,\n        public string $errorCode,\n        string $message,\n        public ?string $requestId = null,\n    ) {\n        parent::__construct($message);\n    }\n}\n\nclass UnknownPayClient\n{\n    public function __construct(\n        private string $baseUrl, \u002F\u002F \"https:\u002F\u002Fapi.unkpay.co\"\n        private string $apiKey,  \u002F\u002F \"unk_live_...\" \u002F \"unk_test_...\"\n        private string $secret,  \u002F\u002F secret จาก Portal (show-once)\n    ) {}\n\n    \u002F** canonical: METHOD\\n\u003Cpath+query>\\n\u003Cts>\\nsha256hex(body) *\u002F\n    private function sign(string $method, string $target, string $ts, string $rawBody): string\n    {\n        $bodyHash  = hash('sha256', $rawBody);                  \u002F\u002F hex (lowercase)\n        $canonical = $method . \"\\n\" . $target . \"\\n\" . $ts . \"\\n\" . $bodyHash;\n        return hash_hmac('sha256', $canonical, $this->secret);  \u002F\u002F hex\n    }\n\n    \u002F** เรียก S2S endpoint พร้อมเซ็น HMAC อัตโนมัติ *\u002F\n    private function request(string $method, string $target, ?array $body = null, ?string $idempotencyKey = null): array\n    {\n        \u002F\u002F json_encode \"ครั้งเดียว\" แล้วใช้ทั้งเซ็นและส่ง — ไบต์ต้องตรงกัน\n        $rawBody = $body === null ? '' : json_encode($body, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);\n        $ts  = (string) time();\n        $sig = $this->sign($method, $target, $ts, $rawBody);\n\n        $headers = [\n            'X-Api-Key: ' . $this->apiKey,\n            'X-Signature: ' . $sig,\n            'X-Timestamp: ' . $ts,\n        ];\n        if ($rawBody !== '')           $headers[] = 'Content-Type: application\u002Fjson';\n        if ($idempotencyKey !== null)  $headers[] = 'Idempotency-Key: ' . $idempotencyKey;\n\n        $ch = curl_init($this->baseUrl . $target);\n        curl_setopt_array($ch, [\n            CURLOPT_CUSTOMREQUEST  => $method,\n            CURLOPT_RETURNTRANSFER => true,\n            CURLOPT_HTTPHEADER     => $headers,\n            CURLOPT_POSTFIELDS     => $rawBody, \u002F\u002F ส่งไบต์เดิมที่เซ็น\n            CURLOPT_TIMEOUT        => 30,\n        ]);\n        $resp   = curl_exec($ch);\n        $status = curl_getinfo($ch, CURLINFO_HTTP_CODE);\n        $err    = curl_error($ch);\n        curl_close($ch);\n\n        if ($resp === false) {\n            throw new UnknownPayException(0, 'NETWORK_ERROR', $err);\n        }\n        $json = $resp === '' ? [] : json_decode($resp, true);\n        if ($status \u003C 200 || $status >= 300) {\n            $e = $json['error'] ?? ['code' => 'UNKNOWN', 'message' => $resp];\n            throw new UnknownPayException($status, $e['code'], $e['message'], $e['request_id'] ?? null);\n        }\n        return $json;\n    }\n\n    \u002F\u002F ---------- Deposit ----------\n    public function createDeposit(array $input, string $idempotencyKey): array\n    {\n        return $this->request('POST', '\u002Fv1\u002Fdeposits', $input, $idempotencyKey);\n    }\n    public function getDeposit(string $id): array\n    {\n        return $this->request('GET', '\u002Fv1\u002Fdeposits\u002F' . rawurlencode($id));\n    }\n    public function cancelDeposit(string $id): array\n    {\n        return $this->request('POST', '\u002Fv1\u002Fdeposits\u002F' . rawurlencode($id) . '\u002Fcancel'); \u002F\u002F ไม่ต้องมี Idempotency-Key\n    }\n\n    \u002F\u002F ---------- Withdrawal ----------\n    public function createWithdrawal(array $input, string $idempotencyKey): array\n    {\n        return $this->request('POST', '\u002Fv1\u002Fwithdrawals', $input, $idempotencyKey);\n    }\n    public function getWithdrawal(string $id): array\n    {\n        return $this->request('GET', '\u002Fv1\u002Fwithdrawals\u002F' . rawurlencode($id));\n    }\n\n    \u002F\u002F ---------- Balance \u002F Banks ----------\n    public function getBalance(): array\n    {\n        return $this->request('GET', '\u002Fv1\u002Fbalance');\n    }\n    public function getBanks(): array\n    {\n        return $this->request('GET', '\u002Fv1\u002Fbanks'); \u002F\u002F public\n    }\n\n    \u002F** helper สร้าง UUID v4 ไว้ใช้เป็น Idempotency-Key (หรือ map กับ order id ของคุณก็ได้) *\u002F\n    public static function uuidv4(): string\n    {\n        $d = random_bytes(16);\n        $d[6] = chr((ord($d[6]) & 0x0f) | 0x40);\n        $d[8] = chr((ord($d[8]) & 0x3f) | 0x80);\n        return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($d), 4));\n    }\n}\n","PHP (UnknownPayClient.php)","php",[231,3083,3084,3092,3096,3112,3116,3128,3143,3156,3167,3185,3192,3211,3215,3219,3223,3230,3234,3244,3260,3275,3290,3296,3300,3305,3351,3356,3390,3451,3485,3489,3493,3498,3556,3560,3565,3610,3631,3668,3672,3684,3702,3720,3737,3742,3779,3816,3820,3846,3860,3874,3884,3897,3913,3925,3930,3948,3971,3989,4000,4004,4020,4052,4057,4094,4123,4186,4249,4253,4263,4267,4271,4276,4305,4309,4347,4351,4372,4376,4412,4416,4437,4441,4487,4491,4495,4500,4529,4533,4571,4575,4596,4600,4634,4638,4642,4647,4660,4664,4690,4694,4707,4711,4740,4744,4748,4753,4769,4773,4792,4843,4888,4926,4930],{"__ignoreMap":274},[278,3085,3086,3089],{"class":280,"line":281},[278,3087,3088],{"class":288},"\u003C?",[278,3090,3091],{"class":292},"php\n",[278,3093,3094],{"class":280,"line":331},[278,3095,335],{"emptyLinePlaceholder":334},[278,3097,3098,3101,3104,3106,3109],{"class":280,"line":338},[278,3099,3100],{"class":344},"class",[278,3102,3103],{"class":348}," UnknownPayException",[278,3105,473],{"class":344},[278,3107,3108],{"class":288}," \\",[278,3110,3111],{"class":348},"Exception\n",[278,3113,3114],{"class":280,"line":355},[278,3115,1500],{"class":288},[278,3117,3118,3120,3123,3126],{"class":280,"line":375},[278,3119,493],{"class":344},[278,3121,3122],{"class":344}," function",[278,3124,3125],{"class":717}," __construct",[278,3127,487],{"class":288},[278,3129,3130,3133,3136,3139,3141],{"class":280,"line":390},[278,3131,3132],{"class":344},"        public",[278,3134,3135],{"class":1106}," int",[278,3137,3138],{"class":288}," $",[278,3140,1569],{"class":292},[278,3142,505],{"class":288},[278,3144,3145,3147,3149,3151,3154],{"class":280,"line":405},[278,3146,3132],{"class":344},[278,3148,365],{"class":1106},[278,3150,3138],{"class":288},[278,3152,3153],{"class":292},"errorCode",[278,3155,505],{"class":288},[278,3157,3158,3161,3163,3165],{"class":280,"line":411},[278,3159,3160],{"class":1106},"        string",[278,3162,3138],{"class":288},[278,3164,564],{"class":292},[278,3166,505],{"class":288},[278,3168,3169,3171,3173,3175,3177,3180,3182],{"class":280,"line":416},[278,3170,3132],{"class":344},[278,3172,1043],{"class":288},[278,3174,1177],{"class":1106},[278,3176,3138],{"class":288},[278,3178,3179],{"class":292},"requestId ",[278,3181,1282],{"class":288},[278,3183,3184],{"class":288}," null,\n",[278,3186,3187,3190],{"class":280,"line":457},[278,3188,3189],{"class":288},"    )",[278,3191,352],{"class":288},[278,3193,3194,3197,3200,3203,3206,3208],{"class":280,"line":462},[278,3195,3196],{"class":344},"        parent",[278,3198,3199],{"class":288},"::",[278,3201,3202],{"class":717},"__construct",[278,3204,3205],{"class":288},"($",[278,3207,564],{"class":292},[278,3209,3210],{"class":288},");\n",[278,3212,3213],{"class":280,"line":481},[278,3214,1604],{"class":288},[278,3216,3217],{"class":280,"line":490},[278,3218,408],{"class":288},[278,3220,3221],{"class":280,"line":508},[278,3222,335],{"emptyLinePlaceholder":334},[278,3224,3225,3227],{"class":280,"line":521},[278,3226,3100],{"class":344},[278,3228,3229],{"class":348}," UnknownPayClient\n",[278,3231,3232],{"class":280,"line":533},[278,3233,1500],{"class":288},[278,3235,3236,3238,3240,3242],{"class":280,"line":547},[278,3237,493],{"class":344},[278,3239,3122],{"class":344},[278,3241,3125],{"class":717},[278,3243,487],{"class":288},[278,3245,3246,3249,3251,3253,3255,3257],{"class":280,"line":555},[278,3247,3248],{"class":344},"        private",[278,3250,365],{"class":1106},[278,3252,3138],{"class":288},[278,3254,1363],{"class":292},[278,3256,296],{"class":288},[278,3258,3259],{"class":371}," \u002F\u002F \"https:\u002F\u002Fapi.unkpay.co\"\n",[278,3261,3262,3264,3266,3268,3270,3272],{"class":280,"line":572},[278,3263,3248],{"class":344},[278,3265,365],{"class":1106},[278,3267,3138],{"class":288},[278,3269,1209],{"class":292},[278,3271,296],{"class":288},[278,3273,3274],{"class":371},"  \u002F\u002F \"unk_live_...\" \u002F \"unk_test_...\"\n",[278,3276,3277,3279,3281,3283,3285,3287],{"class":280,"line":593},[278,3278,3248],{"class":344},[278,3280,365],{"class":1106},[278,3282,3138],{"class":288},[278,3284,243],{"class":292},[278,3286,296],{"class":288},[278,3288,3289],{"class":371},"  \u002F\u002F secret จาก Portal (show-once)\n",[278,3291,3292,3294],{"class":280,"line":599},[278,3293,3189],{"class":288},[278,3295,640],{"class":288},[278,3297,3298],{"class":280,"line":604},[278,3299,335],{"emptyLinePlaceholder":334},[278,3301,3302],{"class":280,"line":609},[278,3303,3304],{"class":371},"    \u002F** canonical: METHOD\\n\u003Cpath+query>\\n\u003Cts>\\nsha256hex(body) *\u002F\n",[278,3306,3307,3310,3312,3314,3316,3318,3320,3322,3324,3326,3328,3330,3332,3334,3336,3338,3340,3342,3344,3346,3348],{"class":280,"line":621},[278,3308,3309],{"class":344},"    private",[278,3311,3122],{"class":344},[278,3313,660],{"class":717},[278,3315,561],{"class":288},[278,3317,1177],{"class":1106},[278,3319,3138],{"class":288},[278,3321,665],{"class":292},[278,3323,296],{"class":288},[278,3325,365],{"class":1106},[278,3327,3138],{"class":288},[278,3329,794],{"class":292},[278,3331,296],{"class":288},[278,3333,365],{"class":1106},[278,3335,3138],{"class":288},[278,3337,273],{"class":292},[278,3339,296],{"class":288},[278,3341,365],{"class":1106},[278,3343,3138],{"class":288},[278,3345,738],{"class":292},[278,3347,699],{"class":288},[278,3349,3350],{"class":1106}," string\n",[278,3352,3353],{"class":280,"line":643},[278,3354,3355],{"class":288},"    {\n",[278,3357,3358,3361,3364,3366,3369,3371,3374,3376,3378,3380,3382,3384,3387],{"class":280,"line":648},[278,3359,3360],{"class":288},"        $",[278,3362,3363],{"class":292},"bodyHash  ",[278,3365,1282],{"class":288},[278,3367,3368],{"class":717}," hash",[278,3370,561],{"class":288},[278,3372,3373],{"class":288},"'",[278,3375,724],{"class":321},[278,3377,3373],{"class":288},[278,3379,296],{"class":288},[278,3381,3138],{"class":288},[278,3383,738],{"class":292},[278,3385,3386],{"class":288},");",[278,3388,3389],{"class":371},"                  \u002F\u002F hex (lowercase)\n",[278,3391,3392,3394,3397,3399,3401,3404,3406,3408,3410,3412,3415,3417,3420,3422,3424,3426,3428,3430,3432,3435,3437,3439,3441,3443,3445,3447,3449],{"class":280,"line":654},[278,3393,3360],{"class":288},[278,3395,3396],{"class":292},"canonical ",[278,3398,1282],{"class":288},[278,3400,3138],{"class":288},[278,3402,3403],{"class":292},"method ",[278,3405,211],{"class":288},[278,3407,318],{"class":288},[278,3409,788],{"class":292},[278,3411,325],{"class":288},[278,3413,3414],{"class":288}," .",[278,3416,3138],{"class":288},[278,3418,3419],{"class":292},"target ",[278,3421,211],{"class":288},[278,3423,318],{"class":288},[278,3425,788],{"class":292},[278,3427,325],{"class":288},[278,3429,3414],{"class":288},[278,3431,3138],{"class":288},[278,3433,3434],{"class":292},"ts ",[278,3436,211],{"class":288},[278,3438,318],{"class":288},[278,3440,788],{"class":292},[278,3442,325],{"class":288},[278,3444,3414],{"class":288},[278,3446,3138],{"class":288},[278,3448,811],{"class":292},[278,3450,328],{"class":288},[278,3452,3453,3456,3459,3461,3463,3465,3467,3469,3471,3473,3475,3478,3480,3482],{"class":280,"line":706},[278,3454,3455],{"class":284},"        return",[278,3457,3458],{"class":717}," hash_hmac",[278,3460,561],{"class":288},[278,3462,3373],{"class":288},[278,3464,724],{"class":321},[278,3466,3373],{"class":288},[278,3468,296],{"class":288},[278,3470,3138],{"class":288},[278,3472,855],{"class":292},[278,3474,296],{"class":288},[278,3476,3477],{"class":288}," $this->",[278,3479,243],{"class":292},[278,3481,3386],{"class":288},[278,3483,3484],{"class":371},"  \u002F\u002F hex\n",[278,3486,3487],{"class":280,"line":770},[278,3488,1604],{"class":288},[278,3490,3491],{"class":280,"line":819},[278,3492,335],{"emptyLinePlaceholder":334},[278,3494,3495],{"class":280,"line":884},[278,3496,3497],{"class":371},"    \u002F** เรียก S2S endpoint พร้อมเซ็น HMAC อัตโนมัติ *\u002F\n",[278,3499,3500,3502,3504,3506,3508,3510,3512,3514,3516,3518,3520,3522,3524,3526,3529,3531,3534,3536,3539,3541,3543,3545,3548,3550,3553],{"class":280,"line":889},[278,3501,3309],{"class":344},[278,3503,3122],{"class":344},[278,3505,908],{"class":717},[278,3507,561],{"class":288},[278,3509,1177],{"class":1106},[278,3511,3138],{"class":288},[278,3513,665],{"class":292},[278,3515,296],{"class":288},[278,3517,365],{"class":1106},[278,3519,3138],{"class":288},[278,3521,794],{"class":292},[278,3523,296],{"class":288},[278,3525,1043],{"class":288},[278,3527,3528],{"class":1106},"array",[278,3530,3138],{"class":288},[278,3532,3533],{"class":292},"body ",[278,3535,1282],{"class":288},[278,3537,3538],{"class":288}," null,",[278,3540,1043],{"class":288},[278,3542,1177],{"class":1106},[278,3544,3138],{"class":288},[278,3546,3547],{"class":292},"idempotencyKey ",[278,3549,1282],{"class":288},[278,3551,3552],{"class":288}," null):",[278,3554,3555],{"class":1106}," array\n",[278,3557,3558],{"class":280,"line":894},[278,3559,3355],{"class":288},[278,3561,3562],{"class":280,"line":900},[278,3563,3564],{"class":371},"        \u002F\u002F json_encode \"ครั้งเดียว\" แล้วใช้ทั้งเซ็นและส่ง — ไบต์ต้องตรงกัน\n",[278,3566,3567,3569,3572,3574,3576,3578,3581,3583,3585,3588,3590,3593,3595,3597,3599,3602,3605,3608],{"class":280,"line":920},[278,3568,3360],{"class":288},[278,3570,3571],{"class":292},"rawBody ",[278,3573,1282],{"class":288},[278,3575,3138],{"class":288},[278,3577,3533],{"class":292},[278,3579,3580],{"class":288},"===",[278,3582,2422],{"class":288},[278,3584,1043],{"class":288},[278,3586,3587],{"class":288}," ''",[278,3589,1049],{"class":288},[278,3591,3592],{"class":717}," json_encode",[278,3594,3205],{"class":288},[278,3596,1034],{"class":292},[278,3598,296],{"class":288},[278,3600,3601],{"class":292}," JSON_UNESCAPED_UNICODE ",[278,3603,3604],{"class":288},"|",[278,3606,3607],{"class":292}," JSON_UNESCAPED_SLASHES",[278,3609,3210],{"class":288},[278,3611,3612,3614,3617,3619,3621,3623,3625,3628],{"class":280,"line":947},[278,3613,3360],{"class":288},[278,3615,3616],{"class":292},"ts  ",[278,3618,1282],{"class":288},[278,3620,1258],{"class":288},[278,3622,1177],{"class":344},[278,3624,567],{"class":288},[278,3626,3627],{"class":717}," time",[278,3629,3630],{"class":288},"();\n",[278,3632,3633,3635,3638,3640,3642,3644,3646,3648,3650,3652,3654,3656,3658,3660,3662,3664,3666],{"class":280,"line":962},[278,3634,3360],{"class":288},[278,3636,3637],{"class":292},"sig ",[278,3639,1282],{"class":288},[278,3641,3477],{"class":288},[278,3643,1134],{"class":717},[278,3645,3205],{"class":288},[278,3647,665],{"class":292},[278,3649,296],{"class":288},[278,3651,3138],{"class":288},[278,3653,794],{"class":292},[278,3655,296],{"class":288},[278,3657,3138],{"class":288},[278,3659,273],{"class":292},[278,3661,296],{"class":288},[278,3663,3138],{"class":288},[278,3665,738],{"class":292},[278,3667,3210],{"class":288},[278,3669,3670],{"class":280,"line":996},[278,3671,335],{"emptyLinePlaceholder":334},[278,3673,3674,3676,3679,3681],{"class":280,"line":1014},[278,3675,3360],{"class":288},[278,3677,3678],{"class":292},"headers ",[278,3680,1282],{"class":288},[278,3682,3683],{"class":288}," [\n",[278,3685,3686,3689,3692,3694,3696,3698,3700],{"class":280,"line":1020},[278,3687,3688],{"class":288},"            '",[278,3690,3691],{"class":321},"X-Api-Key: ",[278,3693,3373],{"class":288},[278,3695,3414],{"class":288},[278,3697,3477],{"class":288},[278,3699,1209],{"class":292},[278,3701,505],{"class":288},[278,3703,3704,3706,3709,3711,3713,3715,3718],{"class":280,"line":1073},[278,3705,3688],{"class":288},[278,3707,3708],{"class":321},"X-Signature: ",[278,3710,3373],{"class":288},[278,3712,3414],{"class":288},[278,3714,3138],{"class":288},[278,3716,3717],{"class":292},"sig",[278,3719,505],{"class":288},[278,3721,3722,3724,3727,3729,3731,3733,3735],{"class":280,"line":1122},[278,3723,3688],{"class":288},[278,3725,3726],{"class":321},"X-Timestamp: ",[278,3728,3373],{"class":288},[278,3730,3414],{"class":288},[278,3732,3138],{"class":288},[278,3734,273],{"class":292},[278,3736,505],{"class":288},[278,3738,3739],{"class":280,"line":1157},[278,3740,3741],{"class":288},"        ];\n",[278,3743,3744,3747,3750,3752,3755,3757,3759,3762,3764,3767,3769,3772,3775,3777],{"class":280,"line":1162},[278,3745,3746],{"class":284},"        if",[278,3748,3749],{"class":288}," ($",[278,3751,3571],{"class":292},[278,3753,3754],{"class":288},"!==",[278,3756,3587],{"class":288},[278,3758,567],{"class":288},[278,3760,3761],{"class":288},"           $",[278,3763,1266],{"class":292},[278,3765,3766],{"class":288},"[]",[278,3768,581],{"class":288},[278,3770,3771],{"class":288}," '",[278,3773,3774],{"class":321},"Content-Type: application\u002Fjson",[278,3776,3373],{"class":288},[278,3778,328],{"class":288},[278,3780,3781,3783,3785,3787,3789,3792,3795,3797,3799,3801,3803,3806,3808,3810,3812,3814],{"class":280,"line":1190},[278,3782,3746],{"class":284},[278,3784,3749],{"class":288},[278,3786,3547],{"class":292},[278,3788,3754],{"class":288},[278,3790,3791],{"class":288}," null)",[278,3793,3794],{"class":288},"  $",[278,3796,1266],{"class":292},[278,3798,3766],{"class":288},[278,3800,581],{"class":288},[278,3802,3771],{"class":288},[278,3804,3805],{"class":321},"Idempotency-Key: ",[278,3807,3373],{"class":288},[278,3809,3414],{"class":288},[278,3811,3138],{"class":288},[278,3813,1305],{"class":292},[278,3815,328],{"class":288},[278,3817,3818],{"class":280,"line":1214},[278,3819,335],{"emptyLinePlaceholder":334},[278,3821,3822,3824,3827,3829,3832,3835,3838,3840,3842,3844],{"class":280,"line":1230},[278,3823,3360],{"class":288},[278,3825,3826],{"class":292},"ch ",[278,3828,1282],{"class":288},[278,3830,3831],{"class":717}," curl_init",[278,3833,3834],{"class":288},"($this->",[278,3836,3837],{"class":292},"baseUrl ",[278,3839,211],{"class":288},[278,3841,3138],{"class":288},[278,3843,794],{"class":292},[278,3845,3210],{"class":288},[278,3847,3848,3851,3853,3856,3858],{"class":280,"line":1246},[278,3849,3850],{"class":717},"        curl_setopt_array",[278,3852,3205],{"class":288},[278,3854,3855],{"class":292},"ch",[278,3857,296],{"class":288},[278,3859,3683],{"class":288},[278,3861,3862,3865,3868,3870,3872],{"class":280,"line":1252},[278,3863,3864],{"class":292},"            CURLOPT_CUSTOMREQUEST  ",[278,3866,3867],{"class":288},"=>",[278,3869,3138],{"class":288},[278,3871,665],{"class":292},[278,3873,505],{"class":288},[278,3875,3876,3879,3881],{"class":280,"line":1294},[278,3877,3878],{"class":292},"            CURLOPT_RETURNTRANSFER ",[278,3880,3867],{"class":288},[278,3882,3883],{"class":288}," true,\n",[278,3885,3886,3889,3891,3893,3895],{"class":280,"line":1333},[278,3887,3888],{"class":292},"            CURLOPT_HTTPHEADER     ",[278,3890,3867],{"class":288},[278,3892,3138],{"class":288},[278,3894,1266],{"class":292},[278,3896,505],{"class":288},[278,3898,3899,3902,3904,3906,3908,3910],{"class":280,"line":1338},[278,3900,3901],{"class":292},"            CURLOPT_POSTFIELDS     ",[278,3903,3867],{"class":288},[278,3905,3138],{"class":288},[278,3907,738],{"class":292},[278,3909,296],{"class":288},[278,3911,3912],{"class":371}," \u002F\u002F ส่งไบต์เดิมที่เซ็น\n",[278,3914,3915,3918,3920,3923],{"class":280,"line":1375},[278,3916,3917],{"class":292},"            CURLOPT_TIMEOUT        ",[278,3919,3867],{"class":288},[278,3921,3922],{"class":1106}," 30",[278,3924,505],{"class":288},[278,3926,3927],{"class":280,"line":1383},[278,3928,3929],{"class":288},"        ]);\n",[278,3931,3932,3934,3937,3939,3942,3944,3946],{"class":280,"line":1391},[278,3933,3360],{"class":288},[278,3935,3936],{"class":292},"resp   ",[278,3938,1282],{"class":288},[278,3940,3941],{"class":717}," curl_exec",[278,3943,3205],{"class":288},[278,3945,3855],{"class":292},[278,3947,3210],{"class":288},[278,3949,3950,3952,3955,3957,3960,3962,3964,3966,3969],{"class":280,"line":1410},[278,3951,3360],{"class":288},[278,3953,3954],{"class":292},"status ",[278,3956,1282],{"class":288},[278,3958,3959],{"class":717}," curl_getinfo",[278,3961,3205],{"class":288},[278,3963,3855],{"class":292},[278,3965,296],{"class":288},[278,3967,3968],{"class":292}," CURLINFO_HTTP_CODE",[278,3970,3210],{"class":288},[278,3972,3973,3975,3978,3980,3983,3985,3987],{"class":280,"line":1420},[278,3974,3360],{"class":288},[278,3976,3977],{"class":292},"err    ",[278,3979,1282],{"class":288},[278,3981,3982],{"class":717}," curl_error",[278,3984,3205],{"class":288},[278,3986,3855],{"class":292},[278,3988,3210],{"class":288},[278,3990,3991,3994,3996,3998],{"class":280,"line":1425},[278,3992,3993],{"class":717},"        curl_close",[278,3995,3205],{"class":288},[278,3997,3855],{"class":292},[278,3999,3210],{"class":288},[278,4001,4002],{"class":280,"line":1448},[278,4003,335],{"emptyLinePlaceholder":334},[278,4005,4006,4008,4010,4013,4015,4018],{"class":280,"line":1480},[278,4007,3746],{"class":284},[278,4009,3749],{"class":288},[278,4011,4012],{"class":292},"resp ",[278,4014,3580],{"class":288},[278,4016,4017],{"class":288}," false)",[278,4019,352],{"class":288},[278,4021,4022,4025,4027,4029,4031,4034,4036,4038,4041,4043,4045,4047,4050],{"class":280,"line":1503},[278,4023,4024],{"class":284},"            throw",[278,4026,1558],{"class":1106},[278,4028,3103],{"class":348},[278,4030,561],{"class":288},[278,4032,4033],{"class":1106},"0",[278,4035,296],{"class":288},[278,4037,3771],{"class":288},[278,4039,4040],{"class":321},"NETWORK_ERROR",[278,4042,3373],{"class":288},[278,4044,296],{"class":288},[278,4046,3138],{"class":288},[278,4048,4049],{"class":292},"err",[278,4051,3210],{"class":288},[278,4053,4054],{"class":280,"line":1552},[278,4055,4056],{"class":288},"        }\n",[278,4058,4059,4061,4064,4066,4068,4070,4072,4074,4076,4079,4081,4084,4086,4089,4091],{"class":280,"line":1601},[278,4060,3360],{"class":288},[278,4062,4063],{"class":292},"json ",[278,4065,1282],{"class":288},[278,4067,3138],{"class":288},[278,4069,4012],{"class":292},[278,4071,3580],{"class":288},[278,4073,3587],{"class":288},[278,4075,1043],{"class":288},[278,4077,4078],{"class":288}," []",[278,4080,1049],{"class":288},[278,4082,4083],{"class":717}," json_decode",[278,4085,3205],{"class":288},[278,4087,4088],{"class":292},"resp",[278,4090,296],{"class":288},[278,4092,4093],{"class":288}," true);\n",[278,4095,4096,4098,4100,4102,4104,4107,4109,4111,4113,4116,4119,4121],{"class":280,"line":1607},[278,4097,3746],{"class":284},[278,4099,3749],{"class":288},[278,4101,3954],{"class":292},[278,4103,911],{"class":288},[278,4105,4106],{"class":1106}," 200",[278,4108,1401],{"class":288},[278,4110,3138],{"class":288},[278,4112,3954],{"class":292},[278,4114,4115],{"class":288},">=",[278,4117,4118],{"class":1106}," 300",[278,4120,567],{"class":288},[278,4122,352],{"class":288},[278,4124,4125,4128,4131,4133,4135,4138,4140,4142,4144,4146,4149,4151,4154,4156,4158,4160,4163,4165,4167,4169,4171,4173,4175,4177,4179,4181,4183],{"class":280,"line":1622},[278,4126,4127],{"class":288},"            $",[278,4129,4130],{"class":292},"e ",[278,4132,1282],{"class":288},[278,4134,3138],{"class":288},[278,4136,4137],{"class":292},"json",[278,4139,1269],{"class":288},[278,4141,3373],{"class":288},[278,4143,1522],{"class":321},[278,4145,3373],{"class":288},[278,4147,4148],{"class":288},"]",[278,4150,1525],{"class":288},[278,4152,4153],{"class":288}," [",[278,4155,3373],{"class":288},[278,4157,231],{"class":321},[278,4159,3373],{"class":288},[278,4161,4162],{"class":288}," =>",[278,4164,3771],{"class":288},[278,4166,1536],{"class":321},[278,4168,3373],{"class":288},[278,4170,296],{"class":288},[278,4172,3771],{"class":288},[278,4174,564],{"class":321},[278,4176,3373],{"class":288},[278,4178,4162],{"class":288},[278,4180,3138],{"class":288},[278,4182,4088],{"class":292},[278,4184,4185],{"class":288},"];\n",[278,4187,4188,4190,4192,4194,4196,4198,4200,4202,4205,4207,4209,4211,4213,4216,4218,4220,4222,4224,4226,4228,4230,4232,4234,4236,4238,4240,4242,4244,4246],{"class":280,"line":1627},[278,4189,4024],{"class":284},[278,4191,1558],{"class":1106},[278,4193,3103],{"class":348},[278,4195,3205],{"class":288},[278,4197,1569],{"class":292},[278,4199,296],{"class":288},[278,4201,3138],{"class":288},[278,4203,4204],{"class":292},"e",[278,4206,1269],{"class":288},[278,4208,3373],{"class":288},[278,4210,231],{"class":321},[278,4212,3373],{"class":288},[278,4214,4215],{"class":288},"],",[278,4217,3138],{"class":288},[278,4219,4204],{"class":292},[278,4221,1269],{"class":288},[278,4223,3373],{"class":288},[278,4225,564],{"class":321},[278,4227,3373],{"class":288},[278,4229,4215],{"class":288},[278,4231,3138],{"class":288},[278,4233,4204],{"class":292},[278,4235,1269],{"class":288},[278,4237,3373],{"class":288},[278,4239,1594],{"class":321},[278,4241,3373],{"class":288},[278,4243,4148],{"class":288},[278,4245,1525],{"class":288},[278,4247,4248],{"class":288}," null);\n",[278,4250,4251],{"class":280,"line":1632},[278,4252,4056],{"class":288},[278,4254,4255,4257,4259,4261],{"class":280,"line":1638},[278,4256,3455],{"class":284},[278,4258,3138],{"class":288},[278,4260,4137],{"class":292},[278,4262,328],{"class":288},[278,4264,4265],{"class":280,"line":1675},[278,4266,1604],{"class":288},[278,4268,4269],{"class":280,"line":1723},[278,4270,335],{"emptyLinePlaceholder":334},[278,4272,4273],{"class":280,"line":1728},[278,4274,4275],{"class":371},"    \u002F\u002F ---------- Deposit ----------\n",[278,4277,4278,4280,4282,4285,4287,4289,4291,4293,4295,4297,4299,4301,4303],{"class":280,"line":1755},[278,4279,493],{"class":344},[278,4281,3122],{"class":344},[278,4283,4284],{"class":717}," createDeposit",[278,4286,561],{"class":288},[278,4288,3528],{"class":1106},[278,4290,3138],{"class":288},[278,4292,1646],{"class":292},[278,4294,296],{"class":288},[278,4296,365],{"class":1106},[278,4298,3138],{"class":288},[278,4300,1305],{"class":292},[278,4302,699],{"class":288},[278,4304,3555],{"class":1106},[278,4306,4307],{"class":280,"line":1790},[278,4308,3355],{"class":288},[278,4310,4311,4313,4315,4317,4319,4321,4323,4325,4327,4329,4331,4333,4335,4337,4339,4341,4343,4345],{"class":280,"line":1795},[278,4312,3455],{"class":284},[278,4314,3477],{"class":288},[278,4316,1682],{"class":717},[278,4318,561],{"class":288},[278,4320,3373],{"class":288},[278,4322,940],{"class":321},[278,4324,3373],{"class":288},[278,4326,296],{"class":288},[278,4328,3771],{"class":288},[278,4330,1697],{"class":321},[278,4332,3373],{"class":288},[278,4334,296],{"class":288},[278,4336,3138],{"class":288},[278,4338,1646],{"class":292},[278,4340,296],{"class":288},[278,4342,3138],{"class":288},[278,4344,1305],{"class":292},[278,4346,3210],{"class":288},[278,4348,4349],{"class":280,"line":1821},[278,4350,1604],{"class":288},[278,4352,4353,4355,4357,4360,4362,4364,4366,4368,4370],{"class":280,"line":1863},[278,4354,493],{"class":344},[278,4356,3122],{"class":344},[278,4358,4359],{"class":717}," getDeposit",[278,4361,561],{"class":288},[278,4363,1177],{"class":1106},[278,4365,3138],{"class":288},[278,4367,1736],{"class":292},[278,4369,699],{"class":288},[278,4371,3555],{"class":1106},[278,4373,4374],{"class":280,"line":1868},[278,4375,3355],{"class":288},[278,4377,4378,4380,4382,4384,4386,4388,4390,4392,4394,4396,4398,4400,4402,4405,4407,4409],{"class":280,"line":1873},[278,4379,3455],{"class":284},[278,4381,3477],{"class":288},[278,4383,1682],{"class":717},[278,4385,561],{"class":288},[278,4387,3373],{"class":288},[278,4389,930],{"class":321},[278,4391,3373],{"class":288},[278,4393,296],{"class":288},[278,4395,3771],{"class":288},[278,4397,1777],{"class":321},[278,4399,3373],{"class":288},[278,4401,3414],{"class":288},[278,4403,4404],{"class":717}," rawurlencode",[278,4406,3205],{"class":288},[278,4408,1736],{"class":292},[278,4410,4411],{"class":288},"));\n",[278,4413,4414],{"class":280,"line":1879},[278,4415,1604],{"class":288},[278,4417,4418,4420,4422,4425,4427,4429,4431,4433,4435],{"class":280,"line":1915},[278,4419,493],{"class":344},[278,4421,3122],{"class":344},[278,4423,4424],{"class":717}," cancelDeposit",[278,4426,561],{"class":288},[278,4428,1177],{"class":1106},[278,4430,3138],{"class":288},[278,4432,1736],{"class":292},[278,4434,699],{"class":288},[278,4436,3555],{"class":1106},[278,4438,4439],{"class":280,"line":1961},[278,4440,3355],{"class":288},[278,4442,4443,4445,4447,4449,4451,4453,4455,4457,4459,4461,4463,4465,4467,4469,4471,4473,4475,4477,4479,4481,4483,4485],{"class":280,"line":1966},[278,4444,3455],{"class":284},[278,4446,3477],{"class":288},[278,4448,1682],{"class":717},[278,4450,561],{"class":288},[278,4452,3373],{"class":288},[278,4454,940],{"class":321},[278,4456,3373],{"class":288},[278,4458,296],{"class":288},[278,4460,3771],{"class":288},[278,4462,1777],{"class":321},[278,4464,3373],{"class":288},[278,4466,3414],{"class":288},[278,4468,4404],{"class":717},[278,4470,3205],{"class":288},[278,4472,1736],{"class":292},[278,4474,567],{"class":288},[278,4476,3414],{"class":288},[278,4478,3771],{"class":288},[278,4480,1850],{"class":321},[278,4482,3373],{"class":288},[278,4484,3386],{"class":288},[278,4486,1860],{"class":371},[278,4488,4489],{"class":280,"line":1992},[278,4490,1604],{"class":288},[278,4492,4493],{"class":280,"line":2026},[278,4494,335],{"emptyLinePlaceholder":334},[278,4496,4497],{"class":280,"line":2031},[278,4498,4499],{"class":371},"    \u002F\u002F ---------- Withdrawal ----------\n",[278,4501,4502,4504,4506,4509,4511,4513,4515,4517,4519,4521,4523,4525,4527],{"class":280,"line":2036},[278,4503,493],{"class":344},[278,4505,3122],{"class":344},[278,4507,4508],{"class":717}," createWithdrawal",[278,4510,561],{"class":288},[278,4512,3528],{"class":1106},[278,4514,3138],{"class":288},[278,4516,1646],{"class":292},[278,4518,296],{"class":288},[278,4520,365],{"class":1106},[278,4522,3138],{"class":288},[278,4524,1305],{"class":292},[278,4526,699],{"class":288},[278,4528,3555],{"class":1106},[278,4530,4531],{"class":280,"line":2042},[278,4532,3355],{"class":288},[278,4534,4535,4537,4539,4541,4543,4545,4547,4549,4551,4553,4555,4557,4559,4561,4563,4565,4567,4569],{"class":280,"line":2062},[278,4536,3455],{"class":284},[278,4538,3477],{"class":288},[278,4540,1682],{"class":717},[278,4542,561],{"class":288},[278,4544,3373],{"class":288},[278,4546,940],{"class":321},[278,4548,3373],{"class":288},[278,4550,296],{"class":288},[278,4552,3771],{"class":288},[278,4554,1936],{"class":321},[278,4556,3373],{"class":288},[278,4558,296],{"class":288},[278,4560,3138],{"class":288},[278,4562,1646],{"class":292},[278,4564,296],{"class":288},[278,4566,3138],{"class":288},[278,4568,1305],{"class":292},[278,4570,3210],{"class":288},[278,4572,4573],{"class":280,"line":2092},[278,4574,1604],{"class":288},[278,4576,4577,4579,4581,4584,4586,4588,4590,4592,4594],{"class":280,"line":2097},[278,4578,493],{"class":344},[278,4580,3122],{"class":344},[278,4582,4583],{"class":717}," getWithdrawal",[278,4585,561],{"class":288},[278,4587,1177],{"class":1106},[278,4589,3138],{"class":288},[278,4591,1736],{"class":292},[278,4593,699],{"class":288},[278,4595,3555],{"class":1106},[278,4597,4598],{"class":280,"line":2126},[278,4599,3355],{"class":288},[278,4601,4602,4604,4606,4608,4610,4612,4614,4616,4618,4620,4622,4624,4626,4628,4630,4632],{"class":280,"line":2159},[278,4603,3455],{"class":284},[278,4605,3477],{"class":288},[278,4607,1682],{"class":717},[278,4609,561],{"class":288},[278,4611,3373],{"class":288},[278,4613,930],{"class":321},[278,4615,3373],{"class":288},[278,4617,296],{"class":288},[278,4619,3771],{"class":288},[278,4621,2013],{"class":321},[278,4623,3373],{"class":288},[278,4625,3414],{"class":288},[278,4627,4404],{"class":717},[278,4629,3205],{"class":288},[278,4631,1736],{"class":292},[278,4633,4411],{"class":288},[278,4635,4636],{"class":280,"line":2164},[278,4637,1604],{"class":288},[278,4639,4640],{"class":280,"line":2169},[278,4641,335],{"emptyLinePlaceholder":334},[278,4643,4644],{"class":280,"line":2174},[278,4645,4646],{"class":371},"    \u002F\u002F ---------- Balance \u002F Banks ----------\n",[278,4648,4649,4651,4653,4656,4658],{"class":280,"line":2180},[278,4650,493],{"class":344},[278,4652,3122],{"class":344},[278,4654,4655],{"class":717}," getBalance",[278,4657,2048],{"class":288},[278,4659,3555],{"class":1106},[278,4661,4662],{"class":280,"line":2191},[278,4663,3355],{"class":288},[278,4665,4666,4668,4670,4672,4674,4676,4678,4680,4682,4684,4686,4688],{"class":280,"line":2206},[278,4667,3455],{"class":284},[278,4669,3477],{"class":288},[278,4671,1682],{"class":717},[278,4673,561],{"class":288},[278,4675,3373],{"class":288},[278,4677,930],{"class":321},[278,4679,3373],{"class":288},[278,4681,296],{"class":288},[278,4683,3771],{"class":288},[278,4685,2083],{"class":321},[278,4687,3373],{"class":288},[278,4689,3210],{"class":288},[278,4691,4692],{"class":280,"line":2221},[278,4693,1604],{"class":288},[278,4695,4696,4698,4700,4703,4705],{"class":280,"line":2236},[278,4697,493],{"class":344},[278,4699,3122],{"class":344},[278,4701,4702],{"class":717}," getBanks",[278,4704,2048],{"class":288},[278,4706,3555],{"class":1106},[278,4708,4709],{"class":280,"line":2251},[278,4710,3355],{"class":288},[278,4712,4713,4715,4717,4719,4721,4723,4725,4727,4729,4731,4733,4735,4737],{"class":280,"line":2266},[278,4714,3455],{"class":284},[278,4716,3477],{"class":288},[278,4718,1682],{"class":717},[278,4720,561],{"class":288},[278,4722,3373],{"class":288},[278,4724,930],{"class":321},[278,4726,3373],{"class":288},[278,4728,296],{"class":288},[278,4730,3771],{"class":288},[278,4732,2147],{"class":321},[278,4734,3373],{"class":288},[278,4736,3386],{"class":288},[278,4738,4739],{"class":371}," \u002F\u002F public\n",[278,4741,4742],{"class":280,"line":2295},[278,4743,1604],{"class":288},[278,4745,4746],{"class":280,"line":2314},[278,4747,335],{"emptyLinePlaceholder":334},[278,4749,4750],{"class":280,"line":2329},[278,4751,4752],{"class":371},"    \u002F** helper สร้าง UUID v4 ไว้ใช้เป็น Idempotency-Key (หรือ map กับ order id ของคุณก็ได้) *\u002F\n",[278,4754,4755,4757,4760,4762,4765,4767],{"class":280,"line":2350},[278,4756,493],{"class":344},[278,4758,4759],{"class":344}," static",[278,4761,3122],{"class":344},[278,4763,4764],{"class":717}," uuidv4",[278,4766,2048],{"class":288},[278,4768,3350],{"class":1106},[278,4770,4771],{"class":280,"line":2355},[278,4772,3355],{"class":288},[278,4774,4775,4777,4780,4782,4785,4787,4790],{"class":280,"line":2360},[278,4776,3360],{"class":288},[278,4778,4779],{"class":292},"d ",[278,4781,1282],{"class":288},[278,4783,4784],{"class":717}," random_bytes",[278,4786,561],{"class":288},[278,4788,4789],{"class":1106},"16",[278,4791,3210],{"class":288},[278,4793,4794,4796,4799,4801,4804,4806,4808,4811,4814,4817,4819,4821,4823,4825,4828,4831,4834,4836,4838,4841],{"class":280,"line":2372},[278,4795,3360],{"class":288},[278,4797,4798],{"class":292},"d",[278,4800,1269],{"class":288},[278,4802,4803],{"class":1106},"6",[278,4805,4148],{"class":288},[278,4807,581],{"class":288},[278,4809,4810],{"class":717}," chr",[278,4812,4813],{"class":288},"((",[278,4815,4816],{"class":717},"ord",[278,4818,3205],{"class":288},[278,4820,4798],{"class":292},[278,4822,1269],{"class":288},[278,4824,4803],{"class":1106},[278,4826,4827],{"class":288},"])",[278,4829,4830],{"class":288}," &",[278,4832,4833],{"class":1106}," 0x0f",[278,4835,567],{"class":288},[278,4837,935],{"class":288},[278,4839,4840],{"class":1106}," 0x40",[278,4842,3210],{"class":288},[278,4844,4845,4847,4849,4851,4854,4856,4858,4860,4862,4864,4866,4868,4870,4872,4874,4876,4879,4881,4883,4886],{"class":280,"line":2384},[278,4846,3360],{"class":288},[278,4848,4798],{"class":292},[278,4850,1269],{"class":288},[278,4852,4853],{"class":1106},"8",[278,4855,4148],{"class":288},[278,4857,581],{"class":288},[278,4859,4810],{"class":717},[278,4861,4813],{"class":288},[278,4863,4816],{"class":717},[278,4865,3205],{"class":288},[278,4867,4798],{"class":292},[278,4869,1269],{"class":288},[278,4871,4853],{"class":1106},[278,4873,4827],{"class":288},[278,4875,4830],{"class":288},[278,4877,4878],{"class":1106}," 0x3f",[278,4880,567],{"class":288},[278,4882,935],{"class":288},[278,4884,4885],{"class":1106}," 0x80",[278,4887,3210],{"class":288},[278,4889,4890,4892,4895,4897,4899,4902,4904,4906,4909,4911,4914,4916,4918,4921,4924],{"class":280,"line":2395},[278,4891,3455],{"class":284},[278,4893,4894],{"class":717}," vsprintf",[278,4896,561],{"class":288},[278,4898,3373],{"class":288},[278,4900,4901],{"class":321},"%s%s-%s-%s-%s-%s%s%s",[278,4903,3373],{"class":288},[278,4905,296],{"class":288},[278,4907,4908],{"class":717}," str_split",[278,4910,561],{"class":288},[278,4912,4913],{"class":717},"bin2hex",[278,4915,3205],{"class":288},[278,4917,4798],{"class":292},[278,4919,4920],{"class":288},"),",[278,4922,4923],{"class":1106}," 4",[278,4925,4411],{"class":288},[278,4927,4928],{"class":280,"line":2410},[278,4929,1604],{"class":288},[278,4931,4932],{"class":280,"line":2427},[278,4933,408],{"class":288},[213,4935,4937],{"id":4936},"usage-example-create-deposit-check-balance-withdraw","Usage example — create deposit → check balance → withdraw",[265,4939,4940,5767],{},[268,4941,4944],{"className":270,"code":4942,"filename":4943,"language":273,"meta":274,"style":274},"import { UnknownPayClient, UnknownPayError } from \".\u002Funknownpay\";\n\nconst client = new UnknownPayClient({\n  baseUrl: \"https:\u002F\u002Fapi.unkpay.co\",\n  apiKey: process.env.UNKPAY_API_KEY!,   \u002F\u002F \"unk_live_...\" (test ใช้ \"unk_test_...\")\n  secret: process.env.UNKPAY_SECRET!,\n});\n\nasync function main() {\n  \u002F\u002F 1) สร้าง deposit — ใช้ idempotency key ที่ผูกกับ order ของคุณ (retry-safe)\n  const orderId = \"order-2026-0001\";\n  const dep = await client.createDeposit(\n    {\n      amount: \"100.50\",\n      payment_method_type: \"PROMPTPAY_QR\",\n      payer_bank_provider: \"KBANK\",\n      payer_bank_account_name: \"สมชาย ใจดี\",\n      payer_bank_account_number: \"1234567890\",\n      user_ref: orderId,\n    },\n    `dep-${orderId}`, \u002F\u002F Idempotency-Key เสถียร (จะ retry ด้วย key เดิมได้)\n  );\n  console.log(\"deposit id     :\", dep.id);\n  console.log(\"ให้ลูกค้าโอนยอด :\", dep.expected_amount); \u002F\u002F ⚠️ ไม่ใช่ amount\n  console.log(\"QR payload     :\", dep.pay_to.qr_payload);\n  \u002F\u002F → แสดง QR (จาก qr_payload) + ยอด expected_amount ให้ลูกค้า แล้วรอ webhook deposit.success\n\n  \u002F\u002F 2) เช็คยอดก่อนถอน\n  const bal = await client.getBalance();\n  console.log(\"available:\", bal.available);\n\n  \u002F\u002F 3) สร้างคำขอถอน (รออนุมัติ — สถานะเริ่มต้น PENDING, รอ webhook withdrawal.success)\n  try {\n    const wd = await client.createWithdrawal(\n      {\n        amount: \"500.00\",\n        receiver_bank_provider: \"SCB\",\n        receiver_bank_account_name: \"สมหญิง รักดี\",\n        receiver_bank_account_number: \"9876543210\",\n        additional: { description: \"payout #A-1042\", reference_user_id: \"cust-7\" },\n      },\n      \"wd-A-1042\", \u002F\u002F Idempotency-Key เสถียร\n    );\n    console.log(\"withdrawal status:\", wd.status); \u002F\u002F \"PENDING\"\n  } catch (e) {\n    if (e instanceof UnknownPayError && e.code === \"INSUFFICIENT_BALANCE\") {\n      console.error(\"ยอดไม่พอ:\", e.message, \"request_id:\", e.requestId);\n    } else {\n      throw e;\n    }\n  }\n}\n\nmain().catch(console.error);\n","Node.js",[231,4945,4946,4971,4975,4993,5008,5033,5053,5061,5065,5079,5084,5103,5124,5128,5144,5159,5175,5191,5207,5218,5223,5243,5249,5280,5313,5348,5353,5357,5362,5384,5414,5418,5423,5430,5450,5455,5471,5487,5503,5519,5555,5560,5574,5580,5613,5629,5664,5712,5721,5729,5733,5737,5741,5745],{"__ignoreMap":274},[278,4947,4948,4950,4952,4954,4956,4958,4960,4962,4964,4967,4969],{"class":280,"line":281},[278,4949,285],{"class":284},[278,4951,289],{"class":288},[278,4953,616],{"class":292},[278,4955,296],{"class":288},[278,4957,470],{"class":292},[278,4959,312],{"class":288},[278,4961,315],{"class":284},[278,4963,318],{"class":288},[278,4965,4966],{"class":321},".\u002Funknownpay",[278,4968,325],{"class":288},[278,4970,328],{"class":288},[278,4972,4973],{"class":280,"line":331},[278,4974,335],{"emptyLinePlaceholder":334},[278,4976,4977,4980,4983,4985,4987,4989,4991],{"class":280,"line":338},[278,4978,4979],{"class":344},"const",[278,4981,4982],{"class":292}," client ",[278,4984,1282],{"class":288},[278,4986,1558],{"class":288},[278,4988,616],{"class":717},[278,4990,561],{"class":292},[278,4992,1500],{"class":288},[278,4994,4995,4997,4999,5001,5004,5006],{"class":280,"line":355},[278,4996,359],{"class":358},[278,4998,362],{"class":288},[278,5000,318],{"class":288},[278,5002,5003],{"class":321},"https:\u002F\u002Fapi.unkpay.co",[278,5005,325],{"class":288},[278,5007,505],{"class":288},[278,5009,5010,5012,5014,5017,5019,5022,5024,5027,5030],{"class":280,"line":375},[278,5011,378],{"class":358},[278,5013,362],{"class":288},[278,5015,5016],{"class":292}," process",[278,5018,211],{"class":288},[278,5020,5021],{"class":292},"env",[278,5023,211],{"class":288},[278,5025,5026],{"class":292},"UNKPAY_API_KEY",[278,5028,5029],{"class":288},"!,",[278,5031,5032],{"class":371},"   \u002F\u002F \"unk_live_...\" (test ใช้ \"unk_test_...\")\n",[278,5034,5035,5037,5039,5041,5043,5045,5047,5050],{"class":280,"line":390},[278,5036,393],{"class":358},[278,5038,362],{"class":288},[278,5040,5016],{"class":292},[278,5042,211],{"class":288},[278,5044,5021],{"class":292},[278,5046,211],{"class":288},[278,5048,5049],{"class":292},"UNKPAY_SECRET",[278,5051,5052],{"class":288},"!,\n",[278,5054,5055,5057,5059],{"class":280,"line":405},[278,5056,785],{"class":288},[278,5058,567],{"class":292},[278,5060,328],{"class":288},[278,5062,5063],{"class":280,"line":411},[278,5064,335],{"emptyLinePlaceholder":334},[278,5066,5067,5070,5072,5075,5077],{"class":280,"line":416},[278,5068,5069],{"class":344},"async",[278,5071,3122],{"class":344},[278,5073,5074],{"class":717}," main",[278,5076,1117],{"class":288},[278,5078,352],{"class":288},[278,5080,5081],{"class":280,"line":457},[278,5082,5083],{"class":371},"  \u002F\u002F 1) สร้าง deposit — ใช้ idempotency key ที่ผูกกับ order ของคุณ (retry-safe)\n",[278,5085,5086,5089,5092,5094,5096,5099,5101],{"class":280,"line":462},[278,5087,5088],{"class":344},"  const",[278,5090,5091],{"class":292}," orderId",[278,5093,581],{"class":288},[278,5095,318],{"class":288},[278,5097,5098],{"class":321},"order-2026-0001",[278,5100,325],{"class":288},[278,5102,328],{"class":288},[278,5104,5105,5107,5110,5112,5114,5117,5119,5122],{"class":280,"line":481},[278,5106,5088],{"class":344},[278,5108,5109],{"class":292}," dep",[278,5111,581],{"class":288},[278,5113,1348],{"class":284},[278,5115,5116],{"class":292}," client",[278,5118,211],{"class":288},[278,5120,5121],{"class":717},"createDeposit",[278,5123,487],{"class":358},[278,5125,5126],{"class":280,"line":490},[278,5127,3355],{"class":288},[278,5129,5130,5133,5135,5137,5140,5142],{"class":280,"line":508},[278,5131,5132],{"class":358},"      amount",[278,5134,362],{"class":288},[278,5136,318],{"class":288},[278,5138,5139],{"class":321},"100.50",[278,5141,325],{"class":288},[278,5143,505],{"class":288},[278,5145,5146,5149,5151,5153,5155,5157],{"class":280,"line":521},[278,5147,5148],{"class":358},"      payment_method_type",[278,5150,362],{"class":288},[278,5152,318],{"class":288},[278,5154,2276],{"class":321},[278,5156,325],{"class":288},[278,5158,505],{"class":288},[278,5160,5161,5164,5166,5168,5171,5173],{"class":280,"line":533},[278,5162,5163],{"class":358},"      payer_bank_provider",[278,5165,362],{"class":288},[278,5167,318],{"class":288},[278,5169,5170],{"class":321},"KBANK",[278,5172,325],{"class":288},[278,5174,505],{"class":288},[278,5176,5177,5180,5182,5184,5187,5189],{"class":280,"line":547},[278,5178,5179],{"class":358},"      payer_bank_account_name",[278,5181,362],{"class":288},[278,5183,318],{"class":288},[278,5185,5186],{"class":321},"สมชาย ใจดี",[278,5188,325],{"class":288},[278,5190,505],{"class":288},[278,5192,5193,5196,5198,5200,5203,5205],{"class":280,"line":555},[278,5194,5195],{"class":358},"      payer_bank_account_number",[278,5197,362],{"class":288},[278,5199,318],{"class":288},[278,5201,5202],{"class":321},"1234567890",[278,5204,325],{"class":288},[278,5206,505],{"class":288},[278,5208,5209,5212,5214,5216],{"class":280,"line":572},[278,5210,5211],{"class":358},"      user_ref",[278,5213,362],{"class":288},[278,5215,5091],{"class":292},[278,5217,505],{"class":288},[278,5219,5220],{"class":280,"line":593},[278,5221,5222],{"class":288},"    },\n",[278,5224,5225,5228,5231,5233,5236,5238,5240],{"class":280,"line":599},[278,5226,5227],{"class":288},"    `",[278,5229,5230],{"class":321},"dep-",[278,5232,791],{"class":288},[278,5234,5235],{"class":292},"orderId",[278,5237,814],{"class":288},[278,5239,296],{"class":288},[278,5241,5242],{"class":371}," \u002F\u002F Idempotency-Key เสถียร (จะ retry ด้วย key เดิมได้)\n",[278,5244,5245,5247],{"class":280,"line":604},[278,5246,550],{"class":358},[278,5248,328],{"class":288},[278,5250,5251,5254,5256,5259,5261,5263,5266,5268,5270,5272,5274,5276,5278],{"class":280,"line":609},[278,5252,5253],{"class":292},"  console",[278,5255,211],{"class":288},[278,5257,5258],{"class":717},"log",[278,5260,561],{"class":358},[278,5262,325],{"class":288},[278,5264,5265],{"class":321},"deposit id     :",[278,5267,325],{"class":288},[278,5269,296],{"class":288},[278,5271,5109],{"class":292},[278,5273,211],{"class":288},[278,5275,1736],{"class":292},[278,5277,567],{"class":358},[278,5279,328],{"class":288},[278,5281,5282,5284,5286,5288,5290,5292,5295,5297,5299,5301,5303,5306,5308,5310],{"class":280,"line":621},[278,5283,5253],{"class":292},[278,5285,211],{"class":288},[278,5287,5258],{"class":717},[278,5289,561],{"class":358},[278,5291,325],{"class":288},[278,5293,5294],{"class":321},"ให้ลูกค้าโอนยอด :",[278,5296,325],{"class":288},[278,5298,296],{"class":288},[278,5300,5109],{"class":292},[278,5302,211],{"class":288},[278,5304,5305],{"class":292},"expected_amount",[278,5307,567],{"class":358},[278,5309,368],{"class":288},[278,5311,5312],{"class":371}," \u002F\u002F ⚠️ ไม่ใช่ amount\n",[278,5314,5315,5317,5319,5321,5323,5325,5328,5330,5332,5334,5336,5339,5341,5344,5346],{"class":280,"line":643},[278,5316,5253],{"class":292},[278,5318,211],{"class":288},[278,5320,5258],{"class":717},[278,5322,561],{"class":358},[278,5324,325],{"class":288},[278,5326,5327],{"class":321},"QR payload     :",[278,5329,325],{"class":288},[278,5331,296],{"class":288},[278,5333,5109],{"class":292},[278,5335,211],{"class":288},[278,5337,5338],{"class":292},"pay_to",[278,5340,211],{"class":288},[278,5342,5343],{"class":292},"qr_payload",[278,5345,567],{"class":358},[278,5347,328],{"class":288},[278,5349,5350],{"class":280,"line":648},[278,5351,5352],{"class":371},"  \u002F\u002F → แสดง QR (จาก qr_payload) + ยอด expected_amount ให้ลูกค้า แล้วรอ webhook deposit.success\n",[278,5354,5355],{"class":280,"line":654},[278,5356,335],{"emptyLinePlaceholder":334},[278,5358,5359],{"class":280,"line":706},[278,5360,5361],{"class":371},"  \u002F\u002F 2) เช็คยอดก่อนถอน\n",[278,5363,5364,5366,5369,5371,5373,5375,5377,5380,5382],{"class":280,"line":770},[278,5365,5088],{"class":344},[278,5367,5368],{"class":292}," bal",[278,5370,581],{"class":288},[278,5372,1348],{"class":284},[278,5374,5116],{"class":292},[278,5376,211],{"class":288},[278,5378,5379],{"class":717},"getBalance",[278,5381,1117],{"class":358},[278,5383,328],{"class":288},[278,5385,5386,5388,5390,5392,5394,5396,5399,5401,5403,5405,5407,5410,5412],{"class":280,"line":819},[278,5387,5253],{"class":292},[278,5389,211],{"class":288},[278,5391,5258],{"class":717},[278,5393,561],{"class":358},[278,5395,325],{"class":288},[278,5397,5398],{"class":321},"available:",[278,5400,325],{"class":288},[278,5402,296],{"class":288},[278,5404,5368],{"class":292},[278,5406,211],{"class":288},[278,5408,5409],{"class":292},"available",[278,5411,567],{"class":358},[278,5413,328],{"class":288},[278,5415,5416],{"class":280,"line":884},[278,5417,335],{"emptyLinePlaceholder":334},[278,5419,5420],{"class":280,"line":889},[278,5421,5422],{"class":371},"  \u002F\u002F 3) สร้างคำขอถอน (รออนุมัติ — สถานะเริ่มต้น PENDING, รอ webhook withdrawal.success)\n",[278,5424,5425,5428],{"class":280,"line":894},[278,5426,5427],{"class":284},"  try",[278,5429,352],{"class":288},[278,5431,5432,5434,5437,5439,5441,5443,5445,5448],{"class":280,"line":900},[278,5433,709],{"class":344},[278,5435,5436],{"class":292}," wd",[278,5438,581],{"class":288},[278,5440,1348],{"class":284},[278,5442,5116],{"class":292},[278,5444,211],{"class":288},[278,5446,5447],{"class":717},"createWithdrawal",[278,5449,487],{"class":358},[278,5451,5452],{"class":280,"line":920},[278,5453,5454],{"class":288},"      {\n",[278,5456,5457,5460,5462,5464,5467,5469],{"class":280,"line":947},[278,5458,5459],{"class":358},"        amount",[278,5461,362],{"class":288},[278,5463,318],{"class":288},[278,5465,5466],{"class":321},"500.00",[278,5468,325],{"class":288},[278,5470,505],{"class":288},[278,5472,5473,5476,5478,5480,5483,5485],{"class":280,"line":962},[278,5474,5475],{"class":358},"        receiver_bank_provider",[278,5477,362],{"class":288},[278,5479,318],{"class":288},[278,5481,5482],{"class":321},"SCB",[278,5484,325],{"class":288},[278,5486,505],{"class":288},[278,5488,5489,5492,5494,5496,5499,5501],{"class":280,"line":996},[278,5490,5491],{"class":358},"        receiver_bank_account_name",[278,5493,362],{"class":288},[278,5495,318],{"class":288},[278,5497,5498],{"class":321},"สมหญิง รักดี",[278,5500,325],{"class":288},[278,5502,505],{"class":288},[278,5504,5505,5508,5510,5512,5515,5517],{"class":280,"line":1014},[278,5506,5507],{"class":358},"        receiver_bank_account_number",[278,5509,362],{"class":288},[278,5511,318],{"class":288},[278,5513,5514],{"class":321},"9876543210",[278,5516,325],{"class":288},[278,5518,505],{"class":288},[278,5520,5521,5524,5526,5528,5530,5532,5534,5537,5539,5541,5543,5545,5547,5550,5552],{"class":280,"line":1020},[278,5522,5523],{"class":358},"        additional",[278,5525,362],{"class":288},[278,5527,289],{"class":288},[278,5529,2305],{"class":358},[278,5531,362],{"class":288},[278,5533,318],{"class":288},[278,5535,5536],{"class":321},"payout #A-1042",[278,5538,325],{"class":288},[278,5540,296],{"class":288},[278,5542,2749],{"class":358},[278,5544,362],{"class":288},[278,5546,318],{"class":288},[278,5548,5549],{"class":321},"cust-7",[278,5551,325],{"class":288},[278,5553,5554],{"class":288}," },\n",[278,5556,5557],{"class":280,"line":1073},[278,5558,5559],{"class":288},"      },\n",[278,5561,5562,5564,5567,5569,5571],{"class":280,"line":1122},[278,5563,1193],{"class":288},[278,5565,5566],{"class":321},"wd-A-1042",[278,5568,325],{"class":288},[278,5570,296],{"class":288},[278,5572,5573],{"class":371}," \u002F\u002F Idempotency-Key เสถียร\n",[278,5575,5576,5578],{"class":280,"line":1157},[278,5577,3189],{"class":358},[278,5579,328],{"class":288},[278,5581,5582,5585,5587,5589,5591,5593,5596,5598,5600,5602,5604,5606,5608,5610],{"class":280,"line":1162},[278,5583,5584],{"class":292},"    console",[278,5586,211],{"class":288},[278,5588,5258],{"class":717},[278,5590,561],{"class":358},[278,5592,325],{"class":288},[278,5594,5595],{"class":321},"withdrawal status:",[278,5597,325],{"class":288},[278,5599,296],{"class":288},[278,5601,5436],{"class":292},[278,5603,211],{"class":288},[278,5605,1569],{"class":292},[278,5607,567],{"class":358},[278,5609,368],{"class":288},[278,5611,5612],{"class":371}," \u002F\u002F \"PENDING\"\n",[278,5614,5615,5618,5621,5623,5625,5627],{"class":280,"line":1190},[278,5616,5617],{"class":288},"  }",[278,5619,5620],{"class":284}," catch",[278,5622,1258],{"class":358},[278,5624,4204],{"class":292},[278,5626,1263],{"class":358},[278,5628,1500],{"class":288},[278,5630,5631,5633,5635,5637,5640,5642,5645,5647,5649,5651,5653,5655,5658,5660,5662],{"class":280,"line":1214},[278,5632,1255],{"class":284},[278,5634,1258],{"class":358},[278,5636,4204],{"class":292},[278,5638,5639],{"class":288}," instanceof",[278,5641,470],{"class":348},[278,5643,5644],{"class":288}," &&",[278,5646,1509],{"class":292},[278,5648,211],{"class":288},[278,5650,231],{"class":292},[278,5652,1037],{"class":288},[278,5654,318],{"class":288},[278,5656,5657],{"class":321},"INSUFFICIENT_BALANCE",[278,5659,325],{"class":288},[278,5661,1263],{"class":358},[278,5663,1500],{"class":288},[278,5665,5666,5669,5671,5673,5675,5677,5680,5682,5684,5686,5688,5690,5692,5694,5697,5699,5701,5703,5705,5708,5710],{"class":280,"line":1230},[278,5667,5668],{"class":292},"      console",[278,5670,211],{"class":288},[278,5672,1522],{"class":717},[278,5674,561],{"class":358},[278,5676,325],{"class":288},[278,5678,5679],{"class":321},"ยอดไม่พอ:",[278,5681,325],{"class":288},[278,5683,296],{"class":288},[278,5685,1509],{"class":292},[278,5687,211],{"class":288},[278,5689,564],{"class":292},[278,5691,296],{"class":288},[278,5693,318],{"class":288},[278,5695,5696],{"class":321},"request_id:",[278,5698,325],{"class":288},[278,5700,296],{"class":288},[278,5702,1509],{"class":292},[278,5704,211],{"class":288},[278,5706,5707],{"class":292},"requestId",[278,5709,567],{"class":358},[278,5711,328],{"class":288},[278,5713,5714,5716,5719],{"class":280,"line":1246},[278,5715,1413],{"class":288},[278,5717,5718],{"class":284}," else",[278,5720,352],{"class":288},[278,5722,5723,5725,5727],{"class":280,"line":1252},[278,5724,1555],{"class":284},[278,5726,1509],{"class":292},[278,5728,328],{"class":288},[278,5730,5731],{"class":280,"line":1294},[278,5732,1604],{"class":288},[278,5734,5735],{"class":280,"line":1333},[278,5736,596],{"class":288},[278,5738,5739],{"class":280,"line":1338},[278,5740,408],{"class":288},[278,5742,5743],{"class":280,"line":1375},[278,5744,335],{"emptyLinePlaceholder":334},[278,5746,5747,5750,5752,5754,5757,5760,5762,5765],{"class":280,"line":1383},[278,5748,5749],{"class":717},"main",[278,5751,1117],{"class":292},[278,5753,211],{"class":288},[278,5755,5756],{"class":717},"catch",[278,5758,5759],{"class":292},"(console",[278,5761,211],{"class":288},[278,5763,5764],{"class":292},"error)",[278,5766,328],{"class":288},[268,5768,5771],{"className":3078,"code":5769,"filename":5770,"language":3081,"meta":274,"style":274},"\u003C?php\nrequire 'UnknownPayClient.php';\n\n$client = new UnknownPayClient(\n    'https:\u002F\u002Fapi.unkpay.co',\n    getenv('UNKPAY_API_KEY'),  \u002F\u002F \"unk_live_...\" (test ใช้ \"unk_test_...\")\n    getenv('UNKPAY_SECRET'),\n);\n\n\u002F\u002F 1) สร้าง deposit — idempotency key ผูกกับ order ของคุณ (retry-safe)\n$orderId = 'order-2026-0001';\n$dep = $client->createDeposit([\n    'amount'                     => '100.50',\n    'payment_method_type'        => 'PROMPTPAY_QR',\n    'payer_bank_provider'        => 'KBANK',\n    'payer_bank_account_name'    => 'สมชาย ใจดี',\n    'payer_bank_account_number'  => '1234567890',\n    'user_ref'                   => $orderId,\n], 'dep-' . $orderId);\n\necho \"ให้ลูกค้าโอนยอด: \" . $dep['expected_amount'] . \"\\n\"; \u002F\u002F ⚠️ ยอดเป๊ะ ไม่ใช่ amount\necho \"QR: \" . ($dep['pay_to']['qr_payload'] ?? '') . \"\\n\";\n\n\u002F\u002F 2) เช็คยอดก่อนถอน\n$bal = $client->getBalance();\necho \"available: \" . $bal['available'] . \"\\n\";\n\n\u002F\u002F 3) สร้างคำขอถอน (รออนุมัติ — รอ webhook withdrawal.success)\ntry {\n    $wd = $client->createWithdrawal([\n        'amount'                       => '500.00',\n        'receiver_bank_provider'       => 'SCB',\n        'receiver_bank_account_name'   => 'สมหญิง รักดี',\n        'receiver_bank_account_number' => '9876543210',\n        'additional'                   => ['description' => 'payout #A-1042', 'reference_user_id' => 'cust-7'],\n    ], 'wd-A-1042');\n    echo \"withdrawal status: \" . $wd['status'] . \"\\n\"; \u002F\u002F \"PENDING\"\n} catch (UnknownPayException $e) {\n    if ($e->errorCode === 'INSUFFICIENT_BALANCE') {\n        echo \"ยอดไม่พอ: {$e->getMessage()} (request_id: {$e->requestId})\\n\";\n    } else {\n        throw $e;\n    }\n}\n","PHP",[231,5772,5773,5779,5793,5797,5813,5824,5842,5857,5861,5865,5870,5887,5909,5929,5949,5968,5988,6008,6026,6044,6048,6090,6142,6146,6151,6170,6208,6212,6217,6224,6244,6264,6284,6304,6323,6371,6384,6425,6444,6469,6513,6521,6532,6536],{"__ignoreMap":274},[278,5774,5775,5777],{"class":280,"line":281},[278,5776,3088],{"class":288},[278,5778,3091],{"class":292},[278,5780,5781,5784,5786,5789,5791],{"class":280,"line":331},[278,5782,5783],{"class":284},"require",[278,5785,3771],{"class":288},[278,5787,5788],{"class":321},"UnknownPayClient.php",[278,5790,3373],{"class":288},[278,5792,328],{"class":288},[278,5794,5795],{"class":280,"line":338},[278,5796,335],{"emptyLinePlaceholder":334},[278,5798,5799,5802,5805,5807,5809,5811],{"class":280,"line":355},[278,5800,5801],{"class":288},"$",[278,5803,5804],{"class":292},"client ",[278,5806,1282],{"class":288},[278,5808,1558],{"class":1106},[278,5810,616],{"class":348},[278,5812,487],{"class":288},[278,5814,5815,5818,5820,5822],{"class":280,"line":375},[278,5816,5817],{"class":288},"    '",[278,5819,5003],{"class":321},[278,5821,3373],{"class":288},[278,5823,505],{"class":288},[278,5825,5826,5829,5831,5833,5835,5837,5839],{"class":280,"line":390},[278,5827,5828],{"class":717},"    getenv",[278,5830,561],{"class":288},[278,5832,3373],{"class":288},[278,5834,5026],{"class":321},[278,5836,3373],{"class":288},[278,5838,4920],{"class":288},[278,5840,5841],{"class":371},"  \u002F\u002F \"unk_live_...\" (test ใช้ \"unk_test_...\")\n",[278,5843,5844,5846,5848,5850,5852,5854],{"class":280,"line":405},[278,5845,5828],{"class":717},[278,5847,561],{"class":288},[278,5849,3373],{"class":288},[278,5851,5049],{"class":321},[278,5853,3373],{"class":288},[278,5855,5856],{"class":288},"),\n",[278,5858,5859],{"class":280,"line":411},[278,5860,3210],{"class":288},[278,5862,5863],{"class":280,"line":416},[278,5864,335],{"emptyLinePlaceholder":334},[278,5866,5867],{"class":280,"line":457},[278,5868,5869],{"class":371},"\u002F\u002F 1) สร้าง deposit — idempotency key ผูกกับ order ของคุณ (retry-safe)\n",[278,5871,5872,5874,5877,5879,5881,5883,5885],{"class":280,"line":462},[278,5873,5801],{"class":288},[278,5875,5876],{"class":292},"orderId ",[278,5878,1282],{"class":288},[278,5880,3771],{"class":288},[278,5882,5098],{"class":321},[278,5884,3373],{"class":288},[278,5886,328],{"class":288},[278,5888,5889,5891,5894,5896,5898,5901,5904,5906],{"class":280,"line":481},[278,5890,5801],{"class":288},[278,5892,5893],{"class":292},"dep ",[278,5895,1282],{"class":288},[278,5897,3138],{"class":288},[278,5899,5900],{"class":292},"client",[278,5902,5903],{"class":288},"->",[278,5905,5121],{"class":717},[278,5907,5908],{"class":288},"([\n",[278,5910,5911,5913,5916,5918,5921,5923,5925,5927],{"class":280,"line":490},[278,5912,5817],{"class":288},[278,5914,5915],{"class":321},"amount",[278,5917,3373],{"class":288},[278,5919,5920],{"class":288},"                     =>",[278,5922,3771],{"class":288},[278,5924,5139],{"class":321},[278,5926,3373],{"class":288},[278,5928,505],{"class":288},[278,5930,5931,5933,5936,5938,5941,5943,5945,5947],{"class":280,"line":508},[278,5932,5817],{"class":288},[278,5934,5935],{"class":321},"payment_method_type",[278,5937,3373],{"class":288},[278,5939,5940],{"class":288},"        =>",[278,5942,3771],{"class":288},[278,5944,2276],{"class":321},[278,5946,3373],{"class":288},[278,5948,505],{"class":288},[278,5950,5951,5953,5956,5958,5960,5962,5964,5966],{"class":280,"line":521},[278,5952,5817],{"class":288},[278,5954,5955],{"class":321},"payer_bank_provider",[278,5957,3373],{"class":288},[278,5959,5940],{"class":288},[278,5961,3771],{"class":288},[278,5963,5170],{"class":321},[278,5965,3373],{"class":288},[278,5967,505],{"class":288},[278,5969,5970,5972,5975,5977,5980,5982,5984,5986],{"class":280,"line":533},[278,5971,5817],{"class":288},[278,5973,5974],{"class":321},"payer_bank_account_name",[278,5976,3373],{"class":288},[278,5978,5979],{"class":288},"    =>",[278,5981,3771],{"class":288},[278,5983,5186],{"class":321},[278,5985,3373],{"class":288},[278,5987,505],{"class":288},[278,5989,5990,5992,5995,5997,6000,6002,6004,6006],{"class":280,"line":547},[278,5991,5817],{"class":288},[278,5993,5994],{"class":321},"payer_bank_account_number",[278,5996,3373],{"class":288},[278,5998,5999],{"class":288},"  =>",[278,6001,3771],{"class":288},[278,6003,5202],{"class":321},[278,6005,3373],{"class":288},[278,6007,505],{"class":288},[278,6009,6010,6012,6015,6017,6020,6022,6024],{"class":280,"line":555},[278,6011,5817],{"class":288},[278,6013,6014],{"class":321},"user_ref",[278,6016,3373],{"class":288},[278,6018,6019],{"class":288},"                   =>",[278,6021,3138],{"class":288},[278,6023,5235],{"class":292},[278,6025,505],{"class":288},[278,6027,6028,6030,6032,6034,6036,6038,6040,6042],{"class":280,"line":572},[278,6029,4215],{"class":288},[278,6031,3771],{"class":288},[278,6033,5230],{"class":321},[278,6035,3373],{"class":288},[278,6037,3414],{"class":288},[278,6039,3138],{"class":288},[278,6041,5235],{"class":292},[278,6043,3210],{"class":288},[278,6045,6046],{"class":280,"line":593},[278,6047,335],{"emptyLinePlaceholder":334},[278,6049,6050,6053,6055,6058,6060,6062,6064,6067,6069,6071,6073,6075,6077,6079,6081,6083,6085,6087],{"class":280,"line":599},[278,6051,6052],{"class":717},"echo",[278,6054,318],{"class":288},[278,6056,6057],{"class":321},"ให้ลูกค้าโอนยอด: ",[278,6059,325],{"class":288},[278,6061,3414],{"class":288},[278,6063,3138],{"class":288},[278,6065,6066],{"class":292},"dep",[278,6068,1269],{"class":288},[278,6070,3373],{"class":288},[278,6072,5305],{"class":321},[278,6074,3373],{"class":288},[278,6076,4148],{"class":288},[278,6078,3414],{"class":288},[278,6080,318],{"class":288},[278,6082,788],{"class":292},[278,6084,325],{"class":288},[278,6086,368],{"class":288},[278,6088,6089],{"class":371}," \u002F\u002F ⚠️ ยอดเป๊ะ ไม่ใช่ amount\n",[278,6091,6092,6094,6096,6099,6101,6103,6105,6107,6109,6111,6113,6115,6118,6120,6122,6124,6126,6128,6130,6132,6134,6136,6138,6140],{"class":280,"line":604},[278,6093,6052],{"class":717},[278,6095,318],{"class":288},[278,6097,6098],{"class":321},"QR: ",[278,6100,325],{"class":288},[278,6102,3414],{"class":288},[278,6104,3749],{"class":288},[278,6106,6066],{"class":292},[278,6108,1269],{"class":288},[278,6110,3373],{"class":288},[278,6112,5338],{"class":321},[278,6114,3373],{"class":288},[278,6116,6117],{"class":288},"][",[278,6119,3373],{"class":288},[278,6121,5343],{"class":321},[278,6123,3373],{"class":288},[278,6125,4148],{"class":288},[278,6127,1525],{"class":288},[278,6129,3587],{"class":288},[278,6131,567],{"class":288},[278,6133,3414],{"class":288},[278,6135,318],{"class":288},[278,6137,788],{"class":292},[278,6139,325],{"class":288},[278,6141,328],{"class":288},[278,6143,6144],{"class":280,"line":609},[278,6145,335],{"emptyLinePlaceholder":334},[278,6147,6148],{"class":280,"line":621},[278,6149,6150],{"class":371},"\u002F\u002F 2) เช็คยอดก่อนถอน\n",[278,6152,6153,6155,6158,6160,6162,6164,6166,6168],{"class":280,"line":643},[278,6154,5801],{"class":288},[278,6156,6157],{"class":292},"bal ",[278,6159,1282],{"class":288},[278,6161,3138],{"class":288},[278,6163,5900],{"class":292},[278,6165,5903],{"class":288},[278,6167,5379],{"class":717},[278,6169,3630],{"class":288},[278,6171,6172,6174,6176,6179,6181,6183,6185,6188,6190,6192,6194,6196,6198,6200,6202,6204,6206],{"class":280,"line":648},[278,6173,6052],{"class":717},[278,6175,318],{"class":288},[278,6177,6178],{"class":321},"available: ",[278,6180,325],{"class":288},[278,6182,3414],{"class":288},[278,6184,3138],{"class":288},[278,6186,6187],{"class":292},"bal",[278,6189,1269],{"class":288},[278,6191,3373],{"class":288},[278,6193,5409],{"class":321},[278,6195,3373],{"class":288},[278,6197,4148],{"class":288},[278,6199,3414],{"class":288},[278,6201,318],{"class":288},[278,6203,788],{"class":292},[278,6205,325],{"class":288},[278,6207,328],{"class":288},[278,6209,6210],{"class":280,"line":654},[278,6211,335],{"emptyLinePlaceholder":334},[278,6213,6214],{"class":280,"line":706},[278,6215,6216],{"class":371},"\u002F\u002F 3) สร้างคำขอถอน (รออนุมัติ — รอ webhook withdrawal.success)\n",[278,6218,6219,6222],{"class":280,"line":770},[278,6220,6221],{"class":284},"try",[278,6223,352],{"class":288},[278,6225,6226,6229,6232,6234,6236,6238,6240,6242],{"class":280,"line":819},[278,6227,6228],{"class":288},"    $",[278,6230,6231],{"class":292},"wd ",[278,6233,1282],{"class":288},[278,6235,3138],{"class":288},[278,6237,5900],{"class":292},[278,6239,5903],{"class":288},[278,6241,5447],{"class":717},[278,6243,5908],{"class":288},[278,6245,6246,6249,6251,6253,6256,6258,6260,6262],{"class":280,"line":884},[278,6247,6248],{"class":288},"        '",[278,6250,5915],{"class":321},[278,6252,3373],{"class":288},[278,6254,6255],{"class":288},"                       =>",[278,6257,3771],{"class":288},[278,6259,5466],{"class":321},[278,6261,3373],{"class":288},[278,6263,505],{"class":288},[278,6265,6266,6268,6271,6273,6276,6278,6280,6282],{"class":280,"line":889},[278,6267,6248],{"class":288},[278,6269,6270],{"class":321},"receiver_bank_provider",[278,6272,3373],{"class":288},[278,6274,6275],{"class":288},"       =>",[278,6277,3771],{"class":288},[278,6279,5482],{"class":321},[278,6281,3373],{"class":288},[278,6283,505],{"class":288},[278,6285,6286,6288,6291,6293,6296,6298,6300,6302],{"class":280,"line":894},[278,6287,6248],{"class":288},[278,6289,6290],{"class":321},"receiver_bank_account_name",[278,6292,3373],{"class":288},[278,6294,6295],{"class":288},"   =>",[278,6297,3771],{"class":288},[278,6299,5498],{"class":321},[278,6301,3373],{"class":288},[278,6303,505],{"class":288},[278,6305,6306,6308,6311,6313,6315,6317,6319,6321],{"class":280,"line":900},[278,6307,6248],{"class":288},[278,6309,6310],{"class":321},"receiver_bank_account_number",[278,6312,3373],{"class":288},[278,6314,4162],{"class":288},[278,6316,3771],{"class":288},[278,6318,5514],{"class":321},[278,6320,3373],{"class":288},[278,6322,505],{"class":288},[278,6324,6325,6327,6330,6332,6334,6336,6338,6341,6343,6345,6347,6349,6351,6353,6355,6358,6360,6362,6364,6366,6368],{"class":280,"line":920},[278,6326,6248],{"class":288},[278,6328,6329],{"class":321},"additional",[278,6331,3373],{"class":288},[278,6333,6019],{"class":288},[278,6335,4153],{"class":288},[278,6337,3373],{"class":288},[278,6339,6340],{"class":321},"description",[278,6342,3373],{"class":288},[278,6344,4162],{"class":288},[278,6346,3771],{"class":288},[278,6348,5536],{"class":321},[278,6350,3373],{"class":288},[278,6352,296],{"class":288},[278,6354,3771],{"class":288},[278,6356,6357],{"class":321},"reference_user_id",[278,6359,3373],{"class":288},[278,6361,4162],{"class":288},[278,6363,3771],{"class":288},[278,6365,5549],{"class":321},[278,6367,3373],{"class":288},[278,6369,6370],{"class":288},"],\n",[278,6372,6373,6376,6378,6380,6382],{"class":280,"line":947},[278,6374,6375],{"class":288},"    ],",[278,6377,3771],{"class":288},[278,6379,5566],{"class":321},[278,6381,3373],{"class":288},[278,6383,3210],{"class":288},[278,6385,6386,6389,6391,6394,6396,6398,6400,6403,6405,6407,6409,6411,6413,6415,6417,6419,6421,6423],{"class":280,"line":962},[278,6387,6388],{"class":717},"    echo",[278,6390,318],{"class":288},[278,6392,6393],{"class":321},"withdrawal status: ",[278,6395,325],{"class":288},[278,6397,3414],{"class":288},[278,6399,3138],{"class":288},[278,6401,6402],{"class":292},"wd",[278,6404,1269],{"class":288},[278,6406,3373],{"class":288},[278,6408,1569],{"class":321},[278,6410,3373],{"class":288},[278,6412,4148],{"class":288},[278,6414,3414],{"class":288},[278,6416,318],{"class":288},[278,6418,788],{"class":292},[278,6420,325],{"class":288},[278,6422,368],{"class":288},[278,6424,5612],{"class":371},[278,6426,6427,6429,6431,6433,6436,6438,6440,6442],{"class":280,"line":996},[278,6428,785],{"class":288},[278,6430,5620],{"class":284},[278,6432,1258],{"class":288},[278,6434,6435],{"class":348},"UnknownPayException",[278,6437,3138],{"class":288},[278,6439,4204],{"class":292},[278,6441,567],{"class":288},[278,6443,352],{"class":288},[278,6445,6446,6448,6450,6452,6454,6457,6459,6461,6463,6465,6467],{"class":280,"line":1014},[278,6447,1255],{"class":284},[278,6449,3749],{"class":288},[278,6451,4204],{"class":292},[278,6453,5903],{"class":288},[278,6455,6456],{"class":292},"errorCode ",[278,6458,3580],{"class":288},[278,6460,3771],{"class":288},[278,6462,5657],{"class":321},[278,6464,3373],{"class":288},[278,6466,567],{"class":288},[278,6468,352],{"class":288},[278,6470,6471,6474,6476,6479,6482,6484,6486,6489,6492,6495,6497,6499,6501,6503,6505,6507,6509,6511],{"class":280,"line":1020},[278,6472,6473],{"class":717},"        echo",[278,6475,318],{"class":288},[278,6477,6478],{"class":321},"ยอดไม่พอ: ",[278,6480,6481],{"class":288},"{$",[278,6483,4204],{"class":292},[278,6485,5903],{"class":288},[278,6487,6488],{"class":717},"getMessage",[278,6490,6491],{"class":288},"()}",[278,6493,6494],{"class":321}," (request_id: ",[278,6496,6481],{"class":288},[278,6498,4204],{"class":292},[278,6500,5903],{"class":288},[278,6502,5707],{"class":292},[278,6504,785],{"class":288},[278,6506,567],{"class":321},[278,6508,788],{"class":292},[278,6510,325],{"class":288},[278,6512,328],{"class":288},[278,6514,6515,6517,6519],{"class":280,"line":1073},[278,6516,1413],{"class":288},[278,6518,5718],{"class":284},[278,6520,352],{"class":288},[278,6522,6523,6526,6528,6530],{"class":280,"line":1122},[278,6524,6525],{"class":284},"        throw",[278,6527,3138],{"class":288},[278,6529,4204],{"class":292},[278,6531,328],{"class":288},[278,6533,6534],{"class":280,"line":1157},[278,6535,1604],{"class":288},[278,6537,6538],{"class":280,"line":1162},[278,6539,408],{"class":288},[213,6541,6543],{"id":6542},"webhook-receiver-verify-signature-handle-events","Webhook receiver — verify signature + handle events",[218,6545,6546],{},[200,6547,6548,6549,6552,6553,6556],{},"You must read the ",[204,6550,6551],{},"RAW body"," (do not parse JSON before verifying) — the signature is computed over the raw bytes. Verify constant-time, then return ",[204,6554,6555],{},"2xx fast"," and process asynchronously; if you don't return 2xx the system retries for up to ~24 hours.",[265,6558,6559,7440],{},[268,6560,6563],{"className":270,"code":6561,"filename":6562,"language":273,"meta":274,"style":274},"import express from \"express\";\nimport { createHmac, timingSafeEqual } from \"crypto\";\n\nconst WEBHOOK_SECRET = process.env.UNKPAY_WEBHOOK_SECRET!; \u002F\u002F show-once จาก Portal\nconst app = express();\n\n\u002F\u002F ⚠️ ต้องอ่าน RAW body (อย่าใช้ express.json() ก่อน verify) — ลายเซ็นคำนวณจากไบต์ดิบ\napp.post(\"\u002Fwebhooks\u002Funknownpay\", express.raw({ type: \"*\u002F*\" }), (req, res) => {\n  const raw: Buffer = req.body; \u002F\u002F Buffer ไบต์ดิบ\n  const signature = req.header(\"X-Webhook-Signature\") ?? \"\";\n\n  const expected = createHmac(\"sha256\", WEBHOOK_SECRET).update(raw).digest(\"hex\");\n  const ok =\n    signature.length === expected.length &&\n    timingSafeEqual(Buffer.from(signature), Buffer.from(expected));\n  if (!ok) return res.status(401).send(\"bad signature\");\n\n  const evt = JSON.parse(raw.toString(\"utf8\"));\n\n  \u002F\u002F กันประมวลผลซ้ำด้วย event_id (เช่น \"\u003Cid>:deposit.success\") — แนะนำเก็บลง DB\n  \u002F\u002F if (alreadyProcessed(evt.event_id)) return res.sendStatus(200);\n\n  switch (evt.event_type) {\n    case \"deposit.success\":\n      \u002F\u002F evt.deposit_id, evt.user_ref, evt.credited_amount (net ที่เข้ากระเป๋า), evt.amount\n      markOrderPaid(evt.user_ref, evt.credited_amount);\n      break;\n    case \"deposit.expired\":\n      markOrderExpired(evt.user_ref);\n      break;\n    case \"withdrawal.success\":\n      markPayoutDone(evt.withdrawal_id);\n      break;\n    case \"withdrawal.failed\":\n    case \"withdrawal.rejected\":\n      \u002F\u002F evt.reason; เงิน gross จะถูกคืนเข้ากระเป๋า (จะมี withdrawal.refunded ตามมา)\n      markPayoutFailed(evt.withdrawal_id, evt.reason);\n      break;\n    case \"withdrawal.refunded\":\n      \u002F\u002F เงินคืนเข้ากระเป๋าแล้ว — กระทบยอดภายในของร้าน\n      break;\n  }\n\n  \u002F\u002F ⚠️ ตอบ 2xx ให้เร็ว (งานหนักไป process แบบ async) ถ้าไม่ตอบ 2xx ระบบจะ retry นานสุด ~24 ชม.\n  res.sendStatus(200);\n});\n\n\u002F\u002F ตัวอย่าง stub — แทนที่ด้วย logic จริงของคุณ\nfunction markOrderPaid(ref: string, credited: string) {}\nfunction markOrderExpired(ref: string) {}\nfunction markPayoutDone(id: string) {}\nfunction markPayoutFailed(id: string, reason: string) {}\n\napp.listen(3000, () => console.log(\"webhook listener on :3000\"));\n","Node.js (Express)",[231,6564,6565,6584,6608,6612,6638,6654,6658,6663,6729,6755,6788,6792,6844,6854,6875,6914,6961,6965,7000,7004,7009,7014,7018,7037,7052,7057,7083,7090,7103,7120,7126,7139,7157,7163,7176,7189,7194,7220,7226,7239,7244,7250,7254,7258,7263,7282,7290,7294,7299,7329,7348,7367,7395,7399],{"__ignoreMap":274},[278,6566,6567,6569,6572,6575,6577,6580,6582],{"class":280,"line":281},[278,6568,285],{"class":284},[278,6570,6571],{"class":292}," express ",[278,6573,6574],{"class":284},"from",[278,6576,318],{"class":288},[278,6578,6579],{"class":321},"express",[278,6581,325],{"class":288},[278,6583,328],{"class":288},[278,6585,6586,6588,6590,6592,6594,6596,6598,6600,6602,6604,6606],{"class":280,"line":331},[278,6587,285],{"class":284},[278,6589,289],{"class":288},[278,6591,299],{"class":292},[278,6593,296],{"class":288},[278,6595,309],{"class":292},[278,6597,312],{"class":288},[278,6599,315],{"class":284},[278,6601,318],{"class":288},[278,6603,322],{"class":321},[278,6605,325],{"class":288},[278,6607,328],{"class":288},[278,6609,6610],{"class":280,"line":338},[278,6611,335],{"emptyLinePlaceholder":334},[278,6613,6614,6616,6619,6621,6623,6625,6627,6629,6632,6635],{"class":280,"line":355},[278,6615,4979],{"class":344},[278,6617,6618],{"class":292}," WEBHOOK_SECRET ",[278,6620,1282],{"class":288},[278,6622,5016],{"class":292},[278,6624,211],{"class":288},[278,6626,5021],{"class":292},[278,6628,211],{"class":288},[278,6630,6631],{"class":292},"UNKPAY_WEBHOOK_SECRET",[278,6633,6634],{"class":288},"!;",[278,6636,6637],{"class":371}," \u002F\u002F show-once จาก Portal\n",[278,6639,6640,6642,6645,6647,6650,6652],{"class":280,"line":375},[278,6641,4979],{"class":344},[278,6643,6644],{"class":292}," app ",[278,6646,1282],{"class":288},[278,6648,6649],{"class":717}," express",[278,6651,1117],{"class":292},[278,6653,328],{"class":288},[278,6655,6656],{"class":280,"line":390},[278,6657,335],{"emptyLinePlaceholder":334},[278,6659,6660],{"class":280,"line":405},[278,6661,6662],{"class":371},"\u002F\u002F ⚠️ ต้องอ่าน RAW body (อย่าใช้ express.json() ก่อน verify) — ลายเซ็นคำนวณจากไบต์ดิบ\n",[278,6664,6665,6668,6670,6673,6675,6677,6680,6682,6684,6686,6688,6691,6693,6696,6699,6701,6703,6706,6708,6710,6712,6714,6716,6719,6721,6723,6725,6727],{"class":280,"line":411},[278,6666,6667],{"class":292},"app",[278,6669,211],{"class":288},[278,6671,6672],{"class":717},"post",[278,6674,561],{"class":292},[278,6676,325],{"class":288},[278,6678,6679],{"class":321},"\u002Fwebhooks\u002Funknownpay",[278,6681,325],{"class":288},[278,6683,296],{"class":288},[278,6685,6649],{"class":292},[278,6687,211],{"class":288},[278,6689,6690],{"class":717},"raw",[278,6692,561],{"class":292},[278,6694,6695],{"class":288},"{",[278,6697,6698],{"class":358}," type",[278,6700,362],{"class":288},[278,6702,318],{"class":288},[278,6704,6705],{"class":321},"*\u002F*",[278,6707,325],{"class":288},[278,6709,312],{"class":288},[278,6711,567],{"class":292},[278,6713,296],{"class":288},[278,6715,1258],{"class":288},[278,6717,6718],{"class":496},"req",[278,6720,296],{"class":288},[278,6722,1343],{"class":496},[278,6724,567],{"class":288},[278,6726,4162],{"class":344},[278,6728,352],{"class":288},[278,6730,6731,6733,6736,6738,6741,6743,6746,6748,6750,6752],{"class":280,"line":416},[278,6732,5088],{"class":344},[278,6734,6735],{"class":292}," raw",[278,6737,362],{"class":288},[278,6739,6740],{"class":348}," Buffer",[278,6742,581],{"class":288},[278,6744,6745],{"class":292}," req",[278,6747,211],{"class":288},[278,6749,1034],{"class":292},[278,6751,368],{"class":288},[278,6753,6754],{"class":371}," \u002F\u002F Buffer ไบต์ดิบ\n",[278,6756,6757,6759,6761,6763,6765,6767,6770,6772,6774,6777,6779,6781,6784,6786],{"class":280,"line":457},[278,6758,5088],{"class":344},[278,6760,1127],{"class":292},[278,6762,581],{"class":288},[278,6764,6745],{"class":292},[278,6766,211],{"class":288},[278,6768,6769],{"class":717},"header",[278,6771,561],{"class":358},[278,6773,325],{"class":288},[278,6775,6776],{"class":321},"X-Webhook-Signature",[278,6778,325],{"class":288},[278,6780,1263],{"class":358},[278,6782,6783],{"class":288},"??",[278,6785,1046],{"class":288},[278,6787,328],{"class":288},[278,6789,6790],{"class":280,"line":462},[278,6791,335],{"emptyLinePlaceholder":334},[278,6793,6794,6796,6799,6801,6803,6805,6807,6809,6811,6813,6816,6818,6820,6822,6824,6826,6828,6830,6832,6834,6836,6838,6840,6842],{"class":280,"line":481},[278,6795,5088],{"class":344},[278,6797,6798],{"class":292}," expected",[278,6800,581],{"class":288},[278,6802,299],{"class":717},[278,6804,561],{"class":358},[278,6806,325],{"class":288},[278,6808,724],{"class":321},[278,6810,325],{"class":288},[278,6812,296],{"class":288},[278,6814,6815],{"class":292}," WEBHOOK_SECRET",[278,6817,567],{"class":358},[278,6819,211],{"class":288},[278,6821,733],{"class":717},[278,6823,561],{"class":358},[278,6825,6690],{"class":292},[278,6827,567],{"class":358},[278,6829,211],{"class":288},[278,6831,754],{"class":717},[278,6833,561],{"class":358},[278,6835,325],{"class":288},[278,6837,761],{"class":321},[278,6839,325],{"class":288},[278,6841,567],{"class":358},[278,6843,328],{"class":288},[278,6845,6846,6848,6851],{"class":280,"line":490},[278,6847,5088],{"class":344},[278,6849,6850],{"class":292}," ok",[278,6852,6853],{"class":288}," =\n",[278,6855,6856,6859,6861,6864,6866,6868,6870,6872],{"class":280,"line":508},[278,6857,6858],{"class":292},"    signature",[278,6860,211],{"class":288},[278,6862,6863],{"class":292},"length",[278,6865,1037],{"class":288},[278,6867,6798],{"class":292},[278,6869,211],{"class":288},[278,6871,6863],{"class":292},[278,6873,6874],{"class":288}," &&\n",[278,6876,6877,6880,6882,6885,6887,6889,6891,6894,6896,6898,6900,6902,6904,6906,6909,6912],{"class":280,"line":521},[278,6878,6879],{"class":717},"    timingSafeEqual",[278,6881,561],{"class":358},[278,6883,6884],{"class":292},"Buffer",[278,6886,211],{"class":288},[278,6888,6574],{"class":717},[278,6890,561],{"class":358},[278,6892,6893],{"class":292},"signature",[278,6895,567],{"class":358},[278,6897,296],{"class":288},[278,6899,6740],{"class":292},[278,6901,211],{"class":288},[278,6903,6574],{"class":717},[278,6905,561],{"class":358},[278,6907,6908],{"class":292},"expected",[278,6910,6911],{"class":358},"))",[278,6913,328],{"class":288},[278,6915,6916,6919,6921,6923,6925,6927,6930,6932,6934,6936,6938,6941,6943,6945,6948,6950,6952,6955,6957,6959],{"class":280,"line":533},[278,6917,6918],{"class":284},"  if",[278,6920,1258],{"class":358},[278,6922,1487],{"class":288},[278,6924,1495],{"class":292},[278,6926,1263],{"class":358},[278,6928,6929],{"class":284},"return",[278,6931,1343],{"class":292},[278,6933,211],{"class":288},[278,6935,1569],{"class":717},[278,6937,561],{"class":358},[278,6939,6940],{"class":1106},"401",[278,6942,567],{"class":358},[278,6944,211],{"class":288},[278,6946,6947],{"class":717},"send",[278,6949,561],{"class":358},[278,6951,325],{"class":288},[278,6953,6954],{"class":321},"bad signature",[278,6956,325],{"class":288},[278,6958,567],{"class":358},[278,6960,328],{"class":288},[278,6962,6963],{"class":280,"line":547},[278,6964,335],{"emptyLinePlaceholder":334},[278,6966,6967,6969,6972,6974,6976,6978,6980,6982,6984,6986,6988,6990,6992,6994,6996,6998],{"class":280,"line":555},[278,6968,5088],{"class":344},[278,6970,6971],{"class":292}," evt",[278,6973,581],{"class":288},[278,6975,1052],{"class":292},[278,6977,211],{"class":288},[278,6979,1466],{"class":717},[278,6981,561],{"class":358},[278,6983,6690],{"class":292},[278,6985,211],{"class":288},[278,6987,1114],{"class":717},[278,6989,561],{"class":358},[278,6991,325],{"class":288},[278,6993,745],{"class":321},[278,6995,325],{"class":288},[278,6997,6911],{"class":358},[278,6999,328],{"class":288},[278,7001,7002],{"class":280,"line":572},[278,7003,335],{"emptyLinePlaceholder":334},[278,7005,7006],{"class":280,"line":593},[278,7007,7008],{"class":371},"  \u002F\u002F กันประมวลผลซ้ำด้วย event_id (เช่น \"\u003Cid>:deposit.success\") — แนะนำเก็บลง DB\n",[278,7010,7011],{"class":280,"line":599},[278,7012,7013],{"class":371},"  \u002F\u002F if (alreadyProcessed(evt.event_id)) return res.sendStatus(200);\n",[278,7015,7016],{"class":280,"line":604},[278,7017,335],{"emptyLinePlaceholder":334},[278,7019,7020,7023,7025,7028,7030,7033,7035],{"class":280,"line":609},[278,7021,7022],{"class":284},"  switch",[278,7024,1258],{"class":358},[278,7026,7027],{"class":292},"evt",[278,7029,211],{"class":288},[278,7031,7032],{"class":292},"event_type",[278,7034,1263],{"class":358},[278,7036,1500],{"class":288},[278,7038,7039,7042,7044,7047,7049],{"class":280,"line":621},[278,7040,7041],{"class":284},"    case",[278,7043,318],{"class":288},[278,7045,7046],{"class":321},"deposit.success",[278,7048,325],{"class":288},[278,7050,7051],{"class":288},":\n",[278,7053,7054],{"class":280,"line":643},[278,7055,7056],{"class":371},"      \u002F\u002F evt.deposit_id, evt.user_ref, evt.credited_amount (net ที่เข้ากระเป๋า), evt.amount\n",[278,7058,7059,7062,7064,7066,7068,7070,7072,7074,7076,7079,7081],{"class":280,"line":648},[278,7060,7061],{"class":717},"      markOrderPaid",[278,7063,561],{"class":358},[278,7065,7027],{"class":292},[278,7067,211],{"class":288},[278,7069,6014],{"class":292},[278,7071,296],{"class":288},[278,7073,6971],{"class":292},[278,7075,211],{"class":288},[278,7077,7078],{"class":292},"credited_amount",[278,7080,567],{"class":358},[278,7082,328],{"class":288},[278,7084,7085,7088],{"class":280,"line":654},[278,7086,7087],{"class":284},"      break",[278,7089,328],{"class":288},[278,7091,7092,7094,7096,7099,7101],{"class":280,"line":706},[278,7093,7041],{"class":284},[278,7095,318],{"class":288},[278,7097,7098],{"class":321},"deposit.expired",[278,7100,325],{"class":288},[278,7102,7051],{"class":288},[278,7104,7105,7108,7110,7112,7114,7116,7118],{"class":280,"line":770},[278,7106,7107],{"class":717},"      markOrderExpired",[278,7109,561],{"class":358},[278,7111,7027],{"class":292},[278,7113,211],{"class":288},[278,7115,6014],{"class":292},[278,7117,567],{"class":358},[278,7119,328],{"class":288},[278,7121,7122,7124],{"class":280,"line":819},[278,7123,7087],{"class":284},[278,7125,328],{"class":288},[278,7127,7128,7130,7132,7135,7137],{"class":280,"line":884},[278,7129,7041],{"class":284},[278,7131,318],{"class":288},[278,7133,7134],{"class":321},"withdrawal.success",[278,7136,325],{"class":288},[278,7138,7051],{"class":288},[278,7140,7141,7144,7146,7148,7150,7153,7155],{"class":280,"line":889},[278,7142,7143],{"class":717},"      markPayoutDone",[278,7145,561],{"class":358},[278,7147,7027],{"class":292},[278,7149,211],{"class":288},[278,7151,7152],{"class":292},"withdrawal_id",[278,7154,567],{"class":358},[278,7156,328],{"class":288},[278,7158,7159,7161],{"class":280,"line":894},[278,7160,7087],{"class":284},[278,7162,328],{"class":288},[278,7164,7165,7167,7169,7172,7174],{"class":280,"line":900},[278,7166,7041],{"class":284},[278,7168,318],{"class":288},[278,7170,7171],{"class":321},"withdrawal.failed",[278,7173,325],{"class":288},[278,7175,7051],{"class":288},[278,7177,7178,7180,7182,7185,7187],{"class":280,"line":920},[278,7179,7041],{"class":284},[278,7181,318],{"class":288},[278,7183,7184],{"class":321},"withdrawal.rejected",[278,7186,325],{"class":288},[278,7188,7051],{"class":288},[278,7190,7191],{"class":280,"line":947},[278,7192,7193],{"class":371},"      \u002F\u002F evt.reason; เงิน gross จะถูกคืนเข้ากระเป๋า (จะมี withdrawal.refunded ตามมา)\n",[278,7195,7196,7199,7201,7203,7205,7207,7209,7211,7213,7216,7218],{"class":280,"line":962},[278,7197,7198],{"class":717},"      markPayoutFailed",[278,7200,561],{"class":358},[278,7202,7027],{"class":292},[278,7204,211],{"class":288},[278,7206,7152],{"class":292},[278,7208,296],{"class":288},[278,7210,6971],{"class":292},[278,7212,211],{"class":288},[278,7214,7215],{"class":292},"reason",[278,7217,567],{"class":358},[278,7219,328],{"class":288},[278,7221,7222,7224],{"class":280,"line":996},[278,7223,7087],{"class":284},[278,7225,328],{"class":288},[278,7227,7228,7230,7232,7235,7237],{"class":280,"line":1014},[278,7229,7041],{"class":284},[278,7231,318],{"class":288},[278,7233,7234],{"class":321},"withdrawal.refunded",[278,7236,325],{"class":288},[278,7238,7051],{"class":288},[278,7240,7241],{"class":280,"line":1020},[278,7242,7243],{"class":371},"      \u002F\u002F เงินคืนเข้ากระเป๋าแล้ว — กระทบยอดภายในของร้าน\n",[278,7245,7246,7248],{"class":280,"line":1073},[278,7247,7087],{"class":284},[278,7249,328],{"class":288},[278,7251,7252],{"class":280,"line":1122},[278,7253,596],{"class":288},[278,7255,7256],{"class":280,"line":1157},[278,7257,335],{"emptyLinePlaceholder":334},[278,7259,7260],{"class":280,"line":1162},[278,7261,7262],{"class":371},"  \u002F\u002F ⚠️ ตอบ 2xx ให้เร็ว (งานหนักไป process แบบ async) ถ้าไม่ตอบ 2xx ระบบจะ retry นานสุด ~24 ชม.\n",[278,7264,7265,7268,7270,7273,7275,7278,7280],{"class":280,"line":1190},[278,7266,7267],{"class":292},"  res",[278,7269,211],{"class":288},[278,7271,7272],{"class":717},"sendStatus",[278,7274,561],{"class":358},[278,7276,7277],{"class":1106},"200",[278,7279,567],{"class":358},[278,7281,328],{"class":288},[278,7283,7284,7286,7288],{"class":280,"line":1214},[278,7285,785],{"class":288},[278,7287,567],{"class":292},[278,7289,328],{"class":288},[278,7291,7292],{"class":280,"line":1230},[278,7293,335],{"emptyLinePlaceholder":334},[278,7295,7296],{"class":280,"line":1246},[278,7297,7298],{"class":371},"\u002F\u002F ตัวอย่าง stub — แทนที่ด้วย logic จริงของคุณ\n",[278,7300,7301,7304,7307,7309,7312,7314,7316,7318,7321,7323,7325,7327],{"class":280,"line":1252},[278,7302,7303],{"class":344},"function",[278,7305,7306],{"class":717}," markOrderPaid",[278,7308,561],{"class":288},[278,7310,7311],{"class":496},"ref",[278,7313,362],{"class":288},[278,7315,365],{"class":348},[278,7317,296],{"class":288},[278,7319,7320],{"class":496}," credited",[278,7322,362],{"class":288},[278,7324,365],{"class":348},[278,7326,567],{"class":288},[278,7328,640],{"class":288},[278,7330,7331,7333,7336,7338,7340,7342,7344,7346],{"class":280,"line":1294},[278,7332,7303],{"class":344},[278,7334,7335],{"class":717}," markOrderExpired",[278,7337,561],{"class":288},[278,7339,7311],{"class":496},[278,7341,362],{"class":288},[278,7343,365],{"class":348},[278,7345,567],{"class":288},[278,7347,640],{"class":288},[278,7349,7350,7352,7355,7357,7359,7361,7363,7365],{"class":280,"line":1333},[278,7351,7303],{"class":344},[278,7353,7354],{"class":717}," markPayoutDone",[278,7356,561],{"class":288},[278,7358,1736],{"class":496},[278,7360,362],{"class":288},[278,7362,365],{"class":348},[278,7364,567],{"class":288},[278,7366,640],{"class":288},[278,7368,7369,7371,7374,7376,7378,7380,7382,7384,7387,7389,7391,7393],{"class":280,"line":1338},[278,7370,7303],{"class":344},[278,7372,7373],{"class":717}," markPayoutFailed",[278,7375,561],{"class":288},[278,7377,1736],{"class":496},[278,7379,362],{"class":288},[278,7381,365],{"class":348},[278,7383,296],{"class":288},[278,7385,7386],{"class":496}," reason",[278,7388,362],{"class":288},[278,7390,365],{"class":348},[278,7392,567],{"class":288},[278,7394,640],{"class":288},[278,7396,7397],{"class":280,"line":1375},[278,7398,335],{"emptyLinePlaceholder":334},[278,7400,7401,7403,7405,7408,7410,7413,7415,7418,7420,7423,7425,7427,7429,7431,7434,7436,7438],{"class":280,"line":1383},[278,7402,6667],{"class":292},[278,7404,211],{"class":288},[278,7406,7407],{"class":717},"listen",[278,7409,561],{"class":292},[278,7411,7412],{"class":1106},"3000",[278,7414,296],{"class":288},[278,7416,7417],{"class":288}," ()",[278,7419,4162],{"class":344},[278,7421,7422],{"class":292}," console",[278,7424,211],{"class":288},[278,7426,5258],{"class":717},[278,7428,561],{"class":292},[278,7430,325],{"class":288},[278,7432,7433],{"class":321},"webhook listener on :3000",[278,7435,325],{"class":288},[278,7437,6911],{"class":292},[278,7439,328],{"class":288},[268,7441,7444],{"className":3078,"code":7442,"filename":7443,"language":3081,"meta":274,"style":274},"\u003C?php\n$secret = getenv('UNKPAY_WEBHOOK_SECRET'); \u002F\u002F show-once จาก Portal\n\n\u002F\u002F ⚠️ อ่าน RAW body — ห้าม json_decode ก่อน verify (ลายเซ็นคำนวณจากไบต์ดิบ)\n$raw = file_get_contents('php:\u002F\u002Finput');\n$sig = $_SERVER['HTTP_X_WEBHOOK_SIGNATURE'] ?? '';\n\n$expected = hash_hmac('sha256', $raw, $secret);\nif (!hash_equals($expected, $sig)) {\n    http_response_code(401);\n    echo 'bad signature';\n    exit;\n}\n\n$evt = json_decode($raw, true);\n\n\u002F\u002F กันประมวลผลซ้ำด้วย event_id (เช่น \"\u003Cid>:deposit.success\") — แนะนำเก็บลง DB\n\u002F\u002F if (already_processed($evt['event_id'])) { http_response_code(200); exit; }\n\nswitch ($evt['event_type']) {\n    case 'deposit.success':\n        \u002F\u002F $evt['deposit_id'], $evt['user_ref'], $evt['credited_amount'] (net), $evt['amount']\n        mark_order_paid($evt['user_ref'], $evt['credited_amount']);\n        break;\n    case 'deposit.expired':\n        mark_order_expired($evt['user_ref']);\n        break;\n    case 'withdrawal.success':\n        mark_payout_done($evt['withdrawal_id']);\n        break;\n    case 'withdrawal.failed':\n    case 'withdrawal.rejected':\n        \u002F\u002F $evt['reason']; เงิน gross จะถูกคืน (มี withdrawal.refunded ตามมา)\n        mark_payout_failed($evt['withdrawal_id'], $evt['reason'] ?? '');\n        break;\n    case 'withdrawal.refunded':\n        \u002F\u002F เงินคืนเข้ากระเป๋าแล้ว\n        break;\n}\n\n\u002F\u002F ⚠️ ตอบ 2xx เร็ว ๆ ไม่งั้นระบบจะ retry นานสุด ~24 ชม.\nhttp_response_code(200);\necho 'ok';\n\n\u002F\u002F ----- stub: แทนที่ด้วย logic จริงของคุณ -----\nfunction mark_order_paid($ref, $credited) {}\nfunction mark_order_expired($ref) {}\nfunction mark_payout_done($id) {}\nfunction mark_payout_failed($id, $reason) {}\n","PHP (webhook.php)",[231,7445,7446,7452,7476,7480,7485,7508,7538,7542,7575,7600,7611,7623,7630,7634,7638,7657,7661,7666,7671,7675,7696,7708,7713,7747,7754,7766,7785,7791,7803,7822,7828,7840,7852,7857,7896,7902,7914,7919,7925,7929,7933,7938,7949,7961,7965,7970,7992,8007,8022],{"__ignoreMap":274},[278,7447,7448,7450],{"class":280,"line":281},[278,7449,3088],{"class":288},[278,7451,3091],{"class":292},[278,7453,7454,7456,7459,7461,7464,7466,7468,7470,7472,7474],{"class":280,"line":331},[278,7455,5801],{"class":288},[278,7457,7458],{"class":292},"secret ",[278,7460,1282],{"class":288},[278,7462,7463],{"class":717}," getenv",[278,7465,561],{"class":288},[278,7467,3373],{"class":288},[278,7469,6631],{"class":321},[278,7471,3373],{"class":288},[278,7473,3386],{"class":288},[278,7475,6637],{"class":371},[278,7477,7478],{"class":280,"line":338},[278,7479,335],{"emptyLinePlaceholder":334},[278,7481,7482],{"class":280,"line":355},[278,7483,7484],{"class":371},"\u002F\u002F ⚠️ อ่าน RAW body — ห้าม json_decode ก่อน verify (ลายเซ็นคำนวณจากไบต์ดิบ)\n",[278,7486,7487,7489,7492,7494,7497,7499,7501,7504,7506],{"class":280,"line":375},[278,7488,5801],{"class":288},[278,7490,7491],{"class":292},"raw ",[278,7493,1282],{"class":288},[278,7495,7496],{"class":717}," file_get_contents",[278,7498,561],{"class":288},[278,7500,3373],{"class":288},[278,7502,7503],{"class":321},"php:\u002F\u002Finput",[278,7505,3373],{"class":288},[278,7507,3210],{"class":288},[278,7509,7510,7512,7514,7516,7518,7521,7523,7525,7528,7530,7532,7534,7536],{"class":280,"line":390},[278,7511,5801],{"class":288},[278,7513,3637],{"class":292},[278,7515,1282],{"class":288},[278,7517,3138],{"class":288},[278,7519,7520],{"class":292},"_SERVER",[278,7522,1269],{"class":288},[278,7524,3373],{"class":288},[278,7526,7527],{"class":321},"HTTP_X_WEBHOOK_SIGNATURE",[278,7529,3373],{"class":288},[278,7531,4148],{"class":288},[278,7533,1525],{"class":288},[278,7535,3587],{"class":288},[278,7537,328],{"class":288},[278,7539,7540],{"class":280,"line":405},[278,7541,335],{"emptyLinePlaceholder":334},[278,7543,7544,7546,7549,7551,7553,7555,7557,7559,7561,7563,7565,7567,7569,7571,7573],{"class":280,"line":411},[278,7545,5801],{"class":288},[278,7547,7548],{"class":292},"expected ",[278,7550,1282],{"class":288},[278,7552,3458],{"class":717},[278,7554,561],{"class":288},[278,7556,3373],{"class":288},[278,7558,724],{"class":321},[278,7560,3373],{"class":288},[278,7562,296],{"class":288},[278,7564,3138],{"class":288},[278,7566,6690],{"class":292},[278,7568,296],{"class":288},[278,7570,3138],{"class":288},[278,7572,243],{"class":292},[278,7574,3210],{"class":288},[278,7576,7577,7580,7583,7586,7588,7590,7592,7594,7596,7598],{"class":280,"line":416},[278,7578,7579],{"class":284},"if",[278,7581,7582],{"class":288}," (!",[278,7584,7585],{"class":717},"hash_equals",[278,7587,3205],{"class":288},[278,7589,6908],{"class":292},[278,7591,296],{"class":288},[278,7593,3138],{"class":288},[278,7595,3717],{"class":292},[278,7597,6911],{"class":288},[278,7599,352],{"class":288},[278,7601,7602,7605,7607,7609],{"class":280,"line":457},[278,7603,7604],{"class":717},"    http_response_code",[278,7606,561],{"class":288},[278,7608,6940],{"class":1106},[278,7610,3210],{"class":288},[278,7612,7613,7615,7617,7619,7621],{"class":280,"line":462},[278,7614,6388],{"class":717},[278,7616,3771],{"class":288},[278,7618,6954],{"class":321},[278,7620,3373],{"class":288},[278,7622,328],{"class":288},[278,7624,7625,7628],{"class":280,"line":481},[278,7626,7627],{"class":284},"    exit",[278,7629,328],{"class":288},[278,7631,7632],{"class":280,"line":490},[278,7633,408],{"class":288},[278,7635,7636],{"class":280,"line":508},[278,7637,335],{"emptyLinePlaceholder":334},[278,7639,7640,7642,7645,7647,7649,7651,7653,7655],{"class":280,"line":521},[278,7641,5801],{"class":288},[278,7643,7644],{"class":292},"evt ",[278,7646,1282],{"class":288},[278,7648,4083],{"class":717},[278,7650,3205],{"class":288},[278,7652,6690],{"class":292},[278,7654,296],{"class":288},[278,7656,4093],{"class":288},[278,7658,7659],{"class":280,"line":533},[278,7660,335],{"emptyLinePlaceholder":334},[278,7662,7663],{"class":280,"line":547},[278,7664,7665],{"class":371},"\u002F\u002F กันประมวลผลซ้ำด้วย event_id (เช่น \"\u003Cid>:deposit.success\") — แนะนำเก็บลง DB\n",[278,7667,7668],{"class":280,"line":555},[278,7669,7670],{"class":371},"\u002F\u002F if (already_processed($evt['event_id'])) { http_response_code(200); exit; }\n",[278,7672,7673],{"class":280,"line":572},[278,7674,335],{"emptyLinePlaceholder":334},[278,7676,7677,7680,7682,7684,7686,7688,7690,7692,7694],{"class":280,"line":593},[278,7678,7679],{"class":284},"switch",[278,7681,3749],{"class":288},[278,7683,7027],{"class":292},[278,7685,1269],{"class":288},[278,7687,3373],{"class":288},[278,7689,7032],{"class":321},[278,7691,3373],{"class":288},[278,7693,4827],{"class":288},[278,7695,352],{"class":288},[278,7697,7698,7700,7702,7704,7706],{"class":280,"line":599},[278,7699,7041],{"class":284},[278,7701,3771],{"class":288},[278,7703,7046],{"class":321},[278,7705,3373],{"class":288},[278,7707,7051],{"class":288},[278,7709,7710],{"class":280,"line":604},[278,7711,7712],{"class":371},"        \u002F\u002F $evt['deposit_id'], $evt['user_ref'], $evt['credited_amount'] (net), $evt['amount']\n",[278,7714,7715,7718,7720,7722,7724,7726,7728,7730,7732,7734,7736,7738,7740,7742,7744],{"class":280,"line":609},[278,7716,7717],{"class":717},"        mark_order_paid",[278,7719,3205],{"class":288},[278,7721,7027],{"class":292},[278,7723,1269],{"class":288},[278,7725,3373],{"class":288},[278,7727,6014],{"class":321},[278,7729,3373],{"class":288},[278,7731,4215],{"class":288},[278,7733,3138],{"class":288},[278,7735,7027],{"class":292},[278,7737,1269],{"class":288},[278,7739,3373],{"class":288},[278,7741,7078],{"class":321},[278,7743,3373],{"class":288},[278,7745,7746],{"class":288},"]);\n",[278,7748,7749,7752],{"class":280,"line":621},[278,7750,7751],{"class":284},"        break",[278,7753,328],{"class":288},[278,7755,7756,7758,7760,7762,7764],{"class":280,"line":643},[278,7757,7041],{"class":284},[278,7759,3771],{"class":288},[278,7761,7098],{"class":321},[278,7763,3373],{"class":288},[278,7765,7051],{"class":288},[278,7767,7768,7771,7773,7775,7777,7779,7781,7783],{"class":280,"line":648},[278,7769,7770],{"class":717},"        mark_order_expired",[278,7772,3205],{"class":288},[278,7774,7027],{"class":292},[278,7776,1269],{"class":288},[278,7778,3373],{"class":288},[278,7780,6014],{"class":321},[278,7782,3373],{"class":288},[278,7784,7746],{"class":288},[278,7786,7787,7789],{"class":280,"line":654},[278,7788,7751],{"class":284},[278,7790,328],{"class":288},[278,7792,7793,7795,7797,7799,7801],{"class":280,"line":706},[278,7794,7041],{"class":284},[278,7796,3771],{"class":288},[278,7798,7134],{"class":321},[278,7800,3373],{"class":288},[278,7802,7051],{"class":288},[278,7804,7805,7808,7810,7812,7814,7816,7818,7820],{"class":280,"line":770},[278,7806,7807],{"class":717},"        mark_payout_done",[278,7809,3205],{"class":288},[278,7811,7027],{"class":292},[278,7813,1269],{"class":288},[278,7815,3373],{"class":288},[278,7817,7152],{"class":321},[278,7819,3373],{"class":288},[278,7821,7746],{"class":288},[278,7823,7824,7826],{"class":280,"line":819},[278,7825,7751],{"class":284},[278,7827,328],{"class":288},[278,7829,7830,7832,7834,7836,7838],{"class":280,"line":884},[278,7831,7041],{"class":284},[278,7833,3771],{"class":288},[278,7835,7171],{"class":321},[278,7837,3373],{"class":288},[278,7839,7051],{"class":288},[278,7841,7842,7844,7846,7848,7850],{"class":280,"line":889},[278,7843,7041],{"class":284},[278,7845,3771],{"class":288},[278,7847,7184],{"class":321},[278,7849,3373],{"class":288},[278,7851,7051],{"class":288},[278,7853,7854],{"class":280,"line":894},[278,7855,7856],{"class":371},"        \u002F\u002F $evt['reason']; เงิน gross จะถูกคืน (มี withdrawal.refunded ตามมา)\n",[278,7858,7859,7862,7864,7866,7868,7870,7872,7874,7876,7878,7880,7882,7884,7886,7888,7890,7892,7894],{"class":280,"line":900},[278,7860,7861],{"class":717},"        mark_payout_failed",[278,7863,3205],{"class":288},[278,7865,7027],{"class":292},[278,7867,1269],{"class":288},[278,7869,3373],{"class":288},[278,7871,7152],{"class":321},[278,7873,3373],{"class":288},[278,7875,4215],{"class":288},[278,7877,3138],{"class":288},[278,7879,7027],{"class":292},[278,7881,1269],{"class":288},[278,7883,3373],{"class":288},[278,7885,7215],{"class":321},[278,7887,3373],{"class":288},[278,7889,4148],{"class":288},[278,7891,1525],{"class":288},[278,7893,3587],{"class":288},[278,7895,3210],{"class":288},[278,7897,7898,7900],{"class":280,"line":920},[278,7899,7751],{"class":284},[278,7901,328],{"class":288},[278,7903,7904,7906,7908,7910,7912],{"class":280,"line":947},[278,7905,7041],{"class":284},[278,7907,3771],{"class":288},[278,7909,7234],{"class":321},[278,7911,3373],{"class":288},[278,7913,7051],{"class":288},[278,7915,7916],{"class":280,"line":962},[278,7917,7918],{"class":371},"        \u002F\u002F เงินคืนเข้ากระเป๋าแล้ว\n",[278,7920,7921,7923],{"class":280,"line":996},[278,7922,7751],{"class":284},[278,7924,328],{"class":288},[278,7926,7927],{"class":280,"line":1014},[278,7928,408],{"class":288},[278,7930,7931],{"class":280,"line":1020},[278,7932,335],{"emptyLinePlaceholder":334},[278,7934,7935],{"class":280,"line":1073},[278,7936,7937],{"class":371},"\u002F\u002F ⚠️ ตอบ 2xx เร็ว ๆ ไม่งั้นระบบจะ retry นานสุด ~24 ชม.\n",[278,7939,7940,7943,7945,7947],{"class":280,"line":1122},[278,7941,7942],{"class":717},"http_response_code",[278,7944,561],{"class":288},[278,7946,7277],{"class":1106},[278,7948,3210],{"class":288},[278,7950,7951,7953,7955,7957,7959],{"class":280,"line":1157},[278,7952,6052],{"class":717},[278,7954,3771],{"class":288},[278,7956,1495],{"class":321},[278,7958,3373],{"class":288},[278,7960,328],{"class":288},[278,7962,7963],{"class":280,"line":1162},[278,7964,335],{"emptyLinePlaceholder":334},[278,7966,7967],{"class":280,"line":1190},[278,7968,7969],{"class":371},"\u002F\u002F ----- stub: แทนที่ด้วย logic จริงของคุณ -----\n",[278,7971,7972,7974,7977,7979,7981,7983,7985,7988,7990],{"class":280,"line":1214},[278,7973,7303],{"class":344},[278,7975,7976],{"class":717}," mark_order_paid",[278,7978,3205],{"class":288},[278,7980,7311],{"class":292},[278,7982,296],{"class":288},[278,7984,3138],{"class":288},[278,7986,7987],{"class":292},"credited",[278,7989,567],{"class":288},[278,7991,640],{"class":288},[278,7993,7994,7996,7999,8001,8003,8005],{"class":280,"line":1230},[278,7995,7303],{"class":344},[278,7997,7998],{"class":717}," mark_order_expired",[278,8000,3205],{"class":288},[278,8002,7311],{"class":292},[278,8004,567],{"class":288},[278,8006,640],{"class":288},[278,8008,8009,8011,8014,8016,8018,8020],{"class":280,"line":1246},[278,8010,7303],{"class":344},[278,8012,8013],{"class":717}," mark_payout_done",[278,8015,3205],{"class":288},[278,8017,1736],{"class":292},[278,8019,567],{"class":288},[278,8021,640],{"class":288},[278,8023,8024,8026,8029,8031,8033,8035,8037,8039,8041],{"class":280,"line":1252},[278,8025,7303],{"class":344},[278,8027,8028],{"class":717}," mark_payout_failed",[278,8030,3205],{"class":288},[278,8032,1736],{"class":292},[278,8034,296],{"class":288},[278,8036,3138],{"class":288},[278,8038,7215],{"class":292},[278,8040,567],{"class":288},[278,8042,640],{"class":288},[257,8044],{"value":8045},"adapt the webhook endpoint path (`\u002Fwebhooks\u002Funknownpay`) and all stub functions to your real system; add storage of `event_id` in your DB for merchant-side idempotency. If you use a framework (Laravel\u002FSlim\u002FNestJS etc.), adapt how you read the raw body — the key point is to verify the raw bytes before parsing JSON",[8047,8048,8049],"style",{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":274,"searchDepth":281,"depth":331,"links":8051},[8052,8053,8054,8055],{"id":215,"depth":331,"text":216},{"id":262,"depth":331,"text":263},{"id":4936,"depth":331,"text":4937},{"id":6542,"depth":331,"text":6543},"Full merchant-side integration samples — automatic HMAC signing, deposit\u002Fwithdrawal\u002Fbalance\u002Fbanks calls, and webhook verification, in Node.js and PHP","md",{},{"icon":187},{"title":184,"description":8056},"mESF_Fi0CJ87qhjWq8M-AfF_Y_tep7LbD8kqH11ClzA",[8063,8065],{"title":179,"path":180,"stem":181,"description":8064,"icon":182,"children":-1},"At-a-glance table of all 11 S2S endpoints — method, path, HMAC auth, and Idempotency-Key requirements",{"title":189,"path":190,"stem":191,"description":8066,"icon":192,"children":-1},"Consolidated deposit and withdrawal status enums, Portal role labels, and the key constants (replay window, idempotency TTL, empty-body SHA-256) in one place",1781891157556]