调用 https 请求以在 Stripe 上收取费用时出现错误 400 API

Getting error 400 when calling an https request to apply a charge on Stripe API

我在没有任何 library/npm 的情况下使用 nodejs 使用测试 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);

在auth中你需要在token前添加Bearer,这就是你发送token到API的方式。我试着在邮递员上做请求并且它有效,你可以使用 axios 或 superagent 在你的 js 文件中执行请求

我就是这样做的。

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'