我已经使用了 sslcommerz 支付网关,但是当我成功完成交易时,它没有在仪表板页面中重定向我,而是抛出了以下错误: UnhandledPromiseRejectionWarning:TypeError:无法读取未定义的属性“_id” 支付网关的代码是:
const express = require( 'express' );
const router = express.Router();
const SSLCommerzPayment = require( "sslcommerz" );
const User = require( '../models/user' );
const crypto = require( 'crypto' );
router.get( '/charge', isLoggedIn, ( req, res ) =>{
User.findById( req.user._id, ( err, user ) => { res.render( 'payments/recharge', { user } ); } )
})
router.post( '/charge', isLoggedIn, async ( req, res ) =>
{
const id = crypto.randomBytes( 16 ).toString( "hex" );
const { amount } = req.body;
console.log( id + " " + amount );
const user = await User.findById( req.user._id )
console.log( user.PhoneNumber );
const data = {
//transaction info
total_amount: amount,
currency: 'BDT',
tran_id: id,
cus_name: user.username,
cus_email: user.email,
cus_phone: user.PhoneNumber,
//redirection urls
success_url: `http://localhost:8000/payment/ssl-payment-success`,
fail_url: `http://localhost:8000/payment/ssl-payment-fail`,
cancel_url: `http://localhost:8000/payment/ssl-payment-cancel`,
ipn_url: `http://localhost:8000/payment/ssl-payment-notification`,
//will not be needed for our A2F but if we delete it sslcommerz will not work
shipping_method: 'No',
product_name: 'Computer.',
product_category: 'Electronic',
product_profile: 'general',
};
const sslcommerz = new SSLCommerzPayment( process.env.STORE_ID, process.env.STORE_PASSWORD, false ) //true for live default false for sandbox
sslcommerz.init( data ).then( data =>
{
console.log( data.GatewayPageURL )
if ( data.GatewayPageURL )
{
return res.status( 200 ).redirect( data.GatewayPageURL );
}
else
{
return res.status( 400 ).json( {
message: "Session was not successful"
} );
}
} );
} );
router.post("/ssl-payment-notification", async (req, res) => {
return res.status(200).json(
{
data: req.body,
message: 'Payment notification'
}
);
})
router.post("/ssl-payment-success", async (req, res) => {
const user = await User.findById( req.user._id )
user.wallet += Number(req.body.store_amount);
user.save();
return res.redirect( '/user/dashboard' );
})
router.post("/ssl-payment-fail", async (req, res) => {
return res.status(200).json(
{
data: req.body,
message: 'Payment failed'
}
);
})
router.post("/ssl-payment-cancel", async (req, res) => {
return res.status(200).json(
{
data: req.body,
message: 'Payment cancelled'
}
);
})
function isLoggedIn( req, res, next )
{
// console.log(req.isAuthenticated());
if ( req.isAuthenticated() )
{
return next();
}
res.redirect( '/user/login' );
}
module.exports = router;
app.js代码:
//App creation
const express = require("express");
const app = express();
//port setup
require('dotenv').config();
const port = process.env.PORT || 8080;
//body parser configutation
const bodyParser = require('body-parser');
app.use(bodyParser.urlencoded({extended: true}));
//morgan configuration
const morgan = require('morgan');
app.use(morgan('dev'));
const cookieParser = require('cookie-parser')
app.use(cookieParser(process.env.SESSION_SECRET));
app.use(require('express-session')({
secret: process.env.SESSION_SECRET,
cookie :
{
expires: false
},
resave: true,
saveUninitialized: true
}));
//passport configuration
const passport = require('passport');
app.use(passport.initialize());
app.use(passport.session());
const localStrategy = require('passport-local');
const User = require('./models/user');
passport.use(new localStrategy(User.authenticate()));
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());
//router configuration
const userRoutes = require('./routes/user');
app.use('/user',userRoutes);
const loanRoutes = require('./routes/loan');
app.use('/loan',loanRoutes);
const adminRoutes = require('./routes/admin');
app.use('/admin',adminRoutes);
const paymentRoutes = require('./routes/payment');
app.use('/payment',paymentRoutes);
//database connection
const mongoose = require('mongoose');
mongoose.connect("mongodb+srv://sifat:[email protected]/test", function(err) {
if (err) {
console.log("Database Not Connected", err);
} else {
console.log("Database Connected")
}
});
mongoose.set('useFindAndModify', false);
//Other usage for application
app.use(express.static("public"));
app.use((req,res,next)=>{
res.locals.currentUser = req.user;
next();
});
app.set('view engine','ejs');
//Home page
app.get('/',(req,res)=>{res.render('home');})
//Server Start
app.listen(port, () => {console.log(`Server is running on port ${port}`);});
我认为问题出在我正在使用的快速会话中。我已经在我的代码中设置了 cookie 解析器,但它仍然抛出错误
你必须更新
app.js
需要像:
const express = require("express"),
session = require('express-session'),
env = require('dotenv'),
bodyParser = require('body-parser'),
morgan = require('morgan'),
...
...;
const app = express();
env.Config();
// Express session
app.use(
session({
secret: process.env.SESSION_SECRET,
resave: true,
saveUninitialized: true,
cookie: { maxAge: 24 * 60 * 60 * 1000 },
})
)
希望这有帮助。