#javascript #node.js #stripe-payments
Вопрос:
У меня есть это:
const customers = await stripe.customers.list({
email: 'contact@Inderatech.com',
});
var customerID = customers.data[0].id;
const subscriptions = await stripe.subscriptions.list({
customer: customerID
});
console.log(subscriptions)
console.log(subscriptions.data[0].status)
и то, что он должен делать, — это извлекать customerid
данные подписчика, затем я пытаюсь перейти к следующей функции и извлекать status
из subscription на основе customerid. Это не работает. это говорит о 2 вещах.
- он просто выводит:
{ объект: ‘список’, данные: [], has_more: false, url: ‘/v1/подписки’ }
(node:30746) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'status' of undefined
который, я знаю, является ложным, потому что, когда я просто регистрирую его вот так:
console.log(subscriptions)
он возвращает более 30 строк данных подписчиков, включая активный статус. вот так:
{
id: 'sub_id',
object: 'subscription',
application_fee_percent: null,
automatic_tax: [Object],
billing_cycle_anchor: 1617410065,
billing_thresholds: null,
cancel_at: null,
cancel_at_period_end: false,
canceled_at: null,
collection_method: 'charge_automatically',
created: 1617410065,
current_period_end: 1635899665,
current_period_start: 1633221265,
customer: 'cus_JEQIfxhiRu7qJh',
days_until_due: null,
default_payment_method: 'pm_1IbxRUIPT89VeZtCxyEA8SMu',
default_source: null,
default_tax_rates: [],
discount: null,
ended_at: null,
items: [Object],
latest_invoice: 'in_1JgIfuIPT89VeZtC2jsKCHRp',
livemode: false,
metadata: {},
next_pending_invoice_item_invoice: null,
pause_collection: null,
payment_settings: [Object],
pending_invoice_item_interval: null,
pending_setup_intent: null,
pending_update: null,
plan: [Object],
quantity: 1,
schedule: null,
start_date: 1617410065,
status: 'active',
tax_percent: null,
transfer_data: null,
trial_end: null,
trial_start: null
},
как я могу получить доступ к статусу или любым другим параметрам из этого?
РЕДАКТИРОВАТЬ, чтобы сделать его более понятным, я покажу это:
когда я делаю это:
const subscriptions = await stripe.subscriptions.list({
});
console.log(subscriptions)
он возвращает весь большой вывод (показанный выше).
затем, когда я делаю это:
const subscriptions = await stripe.subscriptions.list({
customer: customerID
});
console.log(subscriptions)
это показывает только это:
{ object: 'list', data: [], has_more: false, url: '/v1/subscriptions' }
и когда я пытаюсь зарегистрировать статус подписки того, который сравнивает customerid
, я понимаю, что статус не является частью возвращаемых данных.
Комментарии:
1. Какова структура объекта подписки?
2. @damnedOperator только что добавил это выше
3. вторая ошибка из
console.log(subscriptions.data[0].status)
-за отсутствия поля данных4. @cmgchess проблема в том, что есть поле состояния, но не тогда, когда я указываю идентификатор пользователя. но мне это нужно, потому что нет другого способа получить определенную запись для подписчика без использования идентификатора подписки, которого у меня нет. поэтому мне нужно использовать идентификатор клиента, чтобы найти определенную запись, а затем найти статус этой записи.
5. является ли ваш
customerID
cus_JEQIfxhiRu7qJh
Ответ №1:
Итак, если опубликованный вами результат — это все, что вы получили от stripe API, тогда правильным способом доступа к полю статуса было бы просто использовать
console.log(subscriptions[0].status);
Комментарии:
1. должно быть
(subscriptions.status)
2. Остерегайтесь запятой в конце его примера схемы. Это указывает на то, что выдержка была извлечена из массива…. Мои ставки на массив
3. @damnedOperator спасибо за ваш ответ. Я только что внес правку в свой пост внизу, пожалуйста, посмотрите его. Это более подробно объясняет, в чем проблема и что происходит. Не уверен, почему это происходит, но это так.
Ответ №2:
Это сообщение об ошибке совпадает с выводом, который, по вашим словам, вы получаете. Если вызов списка не возвращает никаких подписок, subscriptions.data[0]
будет неопределенным, поэтому нет объекта для получения status
. Поскольку ваш вызов без customer
фильтра правильно возвращает подписки, вызов с фильтром должен работать до тех пор, пока у переданного вами клиента есть подписки, которые не были отменены ( subscriptions.list
по умолчанию возвращаются только не отмененные подписки [1]).
Похоже, это может происходить из-за конкретного идентификатора клиента, по которому вы фильтруете. Если вы попробуете использовать один из идентификаторов клиентов, которые вы видите при составлении списка подписок без фильтра (например cus_JEQIfxhiRu7qJh
), работает ли ваш код? Для клиента, которого вы указали в своем первом примере, я бы дважды проверил страницу этого клиента на вашей панели мониторинга, чтобы узнать, есть ли у него не отмененные подписки, которые должны быть возвращены этим вызовом списка.