Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 
 
 
 

235 строки
7.0 KiB

  1. /**
  2. * Copyright © Magento, Inc. All rights reserved.
  3. * See COPYING.txt for license details.
  4. */
  5. /* global FORM_KEY */
  6. /* @api */
  7. define([
  8. 'jquery',
  9. 'mage/template',
  10. 'Magento_Ui/js/modal/alert',
  11. 'Magento_Payment/js/model/credit-card-validation/validator'
  12. ], function ($, mageTemplate, alert) {
  13. 'use strict';
  14. $.widget('mage.transparent', {
  15. options: {
  16. editFormSelector: '#edit_form',
  17. hiddenFormTmpl:
  18. '<form target="<%= data.target %>" action="<%= data.action %>"' +
  19. 'method="POST" hidden' +
  20. 'enctype="application/x-www-form-urlencoded" class="no-display">' +
  21. '<% _.each(data.inputs, function(val, key){ %>' +
  22. '<input value="<%= val %>" name="<%= key %>" type="hidden">' +
  23. '<% }); %>' +
  24. '</form>',
  25. cgiUrl: null,
  26. orderSaveUrl: null,
  27. controller: null,
  28. gateway: null,
  29. dateDelim: null,
  30. cardFieldsMap: null,
  31. expireYearLength: 2
  32. },
  33. /**
  34. * @private
  35. */
  36. _create: function () {
  37. this.hiddenFormTmpl = mageTemplate(this.options.hiddenFormTmpl);
  38. $(this.options.editFormSelector).on('changePaymentMethod', this._setPlaceOrderHandler.bind(this));
  39. $(this.options.editFormSelector).trigger('changePaymentMethod', [
  40. $(this.options.editFormSelector).find(':radio[name="payment[method]"]:checked').val()
  41. ]);
  42. },
  43. /**
  44. * Handler for form submit.
  45. *
  46. * @param {Object} event
  47. * @param {String} method
  48. */
  49. _setPlaceOrderHandler: function (event, method) {
  50. var $editForm = $(this.options.editFormSelector);
  51. $editForm.off('beforeSubmitOrder.' + this.options.gateway);
  52. if (method === this.options.gateway) {
  53. $editForm.on('beforeSubmitOrder.' + this.options.gateway, this._placeOrderHandler.bind(this));
  54. }
  55. },
  56. /**
  57. * Handler for form submit to call gateway for credit card validation.
  58. *
  59. * @param {Event} event
  60. * @return {Boolean}
  61. * @private
  62. */
  63. _placeOrderHandler: function (event) {
  64. if ($(this.options.editFormSelector).valid()) {
  65. this._orderSave();
  66. } else {
  67. $('body').trigger('processStop');
  68. }
  69. event.stopImmediatePropagation();
  70. return false;
  71. },
  72. /**
  73. * Handler for Place Order button to call gateway for credit card validation.
  74. * Save order and generate post data for gateway call.
  75. *
  76. * @private
  77. */
  78. _orderSave: function () {
  79. var postData = {
  80. 'form_key': FORM_KEY,
  81. 'cc_type': this.ccType()
  82. };
  83. $.ajax({
  84. url: this.options.orderSaveUrl,
  85. type: 'post',
  86. context: this,
  87. data: postData,
  88. dataType: 'json',
  89. /**
  90. * Success callback
  91. * @param {Object} response
  92. */
  93. success: function (response) {
  94. if (response.success && response[this.options.gateway]) {
  95. this._postPaymentToGateway(response);
  96. } else {
  97. this._processErrors(response);
  98. }
  99. },
  100. /** @inheritdoc */
  101. complete: function () {
  102. $('body').trigger('processStop');
  103. }
  104. });
  105. },
  106. /**
  107. * Post data to gateway for credit card validation.
  108. *
  109. * @param {Object} response
  110. * @private
  111. */
  112. _postPaymentToGateway: function (response) {
  113. var $iframeSelector = $('[data-container="' + this.options.gateway + '-transparent-iframe"]'),
  114. data,
  115. tmpl,
  116. iframe;
  117. data = this._preparePaymentData(response);
  118. tmpl = this.hiddenFormTmpl({
  119. data: {
  120. target: $iframeSelector.attr('name'),
  121. action: this.options.cgiUrl,
  122. inputs: data
  123. }
  124. });
  125. iframe = $iframeSelector
  126. .on('submit', function (event) {
  127. event.stopPropagation();
  128. });
  129. $(tmpl).appendTo(iframe).trigger('submit');
  130. iframe.html('');
  131. },
  132. /**
  133. * @returns {String}
  134. */
  135. ccType: function () {
  136. return this.element.find(
  137. '[data-container="' + this.options.gateway + '-cc-type"]'
  138. ).val();
  139. },
  140. /**
  141. * Add credit card fields to post data for gateway.
  142. *
  143. * @param {Object} response
  144. * @private
  145. */
  146. _preparePaymentData: function (response) {
  147. var ccfields,
  148. data,
  149. preparedata;
  150. data = response[this.options.gateway].fields;
  151. ccfields = this.options.cardFieldsMap;
  152. if (this.element.find('[data-container="' + this.options.gateway + '-cc-cvv"]').length) {
  153. data[ccfields.cccvv] = this.element.find(
  154. '[data-container="' + this.options.gateway + '-cc-cvv"]'
  155. ).val();
  156. }
  157. preparedata = this._prepareExpDate();
  158. data[ccfields.ccexpdate] = preparedata.month + this.options.dateDelim + preparedata.year;
  159. data[ccfields.ccnum] = this.element.find(
  160. '[data-container="' + this.options.gateway + '-cc-number"]'
  161. ).val();
  162. return data;
  163. },
  164. /**
  165. * Grab Month and Year into one
  166. * @returns {Object}
  167. * @private
  168. */
  169. _prepareExpDate: function () {
  170. var year = this.element.find('[data-container="' + this.options.gateway + '-cc-year"]').val(),
  171. month = parseInt(
  172. this.element.find('[data-container="' + this.options.gateway + '-cc-month"]').val(), 10
  173. );
  174. if (year.length > this.options.expireYearLength) {
  175. year = year.substring(year.length - this.options.expireYearLength);
  176. }
  177. if (month < 10) {
  178. month = '0' + month;
  179. }
  180. return {
  181. month: month, year: year
  182. };
  183. },
  184. /**
  185. * Processing errors
  186. *
  187. * @param {Object} response
  188. * @private
  189. */
  190. _processErrors: function (response) {
  191. var msg = response['error_messages'];
  192. if (typeof msg === 'object') {
  193. alert({
  194. content: msg.join('\n')
  195. });
  196. }
  197. if (msg) {
  198. alert({
  199. content: msg
  200. });
  201. }
  202. }
  203. });
  204. return $.mage.transparent;
  205. });