Предположим следующий код:
const stripe = window.Stripe('pk_xxx', { stripeAccount: 'acct_xxx' });
const elements = stripe.elements();
const card = elements.create('card');
stripe.createToken(card);
Он преуспевает в 3 из 4 возможных настроек (тестовая среда, выполняющая вызовы полосы LIVE, среда тестирования, выполняющая вызовы полосы TEST, среда в реальном времени, выполняющая вызовы полосы LIVE), но не когда в реальной среде выполняются вызовы полосы TEST.
Ошибка 403 и следующий ответ:
{
"error": {
"code": "secret_key_required",
"doc_url": "https://stripe.com/docs/error-codes/secret-key-required",
"message": "This API call cannot be made with a publishable API key. Please use a secret API key. You can find a list of your API keys at https://dashboard.stripe.com/account/apikeys.",
"type": "invalid_request_error"
}
}
Как для вызова JS может потребоваться секретный ключ? Все это увидят.
Вот HTTP-запрос:
card[number]: 4242424242424242
card[cvc]: 242
card[exp_month]: 04
card[exp_year]: 24
card[address_zip]: 42424
guid: 282d554c-4271-4730-9df4-ad142b19a812
muid: 722e4d63-4df0-40db-8d60-100f841d1718
sid: d5f44fce-9835-497b-a4dd-766894b4c23a
payment_user_agent: stripe.js/3b5fc4c8; stripe-js-v3/3b5fc4c8
referrer: https://app.myowndomain.com/
key: pk_test_xxx (also tried the pk_live_xxx - no difference)
_stripe_account: acct_xxx
Для создания токена никогда не потребуется секретный ключ API. Это было бы реальной проблемой безопасности, и поэтому Stripe имеет пару ключей: секретный ключ для вашего серверного кода и публикуемый ключ для вашего клиентского кода.
Код, которым вы поделились, всегда будет работать с публикуемым ключом, и создание токена никогда не приведет к сбою с этой ошибкой. Ключ Publishable также задокументирован: https://stripe.com/docs/stripe.js
Сложно сказать, что вызывает это в вашем примере, но это должно быть что-то не связанное с этой строкой кода. Что-то еще в коде будет активировано после создания токена, и эта другая часть должна быть неправильно настроена и иметь ваш публикуемый ключ на стороне сервера. Я бы порекомендовал связаться с командой поддержки Stripe по этому поводу, так как они могут напрямую изучить вашу учетную запись: https://support.stripe.com/email
Проблема заключалась в запрошенной области с использованием Stripe Connect. Было установлено значение read_only, а мне нужно было read_write.
Служба поддержки Stripe признала тот факт, что текущее сообщение об ошибке совсем не интуитивно понятно, и передала информацию группе инженеров, чтобы это не сбивало разработчиков с толку.