2017-12-26 12 views
0

Also fummle ich mit der IPN-Funktion dieser Website, um zu sehen, ob ich es in ein dummes Projekt integrieren möchte, an dem meine Freunde und ich arbeiten. Um ehrlich zu sein, ich weiß nicht viel C# in der Tiefe, ich bin ziemlich neu in der Sprache (ein paar Monate Programmierpraxis). Diese ist die PHP-Probe geben sie auf, wie es zu benutzen: https://github.com/Rocketr/rocketrnet-ipn-php/blob/master/example_rocketr_ipn.phpRocket IPN mit C# ASP.NET MVC

Ich versuche, einen Empfänger zu machen wie die in MVC 5. ich das Modell Setup mit einer Funktion haben, wenn das IPN trifft auf die Server-Seite Verarbeite die Anfrage, aber sie scheint immer nur fehlzuschlagen und keine Rohdaten zu schreiben, die ich in den Logs zu erfassen versuche.

// 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()); 
      } 
     } 

    } 

Also das ist nur ich versuche, die Daten von Rocketr gesendet bekommen. heißt es auf der Website:

die Integrität der Nutzlast, um zu überprüfen, werden wir eine HMAC-Signatur über einen HTTP-Header namens „IPN_HASH“ senden. Die HMAC-Signatur ist ein signiertes JSON-codiertes POST-Objekt mit Ihrem IPN-Geheimnis. Sie können sehen, wie die Signatur in der Datei example_rocketr_ipn.php in diesem Repository zu überprüfen.

Bin ich gerade zu dumm und neu zu verstehen, dass C# so funktioniert? Ich habe das Gefühl, dass ich auf dem richtigen Weg bin, die Rohdaten zu lesen, aber ich bin wahrscheinlich falsch?

Also, um die Frage zusammenzufassen Mache ich die falsche Möglichkeit, eine rohe benutzerdefinierte HTTP-Header namens IPN_HASH zu lesen? Gehen Sie vom PHP-Beispiel, das sie verwendet haben, aus, um einen Server-Variablen-Header zu lesen, der mit HTTP_IPN_HASH versehen ist, richtig?

+0

Ist das dein Controller? Warum verwenden Sie keine Bindung mit dem FromHeader-Attribut? – frz3993

+0

HTTP-Header befinden sich in 'Request.Headers'. Du machst eine 'foreach' an einer' string' (?), _etc_. – EdSF

+0

Wie ich sagte, ich bin sehr neu zu C# und ASP.net, konnte ich alle Header-Daten und Body-Daten auflisten und Rocketr berichtet die falschen Header-Namen Felder, so dass eine Menge erklärt. Ich habe die Daten jetzt richtig gelesen, so kann ich es auf der Rückseite manipulieren. ABER ich muss noch herausfinden, wie man mit dieser HMAC512-Sache umgeht. Also muss ich dies konvertieren $ hmac = hash_hmac ("sha512", json_encode ($ _ POST), trimmen ($ IPN_SECRET)); Zu einer Funktion in C#, die ich nur bekommen habe: HMACSHA512 myIPNHash = new HMACSHA512 (Encoding.ASCII.GetBytes (myIPNKey)); Was anscheinend nicht funktioniert ... wenn ich rufe .hash – Ar2Dee2

Antwort

0

Also muss ich diese konvertieren $hmac = hash_hmac("sha512", json_encode($_POST), trim($IPN_SECRET));

Versuchen Sie, diese (Anpassungen nach Bedarf/notwendig):

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); 
     } 
    } 
} 

kein PHP Entwickler - das ist meine "Php-Version":

<?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

PERFEKT !!! Ich musste noch nie so etwas ausprobieren, haha ​​und ich kenne auch nicht viel PHP. Das hat super geklappt, ein wenig an den Saiten und so gemacht, aber dieses Snippet hat perfekt funktioniert, vielen Dank. Ich kann es jetzt sogar irgendwie verstehen, lol. – Ar2Dee2