问题描述
环境:快速,快速会话,条带化
在下面的简化示例中,当用户请求主页express-session
时,向该用户分配会话cookie。刷新页面将保留与访问成功或失败路由相同的会话ID。单击升级按钮会将客户端带到一个Stripe购物车屏幕,该屏幕也保持相同的会话ID。但是,一旦用户到达Stripe购物车,如果用户进行了成功的购买,他将被转发到成功路线,并且会话ID被Stripe覆盖。在完整版本中,这是一个问题,因为用户将登录,并且这导致用户在成功购买后自动注销。我不确定为什么会这样或如何阻止它。
app.js
const bodyParser = require('body-parser');
require('dotenv').config();
const express = require('express');
const session = require('express-session');
const stripe = require('stripe')(process.env.STRIPE_SECRET_KEY);
const app = express();
app.set('view engine','ejs');
app.use(express.static('views'));
app.use(
session({
maxAge: 24 * 60 * 60 * 1000,name: 'randomName',resave: false,saveUninitialized: true,secret: 'randomSecret',cookie: {
sameSite: true,secure: false
}
})
);
app.get('/',function(req,res) {
req.session.userValues = true;
console.log(req.session);
res.render('index',{ stripePublicKey: process.env.STRIPE_PUBLIC_KEY });
});
app.get('/success',res) {
console.log(req.session);
res.render('success');
});
app.get('/fail',res) {
console.log(req.session);
res.render('fail');
});
app.post('/create-checkout-session',bodyParser.raw({ type: 'application/json' }),async function(req,res) {
console.log(req.session);
const session = await stripe.checkout.sessions.create({
submit_type: 'auto',payment_method_types: ['card'],line_items: [
{
price_data: {
currency: 'usd',product_data: {
name: 'name of product',description: 'description of product'
},unit_amount: 100
},quantity: 1,}
],locale: 'en',mode: 'payment',success_url: 'http://localhost:8080/success',cancel_url: 'http://localhost:8080/fail'
});
res.json({ id: session.id });
});
app.listen(8080,function() {
console.log('listening on port 8080');
});
index.js
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>Upgrade</title>
<script>var stripePublicKey = '<%- stripePublicKey %>';</script>
<script defer src="https://js.stripe.com/v3/"></script>
<script defer src="checkout.js"></script>
</head>
<body>
<button id="checkout-button">upgrade premium</button>
</body>
</html>
checkout.js
var stripe = Stripe(stripePublicKey);
var checkoutButton = document.getElementById('checkout-button');
checkoutButton.addEventListener('click',checkoutSequence);
function checkoutSequence() {
fetch('/create-checkout-session',{
method: 'POST',})
.then(function(response) {
return response.json();
})
.then(function(session) {
console.log(session);
return stripe.redirectToCheckout({ sessionId: session.id });
})
.then(function(result) {
if (result.error) {
alert(result.error.message);
}
})
.catch(function(error) {
console.error('Error:',error);
});
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)