2017-11-15 7 views
0

私はAPIの呼び出し方法に関するPHPコード例を私に提供したサードパーティAPIを呼び出しています。私はPHPについては分かりませんが、同様の.NETソリューションを試してビルドするのはかなり簡単で見やすいものです。以下のPHPの例ではPostを実行していますが、C#の例でGetを実行します。私はいくつかのダミー値でPHPの例を嘲笑しました。ここでPHP API呼び出しサンプルコードをC#RestSharp Api呼び出しに変換するOAuth 1.0

$params = array(); 
$params['assertion_id'] = "b57936e4-6cea-46f4-a897-c7b3a6f01147"; // Example Assertion ID. 
$params['product_id'] = "product001"; 
$params['product_name'] = "Useless Product"; 
$params['price'] = "1.99"; 

// Generate Signature Base String. 
$params['api_key'] = "526587410g44p9kk8f7h2bb2zf3365va"; // Example Api Key. 
$params['timestamp'] = "1510760624"; // Example Timestamp. 
$params['nonce'] = "uilp37xh"; // Example Nonce. 
ksort($params); 

$url = "https://someurl.com/api/product"; 
$signature_base_string = 'POST&'.urlencode($url).'&'.http_build_query($params); 

// Encrypt signature base string for signature. 
$secret_key = "DlKST1adTpoWELS8TjjBc1pFATdlGA8qHUNEaq9MOSAUT648AlAvzK4EEC7="; // Example Secret Key. 
$signature = base64_encode(hash_hmac('sha1', $signature_base_string, base64_decode($secret_key), true)); 
$params['signature'] = $signature; 

// Send Request. 
$curl = curl_init(); 
curl_setopt($curl, CURLOPT_URL, $url); 
curl_setopt($curl, CURLOPT_POST, count($params)); 
curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($params)); 
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 
$result = curl_exec($curl); 
curl_close($curl); 

は私がRestSharpを利用し、これまで構築してきたC#のコード例です。ナンス、タイムスタンプ、および署名は、OAuth 1.0仕様に準拠していますが、正しく処理しているかどうかわかりません。私はApi呼び出しを実際にテストするために実際の値を提供することはできませんが、コードがサードパーティのApiからの応答を返すという意味で機能することを知っています。しかし、応答は、パラメータが不足していると述べています...

public class ProductApiRequest 
{ 
    private string _api; 
    private string _apiKey; 
    private string _apiSecretKey; 

    public ProductApiRequest() 
    { 
     _api = "https://someurl.com/api/"; 
     _apiKey = "526587410g44p9kk8f7h2bb2zf3365va"; 
     _apiSecretKey = "DlKST1adTpoWELS8TjjBc1pFATdlGA8qHUNEaq9MOSAUT648AlAvzK4EEC7="; 
    } 

    public class Product 
    { 
     public Guid assertion_id { get; set; } 
     public String api_key { get; set; } 
     public string product_id { get; set; } 
     public string product_name { get; set; } 
     public string price { get; set; } 
     public string timestamp { get; set; } 
     public string nonce { get; set; } 
     public string signature { get; set; } 
    } 

    public string getProduct() 
    { 
     try 
     { 
      Product oProduct = new Product(); 

      oProduct.assertion_id = Guid.NewGuid(); 
      oProduct.api_key = _apiKey; 
      oProduct.product_id = "product001"; 
      oProduct.product_name = "Useless Product"; 
      oProduct.price = "1.99"; 
      oProduct.timestamp = GenerateTimeStamp(); 
      oProduct.nonce = GenerateNonce(); 
      oProduct.signature = GenerateSignature(oProduct.nonce, oProduct.timestamp, _apiSecretKey); 

      var path = "product"; 
      dynamic request = new RestSharp.RestRequest(path, RestSharp.Method.GET); 
      request.RequestFormat = RestSharp.DataFormat.Json; 
      request.JsonSerializer = new RestSharp.Serializers.JsonSerializer(); 
      request.AddJsonBody(oProduct); 

      var client = new RestSharp.RestClient(_api); 
      var response = client.Execute(request); 

      return "Return something."; 
     } 
     catch (Exception ex) 
     { 
      return ex.Message.ToString(); 
     } 
    } 

    public string GenerateTimeStamp() 
    { 
     TimeSpan ts = DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1, 0, 0, 0, 0)); 
     string timeStamp = ts.TotalSeconds.ToString(); 
     timeStamp = timeStamp.Substring(0, timeStamp.IndexOf(".")); 
     return timeStamp; 
    } 

    public string GenerateNonce() 
    { 
     var _random = new Random(); 
     var sb = new StringBuilder(); 
     for (int i = 0; i < 8; i++) 
     { 
      int g = _random.Next(3); 
      switch (g) 
      { 
       case 0: 
        // lowercase alpha 
        sb.Append((char)(_random.Next(26) + 97), 1); 
        break; 
       default: 
        // numeric digits 
        sb.Append((char)(_random.Next(10) + 48), 1); 
        break; 
      } 
     } 
     return sb.ToString(); 
    } 

    public string GenerateSignature(string nonce, string timestamp, string apisecretkey) 
    { 
     var encoder = new UTF8Encoding(); 
     var hasher = new System.Security.Cryptography.HMACSHA1(); 
     var vals = string.Concat(nonce, timestamp, apisecretkey); 
     byte[] hashedDataBytes = hasher.ComputeHash(encoder.GetBytes(vals)); 
     return Convert.ToBase64String(hashedDataBytes); 
    } 
} 

PHPソリューションをC#ソリューションに変換する助けがあれば幸いです!

+0

「ダイナミック」は使用しないでください。 – SLaks

+2

この例でPOSTを実行したときにGETを実行できますか?いくつかのAPIはPOSTを主張しています。 –

+0

はい。提供された例は、POSTでした。 GETの他のAPIがあります。キャッチはテストのためだけのものでした。私はそれが最初に働くようにしたいと思うし、すべてを強化する。 –

答えて

0

私はPHPを知らなかったが、解決策を見つけ出した! \ m/Metal \ m/

public class ProductApiRequest 
{ 
    private string _api; 
    private string _apiKey; 
    private string _apiSecretKey; 
    private string _resource; 

    public ProductApiRequest() 
    { 
     _api = "https://someurl.com/api/"; 
     _apiKey = "526587410g44p9kk8f7h2bb2zf3365va"; 
     _apiSecretKey = "DlKST1adTpoWELS8TjjBc1pFATdlGA8qHUNEaq9MOSAUT648AlAvzK4EEC7="; 
     _resource = "products"; 
    } 

    public class Product 
    { 
     public Guid assertion_id { get; set; } 
     public String api_key { get; set; } 
     public string product_id { get; set; } 
     public string product_name { get; set; } 
     public string price { get; set; } 
     public string timestamp { get; set; } 
     public string nonce { get; set; } 
     public string signature { get; set; } 
    } 

    public string getProduct() 
    { 
     Product oProduct = new Product(); 

     oProduct.assertion_id = Guid.NewGuid(); 
     oProduct.api_key = _apiKey; 
     oProduct.product_id = "product001"; 
     oProduct.product_name = "Useless Product"; 
     oProduct.price = "1.99"; 
     oProduct.timestamp = GenerateTimeStamp(); 
     oProduct.nonce = GenerateNonce(); 

     // Create Signature Base String. 
     string apiEncoded = Uri.EscapeDataString(_api + _resource); 
     string strSignatureBase = "GET&" + apiEncoded + "&api_key=" + oProduct.api_key + "&product_id=" + oProduct.product_id + "&product_name=" + oProduct.product_name + "&price=" + oProduct.price + "&nonce=" + oProduct.nonce + "&timestamp=" + oProduct.timestamp; 

     // Create Signature for OAuth 1.0 
     oProduct.signature = GenerateSignature(strSignatureBase, _apiSecretKey); 

     var client = new RestClient(_api + _resource + "?assertion_id=" + oProduct.assertion_id + "&api_key=" + oProduct.api_key + "&product_id=" + oProduct.product_id + "&product_name=" + oProduct.product_name + "&price=" + oProduct.price + "&timestamp=" + oProduct.timestamp + "&nonce=" + oProduct.nonce + "&signature=" + HttpUtility.UrlEncode(oProduct.signature)); 
     var request = new RestRequest(Method.GET); 
     IRestResponse response = client.Execute(request); 

     return "Return whatever you want."; 
    } 

    public string GenerateTimeStamp() 
    { 
     TimeSpan ts = DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1, 0, 0, 0, 0)); 
     string timeStamp = ts.TotalSeconds.ToString(); 
     timeStamp = timeStamp.Substring(0, timeStamp.IndexOf(".")); 
     return timeStamp; 
    } 

    public string GenerateNonce() 
    { 
     var _random = new Random(); 
     var sb = new StringBuilder(); 
     for (int i = 0; i < 8; i++) 
     { 
      int g = _random.Next(3); 
      switch (g) 
      { 
       case 0: 
        // lowercase alpha 
        sb.Append((char)(_random.Next(26) + 97), 1); 
        break; 
       default: 
        // numeric digits 
        sb.Append((char)(_random.Next(10) + 48), 1); 
        break; 
      } 
     } 
     return sb.ToString(); 
    } 

    public string GenerateSignature(string strSignatureBase, string strSecretKey) 
    { 
     byte[] signatureBaseBytes = Encoding.UTF8.GetBytes(strSignatureBase); 
     byte[] secretKeyDecodedBytes = Convert.FromBase64String(strSecretKey); // Decode Secret Key. 

     var encoder = new UTF8Encoding(); 
     var hasher = new HMACSHA1(secretKeyDecodedBytes); 

     byte[] hashedDataBytes = hasher.ComputeHash(signatureBaseBytes); 

     return Convert.ToBase64String(hashedDataBytes); 
    } 
} 
関連する問題