我正在尝试设置数据条以从HTML表单获取动态付款金额。此表单位于如下所示的checkout.html页面上:
<html>
<header>
<title>checkout</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js"></script>
<script src="https://checkout.stripe.com/checkout.js"></script>
</header>
<body>
<form id="myForm" action="/charge" method="post">
<input type="hidden" id="stripeToken" name="stripeToken" />
<input type="hidden" id="stripeEmail" name="stripeEmail" />
<input type="text" id="item1price" value="253">
<input type="text" id="item2price" value="167">
<button id="customButton">Purchase</button>
<script>
//change secret key later!
var handler = StripeCheckout.configure({
key: 'pk_test',
image: 'img/stripe.png',
locale: 'auto',
token: function(token) {
// You can access the token ID with `token.id`.
// Get the token ID to your server-side code for use.
$("#stripeToken").val(token.id);
$("#stripeEmail").val(token.email);
$("#myForm").submit();
}
});
document.getElementById('customButton').addEventListener('click', function(e) {
//add up each price in array to get total cost
var total = 100;
// ...
//insert total variable into hidden html text field
function insertText(){
document.getElementById('chargeAmount').value = total;
}
insertText();
// Open Checkout with further options:
handler.open({
name: 'test company',
description: "test desc",
amount: total * 100
});
e.preventDefault();
});
// Close Checkout on page navigation:
window.addEventListener('popstate', function() {
handler.close();
});
</script>
<input type="hidden" id="chargeAmount" name="chargeAmount" />
</form>
</body>
</html>
我的server.js中也有以下代码:
app.get('/pay', function (req, res) {
res.sendFile( __dirname + "/checkout.html" );
});
app.get('/paysuccess', function (req, res) {
res.sendFile( __dirname + "/paySuccess.html" );
});
app.post('/charge', function (req, res) {
var token = req.body.stripeToken;
console.log(token);
var chargeAmount = req.body.chargeAmount;
console.log(chargeAmount);
var charge = stripe.charges.create({
amount: chargeAmount,
currency: "usd",
source: token
}, function(err, charge){
if(err & err.type ==="StripeCardError"){
console.log("your card was declined.");
}
});
res.redirect('/paysuccess');
})
当我浏览到localhost / pay时,出现checkout.html。我在价格框中输入信息,我有代码将在表中输入的价格加起来并返回总数,在测试付款卡中输入信息,然后将我带到/ paysuccess页面。但是控制台说chargeAmount和stripeToken都未定义。我让他们登录了/ charge函数。我拿出一些我认为不相关的专有代码,但是当我使用
req.body.stripeToken
和req.body.chargeAmount
调用stripeToken和chargeAmount时,为什么有人定义我的代码,有人能看到我的问题吗?谢谢。编辑-我取消隐藏所有的html表单以查看它们的值。在页面加载时,stripeToken和stripeEmail值为空,但是在完成使用测试卡的测试付款后,将填充它们。我相信我的错误就在于它获取html表单的值。我看到了这篇文章:
https://stackoverflow.com/questions/41712850/stripe-js-resolve-cannot-read-property-stripetoken-of-undefined?rq=1
并将该答案添加到了我的代码中。它似乎有效,但是现在我遇到一个错误,说err为null。if(err & err.type ==="StripeCardError"){
^
TypeError: Cannot read property 'type' of null
问题所在的行在我的server.js的/ charge函数中。
最佳答案
stripe.charges.create
是异步的,因此您要先获取res.redirect
,然后再获得chargeToken值。您也不会在响应中将其传递回去,因此我不确定您希望从何处获取它。
关于node.js - 在结帐页面中未定义stripeToken和chargeAmount,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44619874/