Получение ошибки 400 при вызове https запроса о начислении платы на Stripe API - PullRequest
0 голосов
/ 10 ноября 2018

Я использую nodejs без какой-либо библиотеки / npm, чтобы зарядить полосу с помощью тестового ключа API.

Однако я всегда получаю ответ с кодом состояния 400 и не могу понять почему, может кто-нибудь дать мне подсказку?

Вот мои данные запроса:

{ protocol: 'https:',
  hostname: 'api.stripe.com',
  method: 'POST',
  path: 'v1/charges',
  timeout: 5000,
  headers:
   { 'Content-Type': 'application/x-www-form-urlencoded',
     'Content-Length': 72 },
  auth: 'sk_test_JOXtNqPjvpFgLXMiwuWWKZxu:' }

А вот моя полезная нагрузка (с использованием querystring.stringify):

amount=5000&currency=usd&description=Tiago_1541865841578&source=tok_amex

Заранее спасибо за любую помощь!

Вот код, метод, которым я делаю запрос сам:

helpers.sendRequest = function(protocol, port, hostname, method, path, timeoutSeconds, contentType, postData){

   // Stringify the payload
   var stringPayload = querystring.stringify(postData);

   // Construct the request
   var requestDetails = {
     'protocol' : protocol+':',
     'hostname' : hostname,
     'method' : method,
     'path' : path,
     'port' : port,
     'auth': ('Bearer ' + Buffer.from(config.stripe.secretApiKeyTest).toString('base64') + ":"),
     'timeout' : timeoutSeconds * 1000,
     'headers' :{
       'Authorization': ('Bearer ' + Buffer.from(config.stripe.secretApiKeyTest).toString('base64') + ":"),
       'teste':'ola',
       "teste2":"ola2",
       'Content-Type':contentType,
       'Content-Length': Buffer.byteLength(stringPayload)
     }
   };

   console.log("Request Details:")
   console.log(requestDetails);
   console.log("Payload:")
   console.log(stringPayload);

   // Instantiate the request object (using either the http or https module)
   var _moduleToUse = protocol == 'http' ? http : https;
   var req = _moduleToUse.request(requestDetails, function(res){
       console.log(res.statusCode);

   });

   // Bind to the error event so it doesn't get thrown
   req.on('error',function(e){
     callback(err, e);
   });

   // Bind to the timeout event
   req.on('timeout',function(){
     callback(true, {'Error': 'The request took much time and got timeout.'})
   });

   // Add the payload
   req.write(stringPayload);

   // End the request
   req.end();
 };

И вот где я вызываю метод aux для отправки запроса:

var stripeRequestObject = {
                            amount: (totalPrice*100),
                            currency: 'usd',
                            description: userData.name+'_'+Date.now(),
                            source: stripeToken,
                        };

                        genericHelper.sendRequest('https',
                          443,
                          'api.stripe.com',
                          'POST',
                          'v1/charges',
                          5,
                          'application/x-www-form-urlencoded',
                          stripeRequestObject);

Ответы [ 2 ]

0 голосов
/ 10 ноября 2018

Вот как я это сделал.

const requestDetails = {
            protocol: 'https:',
            hostname: 'api.stripe.com',
            port: 443,
            method: 'POST',
            path: '/v1/charges',
            headers: {
              'Content-Type': 'application/x-www-form-urlencoded',
              'Content-Length': Buffer.byteLength(stringPayload),
              Authorization: `Bearer ${config.stripe.testAPIkey.Secret}`
            }
          };

В вашем коде есть опечатка

'v1/charges'

должно быть

'/v1/charges'
0 голосов
/ 10 ноября 2018

В аутентификации необходимо добавить Носитель перед токеном, именно так вы отправляете токены в API. Я попытался сделать запрос на почтальоне, и он работает, вы можете использовать axios или superagent для выполнения запроса в вашем файле JS enter image description here enter image description here

...