Я храню пользователей в базе данных firebase в реальном времени и полосе для обработки платежей. Авторизованный пользователь может нажать кнопку и будет перенаправлен в Stripe Checkout. После совершения платежа пользователь снова перенаправляется на success_url
в приложении. Затем я хотел бы обновить объект пользователя в базе данных - просто сохраните информацию об успешном платеже и его идентификатор.
Проблема : я не знаю, как найти пользователя, который совершил платеж после переадресации на success_url
. Я хотел бы обновить данные пользователя в базе данных после оплаты.
Идея : я могу сохранить payment_intent
в профиле пользователя, так как эта информация отправляется на сторону клиента с помощью сеанс. А затем, после завершения платежа, я мог найти payment_intent
и обновить пользователя, у которого были эти данные. Но хороший ли это подход? Есть ли лучший способ найти пользователя?
Мой код основан на HTTP-запросах Firebase Cloud Function. Следуя инструкциям Stripe для приема платежа, я создаю сеанс для пользователя, который хочет произвести платеж:
export const payment = functions.https.onRequest((request, response) => {
cors(request, response, async () => {
response.set("Access-Control-Allow-Headers", "Content-Type");
response.set("Access-Control-Allow-Credentials", "true");
response.set("Access-Control-Allow-Origin", "*");
await stripe.checkout.sessions.create(
{
payment_method_types: ["card"],
line_items: [
{
price_data: {
currency: "usd",
product_data: {
name: "Test"
},
unit_amount: 1000
},
quantity: 1
}
],
mode: "payment",
success_url: "https://example.com/success",
cancel_url: "https://example.com/cancel"
},
function(err: Error, session: any) {
response.send(session);
// the session is sent to the client and can be used to finalise a transaction
}
);
});
});
На стороне клиента я использую ax ios для вызова запрос облачной функции payment
, а затем я передаю sessionId
на Stripe.redirectToCheckout
, который запускает перенаправление проверки:
let sessionId = "";
await axios.post("payment function url request")
.then(response => {
sessionId = response.data.id;
});
const stripe: any = await loadStripe("stripe key");
stripe.redirectToCheckout({
sessionId: sessionId
});
После того, как клиент завершает платеж в Stripe Checkout, он перенаправляется на URL-адрес, указанный как success_url
, рекомендуется запускать веб-перехватчик из полосы после завершения проверки. Это позволяет запускать другую облачную функцию, которая отправляет ответ клиентской стороне об успешном платеже response.json({ received: true })
:
export const successfulPayment = functions.https.onRequest(
(request, response) => {
const sig = request.headers["stripe-signature"];
let event;
try {
event = stripe.webhooks.constructEvent(
request.rawBody,
sig,
endpointSecret
);
} catch (err) {
return response.status(400).send(`Webhook Error: ${err.message}`);
}
// Handle the checkout.session.completed event
// Should I update the user data in the database here?
if (event.type === "checkout.session.completed") {
const session = event.data.object;
console.log(`Event passed: ${session}`);
}
// Return a response to acknowledge receipt of the event
response.json({ received: true });
// Or how do I use this response to then update the user from the client side?
}
);
Я буду очень признателен за любую помощь и предложения:)