[{"data":1,"prerenderedAt":552},["ShallowReactive",2],{"merchant-context":3,"docs-navigation":4,"docs-page-\u002Fdocs\u002Fhosted-web\u002Flogin-location":132,"docs-surround-\u002Fdocs\u002Fhosted-web\u002Flogin-location":549},null,[5],{"title":6,"path":7,"stem":8,"children":9,"page":36},"Docs","\u002Fdocs","docs",[10,37,58,89,110],{"title":11,"icon":12,"path":13,"stem":14,"children":15,"page":36},"入門指南","i-lucide-compass","\u002Fdocs\u002Fgetting-started","docs\u002F1.getting-started",[16,21,26,31],{"title":17,"path":18,"stem":19,"icon":20},"總覽","\u002Fdocs\u002Fgetting-started\u002Foverview","docs\u002F1.getting-started\u002F1.overview","i-lucide-map",{"title":22,"path":23,"stem":24,"icon":25},"快速開始","\u002Fdocs\u002Fgetting-started\u002Fquickstart","docs\u002F1.getting-started\u002F2.quickstart","i-lucide-rocket",{"title":27,"path":28,"stem":29,"icon":30},"架構","\u002Fdocs\u002Fgetting-started\u002Farchitecture","docs\u002F1.getting-started\u002F3.architecture","i-lucide-network",{"title":32,"path":33,"stem":34,"icon":35},"Early Access Core","\u002Fdocs\u002Fgetting-started\u002Fearly-access-core","docs\u002F1.getting-started\u002F4.early-access-core","i-lucide-box",false,{"title":38,"icon":39,"path":40,"stem":41,"children":42,"page":36},"Partner Auth","i-lucide-shield","\u002Fdocs\u002Fpartner-auth","docs\u002F2.partner-auth",[43,48,53],{"title":44,"path":45,"stem":46,"icon":47},"授權流程","\u002Fdocs\u002Fpartner-auth\u002Fauthorization-flow","docs\u002F2.partner-auth\u002F1.authorization-flow","i-lucide-route",{"title":49,"path":50,"stem":51,"icon":52},"Scopes","\u002Fdocs\u002Fpartner-auth\u002Fscopes","docs\u002F2.partner-auth\u002F2.scopes","i-lucide-list-checks",{"title":54,"path":55,"stem":56,"icon":57},"Token 交換","\u002Fdocs\u002Fpartner-auth\u002Ftoken-exchange","docs\u002F2.partner-auth\u002F3.token-exchange","i-lucide-repeat-2",{"title":59,"icon":60,"path":61,"stem":62,"children":63,"page":36},"API 參考","i-lucide-braces","\u002Fdocs\u002Fapi-reference","docs\u002F3.api-reference",[64,69,74,79,84],{"title":65,"path":66,"stem":67,"icon":68},"授權預覽","\u002Fdocs\u002Fapi-reference\u002Fpreview","docs\u002F3.api-reference\u002F0.preview","i-lucide-scan-eye",{"title":70,"path":71,"stem":72,"icon":73},"授權","\u002Fdocs\u002Fapi-reference\u002Fauthorize","docs\u002F3.api-reference\u002F1.authorize","i-lucide-key-square",{"title":75,"path":76,"stem":77,"icon":78},"Token","\u002Fdocs\u002Fapi-reference\u002Ftoken","docs\u002F3.api-reference\u002F2.token","i-lucide-key-round",{"title":80,"path":81,"stem":82,"icon":83},"使用者 profile","\u002Fdocs\u002Fapi-reference\u002Fuser-profile","docs\u002F3.api-reference\u002F3.user-profile","i-lucide-user-round",{"title":85,"path":86,"stem":87,"icon":88},"KYC 申請","\u002Fdocs\u002Fapi-reference\u002Fkyc-application","docs\u002F3.api-reference\u002F4.kyc-application","i-lucide-scan-text",{"title":90,"icon":91,"path":92,"stem":93,"children":94,"page":36},"營運指引","i-lucide-settings","\u002Fdocs\u002Foperations","docs\u002F4.operations",[95,100,105],{"title":96,"path":97,"stem":98,"icon":99},"錯誤處理","\u002Fdocs\u002Foperations\u002Ferrors","docs\u002F4.operations\u002F1.errors","i-lucide-circle-alert",{"title":101,"path":102,"stem":103,"icon":104},"安全","\u002Fdocs\u002Foperations\u002Fsecurity","docs\u002F4.operations\u002F2.security","i-lucide-shield-check",{"title":106,"path":107,"stem":108,"icon":109},"版本管理","\u002Fdocs\u002Foperations\u002Fversioning","docs\u002F4.operations\u002F3.versioning","i-lucide-git-branch",{"title":111,"icon":112,"path":113,"stem":114,"children":115,"page":36},"網站身分驗證","i-lucide-scan-face","\u002Fdocs\u002Fhosted-web","docs\u002F5.hosted-web",[116,120,124,128],{"title":117,"path":118,"stem":119},"網站快速串接","\u002Fdocs\u002Fhosted-web\u002Fquickstart","docs\u002F5.hosted-web\u002F1.quickstart",{"title":121,"path":122,"stem":123},"狀態、回呼與通知","\u002Fdocs\u002Fhosted-web\u002Fresults-and-webhooks","docs\u002F5.hosted-web\u002F2.results-and-webhooks",{"title":125,"path":126,"stem":127},"登入位置紀錄","\u002Fdocs\u002Fhosted-web\u002Flogin-location","docs\u002F5.hosted-web\u002F3.login-location",{"title":129,"path":130,"stem":131},"沙盒與驗收","\u002Fdocs\u002Fhosted-web\u002Fsandbox-and-errors","docs\u002F5.hosted-web\u002F4.sandbox-and-errors",{"id":133,"title":125,"body":134,"description":543,"extension":544,"meta":545,"navigation":546,"path":126,"seo":547,"stem":127,"__hash__":548},"docs\u002Fdocs\u002F5.hosted-web\u002F3.login-location.md",{"type":135,"value":136,"toc":538},"minimark",[137,140,144,148,156,163,181,184,187,415,429,509,525,528,531,534],[138,139,125],"h1",{"id":125},[141,142,143],"p",{},"此功能記錄登入當下的位置，與 App 背景定位分開。它不新增計費、不產生 App 失聯警報、不要求每次拍臉，也不阻擋會員登入或遊戲。位置及精度來自瀏覽器，只作風險參考，不能單憑座標認定本人。",[145,146,147],"h2",{"id":147},"網站責任",[141,149,150,151,155],{},"原始碼交付的 ",[152,153,154],"code",{},"examples\u002Fhosted-js\u002Flogin-location.mjs"," 提供可重用的明示同意後拍點與同源提交 helper；搭配的 README 示範手動重試與本站 CSRF。請將範例納入網站自己的資產建置，不把後端 secret 或會員識別交給 helper。",[141,157,158,159,162],{},"每次成功建立新的登入 session，由網站後端產生 ",[152,160,161],{},"login_event_id","，頁面載入後非同步顯示用途並請求定位。刷新、既有 session 恢復、狀態輪詢與驗證回呼都不是新登入。",[141,164,165,166,169,170,169,173,176,177,180],{},"瀏覽器建議參數為 ",[152,167,168],{},"maximumAge: 0","、",[152,171,172],{},"timeout: 10000",[152,174,175],{},"enableHighAccuracy: true","。拒絕權限時不反覆彈窗，提供手動重試指引。每次明確嘗試產生新的 ",[152,178,179],{},"attempt_id","；相同嘗試重送保留 ID。",[141,182,183],{},"瀏覽器只傳到網站同源後端。後端從目前 session 取得會員，不相信 JS 傳入的 Merchant、環境、user ID 或 Client secret，再以 Server API 傳送。",[145,185,186],{"id":186},"傳送範例",[188,189,194],"pre",{"className":190,"code":191,"language":192,"meta":193,"style":193},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"external_user_ref\": \"example-member-123\",\n  \"login_event_id\": \"server-generated-login-id\",\n  \"attempt_id\": \"attempt-id\",\n  \"location_status\": \"success\",\n  \"consent_version\": \"login-location-v1\",\n  \"observed_at\": \"2026-10-04T02:00:00+08:00\",\n  \"coordinates\": {\n    \"latitude\": 25.033,\n    \"longitude\": 121.5654,\n    \"accuracy_meters\": 50\n  }\n}\n","json","",[152,195,196,205,233,253,273,294,315,336,351,371,388,403,409],{"__ignoreMap":193},[197,198,201],"span",{"class":199,"line":200},"line",1,[197,202,204],{"class":203},"sMK4o","{\n",[197,206,208,211,215,218,221,224,228,230],{"class":199,"line":207},2,[197,209,210],{"class":203},"  \"",[197,212,214],{"class":213},"spNyl","external_user_ref",[197,216,217],{"class":203},"\"",[197,219,220],{"class":203},":",[197,222,223],{"class":203}," \"",[197,225,227],{"class":226},"sfazB","example-member-123",[197,229,217],{"class":203},[197,231,232],{"class":203},",\n",[197,234,236,238,240,242,244,246,249,251],{"class":199,"line":235},3,[197,237,210],{"class":203},[197,239,161],{"class":213},[197,241,217],{"class":203},[197,243,220],{"class":203},[197,245,223],{"class":203},[197,247,248],{"class":226},"server-generated-login-id",[197,250,217],{"class":203},[197,252,232],{"class":203},[197,254,256,258,260,262,264,266,269,271],{"class":199,"line":255},4,[197,257,210],{"class":203},[197,259,179],{"class":213},[197,261,217],{"class":203},[197,263,220],{"class":203},[197,265,223],{"class":203},[197,267,268],{"class":226},"attempt-id",[197,270,217],{"class":203},[197,272,232],{"class":203},[197,274,276,278,281,283,285,287,290,292],{"class":199,"line":275},5,[197,277,210],{"class":203},[197,279,280],{"class":213},"location_status",[197,282,217],{"class":203},[197,284,220],{"class":203},[197,286,223],{"class":203},[197,288,289],{"class":226},"success",[197,291,217],{"class":203},[197,293,232],{"class":203},[197,295,297,299,302,304,306,308,311,313],{"class":199,"line":296},6,[197,298,210],{"class":203},[197,300,301],{"class":213},"consent_version",[197,303,217],{"class":203},[197,305,220],{"class":203},[197,307,223],{"class":203},[197,309,310],{"class":226},"login-location-v1",[197,312,217],{"class":203},[197,314,232],{"class":203},[197,316,318,320,323,325,327,329,332,334],{"class":199,"line":317},7,[197,319,210],{"class":203},[197,321,322],{"class":213},"observed_at",[197,324,217],{"class":203},[197,326,220],{"class":203},[197,328,223],{"class":203},[197,330,331],{"class":226},"2026-10-04T02:00:00+08:00",[197,333,217],{"class":203},[197,335,232],{"class":203},[197,337,339,341,344,346,348],{"class":199,"line":338},8,[197,340,210],{"class":203},[197,342,343],{"class":213},"coordinates",[197,345,217],{"class":203},[197,347,220],{"class":203},[197,349,350],{"class":203}," {\n",[197,352,354,357,361,363,365,369],{"class":199,"line":353},9,[197,355,356],{"class":203},"    \"",[197,358,360],{"class":359},"sBMFI","latitude",[197,362,217],{"class":203},[197,364,220],{"class":203},[197,366,368],{"class":367},"sbssI"," 25.033",[197,370,232],{"class":203},[197,372,374,376,379,381,383,386],{"class":199,"line":373},10,[197,375,356],{"class":203},[197,377,378],{"class":359},"longitude",[197,380,217],{"class":203},[197,382,220],{"class":203},[197,384,385],{"class":367}," 121.5654",[197,387,232],{"class":203},[197,389,391,393,396,398,400],{"class":199,"line":390},11,[197,392,356],{"class":203},[197,394,395],{"class":359},"accuracy_meters",[197,397,217],{"class":203},[197,399,220],{"class":203},[197,401,402],{"class":367}," 50\n",[197,404,406],{"class":199,"line":405},12,[197,407,408],{"class":203},"  }\n",[197,410,412],{"class":199,"line":411},13,[197,413,414],{"class":203},"}\n",[141,416,417,418,421,422,425,426,428],{},"後端以 Basic 認證與 ",[152,419,420],{},"Idempotency-Key"," 呼叫 ",[152,423,424],{},"POST \u002Fapi\u002Fpartner\u002Fv1\u002Flogin-locations","。",[152,427,289],{}," 必須有座標及精度，其餘結果禁止夾帶座標。",[430,431,432,446],"table",{},[433,434,435],"thead",{},[436,437,438,443],"tr",{},[439,440,441],"th",{},[152,442,280],{},[439,444,445],{},"意義",[447,448,449,459,469,479,489,499],"tbody",{},[436,450,451,456],{},[452,453,454],"td",{},[152,455,289],{},[452,457,458],{},"瀏覽器取得位置，含精度",[436,460,461,466],{},[452,462,463],{},[152,464,465],{},"denied",[452,467,468],{},"未同意或瀏覽器拒絕授權",[436,470,471,476],{},[452,472,473],{},[152,474,475],{},"timeout",[452,477,478],{},"取得位置逾時",[436,480,481,486],{},[452,482,483],{},[152,484,485],{},"unavailable",[452,487,488],{},"裝置或定位服務暫時無法提供",[436,490,491,496],{},[452,492,493],{},[152,494,495],{},"unsupported",[452,497,498],{},"瀏覽器不支援介面",[436,500,501,506],{},[452,502,503],{},[152,504,505],{},"not_received",[452,507,508],{},"未執行 JS、關頁或尚未回報；不能假造已取得位置",[141,510,511,512,514,515,517,518,520,521,524],{},"除 ",[152,513,505],{}," 以外，",[152,516,301],{}," 與 ",[152,519,322],{}," 必填。伺服器另外保存 ",[152,522,523],{},"received_at","。未完成 KYC 也可記錄，無須建立假的平台帳號。",[145,526,527],{"id":527},"留存與重送",[141,529,530],{},"eKYC 以伺服器接收時間保存新座標 31 天，之後清除座標，保留不含座標的事件摘要。網址、一般日誌及 webhook 都不得包含座標。",[141,532,533],{},"網站可使用短期 outbox 非同步補送；成功後清除暫存座標，失敗最多保留 24 小時。重送沿用相同嘗試 ID、Idempotency-Key 與內容；新位置或手動重試是新嘗試，不覆寫原觀測。定位傳輸失敗不影響原登入成功。",[535,536,537],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}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":193,"searchDepth":207,"depth":207,"links":539},[540,541,542],{"id":147,"depth":207,"text":147},{"id":186,"depth":207,"text":186},{"id":527,"depth":207,"text":527},"在成功登入後經同意取得一次位置，經網站後端傳送，並處理拒絕、逾時及重送。","md",{},true,{"title":125,"description":543},"wPxQ00aQBHq2MWUFNjUaPr4m14Yp0e9ZcB2wBy39MQI",[550,551],{"title":121,"path":122,"stem":123,"children":-1},{"title":129,"path":130,"stem":131,"children":-1},1793286051051]