onchainpay.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438
  1. function safeDecrypt(encryptedData) {
  2. try {
  3. // 检查数据是否为空或无效
  4. if (!encryptedData || encryptedData === 'undefined' || encryptedData === 'null') {
  5. console.warn('Empty or invalid encrypted data provided');
  6. return '';
  7. }
  8. // 尝试解密
  9. const decrypted = CryptToJS.Decrypt(encryptedData);
  10. return decrypted;
  11. } catch (error) {
  12. console.error('Decryption failed:', error.message);
  13. // 返回空字符串而不是抛出错误
  14. return '';
  15. }
  16. }
  17. function setLang(that) {
  18. var jsSrc = (navigator.language || navigator.browserLanguage);
  19. // jsSrc = 'ko-IN'
  20. if (jsSrc.indexOf('zh-C') >= 0) {
  21. that.language = 'cn'
  22. that.lang = content['cn'];
  23. } else if (jsSrc.indexOf('es') >= 0) {
  24. that.language = 'es'
  25. that.lang = content['es'];
  26. } else if (jsSrc.indexOf('zh-') >= 0) {
  27. that.language = 'zhHant'
  28. that.lang = content['zhHant'];
  29. } else if (jsSrc.indexOf('ar') >= 0) {
  30. that.language = 'ar'
  31. that.lang = content['ar'];
  32. } else if (jsSrc.indexOf('de') >= 0) {
  33. that.language = 'de'
  34. that.lang = content['de'];
  35. } else if (jsSrc.indexOf('id') >= 0) {
  36. that.language = 'id'
  37. that.lang = content['id'];
  38. } else if (jsSrc.indexOf('ko') >= 0 && jsSrc.indexOf('kok') == -1) {
  39. that.language = 'ko'
  40. that.lang = content['ko'];
  41. } else if (jsSrc.indexOf('ms') >= 0) {
  42. that.language = 'ms'
  43. that.lang = content['ms'];
  44. } else if (jsSrc.indexOf('th') >= 0) {
  45. that.language = 'th'
  46. that.lang = content['th'];
  47. } else if (jsSrc.indexOf('vi') >= 0) {
  48. that.language = 'vn'
  49. that.lang = content['vn'];
  50. } else if (jsSrc.indexOf('fa') >= 0) {
  51. that.language = 'fa'
  52. that.lang = content['fa'];
  53. } else if (jsSrc.indexOf('pt') >= 0) {
  54. that.language = 'pt'
  55. that.lang = content['pt'];
  56. } else if (jsSrc.indexOf('tr') >= 0) {
  57. that.language = 'tr'
  58. that.lang = content['tr'];
  59. } else {
  60. that.language = 'en'
  61. that.lang = content['en'];
  62. }
  63. sessionStorage.setItem("lang", that.language);
  64. }
  65. function parseParams(str) {
  66. const params = new URLSearchParams(str);
  67. return {
  68. addresses: params.get('addresses'),
  69. successUrl: params.get('successUrl'),
  70. amount: params.get('amount'),
  71. blockchainEnName: params.get('blockchainEnName'),
  72. blockchainName: params.get('blockchainName'),
  73. currency: params.get('currency')
  74. };
  75. }
  76. var content = {
  77. cn: {
  78. item1: "如果你没有任何",
  79. item2: ", 可在",
  80. item3: "得到",
  81. item4: "送出",
  82. item5: " (ㄧ次付款)到提供的地址!",
  83. item6: "如果你送出任何其他金额,系统无论如何都会接受!",
  84. item7: "地址已被复制",
  85. item8: "复制",
  86. item9: "已支付",
  87. item10: "取消",
  88. item11: "总计",
  89. item12: "支付方式:",
  90. item13: "扫码或者点击复制按钮,复制地址进行付款!",
  91. item14: "请务必核对收款地址与金额,转账不可撤销",
  92. item15: "转账完成后,通常需要1–5分钟 网络确认",
  93. item16: "在网络拥堵时,确认时间可能延长,请耐心等待",
  94. item17: "若长时间未到账,请保存 交易哈希(TxHash) 并联系客服",
  95. item18: "交易确认后,系统将自动更新订单状态",
  96. item19: "温馨提示:",
  97. },
  98. zhHant: {
  99. item1: "如果你沒有任何",
  100. item2: ", 可在",
  101. item3: "得到",
  102. item4: "送出",
  103. item5: " (ㄧ次付款)到下列提供的地址!",
  104. item6: "如果你送出任何其他金額,系統無論如何都會接受!",
  105. item7: "地址已複製",
  106. item8: "複製",
  107. item9: "已支付",
  108. item10: "取消",
  109. item11: "总计",
  110. },
  111. en: {
  112. item1: "If you don't have any",
  113. item2: ", at",
  114. item3: "you can get",
  115. item4: "sent out",
  116. item5: "(One payment) to the provided address!",
  117. item6: "If you send any other amount, the system will accept it anyway!",
  118. item7: "Address copied",
  119. item8: "Copy",
  120. item9: "Paid",
  121. item10: "Cancel",
  122. item11: "Total",
  123. item12: "Pay with:",
  124. item13: "Scan the code or click the copy button to copy the address for payment!",
  125. item14: "Please carefully verify the recipient address and amount. Blockchain transactions are irreversible.",
  126. item15: "After the transfer is completed, network confirmation usually takes 1–5 minutes.",
  127. item16: "During periods of network congestion, confirmation times may be longer. Please wait patiently.",
  128. item17: "If the funds are not credited for a long time, please save the transaction hash (TxHash) and contact customer support.",
  129. item18: "Once the transaction is confirmed, the system will automatically update the order status.",
  130. item19: "Friendly Reminder:",
  131. },
  132. vn: {
  133. item1: "Nếu bạn không có bất kỳ",
  134. item2: ", bạn có thể nhận được",
  135. item3: "Nhận",
  136. item4: "Gửi",
  137. item5: " (Thanh toán một lần) đến địa chỉ được cung cấp dưới đây!",
  138. item6: "Nếu bạn gửi bất kỳ số tiền khác, hệ thống sẽ chấp nhận mà không cần xác nhận!",
  139. item7: "Địa chỉ đã được sao chép",
  140. item8: "Sao chép",
  141. item9: "Đã thanh toán",
  142. item10: "Hủy",
  143. item11: "Tổng cộng",
  144. },
  145. de: {
  146. item1: "Wenn du keine hast",
  147. item2: "haben, können Sie",
  148. item3: "Erhalten",
  149. item4: "Senden",
  150. item5: " (Einmalzahlung) an die unten angegebene Adresse!",
  151. item6: "Wenn Sie einen anderen Betrag senden, akzeptiert das System dies ohne Bestätigung!",
  152. item7: "Adresse wurde kopiert",
  153. item8: "Kopieren",
  154. item9: "Bezahlt",
  155. item10: "Abbrechen",
  156. item11: "Insgesamt",
  157. },
  158. es: {
  159. item1: "Si no tienes ninguno",
  160. item2: ", puedes obtener",
  161. item3: "Recibir",
  162. item4: "Enviar",
  163. item5: " (Pago único) a la dirección proporcionada a continuación!",
  164. item6: "Si envías cualquier otra cantidad, el sistema la aceptará sin necesidad de confirmación!",
  165. item7: "La dirección se ha copiado",
  166. item8: "Copiar",
  167. item9: "Pagado",
  168. item10: "Cancelar",
  169. item11: "Total",
  170. },
  171. id: {
  172. item1: "Jika Anda tidak memiliki",
  173. item2: ", Anda dapat mendapatkan",
  174. item3: "Dapatkan",
  175. item4: "Kirim",
  176. item5: " (Pembayaran satu kali) ke alamat yang diberikan di bawah ini!",
  177. item6: "Jika Anda mengirim jumlah lain, sistem akan menerimanya tanpa konfirmasi!",
  178. item7: "Alamat telah disalin",
  179. item8: "Salin",
  180. item9: "Dibayar",
  181. item10: "Batal",
  182. item11: "Total",
  183. },
  184. ms: {
  185. item1: "Jika anda tidak mempunyai",
  186. item2: ", anda boleh mendapat",
  187. item3: "Dapat",
  188. item4: "Hantar",
  189. item5: " (Pembayaran satu kali) ke alamat yang diberikan di bawah!",
  190. item6: "Jika anda menghantar jumlah lain, sistem akan menerima tanpa pengesahan!",
  191. item7: "Alamat telah disalin",
  192. item8: "Salin",
  193. item9: "Dibayar",
  194. item10: "Batal",
  195. item11: "Total",
  196. },
  197. th: {
  198. item1: "ถ้าคุณไม่มี",
  199. item2: ", คุณสามารถได้รับ",
  200. item3: "ได้รับ",
  201. item4: "ส่ง",
  202. item5: " (การชำระเงินครั้งเดียว) ที่ที่ระบุด้านล่างนี้!",
  203. item6: "หากคุณส่งจำนวนเงินอื่นๆ ระบบก็จะยอมรับโดยไม่ต้องยืนยัน!",
  204. item7: "ที่อยู่ถูกคัดลอกแล้ว",
  205. item8: "คัดลอก",
  206. item9: "จ่ายแล้ว",
  207. item10: "ยกเลิก",
  208. item11: "ทั้งหมด",
  209. },
  210. ar: {
  211. item1: " لم يكن لديك أي",
  212. item2: "، يمكنك الحصول على",
  213. item3: "احصل على",
  214. item4: "إرسال",
  215. item5: " (الدفع مرة واحدة) إلى العنوان المقدم أدناه!",
  216. item6: "إذا قمت بإرسال أي مبلغ آخر، ستقبل النظام دون الحاجة إلى تأكيد!",
  217. item7: "تم نسخ العنوان",
  218. item8: "نسخ",
  219. item9: "تم الدفع",
  220. item10: "إلغاء",
  221. item11: "مجموع",
  222. },
  223. ko: {
  224. item1: "당신이 없으면",
  225. item2: ", 당신은 받을 수 있습니다",
  226. item3: "받기",
  227. item4: "보내기",
  228. item5: " (일시불) 아래 제공된 주소로!",
  229. item6: "다른 금액을 보내도 시스템이 확인없이 받습니다!",
  230. item7: "주소가 복사되었습니다",
  231. item8: "복사",
  232. item9: "지불 완료",
  233. item10: "취소",
  234. item11: "합계",
  235. },
  236. pt: {
  237. item1: "Se você não tem nenhum",
  238. item2: ", pode obter",
  239. item3: "Obter",
  240. item4: "Enviar",
  241. item5: " (Pagamento único) para o endereço fornecido abaixo!",
  242. item6: "Se enviar qualquer outro montante, o sistema aceitará sem confirmação!",
  243. item7: "O endereço foi copiado",
  244. item8: "Copiar",
  245. item9: "Pago",
  246. item10: "Cancelar",
  247. item11: "Total",
  248. },
  249. fa: {
  250. item1: "ااگر هیچ ندارید",
  251. item2: "ندارید، می‌توانید",
  252. item3: "دریافت",
  253. item4: "ارسال",
  254. item5: " (پرداخت یکباره) به آدرس زیر!",
  255. item6: "اگر مقدار دیگری ارسال کنید، سیستم بدون تایید آن را قبول می‌کند!",
  256. item7: "آدرس کپی شده است",
  257. item8: "کپی",
  258. item9: "پرداخت شده",
  259. item10: "لغو",
  260. item11: "جمع",
  261. },
  262. tr: {
  263. item1: "Eğer hiç yoksa",
  264. item2: ", xxx'te",
  265. item3: "alabilirsiniz",
  266. item4: "gönderebilirsiniz",
  267. item5: " (tek seferlik ödeme) aşağıdaki adrese!",
  268. item6: "Başka bir miktar gönderirseniz, sistem yine de kabul eder!",
  269. item7: "Adres kopyalandı",
  270. item8: "Kopyala",
  271. item9: "Ödendi",
  272. item10: "İptal",
  273. item11: "Toplam",
  274. },
  275. };
  276. let config = {
  277. Pattern: {
  278. Password:
  279. /^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?!.*([~!@&%$^\\(\\)#_]).*\\1.*\\1.*\\1)[A-Za-z0-9~!@&%$^\\(\\)#_]{8,16}$/,
  280. },
  281. };
  282. let vm = new Vue({
  283. el: "#onchainpay",
  284. data() {
  285. return {
  286. imgUrl: "",
  287. ho: "",
  288. //多语言
  289. langList: {
  290. en: "ENGLISH",
  291. cn: "中文简体",
  292. zhHant: "中文繁體",
  293. vn: "Tiếng Việt",
  294. de: "Deutsch",
  295. es: "Español",
  296. id: "Indonesian",
  297. ms: "Melayu",
  298. th: "ภาษาไทย",
  299. ar: "العربية",
  300. ko: "한국어",
  301. pt: "Português",
  302. fa: "زبان پارسی",
  303. tr: "Türkçe",
  304. },
  305. language: "cn",
  306. lang: {},
  307. Host04: '',
  308. addresses: "",
  309. successUrl: "",
  310. amount: "",
  311. currency: "",
  312. isShow: false,
  313. };
  314. },
  315. computed: {
  316. // AccessToken(){
  317. // return{
  318. // 'Access-Token': window.location.search.split('?token=')[1]
  319. // }
  320. // }
  321. shortAddress() {
  322. const addr = this.addresses || '';
  323. if (addr.length > 16) {
  324. return addr.slice(0, 8) + '...' + addr.slice(-8);
  325. }
  326. return addr;
  327. },
  328. name() {
  329. return this.language == "en" ? this.blockchainEnName : this.blockchainName;
  330. },
  331. },
  332. methods: {
  333. // 语言切换函数
  334. chooseLang(key) {
  335. this.lang = content[key];
  336. this.language = key;
  337. sessionStorage.setItem("lang", this.language);
  338. },
  339. // 复制分享链接
  340. CopyShareLink() {
  341. // 优先使用现代API
  342. if (navigator.clipboard) {
  343. navigator.clipboard.writeText(this.addresses).then(() => {
  344. this.$message.success(this.lang.item7 || '地址已复制');
  345. }).catch(() => {
  346. this.$message.error('复制失败');
  347. });
  348. } else {
  349. // 兼容旧浏览器
  350. const input = document.createElement('input');
  351. input.value = this.addresses;
  352. document.body.appendChild(input);
  353. input.select();
  354. try {
  355. document.execCommand('copy');
  356. this.$message.success(this.lang.item7 || '地址已复制');
  357. } catch (e) {
  358. this.$message.error('复制失败');
  359. }
  360. document.body.removeChild(input);
  361. }
  362. },
  363. //成功跳转页面
  364. Pay() {
  365. window.location.href = this.Host04 + this.successUrl;
  366. },
  367. //取消关闭页面
  368. Cancle() {
  369. if (navigator.userAgent.indexOf("MSIE") > 0) {
  370. // close IE
  371. if (navigator.userAgent.indexOf("MSIE 6.0") > 0) {
  372. window.opener = null;
  373. window.close();
  374. } else {
  375. window.open("", "_top", "");
  376. window.top.close();
  377. }
  378. } else {
  379. // close chrome;It is effective when it is only one.
  380. window.opener = null;
  381. window.open("", "_self", "");
  382. window.close();
  383. }
  384. },
  385. },
  386. mounted() {
  387. let ht = window.location.protocol;
  388. let ho = window.location.host.split('.')[1];
  389. this.Host04 = ht + "//pay." + ho + ".com"
  390. try {
  391. const searchParams = new URLSearchParams(window.location.search);
  392. let params = searchParams.get('params');
  393. this.isShow = false
  394. if (params) {
  395. const str = parseParams(safeDecrypt(params));
  396. this.addresses = str.addresses
  397. this.successUrl = str.successUrl
  398. // 去除末尾多余的0和小数点
  399. if (str.amount) {
  400. let amt = str.amount;
  401. if (typeof amt === 'string') {
  402. amt = amt.replace(/(\.\d*?[1-9])0+$/, '$1').replace(/\.0+$/, '').replace(/\.$/, '');
  403. }
  404. this.amount = amt;
  405. } else {
  406. this.amount = str.amount;
  407. }
  408. this.currency = str.currency
  409. this.blockchainEnName = str.blockchainEnName
  410. this.blockchainName = str.blockchainName
  411. this.isShow = true;
  412. this.$nextTick(() => {
  413. if (sessionStorage.getItem("lang")) {
  414. this.language = sessionStorage.getItem("lang");
  415. this.lang = content[this.language];
  416. } else {
  417. if (!this.lang?.item1) {
  418. setLang(this)
  419. }
  420. }
  421. jQuery('#qrcode').qrcode({ width: 200, height: 200, correctLevel: 0, text: this.addresses });
  422. });
  423. } else {
  424. this.isShow = false
  425. }
  426. } catch (error) {
  427. console.error('解析URL参数时出错:', error);
  428. }
  429. },
  430. });