1var PayPalAPI = (function () { 2 var paypal_data = []; 3 var paypal_script = []; 4 var paypal_sdk = []; 5 var paypal_callback; 6 7 var showPayPalAlert = function(data) { 8 $('.alert-dismissible').remove(); 9 10 if (data['error'] && data['error']['warning']) { 11 if ($('#paypal_form').length) { 12 $('#paypal_form').prepend('<div class="alert alert-danger alert-dismissible"><i class="fa fa-exclamation-circle"></i> ' + data['error']['warning'] + ' <button type="button" class="close" data-dismiss="alert">×</button></div>'); 13 } else { 14 $('#content').parent().before('<div class="alert alert-danger alert-dismissible"><i class="fa fa-exclamation-circle"></i> ' + data['error']['warning'] + ' <button type="button" class="close" data-dismiss="alert">×</button></div>'); 15 16 $('html, body').animate({scrollTop: 0}, 'slow'); 17 } 18 } 19 }; 20 21 var getQueryParams = function(url) { 22 const param_arr = url.slice(url.indexOf('?') + 1).split('&'); 23 const params = {}; 24 25 param_arr.map(param => { 26 const [key, val] = param.split('='); 27 params[key] = decodeURIComponent(val); 28 }) 29 30 return params; 31 }; 32 33 var updatePayPalData = function() { 34 var params = []; 35 var script_file = document.getElementsByTagName('script'); 36 37 for (var i = 0; i < script_file.length; i++) { 38 if (script_file[i].hasAttribute('src') && (script_file[i].getAttribute('src').indexOf('paypal.js') !== -1)) { 39 params = getQueryParams(script_file[i].getAttribute('src')); 40 41 break; 42 } 43 } 44 45 paypal_data = params; 46 47 if (paypal_data['page_code'] == 'product') { 48 paypal_data['product'] = $('#product input[type=\'text\'], #product input[type=\'hidden\'], #product input[type=\'radio\']:checked, #product input[type=\'checkbox\']:checked, #product select, #product textarea').serialize(); 49 } 50 51 $.ajax({ 52 method: 'post', 53 url: 'index.php?route=extension/payment/paypal/getData', 54 data: paypal_data, 55 dataType: 'json', 56 async: false, 57 success: function(json) { 58 paypal_data = json; 59 60 showPayPalAlert(json); 61 }, 62 error: function(xhr, ajaxOptions, thrownError) { 63 console.log(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText); 64 } 65 }); 66 }; 67 68 var readyPayPalSDK = function() { 69 if (typeof PayPalSDK === 'undefined') { 70 setTimeout(readyPayPalSDK, 100); 71 } else { 72 paypal_sdk[paypal_script.length - 1] = PayPalSDK; 73 74 initPayPalSDK(); 75 } 76 }; 77 78 var loadPayPalSDK = function() { 79 var html = ''; 80 81 if (paypal_data['components'].includes('buttons')) { 82 if (!$('#paypal_button').length) { 83 if ($(paypal_data['button_insert_tag']).length) { 84 html = '<div id="paypal_button" class="paypal-button clearfix"><div id="paypal_button_container" class="paypal-button-container paypal-spinner"></div></div>'; 85 86 eval("$('" + paypal_data['button_insert_tag'] + "')." + paypal_data['button_insert_type'] + "(html)"); 87 } 88 } 89 } 90 91 if (paypal_data['components'].includes('googlepay')) { 92 if (!$('#googlepay_button').length) { 93 if ($(paypal_data['googlepay_button_insert_tag']).length) { 94 html = '<div id="googlepay_button" class="googlepay-button clearfix"><div id="googlepay_button_container" class="googlepay-button-container paypal-spinner"></div></div>'; 95 96 eval("$('" + paypal_data['googlepay_button_insert_tag'] + "')." + paypal_data['googlepay_button_insert_type'] + "(html)"); 97 } 98 } 99 } 100 101 if (paypal_data['components'].includes('applepay')) { 102 if (!$('#applepay_button').length) { 103 if ($(paypal_data['applepay_button_insert_tag']).length) { 104 html = '<div id="applepay_button" class="applepay-button clearfix"><div id="applepay_button_container" class="applepay-button-container paypal-spinner"></div></div>'; 105 106 eval("$('" + paypal_data['applepay_button_insert_tag'] + "')." + paypal_data['applepay_button_insert_type'] + "(html)"); 107 } 108 } 109 } 110 111 if (paypal_data['components'].includes('messages')) { 112 if (!$('#paypal_message').length) { 113 if ($(paypal_data['message_insert_tag']).length) { 114 html = '<div id="paypal_message" class="paypal-message"><div id="paypal_message_container" class="paypal-message-container paypal-spinner"></div></div>'; 115 116 eval("$('" + paypal_data['message_insert_tag'] + "')." + paypal_data['message_insert_type'] + "(html)"); 117 } 118 } 119 } 120 121 var src_data = {}; 122 123 src_data['components'] = paypal_data['components'].join(','); 124 src_data['client-id'] = paypal_data['client_id']; 125 src_data['merchant-id'] = paypal_data['merchant_id']; 126 src_data['currency'] = paypal_data['currency_code']; 127 src_data['intent'] = paypal_data['transaction_method']; 128 129 if (paypal_data['button_enable_funding'] && paypal_data['button_enable_funding'].length) { 130 src_data['enable-funding'] = paypal_data['button_enable_funding'].join(','); 131 } 132 133 if (paypal_data['button_disable_funding'] && paypal_data['button_disable_funding'].length) { 134 src_data['disable-funding'] = paypal_data['button_disable_funding'].join(','); 135 } 136 137 var src = 'https://www.paypal.com/sdk/js?' + $.param(src_data);
138 var script_count = paypal_script.length; 139 var script_load_status = 0; 140 141 for (var i = 0; i < script_count; i++) { 142 if (paypal_script[i].src == src) { 143 script_load_status = 1; 144 145 break; 146 } 147 } 148 149 if (!script_load_status) { 150 if (typeof PayPalSDK !== 'undefined') { 151 delete PayPalSDK; 152 } 153 154 paypal_script[script_count] = document.createElement('script'); 155 paypal_script[script_count].type = 'text/javascript'; 156 paypal_script[script_count].src = src; 157 paypal_script[script_count].setAttribute('data-partner-attribution-id', paypal_data['partner_attribution_id']); 158 paypal_script[script_count].setAttribute('data-client-token', paypal_data['client_token']); 159 paypal_script[script_count].setAttribute('data-namespace', 'PayPalSDK'); 160 161 if (paypal_data['id_token']) { 162 paypal_script[script_count].setAttribute('data-user-id-token', paypal_data['id_token']); 163 } 164 165 paypal_script[script_count].async = false; 166 paypal_script[script_count].onload = readyPayPalSDK(); 167 168 document.querySelector('body').appendChild(paypal_script[script_count]); 169 } else if (paypal_sdk[i]) { 170 PayPalSDK = paypal_sdk[i]; 171 172 initPayPalSDK(); 173 } 174 }; 175 176 var initPayPalSDK = function() { 177 if (paypal_data['components'].includes('buttons') && $('#paypal_button').length && !$('#paypal_button_container').html()) { 178 $('#paypal_button').css('text-align', paypal_data['button_align']); 179 180 if (paypal_data['button_width']) { 181 $('#paypal_button_container').css('display', 'inline-block'); 182 $('#paypal_button_container').css('width', paypal_data['button_width']); 183 } else { 184 $('#paypal_button_container').css('display', 'block'); 185 $('#paypal_button_container').css('width', 'auto'); 186 } 187 188 try { 189 var paypal_button_data = { 190 env: paypal_data['environment'], 191 locale: paypal_data['locale'], 192 style: { 193 layout: 'vertical', 194 size: paypal_data['button_size'], 195 color: paypal_data['button_color'], 196 shape: paypal_data['button_shape'], 197 label: paypal_data['button_label'], 198 tagline: 'false' 199 }, 200 createOrder: function() { 201 paypal_order_id = false; 202 product_data = false; 203 204 if (paypal_data['page_code'] == 'product') { 205 product_data = $('#product input[type=\'text\'], #product input[type=\'hidden\'], #product input[type=\'radio\']:checked, #product input[type=\'checkbox\']:checked, #product select, #product textarea').serialize(); 206 } 207 208 $.ajax({
209 method: 'post', 210 url: 'index.php?route=extension/payment/paypal/createOrder', 211 data: {'page_code': paypal_data['page_code'], 'payment_type': 'button', 'product': product_data}, 212 dataType: 'json', 213 async: false, 214 success: function(json) { 215 showPayPalAlert(json); 216 217 paypal_order_id = json['paypal_order_id']; 218 }, 219 error: function(xhr, ajaxOptions, thrownError) { 220 console.log(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText); 221 } 222 }); 223 224 return paypal_order_id; 225 }, 226 onApprove: function(data) { 227 $.ajax({ 228 method: 'post', 229 url: 'index.php?route=extension/payment/paypal/approveOrder', 230 data: {'page_code': paypal_data['page_code'], 'payment_type': 'button', 'paypal_order_id': data.orderID}, 231 dataType: 'json', 232 async: false, 233 success: function(json) { 234 showPayPalAlert(json); 235 236 if (json['url']) { 237 location = json['url']; 238 } 239 }, 240 error: function(xhr, ajaxOptions, thrownError) { 241 console.log(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText); 242 } 243 }); 244 } 245 }; 246 247 if (paypal_data['button_funding_source']) { 248 paypal_button_data['fundingSource'] = paypal_data['button_funding_source']; 249 } 250 251 var paypal_button = PayPalSDK.Buttons(paypal_button_data); 252 253 if (paypal_button.isEligible()) { 254 paypal_button.render('#paypal_button_container'); 255 } 256 } catch (error) { 257 console.error('PayPal Express failed during startup', error); 258 } 259 260 $('#paypal_button_container').removeClass('paypal-spinner'); 261 } 262 263 if (paypal_data['components'].includes('googlepay') && $('#googlepay_button').length && !$('#googlepay_button_container').html()) { 264 if (google && PayPalSDK.Googlepay) { 265 initGooglePaySDK().catch(console.log); 266 } else { 267 $('#googlepay_button').remove(); 268 269 console.log('This device does not support Google Pay'); 270 } 271 272 $('#googlepay_button_container').removeClass('paypal-spinner'); 273 } 274 275 if (paypal_data['components'].includes('applepay') && $('#applepay_button').length && !$('#applepay_button_container').html()) { 276 if (window.ApplePaySession && window.ApplePaySession?.supportsVersion(4) && ApplePaySession.canMakePayments()) { 277 initApplePaySDK().catch(console.log); 278 } else { 279 $('#applepay_button').remove(); 280 281 console.log('This device does not support Apple Pay'); 282 } 283 } 284 285 if (paypal_data['card_customer_tokens'] && $('#paypal_card_tokens').length && !$('#paypal_card_tokens_container').html()) { 286 $('#paypal_card_tokens').css('text-align', paypal_data['card_align']); 287 288 if (paypal_data['card_width']) { 289 $('#paypal_card_tokens_container').css('display', 'inline-block'); 290 $('#paypal_card_tokens_container').css('width', paypal_data['card_width']); 291 } else { 292 $('#paypal_card_tokens_container').css('display', 'block'); 293 $('#paypal_card_tokens_container').css('width', 'auto'); 294 } 295 296 $.each(paypal_data['card_customer_tokens'], function(index, card_customer_token) { 297 html = '<div class="paypal-card-token"><div type="button" class="btn card-token-button" index="' + index + '"><i class="card-icon card-icon-' + card_customer_token['card_type'] + '"></i><span class="card-number">' + card_customer_token['card_number'] + '</span></div><div type="button" class="btn card-token-delete-button" index="' + index + '"><i class="fa fal fa-close"></i></div></div></div>'; 298 299 $('#paypal_card_tokens_container').append(html); 300 }); 301 302 $('#paypal_card_tokens_container').delegate('.card-token-button', 'click', function(event) { 303 event.preventDefault(); 304 305 var paypal_card_token = $(this).parents('.paypal-card-token'); 306 var card_token_index = $(this).attr('index'); 307 308 paypal_order_id = false; 309 310 $.ajax({
311 method: 'post', 312 url: 'index.php?route=extension/payment/paypal/createOrder', 313 data: {'page_code': paypal_data['page_code'], 'payment_type': 'card', 'index': card_token_index}, 314 dataType: 'json', 315 beforeSend: function() { 316 paypal_card_token.addClass('paypal-spinner'); 317 }, 318 success: function(json) { 319 showPayPalAlert(json); 320 321 if (json['url']) { 322 location = json['url']; 323 } 324 }, 325 complete: function() { 326 paypal_card_token.removeClass('paypal-spinner'); 327 }, 328 error: function(xhr, ajaxOptions, thrownError) { 329 console.log(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText); 330 } 331 }); 332 }); 333 334 $('#paypal_card_tokens_container').delegate('.card-token-delete-button', 'click', function(event) { 335 event.preventDefault(); 336 337 var paypal_card_token = $(this).parents('.paypal-card-token'); 338 var card_token_index = $(this).attr('index'); 339 340 $.ajax({ 341 method: 'post', 342 url: 'index.php?route=extension/payment/paypal/deleteCustomerToken', 343 data: {'index': card_token_index}, 344 dataType: 'json', 345 beforeSend: function() { 346 paypal_card_token.addClass('paypal-spinner'); 347 }, 348 success: function(json) { 349 showPayPalAlert(json); 350 351 if (json['success']) { 352 paypal_card_token.remove(); 353 } 354 }, 355 error: function(xhr, ajaxOptions, thrownError) { 356 console.log(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText); 357 }, 358 complete: function() { 359 paypal_card_token.removeClass('paypal-spinner'); 360 } 361 }); 362 }); 363 } 364 365 if (paypal_data['components'].includes('card-fields') && $('#paypal_card').length && !$('#paypal_card_form').find('iframe').length) { 366 $('#paypal_card').css('text-align', paypal_data['card_align']); 367 368 if (paypal_data['card_width']) { 369 $('#paypal_card_container').css('display', 'inline-block'); 370 $('#paypal_card_container').css('width', paypal_data['card_width']); 371 } else { 372 $('#paypal_card_container').css('display', 'block'); 373 $('#paypal_card_container').css('width', 'auto'); 374 } 375 376 try { 377 var paypal_card = PayPalSDK.CardFields({ 378 style: { 379 'input': { 380 'font-size': '1rem', 381 'color': '#282c37', 382 'transition': 'color 0.1s', 383 'padding': '0.75rem 0.75rem', 384 } 385 }, 386 createOrder: function() { 387 paypal_order_id = false; 388 389 var card_save = ($('#paypal_card_form #paypal_card_save:checked').length ? $('#paypal_card_form #paypal_card_save:checked').val() : 0); 390 391 $.ajax({
392 method: 'post', 393 url: 'index.php?route=extension/payment/paypal/createOrder', 394 data: {'page_code': paypal_data['page_code'], 'payment_type': 'card', 'card_save': card_save}, 395 dataType: 'json', 396 async: false, 397 success: function(json) { 398 showPayPalAlert(json); 399 400 paypal_order_id = json['paypal_order_id']; 401 }, 402 error: function(xhr, ajaxOptions, thrownError) { 403 console.log(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText); 404 } 405 }); 406 407 return paypal_order_id; 408 }, 409 onApprove: function(data) { 410 var card_save = ($('#paypal_card_form #paypal_card_save:checked').length ? $('#paypal_card_form #paypal_card_save:checked').val() : 0); 411 var card_type = $('#paypal_card_form').attr('card_type'); 412 var card_nice_type = $('#paypal_card_form').attr('card_nice_type'); 413 414 $.ajax({ 415 method: 'post', 416 url: 'index.php?route=extension/payment/paypal/approveOrder', 417 data: {'page_code': paypal_data['page_code'], 'payment_type': 'card', 'card_save': card_save, 'card_type': card_type, 'card_nice_type': card_nice_type, 'paypal_order_id': data.orderID}, 418 dataType: 'json', 419 async: false, 420 success: function(json) { 421 showPayPalAlert(json); 422 423 if (json['url']) { 424 location = json['url']; 425 } 426 }, 427 error: function(xhr, ajaxOptions, thrownError) { 428 console.log(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText); 429 }, 430 complete: function() { 431 $('#paypal_card_container').removeClass('paypal-spinner'); 432 } 433 }); 434 }, 435 inputEvents: { 436 onChange: function(data) { 437 console.log('CCF Event "change", state=' + paypal_card.getState() + ', event=' + data); 438 439 $('#paypal_card_form').removeClass().addClass('well'); 440 $('#paypal_card_form').removeAttr(); 441 442 if (data.cards.length === 1) { 443 $('#paypal_card_form').addClass(data.cards[0].type); 444 $('#paypal_card_form').attr('card_type', data.cards[0].type); 445 $('#paypal_card_form').attr('card_nice_type', data.cards[0].niceType); 446 } 447 448 if (data.isFormValid) { 449 $('#paypal_card_button').addClass('show-button'); 450 } else { 451 $('#paypal_card_button').removeClass('show-button'); 452 } 453 }, 454 onFocus: function(data) { 455 console.log('CCF Event "focus", state=' + paypal_card.getState() + ', event=' + data); 456 }, 457 onBlur: function(data) { 458 console.log('CCF Event "blur", state=' + paypal_card.getState() + ', event=' + data); 459 }, 460 onInputSubmitRequest: function(data) { 461 console.log('CCF Event "input submit request", state=' + paypal_card.getState() + ', event=' + data); 462 463 if (data.isFormValid) { 464 $('#paypal_card_button').addClass('show-button'); 465 } else { 466 $('#paypal_card_button').removeClass('show-button'); 467 } 468 } 469 } 470 }); 471 472 if (paypal_card.isEligible()) { 473 paypal_card.NameField().render('#card_holder_name'); 474 paypal_card.NumberField().render('#card_number'); 475 paypal_card.ExpiryField().render('#expiration_date'); 476 paypal_card.CVVField().render('#cvv'); 477 478 var paypal_card_button = document.querySelector('#paypal_card_button'); 479 480 paypal_card_button.addEventListener('click', function(event) { 481 event.preventDefault(); 482 483 if ($('#paypal_card_button').hasClass('show-button')) { 484 console.log('CCF Event "click", state=' + paypal_card.getState() + ', event=' + event); 485 486 $('#paypal_card_container').addClass('paypal-spinner'); 487 488 paypal_card.submit().then(function() { 489 console.log('PayPal CCF submitted:', paypal_card); 490 }).catch(function(error) { 491 console.error('PayPal CCF submit erred:', error); 492 }); 493 } 494 }, false); 495 } else { 496 console.log('Not eligible for CCF'); 497 } 498 } catch (error) { 499 console.error('PayPal Card failed during startup', error); 500 } 501 502 $('#paypal_card_container').removeClass('paypal-spinner'); 503 } 504 505 if (paypal_data['components'].includes('messages') && $('#paypal_message').length && !$('#paypal_message_container').html()) { 506 var paypal_message = document.createElement('div'); 507 508 paypal_message.setAttribute('data-pp-message', ''); 509 510 if (paypal_data['page_code'] == 'home') { 511 paypal_message.setAttribute('data-pp-placement', 'home'); 512 } 513 514 if (paypal_data['page_code'] == 'product') { 515 paypal_message.setAttribute('data-pp-placement', 'product'); 516 } 517 518 if (paypal_data['page_code'] == 'cart') { 519 paypal_message.setAttribute('data-pp-placement', 'cart'); 520 } 521 522 if (paypal_data['page_code'] == 'checkout') { 523 paypal_message.setAttribute('data-pp-placement', 'payment'); 524 } 525 526 paypal_message.setAttribute('data-pp-amount', paypal_data['message_amount']); 527 paypal_message.setAttribute('data-pp-style-layout', paypal_data['message_layout']); 528 529 if (paypal_data['message_layout'] == 'text') { 530 paypal_message.setAttribute('data-pp-style-logo-type', paypal_data['message_logo_type']); 531 paypal_message.setAttribute('data-pp-style-logo-position', paypal_data['message_logo_position']); 532 paypal_message.setAttribute('data-pp-style-text-color', paypal_data['message_text_color']); 533 paypal_message.setAttribute('data-pp-style-text-size', paypal_data['message_text_size']); 534 } else { 535 paypal_message.setAttribute('data-pp-style-color', paypal_data['message_flex_color']); 536 paypal_message.setAttribute('data-pp-style-ratio', paypal_data['message_flex_ratio']); 537 } 538 539 document.querySelector('#paypal_message_container').appendChild(paypal_message); 540 541 $('#paypal_message_container').removeClass('paypal-spinner'); 542 543 if (paypal_data['page_code'] == 'product') { 544 $('[name^="option"], [name="quantity"]').on('change', function(event) { 545 setTimeout(function() { 546 updatePayPalData(); 547 548 if (paypal_message) { 549 paypal_message.setAttribute('data-pp-amount', paypal_data['message_amount']); 550 } 551 }, 10); 552 }); 553 } 554 } 555 556 if (paypal_callback && typeof paypal_callback == 'function') { 557 paypal_callback(); 558 } 559 }; 560 561 var initGooglePaySDK = async function() { 562 const {allowedPaymentMethods, merchantInfo, apiVersion, apiVersionMinor, countryCode} = await PayPalSDK.Googlepay().config(); 563 564 const paymentsClient = new google.payments.api.PaymentsClient({ 565 environment: paypal_data['googlepay_environment'], 566 paymentDataCallbacks: { 567 onPaymentAuthorized: function(paymentData) { 568 return new Promise(async function(resolve, reject) { 569 try { 570 paypal_order_id = false; 571 product_data = false; 572 573 if (paypal_data['page_code'] == 'product') { 574 product_data = $('#product input[type=\'text\'], #product input[type=\'hidden\'], #product input[type=\'radio\']:checked, #product input[type=\'checkbox\']:checked, #product select, #product textarea').serialize(); 575 } 576 577 $.ajax({
578 method: 'post', 579 url: 'index.php?route=extension/payment/paypal/createOrder', 580 data: {'page_code': paypal_data['page_code'], 'payment_type': 'googlepay_button', 'product': product_data}, 581 dataType: 'json', 582 async: false, 583 success: function(json) { 584 showPayPalAlert(json); 585 586 paypal_order_id = json['paypal_order_id']; 587 }, 588 error: function(xhr, ajaxOptions, thrownError) { 589 console.log(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText); 590 } 591 }); 592 593 const confirmOrderResponse = await PayPalSDK.Googlepay().confirmOrder({ 594 orderId: paypal_order_id, 595 paymentMethodData: paymentData.paymentMethodData 596 }); 597 598 if (confirmOrderResponse.status === 'PAYER_ACTION_REQUIRED') { 599 console.log('Confirm Payment Completed Payer Action Required'); 600 601 PayPalSDK.Googlepay().initiatePayerAction({orderId: paypal_order_id}).then(async () => { 602 $.ajax({
603 method: 'post', 604 url: 'index.php?route=extension/payment/paypal/approveOrder', 605 data: {'page_code': paypal_data['page_code'], 'payment_type': 'googlepay_button', 'paypal_order_id': paypal_order_id}, 606 dataType: 'json', 607 async: false, 608 success: function(json) { 609 showPayPalAlert(json); 610 611 if (json['url']) { 612 location = json['url']; 613 } 614 }, 615 error: function(xhr, ajaxOptions, thrownError) { 616 console.log(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText); 617 } 618 }); 619 }); 620 621 resolve({transactionState: 'SUCCESS'}); 622 } else if (confirmOrderResponse.status === 'APPROVED') { 623 console.log('Confirm Payment Approved'); 624 625 $.ajax({ 626 method: 'post', 627 url: 'index.php?route=extension/payment/paypal/approveOrder', 628 data: {'page_code': paypal_data['page_code'], 'payment_type': 'googlepay_button', 'paypal_order_id': paypal_order_id}, 629 dataType: 'json', 630 async: false, 631 success: function(json) { 632 showPayPalAlert(json); 633 634 if (json['url']) { 635 location = json['url']; 636 } 637 }, 638 error: function(xhr, ajaxOptions, thrownError) { 639 console.log(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText); 640 } 641 }); 642 643 resolve({transactionState: 'SUCCESS'}); 644 } else { 645 resolve({ 646 transactionState: 'ERROR', 647 error: { 648 intent: 'PAYMENT_AUTHORIZATION', 649 message: 'TRANSACTION FAILED', 650 } 651 });
652 } 653 } catch (error) { 654 resolve({ 655 transactionState: 'ERROR', 656 error: { 657 intent: 'PAYMENT_AUTHORIZATION', 658 message: error.message, 659 } 660 }); 661 } 662 }); 663 } 664 } 665 }); 666 667 paymentsClient.isReadyToPay({allowedPaymentMethods, apiVersion, apiVersionMinor}).then(function(response) { 668 if (response.result) { 669 $('#googlepay_button').css('text-align', paypal_data['googlepay_button_align']); 670 671 var googlepay_button_style = []; 672 673 if (paypal_data['googlepay_button_width']) { 674 googlepay_button_style.push('display: inline-block'); 675 googlepay_button_style.push('width: ' + paypal_data['googlepay_button_width']); 676 } else { 677 googlepay_button_style.push('display: block'); 678 googlepay_button_style.push('width: auto'); 679 } 680 681 googlepay_button_style.push('aspect-ratio: 7.5'); 682 683 $('#googlepay_button_container').attr('style', googlepay_button_style.join('; ')); 684 685 if (paypal_data['googlepay_button_shape'] == 'pill') { 686 $('#googlepay_button_container').removeClass('shape-rect'); 687 $('#googlepay_button_container').addClass('shape-pill'); 688 } else { 689 $('#googlepay_button_container').removeClass('shape-pill'); 690 $('#googlepay_button_container').addClass('shape-rect'); 691 } 692 693 const googlepay_button = paymentsClient.createButton({ 694 buttonColor: paypal_data['googlepay_button_color'], 695 buttonType: paypal_data['googlepay_button_type'], 696 buttonLocale: paypal_data['locale'].split('_')[0], 697 buttonSizeMode: 'fill', 698 onClick: function() { 699 const paymentDataRequest = Object.assign({}, {apiVersion, apiVersionMinor}); 700 701 paymentDataRequest.allowedPaymentMethods = allowedPaymentMethods; 702 paymentDataRequest.transactionInfo = { 703 countryCode: countryCode, 704 currencyCode: paypal_data['currency_code'], 705 totalPriceStatus: 'FINAL', 706 totalPrice: paypal_data['googlepay_amount'], 707 totalPriceLabel: 'Total' 708 } 709 710 paymentDataRequest.merchantInfo = merchantInfo; 711 712 paymentDataRequest.callbackIntents = ['PAYMENT_AUTHORIZATION']; 713 714 paymentsClient.loadPaymentData(paymentDataRequest); 715 } 716 }); 717 718 document.querySelector('#googlepay_button_container').appendChild(googlepay_button); 719 } 720 }).catch(function(error) { 721 console.log(error); 722 }); 723 }; 724 725 var initApplePaySDK = async function() { 726 const ApplePaySDK = PayPalSDK.Applepay(); 727 const { 728 isEligible, 729 countryCode, 730 currencyCode, 731 merchantCapabilities, 732 supportedNetworks, 733 } = await ApplePaySDK.config(); 734 735 if (!isEligible) { 736 $('#applepay_button').remove(); 737 738 throw 'Apple Pay is not eligible'; 739 } 740 741 $('#applepay_button').css('text-align', paypal_data['applepay_button_align']); 742 743 var applepay_button_style = []; 744 745 if (paypal_data['applepay_button_width']) { 746 $('#applepay_button_container').css('display', 'inline-block'); 747 $('#applepay_button_container').css('width', paypal_data['applepay_button_width']); 748 } else { 749 $('#applepay_button_container').css('display', 'block'); 750 $('#applepay_button_container').css('width', 'auto'); 751 } 752 753 var applepay_button = document.createElement('apple-pay-button'); 754 755 applepay_button.setAttribute('id', 'apple-pay-button'); 756 applepay_button.setAttribute('buttonstyle', paypal_data['applepay_button_color']); 757 applepay_button.setAttribute('type', paypal_data['applepay_button_type']); 758 applepay_button.setAttribute('locale', paypal_data['locale']); 759 760 var applepay_button_style = []; 761 762 applepay_button_style.push('display: inline-block'); 763 764 if (paypal_data['applepay_button_width']) { 765 applepay_button_style.push('--apple-pay-button-width: ' + paypal_data['applepay_button_width']); 766 } else { 767 applepay_button_style.push('--apple-pay-button-width: 100%'); 768 } 769 770 applepay_button_style.push('--apple-pay-button-height: calc(var(--apple-pay-button-width) / 7.5)'); 771 772 if (paypal_data['applepay_button_shape'] == 'pill') { 773 applepay_button_style.push('--apple-pay-button-border-radius: 1000px'); 774 } else { 775 applepay_button_style.push('--apple-pay-button-border-radius: 4px'); 776 } 777 778 applepay_button.setAttribute('style', applepay_button_style.join('; '));
779 780 document.querySelector('#applepay_button_container').appendChild(applepay_button); 781 782 applepay_button.addEventListener('click', async function (event) { 783 event.preventDefault(); 784 785 const paymentRequest = { 786 countryCode, 787 currencyCode: paypal_data['currency_code'], 788 merchantCapabilities, 789 supportedNetworks, 790 requiredBillingContactFields: ['name', 'phone', 'email', 'postalAddress'], 791 requiredShippingContactFields: [], 792 total: { 793 label: 'Total', 794 amount: paypal_data['applepay_amount'], 795 type: 'final', 796 } 797 }; 798 799 var session = new ApplePaySession(4, paymentRequest); 800 801 session.onvalidatemerchant = (event) => { 802 ApplePaySDK.validateMerchant({ 803 validationUrl: event.validationURL, 804 }).then((payload) => { 805 session.completeMerchantValidation(payload.merchantSession); 806 console.log('Complete Merchant validation Done!', {payload}); 807 }).catch((error) => { 808 console.error(error); 809 session.abort(); 810 }); 811 }; 812 813 session.onpaymentmethodselected = (event) => { 814 console.log('onpaymentmethodselected'); 815 console.log(event.paymentMethod); // {type: "credit"} 816 817 session.completePaymentMethodSelection({ 818 newTotal: paymentRequest.total 819 }); 820 }; 821 822 session.onshippingcontactselected = async (event) => { 823 console.log('Your shipping contacts selected is: ' + event.shippingContact); 824 825 const shippingContactUpdate = { 826 newTotal: paymentRequest.total, 827 newLineItems: [] 828 }; 829 830 session.completeShippingContactSelection(shippingContactUpdate); 831 }; 832 833 session.onshippingmethodselected = (event) => { 834 console.log('onshippingmethodselected'); 835 console.log(JSON.stringify(event.shippingMethod, null, 4)); 836 console.log('Your shipping method selected is: ', event.shippingMethod); 837 838 var shippingMethodUpdate = { 839 newTotal: paymentRequest.total, 840 newLineItems: [] 841 }; 842 843 session.completeShippingMethodSelection(shippingMethodUpdate); 844 }; 845 846 session.onpaymentauthorized = async (event) => { 847 try { 848 console.log('onpaymentauthorized'); 849 console.log(JSON.stringify(event, null, 4)); 850 851 paypal_order_id = false; 852 product_data = false; 853 854 if (paypal_data['page_code'] == 'product') { 855 product_data = $('#product input[type=\'text\'], #product input[type=\'hidden\'], #product input[type=\'radio\']:checked, #product input[type=\'checkbox\']:checked, #product select, #product textarea').serialize(); 856 } 857 858 $.ajax({
859 method: 'post', 860 url: 'index.php?route=extension/payment/paypal/createOrder', 861 data: {'page_code': paypal_data['page_code'], 'payment_type': 'applepay_button', 'product': product_data}, 862 dataType: 'json', 863 async: false, 864 success: function(json) { 865 showPayPalAlert(json); 866 867 paypal_order_id = json['paypal_order_id']; 868 }, 869 error: function(xhr, ajaxOptions, thrownError) { 870 console.log(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText); 871 } 872 }); 873 874 await ApplePaySDK.confirmOrder({ 875 orderId: paypal_order_id, 876 token: event.payment.token, 877 billingContact: event.payment.billingContact, 878 shippingContact: event.payment.shippingContact 879 }); 880 881 $.ajax({ 882 method: 'post', 883 url: 'index.php?route=extension/payment/paypal/approveOrder', 884 data: {'page_code': paypal_data['page_code'], 'payment_type': 'applepay_button', 'paypal_order_id': paypal_order_id}, 885 dataType: 'json', 886 async: false, 887 success: function(json) { 888 showPayPalAlert(json); 889 890 if (json['url']) { 891 location = json['url']; 892 } 893 }, 894 error: function(xhr, ajaxOptions, thrownError) { 895 console.log(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText); 896 } 897 }); 898 899 session.completePayment({ 900 status: window.ApplePaySession.STATUS_SUCCESS 901 }); 902 } catch (error) { 903 console.error(error); 904 905 session.completePayment({ 906 status: window.ApplePaySession.STATUS_FAILURE 907 }); 908 } 909 }; 910 911 session.oncancel = (event) => { 912 console.log(event); 913 console.log('Apple Pay Cancelled!'); 914 } 915 916 session.begin(); 917 }); 918 919 $('#applepay_button_container').removeClass('paypal-spinner'); 920 }; 921 922 var init = function(callback = '') { 923 updatePayPalData(); 924 925 paypal_callback = callback; 926 927 loadPayPalSDK(); 928 }; 929 930 return { 931 init: init 932 }; 933}()); 934 935window.addEventListener('load', function () { 936 PayPalAPI.init(); 937}); 938
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.