我到处寻找答案,但没有找到解决办法。我正在使用条纹收费用户,然而,付款不应该硬编码,因为价格的变化取决于不同的问题回答。我想做的是获取确认页面(HTML)上给出的“总价格”,并将该价格记为Stripe(使用Node)。
我目前有标记化工作和收费是成功时,数额是硬编码,但我需要收费数额的变化。有人知道Stripe(www.Stripe.com)是否可以做到这一点吗?
我的app.js文件(部分):
// charge route
app.post('/charge', (req, res) => {
const amount = 2500; <-- needs to change to not be hardcoded
stripe.customers.create({
email: "[email protected]",
source: req.body.mytoken
})
.then(customer => {
stripe.charges.create({
amount,
description:'item desc',
currency:'usd',
customer:customer.id
})})
.then(charge => res.send('success'));
});
const port = process.env.PORT || 5000;
app.listen(port, () => {
console.log(`Server started on port ${port}`);
});
更新
我还想从输入表单更新用户的电子邮件信息,而不是像现在这样硬编码:
email: "[email protected]"
第二次更新
条纹形式:
<div class="" style="margin-top: 60px;">
<h2 class="quote-info">Estimated total: $<span id="new_text"></span> USD</h2>
</div>
<!-- Payment form -->
<form action="/charge" method="post" id="payment-form">
<div class="form-row">
<label for="card-element">
Credit or debit card
</label>
<div id="card-element">
<!-- a Stripe Element will be inserted here. -->
</div>
<!-- Used to display form errors -->
<div id="card-errors"></div>
</div>
<button>Submit Payment</button>
</form>
在脚本标记的HTML页底部找到的函数:
function stripeTokenHandler(token) {
var form = document.getElementById('payment-form');
var hiddenInput = document.createElement('input');
hiddenInput.setAttribute('type', 'hidden');
hiddenInput.setAttribute('name', 'stripeToken');
hiddenInput.setAttribute('value', token.id);
form.appendChild(hiddenInput);
var formData = JSON.stringify({
mytoken: token.id
});
$.ajax({
type: "POST",
url: "/charge",
data: formData,
success: function(){alert("done")},
dataType: "json",
contentType: "application/json"
});
form.submit();
}
最佳答案
您需要在Express中从表单中检索POST数据。
方法1(隐藏输入)
基于当前实现的最小阻力路径。
首先,您需要确保将总金额从表单传递到后端:
function stripeTokenHandler(token) {
var form = document.getElementById('payment-form');
var token = document.createElement('input');
token.setAttribute('type', 'hidden');
token.setAttribute('name', 'stripeToken');
token.setAttribute('value', token.id);
var totalAmount = document.createElement('input');
token.setAttribute('type', 'hidden');
token.setAttribute('name', 'totalAmount');
token.setAttribute('value', $('#new_text').innerHTML);
// or, prefereably, grab this directly from the var you're using to update the #new_text span's value
form.appendChild(token);
form.appendChild(totalAmount);
// You could also just use the variables here (i.e. token.id) instead of grabbing it from the inputs generated above
var formData = JSON.stringify({
mytoken: token.value,
totalAmount: totalAmount.value
});
// You're not actually referencing the form here, so you don't technically need to append the inputs above.
// I've only included them for consistency. You're setting the values to be submitted to /charge when you set
// the variable formData above and then passing it via the data property of $.ajax below.
$.ajax({
type: "POST",
url: "/charge",
data: formData,
success: function(){alert("done")},
dataType: "json",
contentType: "application/json"
});
form.submit();
}
那么你应该能够做到:
app.post('/charge', (req, res) => {
const amount = req.param('totalAmount');
...
方法2(命名路由参数)
在这种情况下,您不会向表单添加隐藏的输入,而是更新
action
,使表单类似于:action="/charge/TOTAL_AMOUNT/EMAIL"
然后修改快速路线以引用此值,如:
app.get('/charge/:totalAmount/:email', (req, res) => {
const amount = req.params.totalAmount;
const email = req.params.email;
...
Scotch.io also has a great explanation of handling POST parameters in Express.