Я обрабатываю транзакции по кредитным картам с помощью 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.