Braintree - кнопка Google Pay не отображается

я просто вырезал и вставил этот код в html-файл, который я назвал payg.html: https://jsfiddle.net/f1am0dr7/

Я вставляю «jsfiddel html section» в начало страницы.

<div id="container"></div>
<script async
  src="https://pay.google.com/gp/p/js/pay.js"
  onload="onGooglePayLoaded()"></script>

и "jsfiddle javascript section" ниже и между

<script> & </script>

-

/**
 * Define the version of the Google Pay API referenced when creating your
 * configuration
 *
 * @see {@link https://developers.google.com/pay/api/web/reference/request-objects#PaymentDataRequest|apiVersion in PaymentDataRequest}
 */
const baseRequest = {
  apiVersion: 2,
  apiVersionMinor: 0
};

/**
 * Card networks supported by your site and your gateway
 *
 * @see {@link https://developers.google.com/pay/api/web/reference/request-objects#CardParameters|CardParameters}
 * @todo confirm card networks supported by your site and gateway
 */
const allowedCardNetworks = ["AMEX", "DISCOVER", "INTERAC", "JCB", "MASTERCARD", "VISA"];

/**
 * Card authentication methods supported by your site and your gateway
 *
 * @see {@link https://developers.google.com/pay/api/web/reference/request-objects#CardParameters|CardParameters}
 * @todo confirm your processor supports Android device tokens for your
 * supported card networks
 */
const allowedCardAuthMethods = ["PAN_ONLY", "CRYPTOGRAM_3DS"];

/**
 * Identify your gateway and your site's gateway merchant identifier
 *
 * The Google Pay API response will return an encrypted payment method capable
 * of being charged by a supported gateway after payer authorization
 *
 * @todo check with your gateway on the parameters to pass
 * @see {@link https://developers.google.com/pay/api/web/reference/request-objects#gateway|PaymentMethodTokenizationSpecification}
 */
const tokenizationSpecification = {
  type: 'PAYMENT_GATEWAY',
  parameters: {
    'gateway': 'example',
    'gatewayMerchantId': 'exampleGatewayMerchantId'
  }
};

/**
 * Describe your site's support for the CARD payment method and its required
 * fields
 *
 * @see {@link https://developers.google.com/pay/api/web/reference/request-objects#CardParameters|CardParameters}
 */
const baseCardPaymentMethod = {
  type: 'CARD',
  parameters: {
    allowedAuthMethods: allowedCardAuthMethods,
    allowedCardNetworks: allowedCardNetworks
  }
};

/**
 * Describe your site's support for the CARD payment method including optional
 * fields
 *
 * @see {@link https://developers.google.com/pay/api/web/reference/request-objects#CardParameters|CardParameters}
 */
const cardPaymentMethod = Object.assign(
  {},
  baseCardPaymentMethod,
  {
    tokenizationSpecification: tokenizationSpecification
  }
);

/**
 * An initialized google.payments.api.PaymentsClient object or null if not yet set
 *
 * @see {@link getGooglePaymentsClient}
 */
let paymentsClient = null;

/**
 * Configure your site's support for payment methods supported by the Google Pay
 * API.
 *
 * Each member of allowedPaymentMethods should contain only the required fields,
 * allowing reuse of this base request when determining a viewer's ability
 * to pay and later requesting a supported payment method
 *
 * @returns {object} Google Pay API version, payment methods supported by the site
 */
function getGoogleIsReadyToPayRequest() {
  return Object.assign(
      {},
      baseRequest,
      {
        allowedPaymentMethods: [baseCardPaymentMethod]
      }
  );
}

/**
 * Configure support for the Google Pay API
 *
 * @see {@link https://developers.google.com/pay/api/web/reference/request-objects#PaymentDataRequest|PaymentDataRequest}
 * @returns {object} PaymentDataRequest fields
 */
function getGooglePaymentDataRequest() {
  const paymentDataRequest = Object.assign({}, baseRequest);
  paymentDataRequest.allowedPaymentMethods = [cardPaymentMethod];
  paymentDataRequest.transactionInfo = getGoogleTransactionInfo();
  paymentDataRequest.merchantInfo = {
    // @todo a merchant ID is available for a production environment after approval by Google
    // See {@link https://developers.google.com/pay/api/web/guides/test-and-deploy/integration-checklist|Integration checklist}
    // merchantId: '01234567890123456789',
    merchantName: 'Example Merchant'
  };
  return paymentDataRequest;
}

/**
 * Return an active PaymentsClient or initialize
 *
 * @see {@link https://developers.google.com/pay/api/web/reference/client#PaymentsClient|PaymentsClient constructor}
 * @returns {google.payments.api.PaymentsClient} Google Pay API client
 */
function getGooglePaymentsClient() {
  if ( paymentsClient === null ) {
    paymentsClient = new google.payments.api.PaymentsClient({environment: 'TEST'});
  }
  return paymentsClient;
}

/**
 * Initialize Google PaymentsClient after Google-hosted JavaScript has loaded
 *
 * Display a Google Pay payment button after confirmation of the viewer's
 * ability to pay.
 */
function onGooglePayLoaded() {
  const paymentsClient = getGooglePaymentsClient();
  paymentsClient.isReadyToPay(getGoogleIsReadyToPayRequest())
      .then(function(response) {
        if (response.result) {
          addGooglePayButton();
          // @todo prefetch payment data to improve performance after confirming site functionality
          // prefetchGooglePaymentData();
        }
      })
      .catch(function(err) {
        // show error in developer console for debugging
        console.error(err);
      });
}

/**
 * Add a Google Pay purchase button alongside an existing checkout button
 *
 * @see {@link https://developers.google.com/pay/api/web/reference/request-objects#ButtonOptions|Button options}
 * @see {@link https://developers.google.com/pay/api/web/guides/brand-guidelines|Google Pay brand guidelines}
 */
function addGooglePayButton() {
  const paymentsClient = getGooglePaymentsClient();
  const button =
      paymentsClient.createButton({onClick: onGooglePaymentButtonClicked});
  document.getElementById('container').appendChild(button);
}

/**
 * Provide Google Pay API with a payment amount, currency, and amount status
 *
 * @see {@link https://developers.google.com/pay/api/web/reference/request-objects#TransactionInfo|TransactionInfo}
 * @returns {object} transaction info, suitable for use as transactionInfo property of PaymentDataRequest
 */
function getGoogleTransactionInfo() {
  return {
    countryCode: 'US',
    currencyCode: 'USD',
    totalPriceStatus: 'FINAL',
    // set to cart total
    totalPrice: '1.00'
  };
}

/**
 * Prefetch payment data to improve performance
 *
 * @see {@link https://developers.google.com/pay/api/web/reference/client#prefetchPaymentData|prefetchPaymentData()}
 */
function prefetchGooglePaymentData() {
  const paymentDataRequest = getGooglePaymentDataRequest();
  // transactionInfo must be set but does not affect cache
  paymentDataRequest.transactionInfo = {
    totalPriceStatus: 'NOT_CURRENTLY_KNOWN',
    currencyCode: 'USD'
  };
  const paymentsClient = getGooglePaymentsClient();
  paymentsClient.prefetchPaymentData(paymentDataRequest);
}

/**
 * Show Google Pay payment sheet when Google Pay payment button is clicked
 */
function onGooglePaymentButtonClicked() {
  const paymentDataRequest = getGooglePaymentDataRequest();
  paymentDataRequest.transactionInfo = getGoogleTransactionInfo();

  const paymentsClient = getGooglePaymentsClient();
  paymentsClient.loadPaymentData(paymentDataRequest)
      .then(function(paymentData) {
        // handle the response
        processPayment(paymentData);
      })
      .catch(function(err) {
        // show error in developer console for debugging
        console.error(err);
      });
}

/**
 * Process payment data returned by the Google Pay API
 *
 * @param {object} paymentData response from Google Pay API after user approves payment
 * @see {@link https://developers.google.com/pay/api/web/reference/response-objects#PaymentData|PaymentData object reference}
 */
function processPayment(paymentData) {
  // show returned data in developer console for debugging
    console.log(paymentData);
  // @todo pass payment token to your gateway to process payment
  paymentToken = paymentData.paymentMethodData.tokenizationData.token;
}

Кнопка вообще не отображается, кажется, что для отображения кнопки в этом примере не требуется API или настраиваемый закрытый / открытый ключ.

Не могли бы вы помочь мне.

С уважением.


person Rex NEBULAR    schedule 17.05.2020    source источник


Ответы (1)


Одной из возможных причин этого может быть страна, связанная с вашим аккаунтом Google.

Я обновил ваш JSFiddle, добавив в него выражение console.log: https://jsfiddle.net/ge37h05t/

function onGooglePayLoaded() {
  const paymentsClient = getGooglePaymentsClient();
  paymentsClient.isReadyToPay(getGoogleIsReadyToPayRequest())
      .then(function(response) {
        if (response.result) {
          addGooglePayButton();
          // @todo prefetch payment data to improve performance after confirming site functionality
          // prefetchGooglePaymentData();
        } else {
            console.log('Not ready to pay');
        }
      })
      .catch(function(err) {
        // show error in developer console for debugging
        console.error(err);
      });
}

Можете ли вы попробовать еще раз по указанной выше ссылке и проверить вывод консоли?

Один из способов убедиться, что это связано со страной, - это создать новую учетную запись Google в одном из поддержал страны и повторил попытку.

person Soc    schedule 18.05.2020
comment
Привет и спасибо за ваш ответ: jsfiddle display Acheter avec GPAY, соответствующий стране происхождения моего аккаунта Google (поддерживается Франция). Консоль возвращает: {apiVersion: 2, apiVersionMinor: 0, paymentMethodData: {description: Mastercard •••• ** 09 , info: {...}, tokenizationData: {...}, type: CARD}} На моем веб-сайте нет изменений, кнопка не отображается, я вставляю весь свой файл payg.html сюда jsfiddle.net/ReXNeB/ua2r6ph5 и кнопка появляется во всплывающем окне. С уважением - person Rex NEBULAR; 19.05.2020
comment
То есть вы говорите, что он работает с jsfiddle, но не на вашем сайте? Как вы тестируете свой HTML? Используется _1 _ / _ 2_ локально или file://? Трудно сказать, в чем проблема, не имея возможности воспроизвести ее. Можете ли вы попробовать воспроизвести это с помощью такого инструмента, как glitch, и поделиться им? - person Soc; 19.05.2020
comment
Здравствуйте, я использую https: // на общедоступной тестовой странице html. Сервером управляет Plesk: глюк работает: glitch.com/~polyester-thorn-raven. С уважением. - person Rex NEBULAR; 20.05.2020
comment
Если тот же код работает с ошибкой, но не на вашем собственном сервере, это должно быть проблема конфигурации сервера. Можете ли вы поделиться URL-адресом тестовой страницы, над которой она не работает? Трудно сказать, в чем проблема, не имея возможности наблюдать напрямую. В противном случае проверьте консоль браузера на наличие ошибок и предупреждений. Можно начать с заголовков ответов, например Content-Security-Policy. - person Soc; 20.05.2020
comment
Я разместил свой код в другом домене, вот ссылка на тестовую страницу rexneb.ovh/TEMP/payg. html не работает. Я поставил его на другой сервер (стандартный Debian Apache и PHP, без Plex), он больше не работает. Я тестирую все ссылки с помощью 4 разных браузеров и со своего телефона с другим IP. На самом деле не понимаю (РЕДАКТИРОВАТЬ: поскольку я не понимаю ни одного javascript, я не могу отлаживать даже с помощью консоли). С уважением - person Rex NEBULAR; 20.05.2020
comment
Вы получаете ошибку Uncaught SyntaxError: Unexpected identifier, потому что HTML недействителен. JSFiddle позволяет использовать фрагменты HTML для удобства, но не должен использоваться как есть. Я включил полный HTML-код, который вы должны использовать здесь: jsfiddle.net/m9vkz3dp - person Soc; 20.05.2020
comment
Теперь он работает, большое вам спасибо. С уважением. - person Rex NEBULAR; 21.05.2020