Как перенаправить пользователя на сайт только после успешной оплаты? - PullRequest
0 голосов
/ 09 января 2019

Для моего сайта у меня есть один сайт, чтобы объяснить тарифные планы и где вы можете отправить свою электронную почту и информацию о кредитной карте. После этого вы будете перенаправлены на сайт создания учетной записи. Я хочу перенаправить только на сайт, если платеж прошел успешно, иначе URL / createaccount не должен быть доступен. У меня есть некоторые идеи о том, как это сделать, но мне понадобится помощь с этим или советы.

Раньше я пытался добавить какой-либо идентификатор в URL / createaccount: id, но это не сработало.

Код внешнего интерфейса - это типичный код подписки на полосу с stripe.elemens и elements.create ('card')

Код сервера выглядит так:

app.post("/charge", (req, res) => {
let email = req.body.email;
let card = req.body.stripeToken;
let amount = req.body.plan;
let interval = req.body.interval;
const createSubscription = async () => {
const stripe = require("stripe")(SK);
const {
  data: plans
} = await stripe.plans.list({
  product: "prod_id"
})
// Create Customer
const customer = await stripe.customers.create({
  email: email,
  card: card,
});
const planToSubscribeTo = plans.find(p => p.interval === interval)
// Subscribe Customer to plan
const subscription = await stripe.subscriptions.create({
  customer: customer.id,
  items: [{
    plan: planToSubscribeTo.id
  }],
});
return {
  customer,
  // prodgHack,
  planToSubscribeTo,
  // ThreeMonthFreeCoupon,
  subscription
};
};

console.log('Creating subscriptions ...... ');
createSubscription().then((sub) => {
 console.log(sub);
}).catch(err => {
 console.warn('Failed to create subscriptions ', err);
});
res.redirect('/createAccount');
});

1 Ответ

0 голосов
/ 09 января 2019

Используя Stripe в прошлом (хотя для оплаты, а не для подписки), предполагая, что процесс похож, я сделал что-то вроде ниже

app.post('/payment', async (req, res) => {
  stripe.charges.create({
    amount: 10000,
    currency: 'gbp',
    description: 'Description Here',
    source: req.body.stripeToken,
    receipt_email: req.body.stripeEmail,
    metadata: { email: req.body.stripeEmail },
  }, async (err, charge) => {
    if (err && err.type === 'StripeCardError') {
      res.render('payment_declined');
    } else {
      // Do anything else here like update DB etc and then render view
      res.render('successful_payment');
    }
  });
});

Правильный ли это путь, или я пропустил кусочки, я не уверен, но, возможно, это продвинет вас немного дальше? Если не рады удалить этот ответ для кого-то еще, чтобы добавить что-то

Также в качестве дополнительного примечания в вашем коде вам, вероятно, не нужно объявлять переменные для следующего, просто вызовите их напрямую

let email = req.body.email;
let card = req.body.stripeToken;
let amount = req.body.plan;
let interval = req.body.interval;
// So just use req.body.email, req.body.plan where required

const stripe = require("stripe")(SK); лучше разместить в верхней части вашего файла (вызывайте его только один раз, что происходит, если в вашем приложении несколько путей оплаты), а не в самой функции post

...