app/Plugin/StripePaymentGateway42/Resource/assets/js/stripe_request_button.js.twig line 1

Open in your IDE?
  1. <script>
  2. var stripe = Stripe("{{ stripeConfig.PublishableKey }}");
  3. var registerPayButton = function(option){
  4.     var _DEFAULT = {
  5.         button_id : "payment-request-button",
  6.         shipping_fetch_url : '{{ url("plugin_stripe_pr_shipping") }}',
  7.         pay_url   : "{{ url('plugin_stripe_pr_pay') }}",
  8.         getData     : null,
  9.         onSuccess   :   null,
  10.         request_data: {
  11.             country     :   "JP",
  12.             currency    :   "jpy",
  13.             total       :   {
  14.                 label: "{{ 'stripe_payment_gateway.payrequest.pay_now_label'|trans }}",
  15.                 amount: 0
  16.             },
  17.             requestPayerName    : true,
  18.             requestPayerEmail   : true,
  19.             requestPayerPhone   : true,
  20.             requestShipping     : true
  21.         }
  22.     }
  23.     option = Object.assign(_DEFAULT, option )
  24.     var is_apple = false;
  25.     var paymentRequest = stripe.paymentRequest(option.request_data)
  26.     
  27.     var elements = stripe.elements();
  28.     var prButton = elements.create('paymentRequestButton', {
  29.         paymentRequest: paymentRequest,
  30.     });
  31.     
  32.     paymentRequest.canMakePayment().then(function(result) {
  33.         if (result) {
  34.             prButton.mount('#' + option.button_id);
  35.             if(result.applePay){
  36.                 is_apple = true;
  37.             }
  38.         } else {
  39.             document.getElementById(option.button_id).style.display = 'none';
  40.         }
  41.     });
  42.     var shippingOptions = null;
  43.     var selectedShipping = null;
  44.     var currentAmount = 0;
  45.     paymentRequest.on('shippingaddresschange', function(ev){
  46.         if(ev.shippingAddress.country !== 'JP'){
  47.             ev.updateWith({status: 'invalid_shipping_address'});
  48.         }else{
  49.             console.log(ev.shippingAddress);
  50.             $.ajax({
  51.                 type: 'POST',
  52.                 data: {
  53.                     shippingAddress : ev.shippingAddress,
  54.                     data            :   option.getData()
  55.                 },
  56.                 url: option.shipping_fetch_url,
  57.                 success: function(result) {
  58.                     if(result.status && result.status == "success"){
  59.                         shippingOptions = result.shippingOptions;
  60.                         if (!shippingOptions.length) {
  61.                             ev.updateWith({ status: 'invalid_shipping_address' })
  62.                         }
  63.                         shippingOptions = result.shippingOptions;
  64.                         selectedShipping = shippingOptions[0];
  65.                         currentAmount = result.amount;
  66.                         ev.updateWith({
  67.                             status  :   'success',
  68.                             shippingOptions :   shippingOptions,
  69.                             total   : {
  70.                                 label: option.request_data.total.label,
  71.                                 amount: result.amount + selectedShipping.amount
  72.                             },
  73.                             displayItems : [
  74.                                 {
  75.                                     label: "小計",
  76.                                     amount: result.amount
  77.                                 },
  78.                                 {
  79.                                     label: "送料 (" + selectedShipping.label + ")",
  80.                                     amount: selectedShipping.amount
  81.                                 }
  82.                             ]
  83.                         })
  84.                     }else{
  85.                         ev.updateWith({ status: 'invalid_shipping_address' })
  86.                     }
  87.                 },
  88.                 error: function(error) {
  89.                     ev.updateWith({ status: 'invalid_shipping_address' })
  90.                 }
  91.             });
  92.         }
  93.     })
  94.     paymentRequest.on("shippingoptionchange", function(ev) {
  95.         ev.updateWith({
  96.             status: 'success',
  97.             shippingOptions: shippingOptions,
  98.             total: {
  99.                 label: option.request_data.total.label,
  100.                 amount: currentAmount + ev.shippingOption.amount
  101.             },
  102.             displayItems : [
  103.                 {
  104.                     label: "小計",
  105.                     amount: currentAmount
  106.                 },
  107.                 {
  108.                     label: "送料 (" + ev.shippingOption.label + ")",
  109.                     amount: ev.shippingOption.amount
  110.                 }
  111.             ]
  112.         })
  113.     })
  114.     paymentRequest.on('paymentmethod', function(ev){
  115.         var data = option.getData()
  116.         console.log(ev);
  117.         ev['data'] = data;
  118.         ev['applePay'] = is_apple;
  119.         ev.complete('success');
  120.         loadingOverlay('show');
  121.         $.ajax({
  122.             type    :   "POST",
  123.             data    :   ev,
  124.             url     :   option.pay_url,
  125.             success: function(result) {
  126.                 handleServerResponse(result)
  127.             },
  128.             error: function(error) {
  129.                 alert("{{ 'stripe_payment_gateway.payrequest.connection_error'|trans }}");
  130.                 loadingOverlay('hide');
  131.             }
  132.         })
  133.     })
  134.     function handleServerResponse(response) {
  135.         if (response.status === "success") {
  136.             // Show success message
  137.             if(option.onSuccess){
  138.                 option.onSuccess();
  139.             }else{
  140.                 loadingOverlay('hide');
  141.                 alert("{{ 'stripe_payment_gateway.payrequest.success'|trans }}")
  142.             }
  143.         } else if (response.status === "requires_action") {
  144.             // Use Stripe.js to handle required card action
  145.             loadingOverlay('hide');
  146.             stripe.handleCardAction(
  147.                 response.secret
  148.             ).then(handleStripeJsResult);
  149.         } else {
  150.             // Show error from server on payment form
  151.             alert("{{ 'stripe_payment_gateway.payrequest.payment_failed'|trans }}")
  152.             loadingOverlay('hide');
  153.         }
  154.         
  155.     }
  156.     function handleStripeJsResult(result) {
  157.         if (result.error) {
  158.             // Show error in payment form
  159.         } else {
  160.             // The card action has been handled
  161.             // The PaymentIntent can be confirmed again on the server
  162.             loadingOverlay('show');
  163.             $.ajax({
  164.                 type    :   "POST",
  165.                 data    : { payment_intent_id: result.paymentIntent.id },
  166.                 url     :   option.pay_url,
  167.                 
  168.             }).then(handleServerResponse);
  169.         }
  170.     }
  171.     return paymentRequest;
  172. }
  173. </script>