Я пытаюсь прослушать Foxycart XML Datafeed в C # и сталкиваюсь с проблемой, которая сводится к шифрованию.
Короче говоря, они отправляют свои данные в виде закодированного и зашифрованного XML с использованием RC4 шифрования .
Для проверки у них есть некоторый (отправленный пользователем) пример кода для проверки этого с C # . Я попытался использовать этот пример кода дешифрования RC4, предоставленного одним из пользователей, но, похоже, он не работает, и его служба поддержки считает, что он не соответствует алгоритму C # RC4. Поскольку они не являются экспертами по C #, я решил спросить здесь. Вот сообщение на форуме FoxyCart
В любом случае, вот код, который (пытается) имитировать ответ, зашифровывая файл XML и публикуя его по URL (обратите внимание, что DataFeedKey - это строка, которую я сохранил как переменную-член):
public ActionResult TestDataFeed()
{
string transactionData = (new StreamReader(@"D:\SampleFeed.xml")).ReadToEnd();
string encryptedTransactionData = RC4.Encrypt(DataFeedKey, transactionData, false);
string encodedTransactionData = HttpUtility.UrlEncode(encryptedTransactionData, Encoding.GetEncoding(1252));
string postData = "FoxyData=" + encodedTransactionData;
var req = (HttpWebRequest)WebRequest.Create("http://localhost:3396/FoxyCart/RecieveDataFeed");
req.Method = "POST";
req.ContentType = "application/x-www-form-urlencoded";
var sw = new StreamWriter(req.GetRequestStream(), Encoding.ASCII);
sw.Write(postData);
sw.Close();
HttpWebResponse resp = null;
try
{
resp = (HttpWebResponse)req.GetResponse();
string r = new StreamReader(resp.GetResponseStream()).ReadToEnd();
}
catch (WebException ex)
{
string err = new StreamReader(ex.Response.GetResponseStream()).ReadToEnd();
}
return null;
}
и вот метод обратного вызова, который получает ответ.
[ValidateInput(false)]
public ActionResult RecieveDataFeed(FormCollection collection)
{
string unencodedFeed = HttpUtility.UrlDecode(collection["FoxyData"], Encoding.GetEncoding(1252));
string transaction = RC4.Decrypt(DataFeedKey, unencodedFeed, false);
return Content("foxy");
}
Вместо публикации всего встроенного класса RC4 в этом вопросе, здесь есть ссылка на код этого класса RC4 .
Как я уже писал в приведенной выше ссылке в верхней части вопроса, проблема возникает, когда я проверяю переменную транзакцию внутри
RecieveDataFeed()
метод, у меня должен быть обычный XML обратно, но вместо этого я вижу это:
É?xø´ v´“Û·8êUŸí¥MïSÅJÖó5Cå7ã…ÄlÞ&þòG·¶ÝÙ3<ÍÖ¡«úüF¿¿ßìNµ>4¦Äu÷¼Â;£-w¤ƒûÊyL¹®½èíYö½’é(µJŒ~»»=3¼]F‡•=±Ùí]'鳫"øPç{Ù^yyéå–°ñ…5ðWF$zÉnÄ^_”Xë’ï%œ-5á
ÒÛ€jŠt`Â9œÇÞLU&¼~ç2îžúo/¢¶5,º*öOqÝ—‘.ó®šuf™å5G—õC®‰ÁéiÇúW®¦ÝÚ•Z±:„Q\p"p
ôÔiÛ!\D"ÉÂX3]ƒ°è€Œ«DQE‡kÝ@àö`gpöŽ÷nÛ={µÏßKQKüå(ö%¯¯Ü–9}¨¬°£7yo,«”ÜëCÍ/+…†ÕËî‘‹‰AÚmÇÙå©&©¡xÙkŒföX¯ÃX&×°S|kÜ6Ô°Üú\Ätóü-äUƆÈáÅ\ ’E8‚¤âÈ4Ž¾«ãΚ_Sï£y‰xJº•bm*jo›‰ÜW–[ô†ÆJÐà$½…9½šžˆ_ÙÜù/®öÁVhzŠ¥ú(ñ£²6ˆb6¢ëße¤oáIðZuK}ÆÙ]"T¼*åZêñß5K—½òQSåRN Çë'Å¡
ÕyiÈX •bØðIk¿WxwNàäx®‹?cv+X™¥E!gd4â¤nÔ‹¢½Ð”ªÊQ!‚.e8s
Gyª4¼ò,}Yœ‚¹”±E‡Jy}Sæ
ƒ¦ýK'Ð}~B¦E3!0°ú´A–5Þ³£9$–8äÏ©?
œ‡8GÂø
Код выглядит правильно:
- Шифрование
- Encode
- Decode
- Расшифровать
но, похоже, это не работает. Любые предложения о том, что может быть не так?