#node.js #stripe-payments
#node.js #stripe-платежи
Вопрос:
Я создал продукт с многоуровневыми ценами на своей панели инструментов Stripe. Я скопировал идентификаторы price API и поместил их во внешний интерфейс моего приложения. Когда я запускаю свой код, серверная часть выдает ошибку: No such price: 'PRICE_1HPYAGLJZYBC5S5KGBKT8UDY'
. Этот идентификатор цены соответствует одной из цен на моей панели инструментов Stripe, но я никогда не устанавливал продукт, поэтому мне интересно, проблема ли в этом. Вот мой клиент js:
function createSubscription({ customerId, paymentMethodId, priceId }) {
return (
fetch('/create-subscription', {
method: 'post',
headers: {
'Content-type': 'application/json',
},
body: JSON.stringify({
customerId: customerId,
paymentMethodId: paymentMethodId,
priceId: priceId,
}),
})
.then((response) => {
return response.json();
})
// If the card is declined, display an error to the user.
.then((result) => {
if (result.error) {
// The card had an error when trying to attach it to a customer
throw resu<
}
return resu<
})
// Normalize the result to contain the object returned
// by Stripe. Add the addional details we need.
.then((result) => {
console.log("RETURNING SUBSCRIPTION")
return {
// Use the Stripe 'object' property on the
// returned result to understand what object is returned.
subscription: result,
paymentMethodId: paymentMethodId,
priceId: priceId,
};
})
);
}
И вот мой внутренний код:
app.post('/create-subscription', async function(req, res) {
console.log(req.body);
User.findOne({"_id": req.session.auth_user._id}, async function(err, user) {
if (user.stripe_id) {
console.log("RETRIEVING CUSTOMER");
var customer = await stripe.customers.retrieve(user.stripe_id);
if (user.stripe_subscription) {
console.log("RETRIEVING SUBSCRIPTION");
var subscription = await stripe.subscriptions.retrieve(user.stripe_subscription);
update_customer(customer, subscription);
}
else {
console.log("CREATING SUBSCRIPTION");
var subscription = await stripe.subscriptions.create({
customer: customer.id,
items: [{
price: req.body.priceId,
}]
});
user.stripe_subscription = subscription.id;
user.save(function(err) {
update_customer(customer, subscription);
})
}
}
else {
console.log("CREATING CUSTOMER");
var customer = await stripe.customers.create({
email: req.body.email,
});
user.stripe_id = customer.id;
user.save( async function(err, user) {
if (user.stripe_subscription) {
console.log("RETRIEVING SUBSCRIPTION");
var subscription = await stripe.subscriptions.retrieve(user.stripe_subscription);
update_customer(customer, subscription);
}
else {
console.log("CREATING SUBSCRIPTION");
var subscription = await stripe.subscriptions.create({
customer: customer.id,
items: [{
price: req.body.priceId,
}]
});
user.stripe_subscription = subscription.id;
user.save(function(err) {
update_customer(customer, subscription);
});
}
});
}
});
async function update_customer(customer, subscription) {
const paymentMethod = await stripe.paymentMethods.attach(
req.body.paymentMethodId,
{customer: customer.id}
);
console.log(subscription);
res.send(subscription);
}
});
Комментарии:
1. Сначала проверьте идентификатор цены, похоже, что что-то в вашем интерфейсе преобразует всю строку в верхний регистр. Обычно идентификатор цены начинается со строчной буквы (‘цена….’), а затем строка представляет собой смесь цифр и символов нижнего и верхнего регистров.
2. @MatiasG Хороший улов, спасибо.
Ответ №1:
Проверьте идентификатор цены, похоже, что что-то в вашем интерфейсе преобразует всю строку в верхний регистр. Обычно идентификатор цены начинается со строчной буквы (‘цена….’), а затем строка представляет собой смесь цифр и символов нижнего и верхнего регистров.
Ответ №2:
Если кто-нибудь столкнется с этой проблемой в будущем. У меня была такая же проблема, но моя была вызвана тем, что stripe secret был неправильным.
Разумно:
- Дважды проверьте цену,
- Обрезать строку,
- Проверьте свои ключи конфигурации полностью
Надеюсь, это кому-то поможет 🚀
Комментарии:
1. Ах да, документы заполнят ваш тестовый ключ, но вы можете посмотреть текущие цены. Спасибо!
2. да, я тоже… В итоге я настроил тестовые и текущие ключи, но в новой кодировке забыл захватить переменную окружения, поэтому она использовала текущие ключи для тестовых цен. 🙂
Ответ №3:
В моем случае я следил за документами, и в документах было это так: Price = «{{price_1234}}» Поэтому я изменил его на это: Price = «price_1234», и это сработало.
Ответ №4:
В моем случае ключи API были неверными.
Если, как и я, вы просто следовали руководству из документов, ключи API из предложенных фрагментов кода неверны. Вы должны настроить те, которые находятся на странице панели мониторинга (для тестовой среды:https://dashboard.stripe.com/test/dashboard )