2013-04-12 43 views
3

我正在使用Stripe作为支付网关。我可以在Stripe调用它时成功获取一张卡片的“标记”,这里解释如下:https://stripe.com/docs/checkout#api 不错。我成功地在我的条纹仪表板中接收了该令牌。现在我需要做的是实际收取卡(令牌)。以下是他们如何说的:“你已经得到了用户的信用卡信息,现在是什么?现在你向他们收取钱,这发生在你的服务器上,最快的方法是使用我们的客户端库。”那么,他们提供正确的网页上所需要的PHP:我使用这个PHP代码错了吗? (使用Stripe)

 // 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)本代码中的哪个位置实际上确定要收取什么卡?我在我的私人仪表板中拥有该卡的令牌ID号。我现在需要收费,但是这个代码并没有说明卡片的任何内容。我看到的唯一现货是:

  $token = $_POST['stripeToken']; 

'stripeToken'我在这张卡的身份证号码?

2)我创建了一个简单的网页与运行此:

<div id="payment"> 


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

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


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

“充cards.php”是由条纹提供顶级的代码。当我点击提交,我得到了如下错误:

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

谁能明白我?!“在做错误的感谢

+0

可能是您缺少一些“包含”! –

+0

你有红色的https://stripe.com/docs/checkout/guides/php吗?他们在那里说“让我们创建一个名为config.php的文件,我们将在其中设置一些初始配置。”你有没有下载“条纹PHP库” –

+0

谢谢你的回复!是的,我已经将Stripe.php上传到我的服务器,并在上面的表单中包含:“<?php require'Stripe.php';?> –

回答

2

我觉得可能是你缺少一些‘有’,Class 'Stripe' not found指由班 '条纹' 的PHP文件没有包括呼叫@

注意前:一个PHP> = 5.2环境要求

下载The Stripe PHP library

将其提取到您的家!

让我们创建一个名为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! 
+0

好的,所以这就是条纹的混淆!有很多方法可以解决这个问题,我想。我没有意识到做了一个config.php文件!好吧,我会尝试这个并报告回来。 –

+0

“致命错误:未捕获异常'Stripe_CardError'带有消息'无法向没有活动卡的客户收费' in /home/preemin/public_html/fun.dit/testing/stripephp/lib/Stripe/ApiRequestor.php“This is fru strating!我们甚至在什么地方说什么卡? –

+0

IOIO MAD是正确的,但还有更多。 – Codasaurus

16

我认为这是值得的退后一步,并复习基础知识。首先,为了提供安全的信用卡交易,并确保PCI合规性,Stripe提供了一个JavaScript库,用于加密和传输敏感信用卡数据。他们提供一个example form

请小心注意表单没有提交操作的事实。还要特别注意这个事实,即没有敏感的卡片字段具有名称属性。此表格应该以从未通过他们提供的安全方法以外的其他方式提交。尝试这样做会使您承担责任。

当您使用他们提供的js课程(参见Step 2)提交该表单时,它将给您一个卡片标记,您说您已拥有该卡片标记。您可以将该卡片令牌存储在数据库中,而不存在任何安全问题 - 这只是一个任意数字,对黑客毫无意义。

一旦你的道理,你有两个选择:

  1. 使用它立即作出一次性收取,或
  2. 店,并创建一个客户对象,您可以充电多次。

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

现在回到基础再次,作为IOIO MAD描述的,也有要调用来自条法两件事情,你必须在任何PHP文件的顶部做:

  1. 包括条纹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> 

当表单提交,充cards.php会从$_POST变量得到$cardHash,于是你要遵循example given by 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正在使用quick checkout method并使用自定义按钮。以上大部分仍然适用。

在自定义按钮部分中列出的代码分配一个单击处理程序自定义按钮,它返回一个回调函数执行时,附加了一个隐藏的输入到表格中,stripeToken分配到该领域,并提交表单。在表单提交之前,控制台。日志或警报的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>'); 
    }); 
}); 

免责声明:我没有用简单的检验方法呢。此代码未经测试

+0

非常感谢您的回应!我试图加入它。我认为最让我失望的是似乎有很多方法可以做同样的事情。我看到一堆不同的例子,不知道在我的情况下使用哪种方法。我需要使用他们简单的CHECKOUT方法,但使用自定义按钮和他们的Javascript API。支持表示:“您可以从请求日志中看到该令牌没有在客户创建时被张贴。”所以我错了。我没有收集令牌ID,但是我正在使用他们自己的方法来做这件事,所以我不明白那可能是错的吗? –

+0

支持人员告诉我的另一件事是,“看起来您正在创建客户,但是一旦将其标记ID发送到服务器,就无法正确访问令牌ID”。因此,当我使用本页提供的EXACT代码时:https://stripe.com/docs/checkout#api,为什么它不会将令牌ID发布到服务器?基本上我需要的是自定义CHECKOUT方法(显示在上面的链接中)可以在“稍后保存客户详细信息”中使用,如下所示:https://stripe.com/docs/tutorials/charges#saving-credit卡片详情稍后。 –

+0

“条纹不存储该卡令牌!”那么,我将令牌发送给我自己的服务器?我认为该卡的令牌会转到条纹后端的仪表板。 –