| // Copyright 2017 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| /** |
| * Updates the price based on the selected shipping option. |
| * @param {object} details - The current details to update. |
| * @param {string} shippingOption - The shipping option selected by user. |
| * @return {object} The updated details. |
| */ |
| function updateDetails(details, shippingOption) { |
| var selectedShippingOption; |
| var otherShippingOption; |
| if (shippingOption === 'standard') { |
| selectedShippingOption = details.shippingOptions[0]; |
| otherShippingOption = details.shippingOptions[1]; |
| details.total.amount.value = '55.00'; |
| } else { |
| selectedShippingOption = details.shippingOptions[1]; |
| otherShippingOption = details.shippingOptions[0]; |
| details.total.amount.value = '67.00'; |
| } |
| if (details.displayItems.length === 2) { |
| details.displayItems.splice(1, 0, selectedShippingOption); |
| } else { |
| details.displayItems.splice(1, 1, selectedShippingOption); |
| } |
| selectedShippingOption.selected = true; |
| otherShippingOption.selected = false; |
| return details; |
| } |
| |
| /** |
| * Launches payment request that provides multiple shipping options worldwide, |
| * regardless of the shipping address. |
| */ |
| function onBuyClicked() { // eslint-disable-line no-unused-vars |
| var supportedInstruments = [ |
| { |
| supportedMethods: 'https://android.com/pay', |
| data: { |
| merchantName: 'Rouslan Solomakhin', |
| merchantId: '00184145120947117657', |
| allowedCardNetworks: ['AMEX', 'MASTERCARD', 'VISA', 'DISCOVER'], |
| paymentMethodTokenizationParameters: { |
| tokenizationType: 'GATEWAY_TOKEN', |
| parameters: { |
| 'gateway': 'stripe', |
| 'stripe:publishableKey': 'pk_live_lNk21zqKM2BENZENh3rzCUgo', |
| 'stripe:version': '2016-07-06', |
| }, |
| }, |
| }, |
| }, |
| { |
| supportedMethods: 'basic-card', |
| }, |
| ]; |
| |
| var details = { |
| total: { |
| label: 'Donation', |
| amount: { |
| currency: 'USD', |
| value: '55.00', |
| }, |
| }, |
| displayItems: [ |
| { |
| label: 'Original donation amount', |
| amount: { |
| currency: 'USD', |
| value: '65.00', |
| }, |
| }, |
| { |
| label: 'Friends and family discount', |
| amount: { |
| currency: 'USD', |
| value: '-10.00', |
| }, |
| }, |
| ], |
| shippingOptions: [ |
| { |
| id: 'standard', |
| label: 'Standard shipping', |
| amount: { |
| currency: 'USD', |
| value: '0.00', |
| }, |
| selected: true, |
| }, |
| { |
| id: 'express', |
| label: 'Express shipping', |
| amount: { |
| currency: 'USD', |
| value: '12.00', |
| }, |
| }, |
| ], |
| }; |
| |
| var options = { |
| requestShipping: true, |
| requestPayerName: true, |
| requestPayerPhone: true, |
| requestPayerEmail: true, |
| }; |
| |
| if (!window.PaymentRequest) { |
| error('PaymentRequest API is not supported.'); |
| return; |
| } |
| |
| try { |
| var request = new PaymentRequest(supportedInstruments, details, options); |
| |
| request.addEventListener('shippingaddresschange', function(e) { |
| e.updateWith(new Promise(function(resolve) { |
| window.setTimeout(function() { |
| // No changes in price based on shipping address change. |
| resolve(details); |
| }, 2000); |
| })); |
| }); |
| |
| request.addEventListener('shippingoptionchange', function(e) { |
| e.updateWith(new Promise(function(resolve) { |
| resolve(updateDetails(details, request.shippingOption)); |
| })); |
| }); |
| |
| request.show() |
| .then(function(instrumentResponse) { |
| window.setTimeout(function() { |
| instrumentResponse.complete('success') |
| .then(function() { |
| done( |
| 'This is a demo website. No payment will be processed.', |
| instrumentResponse); |
| }) |
| .catch(function(err) { |
| error(err); |
| }); |
| }, 2000); |
| }) |
| .catch(function(err) { |
| error(err); |
| }); |
| } catch (e) { |
| error('Developer mistake: \'' + e.message + '\''); |
| } |
| } |