Я думаю, что стоит сделать шаг назад и пересмотреть основы. Во-первых, чтобы обеспечить безопасную транзакцию по кредитной карте и обеспечить соответствие PCI, Stripe предоставила библиотеку javascript, которая шифрует и передает конфиденциальные данные кредитной карты. Они предоставляют пример формы
Обратите внимание на то, что в форме нет действия отправки. Также обратите особое внимание на то, что ни одно из конфиденциальных полей карты не имеет атрибута имени. Эту форму нельзя никогда отправлять каким-либо другим способом, кроме предоставленного безопасным способом. Попытка сделать это влечет за собой ответственность.
Когда вы отправляете эту форму, используя предоставленный ими класс js (см. шаг 2), он дает вы возвращаете жетон карты, который, по вашему мнению, у вас уже есть. Вы можете сохранить этот токен карты в своей базе данных без каких-либо проблем с безопасностью - это просто произвольное число, которое ничего не значит для хакера.
Когда у вас есть этот токен, у вас есть два варианта:
- используйте его немедленно, чтобы произвести разовую зарядку, или
- сохраните его и создайте объект клиента, который вы можете заряжать несколько раз.
Вам нужно понять, что Stripe НЕ хранит этот токен карты! Если вы его потеряете, вы не сможете его вернуть. Вы должны создать новый. Кроме того, единственный способ использовать его для нескольких платежей - это создать объект клиента. Другими словами, ЕСЛИ вы не храните его на объекте клиента, он хорош только за разовую плату. Итак, если вы списываете с него счет до того, как прикрепить его к объекту клиента, он больше не действителен.
Теперь снова вернемся к основам, как описано в IOIO MAD, есть две вещи, которые вы должны сделать в верхней части любого php-файла, из которого вы хотите вызвать метод Stripe:
- включить библиотеку Stripe php
- установить секретный ключ
Открытый ключ используется только тогда, когда вы выполняете этот вызов 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