使用stripe API从stripe令牌获取收费金额

Obtaining the charge amount from a stripe token using stripe API

本文关键字:stripe 金额 获取 令牌 API 使用      更新时间:2023-09-26

目标:我有一个html页面,其中有两个不同的项目,您可以购买。一个是5美元,另一个是10美元。我正在使用stripe处理付款。当stripe创建一个支付令牌并将其提交给我的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将其发送到stripe。金额、货币和卡令牌是必填字段。您可以看到令牌是从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。然而,这仅适用于成功处理的指控。

所以我被卡住了。搞不清楚。我能想到的最好的解决方案是在提供的嵌入表单中添加一行<input type="hidden" name="amt" value="1000" />,这样我就可以通过$_POST['amt']提取金额。问题是,我不知道它是否符合PCI。在stripe site/api/docs的许多地方,他们告诉你不要在表单中包含名称字段,这样你就不会在网站上的页面之间传递敏感信息,所以我认为"安全总比抱歉好"。是否有其他处理方法或我不知道的最佳实践?

**抱歉时间太长了。我真的尽了最大的努力,试图自己解决这个问题,我想提供尽可能多的信息。

通过在表单中列出价格(只要您使用SSL),我看不出PCI合规性有任何问题。然而,这将允许他们在提交前简单地编辑HTML输入,并以比您希望的便宜得多的价格获得项目。您可以通过使用带有产品表的数据库并在隐藏的输入字段中引用产品ID来绕过这一点。

我通过使用AJAX生成每个按钮来解决这个问题,将数据发送到php文件,并在选择时重新生成按钮,当按钮单击时,每个按钮都是唯一的