Rocketr IPN с C # ASP.NET MVC

Так что я возился с функцией IPN на этом сайте, чтобы понять, не хочу ли я включить ее в какой-то тупой проект, над которым работают мои друзья и я. Честно говоря, я не знаю много C # в глубине, я довольно плохо знаком с языком (несколько месяцев практики кодирования).
Это пример PHP, который они выдают о том, как его использовать:
https://github.com/Rocketr/rocketrnet-ipn-php/blob/master/example_rocketr_ipn.php

Я пытаюсь сделать такой приемник в MVC 5. У меня есть Настройка модели с функцией, когда IPN попадает на страницу сервера для обработки запроса, но кажется, что он просто каждый раз терпит неудачу и не записывает необработанные данные, которые я пытаюсь выполнить. захватить в журналы.

// GET: Purchases/Incoming
public void Incoming()
{
var ipnDebugLog = HttpRuntime.AppDomainAppPath + "/Logs/IPN/debug.txt";
var testIPNKey = "the hash here";
byte[] ipnToByes = Encoding.ASCII.GetBytes(testIPNKey); // IPN string to byteto hash with
var recvdIPN = Request["HTTP_IPN_HASH"];
HMACSHA256 testHash = new HMACSHA256(ipnToByes); // Setting testHash to IPN secret string
string ipnHeader = Request["IPN_HASH"];
using (StreamWriter sw = new StreamWriter(ipnDebugLog))
{
sw.WriteLine(ipnHeader);
foreach (var reqHead in ipnHeader)
{
sw.WriteLine(reqHead.ToString());
sw.WriteLine("JSON String: " + Request["HTTP_IPN_SECRET"]);
sw.WriteLine(recvdIPN);
sw.WriteLine("From: " + GetIPAddress());
}
}

}

Так что это только я пытаюсь получить данные, отправляемые из Rocketr. На сайте говорится:

Чтобы проверить целостность полезной нагрузки, мы отправим подпись HMAC
через заголовок HTTP под названием «IPN_HASH». Подпись HMAC будет
POST-объект со знаком JSON и секретом IPN. Вы можете увидеть, как
проверить подпись в файле example_rocketr_ipn.php в этом
репозиторий.

Я просто тупой и новый, чтобы понять C #, чтобы функционировать так? Я чувствую, что нахожусь на правильном пути для чтения необработанных данных, но я, вероятно, ошибаюсь?

Итак, чтобы подвести итог вопроса
Я делаю неправильный способ прочитать необработанный пользовательский заголовок HTTP с именем IPN_HASH? Исходя из примера PHP, который они использовали, isset для чтения заголовка переменной сервера labled HTTP_IPN_HASH, верно?

0

Решение

Так что я должен преобразовать это $hmac = hash_hmac("sha512", json_encode($_POST), trim($IPN_SECRET));

Попробуйте это (внести коррективы по мере необходимости / необходимости):

using System;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Web;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Newtonsoft.Json;

namespace Foo
{
[TestClass]
public class UnitTest1
{
[TestMethod]
public void PhpHashTest()
{

string IPN_SECRET = "I-am-the-secret";

//Mocking some HTTP POSTed data
var someFormUrlEncodedData = "order_id=1234&product_title=Hello%20World&product_id=Sku123";

//Mocking json_encode($_POST)
var data = HttpUtility.ParseQueryString(someFormUrlEncodedData);
var dictionary = data.AllKeys.ToDictionary(key => key, key => data[key]);

//{"order_id":"1234","product_title":"Hello World","product_id":"Sku123"}
var json = JsonConvert.SerializeObject(dictionary);

byte[] bytes;
using (var hmac512 = new HMACSHA512(Encoding.ASCII.GetBytes(IPN_SECRET)))
{
bytes = hmac512.ComputeHash(Encoding.ASCII.GetBytes(json));
}

//will contain lower-case hex like Php hash_hmac
var hash = new StringBuilder();
Array.ForEach(bytes, b => hash.Append(b.ToString("x2")));

//Assert that Php output exactly matches implementation
Assert.IsTrue(string.Equals("340c0049bde54aa0d34ea180f8e015c96edfc4d4a6cbd7f139d80df9669237c3d564f10366f3549a61871779c2a20d2512c364ee56af18a25f70b89bd8b07421", hash.ToString(), StringComparison.Ordinal));
Console.WriteLine(hash);
}
}
}

Не PHP-разработчик — это моя «версия Php»:

<?php

$IPN_SECRET = 'I-am-the-secret';

# 'order_id=1234&product_title=Hello%20World&product_id=Sku123';
$json = array('order_id' => '1234', 'product_title' => 'Hello World', 'product_id' =>'Sku123');

echo json_encode($json);
echo "<br />";

$hmac = hash_hmac("sha512", json_encode($json), trim($IPN_SECRET));

echo $hmac;

?>

Hth ….

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]