как преобразовать вложенный объект в строку запроса в узле с помощью http-модуля

#javascript #node.js #stripe-payments #query-string

#javascript #node.js #stripe-платежи #строка запроса

Вопрос:

Мне нужна помощь, чтобы отправить вложенный объект по POST-запросу в stripe API с использованием стандартного http-модуля на node.js Когда я использую модуль querystring для преобразования json в строку запроса, он не дает соответствующего вывода. Он плохо работает с вложенным объектом.

Это мой объект полезной нагрузки:

 const payload = {
  "card": {
    "number": number,
    "exp_month": exp_month,
    "exp_year": exp_year,
    'cvc': cvc
  },
};
 

Мой вспомогательный метод для отправки HTTP POST запроса:

 helpers.createPaymentToken = (payload, callback) => {
  //validate the parameters
  if (payload) { //configure the request details
    const stringPayload =queryString.stringify(payload)
    //configure request details
    const requestDetails = {
      protocol: "https:",
      hostname: "api.stripe.com",
      method: "post",
      path:
        "/v1/tokens",
      auth:config.stripe.authToken,
      headers: {
        "Content-Type": "application/x-www-form-urlencoded",
        "Content-Length": Buffer.byteLength(stringPayload),
      },
    };
    //instantiate the request
    const req = https.request(requestDetails, function (res) {
      res.setEncoding('utf8');
      var body = '';
      console.log(res)
      res.on('data', function (chunk) {
        body = body   chunk;
      });
  
      res.on('end',function(){
        console.log("Body :"   body);
        if (res.statusCode != 200) {
          callback(res.statusCode,body);
        } else {
          callback(null);
        }
      });
  
    });
    //bind to an error event so it does not get thrown
    req.on("error", (e) => {
      callback(e);
    });

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

    //end the request
    req.end();
  } else {
    callback("Given parameters are missing on invalid");
  }
};
 

ожидаемая строка запроса:

 card[number]=****************2amp;card[exp_month]=11amp;card[exp_year]=2021amp;card[cvc]=***
 

ожидаемый результат:(тело запроса)

 {
  "card": {
    "number": "************4242",
    "exp_month": "11",
    "exp_year": "2021",
    "cvc": "***"
  }
}
 

фактический результат: (тело запроса)

 {
  "card": ""
}
 

Ответ №1:

В настоящее время ваш код напрямую обрабатывает данные карты, которые вы не должны пытаться использовать по соображениям безопасности.

Поскольку вы собираете данные карты, вы должны использовать элементы, которые являются библиотекой пользовательского интерфейса Stripe, для безопасного сбора данных карты на стороне клиента при соблюдении самого низкого уровня соответствия PCI. Вы можете прочитать больше о соответствии PCI здесь.

Комментарии:

1. Спасибо, на самом деле я проверил это, с элементами намного проще