card.js 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. function getLang(lan) {
  2. const lans = {
  3. zh: {
  4. "银行卡号": "银行卡号",
  5. "有效期": "有效期",
  6. "安全码": "安全码",
  7. "确认": "确认",
  8. },
  9. en: {
  10. "银行卡号": "Card number",
  11. "有效期": "Expiry",
  12. "安全码": "CVC",
  13. "确认": "Confirm",
  14. },
  15. es: {
  16. "银行卡号": "Número de tarjeta",
  17. "有效期": "validez",
  18. "安全码": "El Código de Seguridad",
  19. "确认": "Confirmar",
  20. }
  21. };
  22. if (!lan) return lans.en;
  23. return lans[lan]
  24. }
  25. let paramsOfAirwallex = {};
  26. (function () {
  27. let elementId = document.getElementById('element');
  28. let lan = 'en';
  29. function initAirwallex() {
  30. try {
  31. Airwallex.init({
  32. env: "prod",
  33. origin: window.location.origin,
  34. locale: lan
  35. });
  36. const cardNumber = Airwallex.createElement("cardNumber");
  37. const expiry = Airwallex.createElement("expiry");
  38. const cvc = Airwallex.createElement("cvc");
  39. cardNumber.mount("cardNumber");
  40. expiry.mount("expiry");
  41. cvc.mount("cvc");
  42. sendMessage({ status: 'loading', res: { state: false } })
  43. } catch (error) {
  44. console.error("------ int Airwallex There was an error -------", error);
  45. }
  46. }
  47. function initElement() {
  48. const findItem = getLang(lan);
  49. console.log('---- findItem -----', JSON.stringify(findItem))
  50. let childHtml = `<div class="field-container">
  51. <div>${findItem['银行卡号']}</div>
  52. <div id="cardNumber"></div>
  53. <p id="cardNumber-error" style="color: red;"></p>
  54. </div>
  55. <div class="field-container">
  56. <div>${findItem['有效期']}</div>
  57. <div id="expiry"></div>
  58. <p id="expiry-error" style="color: red;"></p>
  59. </div>
  60. <div class="field-container">
  61. <div>${findItem['安全码']}</div>
  62. <div id="cvc"></div>
  63. <p id="cvc-error" style="color: red;"></p>
  64. </div>
  65. <div id="submit" class="submit">${findItem['确认']}</div>`
  66. elementId.innerHTML = childHtml;
  67. handleEventBind();
  68. }
  69. window.addEventListener('appMessage', function (e) {
  70. console.log("------ appMessage ------", JSON.stringify(e.detail));
  71. const { type, lan: lang, ...payData } = e.detail;
  72. paramsOfAirwallex = payData;
  73. lan = lang;
  74. // sendMessage({ status: 'loading', res: { state: true } })
  75. initElement();
  76. let timer = setTimeout(() => {
  77. initAirwallex();
  78. clearTimeout(timer);
  79. timer = null;
  80. }, 100)
  81. });
  82. })()
  83. function sendMessage(data = {}) {
  84. location.href = `callback?str=${escape(JSON.stringify(data))}`
  85. }
  86. function handleEventBind() {
  87. document.getElementById("submit").addEventListener("click", () => {
  88. sendMessage({ status: 'loading', res: { state: true } })
  89. Airwallex.confirmPaymentIntent({
  90. element: Airwallex.getElement("cardNumber"),
  91. id: paramsOfAirwallex.intent_id,
  92. client_secret: paramsOfAirwallex.client_secret
  93. })
  94. .then((response) => {
  95. sendMessage({ status: 'success', res: response })
  96. })
  97. .catch((response) => {
  98. sendMessage({ status: 'error', res: response })
  99. console.log("---------- submit There was an error ----------", JSON.stringify(response));
  100. })
  101. .finally(() => {
  102. sendMessage({ status: 'loading', res: { state: false } })
  103. });
  104. });
  105. const elementsReady = {
  106. cardNumber: false,
  107. expiry: false,
  108. cvc: false
  109. };
  110. const cardNumberElement = document.getElementById("cardNumber");
  111. const expiryElement = document.getElementById("expiry");
  112. const cvcElement = document.getElementById("cvc");
  113. const domElementArray = [cardNumberElement, expiryElement, cvcElement];
  114. domElementArray.forEach((element) => {
  115. element.addEventListener("onReady", (event) => {
  116. const { type } = event.detail;
  117. if (elementsReady.hasOwnProperty(type)) {
  118. elementsReady[type] = true;
  119. }
  120. if (!Object.values(elementsReady).includes(false)) {
  121. document.getElementById("element").style.display = "block";
  122. }
  123. });
  124. });
  125. const elementsCompleted = {
  126. cardNumber: false,
  127. expiry: false,
  128. cvc: false
  129. };
  130. domElementArray.forEach((element) => {
  131. element.addEventListener("onChange", (event) => {
  132. const { type, complete } = event.detail;
  133. if (elementsCompleted.hasOwnProperty(type)) {
  134. elementsCompleted[type] = complete;
  135. }
  136. const allElementsCompleted = !Object.values(
  137. elementsCompleted
  138. ).includes(false);
  139. document.getElementById("submit").disabled = !allElementsCompleted;
  140. });
  141. });
  142. domElementArray.forEach((element) => {
  143. element.addEventListener("onFocus", (event) => {
  144. const { type } = event.detail;
  145. const element = document.getElementById(type + "-error");
  146. if (element) {
  147. element.innerHTML = "";
  148. }
  149. });
  150. });
  151. domElementArray.forEach((element) => {
  152. element.addEventListener("onBlur", (event) => {
  153. const { error, type } = event.detail;
  154. const element = document.getElementById(type + "-error");
  155. if (element && error) {
  156. element.innerHTML = error.message || JSON.stringify(error);
  157. }
  158. });
  159. });
  160. /* domElementArray.forEach((element) => {
  161. element.addEventListener("onBlur", (event) => {
  162. console.error("There was an error", event.detail.error);
  163. });
  164. }); */
  165. }