4

我正在使用 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" => "payinguser@example.com")
               );
                } catch(Stripe_CardError $e) {
               // The card has been declined
                }

你可以在这里看到他们是如何解释的: https ://stripe.com/docs/tutorials/charges

这就是事情出错的地方。1) 在这段代码中,哪里真正指出了要收取什么卡?!我的私人仪表板中有卡的令牌 ID 号。我现在需要给它充电,但这段代码并没有说明这张卡的任何信息。我看到的唯一地方是:

          $token = $_POST['stripeToken'];

'stripeToken' 我要在这里输入卡的 ID 号吗?

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

谁能看到我做错了什么?谢谢!

4

2 回答 2

18

我认为值得退后一步,回顾一下基础知识。首先,为了提供安全的信用卡交易,并确保 PCI 合规性,Stripe 提供了一个 javascript 库来加密和传输敏感的信用卡数据。他们提供了一个示例表格

请注意表单没有提交操作这一事实。还要特别注意没有一个敏感卡字段具有名称属性的事实。除了他们提供的安全方法之外,不得通过任何其他方式提交表格。尝试这样做会使您承担责任。

当您提交该表单时,使用他们提供的 js 类(请参见步骤 2),它会返回您说您已经拥有的卡令牌。您可以将该卡令牌存储在您的数据库中而不会出现任何安全问题——它只是一个任意数字,对黑客来说没有任何意义。

获得该令牌后,您有两个选择:

  1. 立即使用它进行一次性充电,或
  2. 存储它并创建一个可以多次收费的客户对象。

您需要意识到的是,Stripe 不存储该卡令牌!如果你失去了它,你就无法找回它。你必须生成一个新的。此外,您可以将其用于多次收费的唯一方法是创建一个客户对象。换句话说,除非您将其存储在客户对象上,否则它只适用于一次充电。因此,如果您在将其附加到客户对象之前对其进行收费,则它不再有效

现在再次回到基础,正如 IOIO MAD 所描述的,您必须在要从中调用 Stripe 方法的任何 php 文件的顶部做两件事:

  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" => "payinguser@example.com")
    );
} catch(Stripe_CardError $e) {
    // The card has been declined
}
?>

如果您仍然遇到问题,请使用适当的调试技巧来检查您的 $_POST 变量是否包含卡片哈希。如果一切都失败了,请联系 Stripe 客户支持。他们的 API 是一流的,他们的文档和支持也是如此。

EDIT 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”的隐藏输入字段,其中包含令牌值。您可以从表单中获取该令牌并稍后提交。或者,您可以收听“令牌”事件,该事件将绑定到您的按钮:

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

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

免责声明:我还没有使用简单的结帐方法。此代码未经测试

于 2013-04-12T16:32:47.670 回答
3

我认为您可能缺少一些“包含”, Class 'Stripe' not found 这意味着在调用之前没有包含由“Stripe”类组成的 PHP 文件@

注意:需要 PHP >= 5.2 环境

下载Stripe PHP 库

将其提取到您的家中!

让我们创建一个名为 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!
于 2013-04-12T02:20:20.660 回答