2017-12-26 8 views
0

그래서이 웹 사이트의 IPN 기능을 사용하여 내 친구들과 내가 작업하고있는 바보 같은 프로젝트에 그것을 포함시키지 않겠습니까? 솔직히 말해서 나는 C#을 많이 알지 못한다. 나는 언어에 상당히 익숙하지 않다. (코딩 연습을 몇 달간). 이것은 그들이 그것을 사용하는 방법을 알아주는 PHP 샘플입니다 : https://github.com/Rocketr/rocketrnet-ipn-php/blob/master/example_rocketr_ipn.phpRocketr IPN with C# ASP.NET MVC

나는 IPN가 서버 페이지를 칠 때 나는 기능을 가진 모델 설정을 가지고 MVC 5에 같은 수신기를 만들려고 노력하고 있어요 요청을 처리하지만 매번 실패하고 로그에 캡처하려고하는 원시 데이터를 쓰지 않는 것 같습니다.

// 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에서 보낸 데이터를 가져 오려고합니다. 사이트에이 상태 :

는 페이로드의 무결성을 확인하기 위해, 우리는 "IPN_HASH"라는 HTTP 헤더를 통해 HMAC 서명 를 보내드립니다. HMAC 서명은 으로 서명 된 json으로 인코딩 된 POST 개체로 IPN 암호로 이루어집니다. 이 저장소의 example_rocketr_ipn.php 파일에서 이 서명을 확인하는 방법을 확인할 수 있습니다.

나는 단지 이런 식으로 작동하는 C#을 이해하기 위해 바보스럽고 새로운가요? 나는 원시 데이터를 읽는 것이 옳은 것처럼 느껴진다.하지만 나는 틀린 것일까?

질문을 요약하십시오. 원시 기본 HTTP 헤더 인 IPN_HASH를 읽는 잘못된 방법을 사용하고 있습니까? PHP 예제에서 벗어나 서버 변수 헤더를 읽으려고 isset을 사용했습니다. HTTP_IPN_HASH가 맞습니까?

+0

컨트롤러인가요? FromHeader 속성으로 바인딩을 사용하지 않는 이유는 무엇입니까? – frz3993

+0

HTTP 헤더가 'Request.Headers'에 있습니다. 당신은'string' (?)에서'foreach'를하고 있습니다, _etc_. – EdSF

+0

내가 C#과 ASP.net에 대해 매우 익숙하다고 말했듯이, 나는 모든 헤더 데이터와 바디 데이터를 나열 할 수 있었고 Rocketr은 잘못된 헤더 이름 필드를보고하여 설명했다. 데이터가 올바르게 읽혀 지므로 백업 된 데이터를 조작 할 수 있습니다. 그러나 나는이 HMAC512 것을 다루는 방법을 알아 내야합니다. 그래서 이걸 변환해야합니다. $ hmac = hash_hmac ("sha512", json_encode ($ _ POST), trim ($ IPN_SECRET)); C#의 함수에 대해서만 : HMACSHA512 myIPNHash = new HMACSHA512 (Encoding.ASCII.GetBytes (myIPNKey)); 분명히 작동하지 않는 ... 내가 전화 할 때. 해시 – Ar2Dee2

답변

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 dev에 -이 내 "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; 

?> 

제 H ....

+0

완료! 나는 심지어이 하하 같은 것을 시도해 보지도 못했고 나는 많은 PHP를 모른다. 이것은 위대하고, 현과 같은 것들을 약간 조정했지만이 스 니펫은 완벽하게 작동했습니다. 나는 실제로 그것을 너무 이해할 수있다. – Ar2Dee2