{"id":9087,"date":"2025-07-25T13:33:52","date_gmt":"2025-07-25T05:33:52","guid":{"rendered":"https:\/\/www.chainup.com\/?page_id=9087"},"modified":"2026-04-02T11:42:27","modified_gmt":"2026-04-02T03:42:27","slug":"contact","status":"publish","type":"page","link":"https:\/\/custody.chainup.com\/zh\/contact\/","title":{"rendered":"Contact us"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"9087\" class=\"elementor elementor-9087\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-1dcf0cf e-flex e-con-boxed e-con e-parent\" data-id=\"1dcf0cf\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-9598632 elementor-widget elementor-widget-html\" data-id=\"9598632\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<style>\n  .login-ewm__code {\n    position: relative;\n    width: 200px;\n    height: 200px;\n    margin: 0 auto;\n  }\n  .login-ewm__code img {\n    width: 100%;\n    height: 100%;\n    object-fit: contain;\n  }\n  .login-ewm__mask {\n    position: absolute;\n    inset: 0;\n    background: rgba(0, 0, 0, 0.6);\n    display: flex;\n    justify-content: center;\n    align-items: center;\n    border-radius: 4px;\n  }\n  .login-ewm__reload,\n  .login-ewm__success {\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    gap: 8px;\n  }\n  .login-ewm__mask-title {\n    font-size: 14px;\n    color: #fff;\n    max-width: 160px;\n    margin: 0;\n  }\n  .login-ewm__button {\n    padding: 6px 24px;\n    background: #1677ff;\n    color: #fff;\n    border: none;\n    border-radius: 4px;\n    cursor: pointer;\n    font-size: 14px;\n  }\n  .login-ewm__button:hover {\n    background: #4096ff;\n  }\n  .login-ewm__icon {\n    font-size: 28px;\n  }\n  .hidden {\n    display: none;\n  }\n<\/style>\n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/crypto-js\/4.2.0\/crypto-js.min.js\"><\/script>\n<div class=\"login-ewm__code\">\n  <img decoding=\"async\"\n    id=\"qrImage\"\n    src=\"\"\n    alt=\"QR Code\"\n  \/>\n  <div\n    id=\"qrMask\"\n    class=\"login-ewm__mask hidden\"\n  >\n    <!-- \u8fc7\u671f\u906e\u7f69 -->\n    <div\n      id=\"reloadView\"\n      class=\"login-ewm__reload hidden\"\n    >\n      <span class=\"login-ewm__icon\">\n        <svg\n          width=\"36\"\n          height=\"36\"\n          viewBox=\"0 0 36 36\"\n          fill=\"none\"\n          xmlns=\"http:\/\/www.w3.org\/2000\/svg\"\n        >\n          <circle\n            cx=\"18\"\n            cy=\"18\"\n            r=\"18\"\n            fill=\"#FFA338\"\n          \/>\n          <path\n            d=\"M16.2 10.35C16.2 9.35588 17.0059 8.54999 18 8.54999C18.9941 8.54999 19.8 9.35588 19.8 10.35V19.8C19.8 20.7941 18.9941 21.6 18 21.6C17.0059 21.6 16.2 20.7941 16.2 19.8V10.35Z\"\n            fill=\"white\"\n          \/>\n          <path\n            d=\"M16.2 25.2C16.2 24.2059 17.0059 23.4 18 23.4C18.9941 23.4 19.8 24.2059 19.8 25.2C19.8 26.1941 18.9941 27 18 27C17.0059 27 16.2 26.1941 16.2 25.2Z\"\n            fill=\"white\"\n          \/>\n        <\/svg>\n      <\/span>\n      <p class=\"login-ewm__mask-title\">QR Code Expired<\/p>\n      <button\n        class=\"login-ewm__button\"\n        onclick=\"refreshQr()\"\n      >\n        Refresh\n      <\/button>\n    <\/div>\n    <!-- \u626b\u7801\u6210\u529f\u906e\u7f69 -->\n    <div\n      id=\"successView\"\n      class=\"login-ewm__success hidden\"\n    >\n      <span class=\"login-ewm__icon\">\n        <svg\n          width=\"36\"\n          height=\"36\"\n          viewBox=\"0 0 36 36\"\n          fill=\"none\"\n          xmlns=\"http:\/\/www.w3.org\/2000\/svg\"\n        >\n          <circle\n            cx=\"18\"\n            cy=\"18\"\n            r=\"18\"\n            fill=\"#0AD067\"\n          \/>\n          <path\n            fill-rule=\"evenodd\"\n            clip-rule=\"evenodd\"\n            d=\"M16.9187 23.6014C16.3936 23.8963 15.7164 23.8203 15.2696 23.3735L10.2393 18.3432C9.70093 17.8048 9.70093 16.932 10.2393 16.3937C10.7776 15.8553 11.6504 15.8553 12.1888 16.3937L16.2505 20.4555L23.8747 12.8313C24.413 12.293 25.2858 12.293 25.8242 12.8313C26.3625 13.3696 26.3625 14.2425 25.8242 14.7808L17.2464 23.3586C17.1472 23.4578 17.0365 23.5388 16.9187 23.6014Z\"\n            fill=\"white\"\n          \/>\n        <\/svg>\n      <\/span>\n      <p class=\"login-ewm__mask-title\">\n        Scan code successfully, please confirm in APP\n      <\/p>\n    <\/div>\n  <\/div>\n<\/div>\n<script>\n  const LOGIN_IP_AES_KEY = 'JVaitJoNe9et1RJ5';\n  const QR_EXPIRE_MS = 3 * 60 * 1000; \/\/ 3 \u5206\u949f\u8fc7\u671f\n\n  let qrcURL = '';\n  let qrImgValidTime = 0;\n  let checkQrTimerId = null;\n  let checkLoginTimerId = null;\n  let clientIp = '';\n\n  \/\/ ========== DOM \u5143\u7d20 ==========\n  const qrImage = document.getElementById('qrImage');\n  const qrMask = document.getElementById('qrMask');\n  const reloadView = document.getElementById('reloadView');\n  const successView = document.getElementById('successView');\n\n  \/\/ ========== \u5de5\u5177\u51fd\u6570 ==========\n  function showMask() {\n    qrMask.classList.remove('hidden');\n  }\n  function hideMask() {\n    qrMask.classList.add('hidden');\n  }\n  function showReload() {\n    reloadView.classList.remove('hidden');\n    successView.classList.add('hidden');\n    showMask();\n  }\n  function showSuccess() {\n    successView.classList.remove('hidden');\n    reloadView.classList.add('hidden');\n    showMask();\n  }\n  function hideAll() {\n    hideMask();\n    reloadView.classList.add('hidden');\n    successView.classList.add('hidden');\n  }\n\n  \/\/ \u901a\u7528\u8bf7\u6c42\u5c01\u88c5\uff08x-www-form-urlencoded\uff09\n  function request(url, method, data, extraHeaders) {\n    const headers = {\n      'Content-Type': 'application\/x-www-form-urlencoded',\n      Language: 'en_US',\n      'Build-CU': 'web',\n      ...(extraHeaders || {}),\n    };\n    const options = { method, headers };\n    if (method.toUpperCase() === 'POST' && data) {\n      options.body = new URLSearchParams(data).toString();\n    }\n    return fetch(url, options)\n      .then(function (res) {\n        return res.json();\n      })\n      .then(function (json) {\n        if (String(json.code) !== '0') throw json;\n        return json;\n      });\n  }\n\n  \/\/ ========== \u83b7\u53d6\u5ba2\u6237\u7aef IP\uff08\u7ade\u901f\uff09 ==========\n  function fetchClientIp() {\n    var controller = new AbortController();\n    var signal = controller.signal;\n    Promise.any([\n      fetch('https:\/\/api.ipapi.is\/', { signal })\n        .then(function (r) {\n          return r.json();\n        })\n        .then(function (d) {\n          return d.ip;\n        }),\n      fetch('https:\/\/ipinfo.io\/json', { signal })\n        .then(function (r) {\n          return r.json();\n        })\n        .then(function (d) {\n          return d.ip;\n        }),\n      fetch('https:\/\/api.ipify.org\/', { signal }).then(function (r) {\n        return r.text();\n      }),\n    ])\n      .then(function (ip) {\n        clientIp = ip || '';\n      })\n      .catch(function () {});\n  }\n\n  \/\/ ========== \u4e8c\u7ef4\u7801\u8fc7\u671f\u5012\u8ba1\u65f6 ==========\n  function checkQrTime() {\n    clearTimeout(checkQrTimerId);\n    checkQrTimerId = setTimeout(function () {\n      if (Date.now() - qrImgValidTime >= QR_EXPIRE_MS) {\n        \/\/ \u8fc7\u671f\n        showReload();\n        clearTimeout(checkQrTimerId);\n        clearTimeout(checkLoginTimerId);\n      } else {\n        checkQrTime();\n      }\n    }, 1000);\n  }\n\n  \/\/ ========== \u8f6e\u8be2\u767b\u5f55\u72b6\u6001 ==========\n  function checkLoginState() {\n    clearTimeout(checkLoginTimerId);\n    var shouldContinue = true;\n\n    \/\/ AES-ECB \u52a0\u5bc6 IP\n    var encryptedIp = '';\n    if (clientIp) {\n      encryptedIp = CryptoJS.AES.encrypt(\n        clientIp,\n        CryptoJS.enc.Utf8.parse(LOGIN_IP_AES_KEY),\n        { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 },\n      ).toString();\n    }\n\n    request(\n      '\/api\/openPlatform\/login\/loginQrcStatus',\n      'POST',\n      { qrc: qrcURL },\n      { digest: encryptedIp },\n    )\n      .then(function (json) {\n        var status = Number(json.data && json.data.status);\n        switch (status) {\n          case 1: \/\/ \u767b\u5f55\u6210\u529f\n            shouldContinue = false;\n            clearTimeout(checkLoginTimerId);\n            clearTimeout(checkQrTimerId);\n            window.location.href = '\/mpc\/';\n            break;\n          case 2: \/\/ \u5df2\u5931\u6548\n            showReload();\n            break;\n          case 3: \/\/ \u5df2\u626b\u7801\n            showSuccess();\n            break;\n        }\n      })\n      .catch(function () {})\n      .finally(function () {\n        if (shouldContinue) {\n          clearTimeout(checkLoginTimerId);\n          checkLoginTimerId = setTimeout(checkLoginState, 1000);\n        }\n      });\n  }\n\n  \/\/ ========== \u83b7\u53d6\u4e8c\u7ef4\u7801 ==========\n  function getLoginQrc() {\n    request('\/api\/openPlatform\/login\/loginQrc', 'POST')\n      .then(function (json) {\n        qrImage.src = json.data.qrcImg;\n        qrcURL = json.data.qrc;\n        qrImgValidTime = Date.now();\n        hideAll();\n        checkQrTime();\n        checkLoginState();\n      })\n      .catch(function (err) {\n        console.error('\u83b7\u53d6\u4e8c\u7ef4\u7801\u5931\u8d25', err);\n      });\n  }\n\n  \/\/ \u5237\u65b0\u6309\u94ae\n  function refreshQr() {\n    getLoginQrc();\n  }\n\n  \/\/ ========== \u521d\u59cb\u5316 ==========\n  \/\/ \u5148\u5224\u65ad\u662f\u5426\u5df2\u767b\u5f55\n  request('\/api\/openPlatform\/wallet\/system', 'GET')\n    .then(function () {\n      \/\/ code === '0' \u8bf4\u660e\u5df2\u767b\u5f55\uff0c\u76f4\u63a5\u8df3\u8f6c\n      window.location.href = '\/mpc\/';\n    })\n    .catch(function () {\n      \/\/ \u672a\u767b\u5f55\uff0c\u8d70\u4e8c\u7ef4\u7801\u6d41\u7a0b\n      fetchClientIp();\n      getLoginQrc();\n    });\n<\/script>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>QR Code Expired Refresh Scan code successfully, please confirm in APP<\/p>","protected":false},"author":3,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-9087","page","type-page","status-publish","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/custody.chainup.com\/zh\/wp-json\/wp\/v2\/pages\/9087","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/custody.chainup.com\/zh\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/custody.chainup.com\/zh\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/custody.chainup.com\/zh\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/custody.chainup.com\/zh\/wp-json\/wp\/v2\/comments?post=9087"}],"version-history":[{"count":47,"href":"https:\/\/custody.chainup.com\/zh\/wp-json\/wp\/v2\/pages\/9087\/revisions"}],"predecessor-version":[{"id":13310,"href":"https:\/\/custody.chainup.com\/zh\/wp-json\/wp\/v2\/pages\/9087\/revisions\/13310"}],"wp:attachment":[{"href":"https:\/\/custody.chainup.com\/zh\/wp-json\/wp\/v2\/media?parent=9087"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}