Как смешать javascript paymentRequest Stripe с PHP-обработкой на стороне сервера при интеграции Apple Pay - PullRequest
0 голосов
/ 06 марта 2019

Я использую элементы Stripe для выполнения асинхронного платежного запроса для взимания платы с клиентов.Запрос возвращает «успех» независимо от результата начисления, так как лучше всего вернуть состояние, чтобы я мог обработать клиентскую часть состояния начисления и сообщить о невыполненном начислении?Нужно ли использовать конечные точки?Полоса, кажется, оставляет нас висеть после зарядки без руководства.

Слушатель:

<script>    
    paymentRequest.on('token', function(ev) {

        fetch('https://example.com/pub/apple.php', {
        method: 'POST',
        body: JSON.stringify({token: ev.token.id , email: ev.token.email}),
        headers: {'content-type': 'application/json'},
    })
      .then(function(response) {
        if (response.ok) {

          // Report to the browser that the payment was successful, prompting
          // it to close the browser payment interface.

          ev.complete('success');

        } else {

          // Report to the browser that the payment failed, prompting it to
          // re-show the payment interface, or show an error message and close
          // the payment interface.

          ev.complete('fail');
        }
  });
});
    </script>

https://example.com/pub/apple.php:

require_once('../_stripe-php-4.9.0/init.php');

// Retrieve the request's body and parse it as JSON
$input = @file_get_contents("php://input");
$json = json_decode($input);

// get the token from the returned object

$token = $json->token;
$email = $json->email;

$skey = 'sk_test_Y********************F';  

\Stripe\Stripe::setApiKey($skey);  

//  create the customer

$customer = \Stripe\Customer::create(array(
          "source" => $token,
           "description" => 'Device',
           "email" => $email)
        );  



    //charge the card    

    $charge = \Stripe\Charge::create(array(
              "amount" => 1000, 
              "currency" => 'GBP',
              "statement_descriptor" => 'MTL',
              "description" => 'Device - '.$customer->id,
              "customer" => $customer->id)
            );

1 Ответ

0 голосов
/ 06 марта 2019

Чтобы дать пользователю знать, что его заряд не удался, и вызвать ev.complete('fail'); в приведенном выше коде, вам потребуется response.ok в вашем запросе на получение, чтобы вернуть false.

Давайте сначалапосмотрите определение этого свойства response.ok,

Свойство ok только для чтения интерфейса Response содержит логическое значение, указывающее, был ли ответ успешным (состояние в диапазоне 200-299) или нет.

через https://developer.mozilla.org/en-US/docs/Web/API/Response/ok

Таким образом, для успешного запроса вы хотите, чтобы PHP возвращал статус 2xx (скажем, 200), а для отказа - не 200Код состояния HTTP (скажем, 402).

В вашем PHP вы попытаетесь сделать Charge, а затем получите ответ от Stripe.Основываясь на этом ответе, вы должны заставить PHP возвращать статус вашему интерфейсу - либо 200 OK, либо 402 ошибка.

Вы можете сделать это с помощью функции http_response_code(), например, http_response_code(200) или http_response_code(402)

http://php.net/manual/en/function.http-response-code.php

Давайте рассмотрим упрощенный пример

try {
  // make a charge
  $charge = \Stripe\Charge::create(array(
    "amount" => 1000, 
    "currency" => 'GBP',
    "source" => $token
  ));

  // send a 200 ok
  http_response_code(200);
  print("Charge successful");

} catch(\Stripe\Error\Card $e) {
  // Since it's a decline, \Stripe\Error\Card will be caught
  $body = $e->getJsonBody();
  $err  = $body['error'];

  // this charge declined, return a 402
  // response.ok should then be false
  http_response_code(402);
  print('Error:' . $err['message']);
}

Вызов Charge здесь заключен в блок try-catch.Если оплата прошла успешно, отправляется HTTP-код ответа 200, и response.ok будет иметь значение true.

Если пользователь предоставляет отклоненную карту, эта ошибка будет обнаружена, и будет возвращен 402 код ответа HTTP (вместе с сообщением об ошибке).В этом случае response.ok будет false, поэтому будет вызван ev.complete('fail');.

Есть некоторые другие типы ошибок Stripe, которые вы, вероятно, хотите отловить, полная ссылка здесь,

https://stripe.com/docs/api/errors https://stripe.com/docs/api/errors/handling

...