**目标:**我有一个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站点/API/docs的许多地方,他们告诉你不要在表单中包含名称字段,这样你就不会“不要在你的网站上一页一页地传递敏感信息,所以我认为“安全总比抱歉好”。有没有其他的方法来处理这个问题,或者一些我不知道的最佳实践?
**很抱歉这么长时间。我真的尽了最大的努力试图自己解决这个问题,我想提供尽可能多的信息。
2条答案
按热度按时间r6hnlfcb1#
我不认为把他们的价格放在表单中会有任何PCI合规性问题(只要你使用SSL)。然而,这将允许他们在提交之前简单地编辑HTML输入,并获得比你希望他们便宜得多的项目。你可以通过使用带有产品表的数据库并在隐藏的输入字段中引用产品ID来绕过这个问题。
ttygqcqt2#
我已经解决了这个问题,通过使用 AJAX 为每个按钮生成,发送数据到php文件,并重新生成按钮的选择和按钮点击时,每个按钮都是唯一的