Полоса «нет такой цены»

#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 )