Я неправильно использую этот PHP-код? (работает с Stripe)

Я использую Stripe в качестве платежного шлюза. Я могу успешно получить «токен» карты, как его называет Stripe, что объясняется здесь: https://stripe.com/docs/checkout#api. Хорошо. Я успешно получил токен на панели инструментов полосы. Теперь мне нужно фактически зарядить эту карту (токен). Вот как они выразились: «У вас есть данные кредитной карты пользователя, что теперь? Теперь вы снимаете с них деньги. Это происходит на вашем сервере, и самый быстрый способ сделать это - использовать одну из наших клиентских библиотек». Ну, они предоставляют необходимый php прямо на этой странице:

        // Set your secret key: remember to change this to your live secret key in          production
       // See your keys here https://manage.stripe.com/account
        Stripe::setApiKey("sk_test_68YYnDTKPzcxxRZbkxEJtOVq");

        // Get the credit card details submitted by the form
        $token = $_POST['stripeToken'];

        // Create the charge on Stripe's servers - this will charge the user's card
         try {
          $charge = Stripe_Charge::create(array(
           "amount" => 1000, // amount in cents, again
             "currency" => "usd",
             "card" => $token,
              "description" => "[email protected]")
               );
                } catch(Stripe_CardError $e) {
               // The card has been declined
                }

Вы можете увидеть, как именно они это объясняют, здесь: https://stripe.com/docs/tutorials/charges

Здесь все идет не так. 1) Где в этом коде на самом деле указано, какую карту заряжать ?! У меня есть идентификационный номер токена карты в моем личном кабинете. Теперь мне нужно зарядить ее, но этот код ничего не говорит о карте. Единственное место, которое я вижу:

          $token = $_POST['stripeToken'];

'stripeToken' можно ли указать здесь идентификационный номер карты?

2) Я создал простую страницу для запуска:

 <div id="payment">


    <form action="charge-cards.php">
        <?php require 'Stripe.php';?>

        <input type="submit">
</form>


</div><!--end payment-->

"charge-cards.php" - это код, предоставленный Stripe вверху. Когда я нажимаю "Отправить", я получаю следующую ошибку:

    Fatal error: Class 'Stripe' not found in /home/preemin/public_html/fun.dit       /testing/charge-cards.php on line 5

Кто-нибудь может понять, что я делаю не так? Спасибо!


person Anthony Myers    schedule 12.04.2013    source источник
comment
может быть вам не хватает некоторых включить!   -  person internals-in    schedule 12.04.2013
comment
у вас красный stripe.com/docs/checkout/guides/php? где они сказали: давайте создадим файл с именем config.php, в котором мы собираемся настроить начальную конфигурацию. вы скачали библиотеку Stripe PHP?   -  person internals-in    schedule 12.04.2013
comment
Спасибо за ваш ответ! Да, я загрузил Stripe.php на свой сервер, и в форму выше я включил: ‹? Php require 'Stripe.php';?›   -  person Anthony Myers    schedule 12.04.2013
comment
ой! я ответил! Есть большие пальцы! если я прав!   -  person internals-in    schedule 12.04.2013
comment
Загляните в этот блог larryullman.com / 2012/11/07 /. В этом блоге подробно объясняется каждый этап списания оплаты.   -  person Chirag B    schedule 12.04.2013
comment
Спасибо. Я перечитаю его серию и посмотрю, не упустил ли я что-нибудь. Вроде все должно быть так просто!   -  person Anthony Myers    schedule 12.04.2013


Ответы (2)


Я думаю, что стоит сделать шаг назад и пересмотреть основы. Во-первых, чтобы обеспечить безопасную транзакцию по кредитной карте и обеспечить соответствие PCI, Stripe предоставила библиотеку javascript, которая шифрует и передает конфиденциальные данные кредитной карты. Они предоставляют пример формы

Обратите внимание на то, что в форме нет действия отправки. Также обратите особое внимание на то, что ни одно из конфиденциальных полей карты не имеет атрибута имени. Эту форму нельзя никогда отправлять каким-либо другим способом, кроме предоставленного безопасным способом. Попытка сделать это влечет за собой ответственность.

Когда вы отправляете эту форму, используя предоставленный ими класс js (см. шаг 2), он дает вы возвращаете жетон карты, который, по вашему мнению, у вас уже есть. Вы можете сохранить этот токен карты в своей базе данных без каких-либо проблем с безопасностью - это просто произвольное число, которое ничего не значит для хакера.

Когда у вас есть этот токен, у вас есть два варианта:

  1. используйте его немедленно, чтобы произвести разовую зарядку, или
  2. сохраните его и создайте объект клиента, который вы можете заряжать несколько раз.

Вам нужно понять, что Stripe НЕ хранит этот токен карты! Если вы его потеряете, вы не сможете его вернуть. Вы должны создать новый. Кроме того, единственный способ использовать его для нескольких платежей - это создать объект клиента. Другими словами, ЕСЛИ вы не храните его на объекте клиента, он хорош только за разовую плату. Итак, если вы списываете с него счет до того, как прикрепить его к объекту клиента, он больше не действителен.

Теперь снова вернемся к основам, как описано в IOIO MAD, есть две вещи, которые вы должны сделать в верхней части любого php-файла, из которого вы хотите вызвать метод Stripe:

  1. включить библиотеку Stripe php
  2. установить секретный ключ

Открытый ключ используется только тогда, когда вы выполняете этот вызов javascript для отправки формы карты.

Если вы хотите снять деньги с карты немедленно, вам нужно повернуться направо и позвонить на сервер, отправив хэш карты, который вы только что получили. Вы можете сделать это с помощью ajax или вставить его в поле формы, которое вы затем опубликуете. Шаг 3 показывает вам, как это можно сделать.

Но давайте предположим, что вы хотите заняться другими делами, прежде чем фактически зарядить карту. Чтобы расширить ваш пример, скажем, я собрал свою карту клиента на одной странице, а затем на моей странице оформления заказа я хочу отправить платеж:

<?php
require('path/to/Stripe.php'); // MUST be done before any Stripe:: call
Stripe::setApiKey("sk_test_mkGsLqEW6SLnZa487HYfJVLf");

// retrieve stored card hash. Could have got it to this page in any number of
// ways, including: stored in cookie, stored in session, stored in database.
// Let's assume stored in session for sake of simplicity of example

$cardHash = $_SESSION['stripeToken'];
?>
<div id="payment">
    <form action="charge-cards.php">
        <?php require 'Stripe.php';?>
        <input name="stripeToken" type="hidden" value="<?= $cardHash ?>" />
        <input type="submit">
    </form>
</div>

Когда эта форма будет отправлена, charge-cards.php получит $cardHash из переменной $_POST, после чего вы собираетесь следовать пример, предоставленный Stripe:

<?php
require('path/to/Stripe.php'); // MUST be done before any Stripe:: call
Stripe::setApiKey("sk_test_mkGsLqEW6SLnZa487HYfJVLf");

// Get the credit card details submitted by the form
$token = $_POST['stripeToken'];

// Create the charge on Stripe's servers - this will charge the user's card
try {
    $charge = Stripe_Charge::create(array(
    "amount" => 1000, // amount in cents, again
    "currency" => "usd",
    "card" => $token,
    "description" => "[email protected]")
    );
} catch(Stripe_CardError $e) {
    // The card has been declined
}
?>

Если у вас все еще есть проблемы, используйте соответствующие навыки отладки, чтобы проверить, содержит ли ваша переменная $ _POST хэш карты. Если ничего не помогает, обратитесь в службу поддержки Stripe. Их API на высшем уровне, как и их документация и поддержка.

РЕДАКТИРОВАТЬ 4/15/13 OP использует метод быстрой проверки и использует настраиваемые кнопки. Большая часть вышеперечисленного все еще применима.

Код, описанный в разделе «Настраиваемые кнопки», назначает обработчик кликов настраиваемой кнопке, которая возвращает функцию обратного вызова, которая при выполнении добавляет скрытый ввод к форме, назначает stripeToken этому полю и отправляет форму. Непосредственно перед отправкой формы console.log или предупреждение stripeToken, чтобы убедиться, что у вас есть допустимое значение:

$('#customButton').click(function(){
  var token = function(res){
    var $input = $('<input type=hidden name=stripeToken />').val(res.id);

    // alert the value of stripeToken
    alert('stripeToken = ' + res.id);

    $('form').append($input).submit();
}; 

Это будет использоваться вместе с этим:

<form action="/charge" method="post">
  <script src="https://checkout.stripe.com/v2/checkout.js" class="stripe-button"
      data-key="pk_test_yourprivatekeyhere"></script>
</form>

Итак, что должно произойти, так это после того, как пользователь нажмет кнопку проверки, в форме должно быть скрытое поле ввода с именем stripeToken, которое содержит значение токена. Вы можете получить этот токен из формы и отправить его позже. В качестве альтернативы вы можете прослушивать событие 'token', которое будет привязано к вашей кнопке:

jQuery(function($){
  var $button = $('#customButton');

  $button.on('token', function(e, token){
    $button.after('<hr /><p>Your Stripe token is: <strong>' + token.id + '</strong></p>');
  });
});

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: я еще не использовал простой метод оформления заказа. Этот код не протестирован

person Codasaurus    schedule 12.04.2013
comment
Большое спасибо за отличный ответ! Я пытался проголосовать за него. Я думаю, что меня больше всего сбивает с толку то, что существует множество способов сделать то же самое. Я вижу кучу разных примеров и не знаю, какой метод использовать в моем случае. Мне нужно использовать их простой метод CHECKOUT, но с настраиваемыми кнопками и их Javascript API. Служба поддержки сообщает, что: Из журнала запросов видно, что токен не отправляется на POST при создании клиента. Так что я ошибаюсь. Я не собираю идентификатор токена, но я использую их собственный метод для этого, поэтому я не понимаю, как это может быть неправильно? - person Anthony Myers; 13.04.2013
comment
Похоже, вы создаете клиента, но не получаете должного доступа к идентификатору токена после его отправки на сервер - это еще одна вещь, о которой мне сообщили в службе поддержки. Поэтому, когда я использую ТОЧНЫЙ код, представленный на этой странице: stripe.com/docs/checkout#api, почему он не отправляет идентификатор токена на сервер? В основном мне нужно, чтобы пользовательский метод CHECKOUT (показанный по ссылке выше) работал с сохранением сведений о клиенте на будущее, что показано здесь: stripe.com/docs/tutorials/. - person Anthony Myers; 13.04.2013
comment
Stripe НЕ хранит этот жетон карты! Итак, я отправляю токен на свой сервер? Я думал, что токен карты идет на панель управления в бэкэнде Stripe. - person Anthony Myers; 13.04.2013
comment
Я признаю, что в их документации есть некоторые дыры, и есть несколько способов сделать то же самое. Но у всех разных способов разная цель;) - person Codasaurus; 15.04.2013
comment
Позвольте мне уточнить, что Stripe НЕ хранит этот жетон карты! Stripe хранит токен карты внутри ... но нет никакого способа получить его или увидеть его снова, когда он вам будет предоставлен (токен карты отличается от отпечатка пальца, который вы можете просмотреть на панели управления). В конечном итоге токен карты передается на серверы чередования, чтобы либо произвести разовую оплату, либо сохраниться на объекте клиента для последующих многократных списаний. Но, если вы не используете функцию быстрой проверки, она сначала отправляется на ваш сервер, откуда вы либо отправляете ее на полосу для создания единовременного платежа, либо объект клиента. - person Codasaurus; 15.04.2013
comment
вы заявляете. Обратите внимание на тот факт, что форма не имеет действия отправки .... тогда в вашем примере у вас есть файл в вашем действии отправки ???? Что он? - person Norman Bird; 26.06.2014
comment
Прежде всего, большое спасибо. У меня есть небольшая просьба о создании клиента без взимания платы напрямую. Если мы создадим клиента, мы сможем взимать с него плату в любое время, я прав? - person Pradeepta; 09.09.2016

я думаю, может быть вам не хватает некоторых "include", Class 'Stripe' not found означает, что файл PHP, состоящий из класса 'Stripe', не был включен до вызова @

Примечание: требуется среда PHP> = 5.2.

Загрузите библиотеку PHP Stripe

Распакуйте его в свой ДОМ!

Давайте создадим файл с именем config.php, в котором мы собираемся настроить начальную конфигурацию.

<?php
require_once('./lib/Stripe.php');

$stripe = array(
  "secret_key"      => "sk_test_mkGsLqEW6SLnZa487HYfJVLf",
  "publishable_key" => "pk_test_czwzkTp2tactuLOEOqbMTRzG"
);

Stripe::setApiKey($stripe['secret_key']);
?>

Затем в вашем файле кода ВЫШЕ (предполагает yours.php)

  include "config.php";
 // Get the credit card details submitted by the form
  $token = $_POST['stripeToken'];
 //rest as you go!
person internals-in    schedule 12.04.2013
comment
Хорошо, вот что так сбивает с толку в полосе! Думаю, есть много способов сделать это. Я вообще не знал о создании файла config.php! Фу. Хорошо, я попробую это и доложу. - person Anthony Myers; 12.04.2013
comment
Неустранимая ошибка: неперехваченное исключение «Stripe_CardError» с сообщением «Невозможно взимать плату с клиента, у которого нет активной карты» в /home/preemin/public_html/fun.dit/testing/stripephp/lib/Stripe/ApiRequestor.php Это так разочаровывает! Но где мы вообще говорим, с какой карты снимать деньги? - person Anthony Myers; 12.04.2013
comment
вы должны знать токен карты и разместить его на своей странице. Похоже, вы пытаетесь снять недействительный или использованный токен карты. См. Подробный ответ ниже - person Codasaurus; 12.04.2013