【问题标题】:Obtaining the charge amount from a stripe token using stripe API使用条带 API 从条带令牌中获取费用金额
【发布时间】:2014-06-02 16:00:28
【问题描述】:

目标:我有一个 html 页面,其中包含您可以购买的两种不同的物品。一个是 5 美元,另一个是 10 美元。我正在使用条纹来处理付款。当条纹创建支付令牌并将其提交到我的 process_charge.php 时,我想从通过 POST 提交的数据中提取费用金额。然后我可以用这个金额打电话给Stripe_Charge::create()

问题:金额没有提交到我的 PHP 表单,我不知道如何获取。

我的临时解决方案:我销售的每件商品都使用不同的 php 表单。然后为每个新项目创建一个新的 PHP 表单!!! 不理想

我目前正在使用此处列出的嵌入式表单方法:https://stripe.com/docs/tutorials/checkout

我的订单页面是这样的。

<div class="payment-options">
    <form action="process_card.php" method="POST">
        <script
            src="https://checkout.stripe.com/checkout.js" class="stripe-button"
            data-key="pk_test_PUBLIC_KEY_FOR_TESTING"
            data-amount="1000"
            data-name="Nice Lint"
            data-description="High quality belly button lint."
            data-image="images/nice-lint.svg"
            data-panel-label="Checkout {{amount}}"
            data-label="Pay with Credit Card"
            data-billing-address="true"
            data-shipping-address="true">
        </script>
    </form>
</div>

所以这很好用。它需要客户的信息、他们的送货/账单地址和他们的信用卡详细信息。然后它生成一个收费令牌并将其提交给process_card.php。在那里我可以获取令牌并执行以下操作:

if ($_POST) {
  Stripe::setApiKey("sk_test_SECRET_KEY_FOR_TESTING");
  try {
    if (!isset($_POST['stripeToken']))
      throw new Exception("The Stripe Token was not generated correctly");
    Stripe_Charge::create(array("amount" => '1000'],
                                "currency" => "usd",
                                "card" => $_POST['stripeToken']));
  }
  catch (Exception $e) {
    $error = $e->getMessage();
  }
}

在这里,我获取通过 POST 提交的令牌,并使用他们的 API 将其发送到条带。金额、货币和卡令牌是必填字段。您可以看到令牌是从POST 数据中提取的,但我必须发送一个文字字符串来表示金额。这一切都很好而且很花哨,直到我拥有不止一种产品/服务并且我有不同的形式来生成不同数量的代币并将它们发送到我的process_card.php。然后那个文字字符串看起来不再快乐了。他那愚蠢的笑容立刻从他那张愚蠢的脸上消失了。

所以无论如何,我检查了所有POST 数据以查看是否有任何提交的字段包含金额,以便我可以将其传递。所以我只是做了一个小循环来查看提交的内容:

foreach ($_POST as $key => $value) {
    echo "key: " . $key . "  -  " . $value . "<br>";
}

它给了我这个:

key: stripeToken - tok_youShouldDefinitelyPostThisTokenOnAPublicWebsite
key: stripeEmail - super.real.email@aol.com
key: stripeBillingName - asdf
key: stripeBillingAddressLine1 - asdf
key: stripeBillingAddressZip - 12345
key: stripeBillingAddressCity - Schenectady
key: stripeBillingAddressState - NY
key: stripeBillingAddressCountry - United States
key: stripeBillingAddressCountryCode - US
key: stripeShippingName - asdf
key: stripeShippingAddressLine1 - asdf
key: stripeShippingAddressZip - 12345
key: stripeShippingAddressCity - Schenectady
key: stripeShippingAddressState - NY
key: stripeShippingAddressCountry - United States
key: stripeShippingAddressCountryCode - US

没有金额。嘘。所以去 API 文档看看我是否能找到解决方案。我能找到的最接近的东西是Stripe_Charge::retrieve({CHARGE_ID}); ,可以在这里找到:https://stripe.com/docs/api/php#retrieve_charge。但是,这仅适用于成功处理的费用。

所以我被困住了。想不通。我能想到的最佳解决方案是在我提供的嵌入式表单中添加一个&lt;input type="hidden" name="amt" value="1000" /&gt; 行,这样我就可以通过$_POST['amt'] 提取金额。问题在于我不知道它是否符合 PCI 标准。在条带站点/api/docs 上的许多地方,他们告诉您不要在其表单中包含名称字段,这样您就不会在您的网站上从一个页面到另一个页面传递敏感信息,所以我认为“比抱歉更安全”。是否有另一种处理方式或一些我不知道的最佳做法?

**抱歉,拖了这么久。我真的尽了最大的努力尝试自己解决它,我想提供尽可能多的信息。

【问题讨论】:

  • 我也想知道,他们的结帐示例有硬编码的金额。看着用金额的隐藏字段做同样的事情,但不禁认为这是错误和不安全的,但可能会做我需要的事情

标签: javascript php html stripe-payments


【解决方案1】:

通过将价格放入表单中(只要您使用 SSL),我没有看到任何关于 PCI 合规性的问题。但是,这将允许他们在提交之前简单地编辑 HTML 输入,并获得比您希望的便宜得多的项目。您可以通过使用带有产品表的数据库并在隐藏的输入字段中引用产品 ID 来解决此问题。

【讨论】:

  • 谢谢。我花了更多时间研究应该保护哪些内容以符合 PCI 合规性。在仔细阅读了official documentation 并阅读了informative blog post 之后,我发现事务的数量不被视为受保护的数据。
  • 另外,关于有人能够更改金额,我们并不真正担心。我们现在是一家产量非常低的公司,因此自动化程度不足以让类似的事情溜走。如果发生了一些奇怪的收费,我相信您可以使用 Stripe 仪表板退款,那么我们可以联系客户,看看这是否是一个奇怪的错误,并要求他们重新收费。我认为我计划做的唯一数量验证是确保它是一个数字,并确保它 > 0。非常感谢您的帮助。希望我能投票给你。
猜你喜欢
  • 2021-06-04
  • 2016-08-22
  • 1970-01-01
  • 1970-01-01
  • 2014-04-23
  • 2015-08-25
  • 2017-10-31
  • 2014-03-19
  • 1970-01-01
相关资源
最近更新 更多