Строка URL-адреса синтаксического анализа javascript с амперсандом в значении объекта

Я обрабатываю транзакции по кредитным картам с помощью Authorize.net, и их ответ API на мою страницу отправляет следующую незакодированную строку URL:

action=transactResponse&response={"accountType":"Visa","accountNumber":"XXXX0623","transId":"62830720474","responseCode":"1","authorization":"185778","shipTo":{"firstName":"Bob","lastName":"Jones","company":"Backyard Bar & Grill","address":"123 Main St ","city":"Tampa","state":"FL","zip":"33606","country":"USA"},"orderDescription":"2020-12-01 bill for All Regions/All Sites","customerId":"1002-0","totalAmount":"1.50","orderInvoiceNumber":"11386-0","dateTime":"2/2/2021 4:57:53 PM","refId":"ref1612285039"}

Но из-за "company" : "Backyard Bar & Grill" - & ломается в простом парсере строки запроса, который Authorize.net предоставляет в своем примере API:

function parseQueryString(str) {
  var vars = [];
  var arr = str.split('&');    // <--- too simple, breaks on values containing '&'
  var pair;
  for (var i = 0; i < arr.length; i++) {
    pair = arr[i].split('=');
    vars.push(pair[0]);
    vars[pair[0]] = unescape(pair[1]);
  }
  return vars;
}

AuthorizeNetPopup.onReceiveCommunication = function (querystr) {
  var params = parseQueryString(querystr);
  //console.log(params) ;
  switch (params["action"]) {
    case "successfulSave":
      AuthorizeNetPopup.closePopup();
      break;
    case "cancel":
      AuthorizeNetPopup.closePopup();
      break;
    case "transactResponse":
      // 'response' is a string value
      // encode it as an object, to be passed to global function
      // that will decode it again for PHP
      var response = params["response"] ;  <-- parses string at '&' in company name
      var jsonResponse = JSON.parse(response) ;  <-- causing error: `unexpected end of json input`
      httpReceipt(response) ;
      AuthorizeNetPopup.closePopup();
      break;
    case "resizeWindow":
      var w = parseInt(params["width"]);
      var h = parseInt(params["height"]);
      var ifrm = document.getElementById("iframeAuthorizeNet");
      ifrm.style.width = w.toString() + "px";
      ifrm.style.height = h.toString() + "px";
      centerPopup();
      break;
  }
};

Мне нужно переписать функцию синтаксического анализа, чтобы она не давала сбоев на специальных символах, таких как & или других, но пока мне не везет - я пробовал несколько комбинаций или кодирование/декодирование и т. д., и ниже пока что самый близкий (и самый чистый), который я пришел, но он все еще ломается:

function parseQueryString(str) {
  var urlstr = encodeURI(str) ;
  var newUrl = new URLSearchParams(urlstr) ;
  console.log(newUrl.get('action')) ; 
  console.log(newUrl.get('response')) ;
  return newUrl
}

Это близко, но все еще нарушается параметр reponse:

Console Output:
"transactResponse"

"{\"accountType\":\"Visa\",\"accountNumber\":\"XXXX0623\",\"transId\":\"62830720474\",\"responseCode\":\"1\",\"authorization\":\"185778\",\"shipTo\":{\"firstName\":\"Preston\",\"lastName\":\"Rolinger\",\"company\":\"Backyard "

Параметр response по-прежнему обрезан в названии компании Backyard, что по-прежнему вызывает ошибку json.


person rolinger    schedule 02.02.2021    source источник
comment
Чем это отличается от вашего другого вопроса?   -  person John Conde    schedule 03.02.2021