2015-07-03 2 views
0

Я пытаюсь добавить новый продукт WooCommerce используя C# RestSharp, но ответ от сервера:Как добавить новый продукт WooCommerce с использованием C# RestSharp

{ "ошибки": [{ "код": "woocommerce_api_authentication_error », "сообщение": "oauth_consumer_key параметр Mangler"}]}

Для добавления продукта я использовать следующий код:

public string AddProduct() 
    { 
     Method method = Method.POST; 
     string result = ""; 
     string endpoint = "products"; 
     var client = new RestClient(ApiUrl); 
     var parameters = new Dictionary<string, string>(); 
     var request = createRequestWithParams(parameters, endpoint, method); 
     request.RequestFormat = DataFormat.Json; 

     request.AddJsonBody(new DTO.WCProduct { title = "eeee2", type = "simple", regular_price = "777", description = "Descr" }); 
     AddOAuthparams(ref parameters, method.ToString(), endpoint); 
     result = client.Execute(request).Content; 
     return result; 
    } 

Где Метод Creater equestWithParams является:

private RestRequest createRequestWithParams(Dictionary<string, string> parameters, string res, Method methos) 
    { 
     var req = new RestRequest(res, methos); 
     foreach (var item in parameters) 
     { 
      req.AddParameter(item.Key, item.Value); 
     } 
     return req; 
    }` 

Где Метод AddOAuthparams является:

void AddOAuthparams(ref Dictionary<string, string> parameters, string method, string endpoint) 
    { 
     parameters["oauth_consumer_key"] = this.ConsumerKey; 
     parameters["oauth_timestamp"] = 
      DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1, 0, 0, 0)).TotalSeconds.ToString(); 
     parameters["oauth_timestamp"] = parameters["oauth_timestamp"].Substring(0, parameters["oauth_timestamp"].IndexOf(",")); //todo fix for . or , 
     parameters["oauth_nonce"] = Hash(parameters["oauth_timestamp"]); 
     parameters["oauth_signature_method"] = "HMAC-SHA256"; 
     parameters["oauth_signature"] = GenerateSignature(parameters, method, endpoint); 

    } 

public string GenerateSignature(Dictionary<string, string> parameters, string method, string endpoint) 
    { 
     var baserequesturi = Regex.Replace(HttpUtility.UrlEncode(this.ApiUrl + endpoint), "(%[0-9a-f][0-9a-f])", c => c.Value.ToUpper()); 
     var normalized = NormalizeParameters(parameters); 

     var signingstring = string.Format("{0}&{1}&{2}", method, baserequesturi, 
      string.Join("%26", normalized.OrderBy(x => x.Key).ToList().ConvertAll(x => x.Key + "%3D" + x.Value))); 
     var signature = 
      Convert.ToBase64String(HashHMAC(Encoding.UTF8.GetBytes(this.ConsumerSecret), 
       Encoding.UTF8.GetBytes(signingstring))); 
     Console.WriteLine(signature); 
     return signature; 
    } 

    private Dictionary<string, string> NormalizeParameters(Dictionary<string, string> parameters) 
    { 
     var result = new Dictionary<string, string>(); 
     foreach (var pair in parameters) 
     { 
      var key = HttpUtility.UrlEncode(HttpUtility.UrlDecode(pair.Key)); 
      key = Regex.Replace(key, "(%[0-9a-f][0-9a-f])", c => c.Value.ToUpper()).Replace("%", "%25"); 
      var value = HttpUtility.UrlEncode(HttpUtility.UrlDecode(pair.Value)); 
      value = Regex.Replace(value, "(%[0-9a-f][0-9a-f])", c => c.Value.ToUpper()).Replace("%", "%25"); 
      result.Add(key, value); 
     } 
     return result; 
    } 

** Но если я пытаюсь получить информацию о продуктах или удалить какой-либо продукт эта функция работала хорошо, **

Этот код я нахожу на Github https://github.com/kloon/WooCommerce-REST-API-Client-Library

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

ответ

0

Возможно, это старый вопрос. Но это будет стоить того, чтобы кто-то пришел из поисковой системы Google в любой намек.

Редактировать: Из сообщения об ошибке, я думаю, вы забыли включить oauth_consumer_key в качестве сообщения. Убедитесь, что ваш запрос включает в себя oauth_consumer_key, путем проверки параметра запроса RestRequest.

Btw используя вместо реализации из kloon, вы можете использовать WooCommerce C# библиотеки из my repository

+0

Хотя эта ссылка может ответить на вопрос, лучше включить здесь основные части ответа и предоставить ссылку для справки. Ответные ссылки могут стать недействительными, если связанная страница изменится. - [Из обзора] (/ review/low-quality-posts/10771199) – dbugger

+0

@dbugger Я отредактировал свой ответ, чтобы обеспечить основную часть. –

0

Попробуйте решение ниже его очень легко интегрироваться и требуют очень меньше линии codes.It работ для меня

static void Main(string[] args) 
     { 
      string requestURL = @"http://www.example.co.uk/test/wp-json/wc/v1/products"; 

      UriBuilder tokenRequestBuilder = new UriBuilder(requestURL); 
      var query = HttpUtility.ParseQueryString(tokenRequestBuilder.Query); 
      query["oauth_consumer_key"] = "consumer_key"; 
      query["oauth_nonce"] = Guid.NewGuid().ToString("N"); 
      query["oauth_signature_method"] = "HMAC-SHA1"; 
      query["oauth_timestamp"] = (Math.Truncate((DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds)).ToString(); 
      string signature = string.Format("{0}&{1}&{2}", "POST", Uri.EscapeDataString(requestURL), Uri.EscapeDataString(query.ToString())); 
      string oauth_Signature = ""; 
      using (HMACSHA1 hmac = new HMACSHA1(Encoding.ASCII.GetBytes("consumer_Secret&"))) 
      { 
       byte[] hashPayLoad = hmac.ComputeHash(Encoding.ASCII.GetBytes(signature)); 
       oauth_Signature = Convert.ToBase64String(hashPayLoad); 
      } 
      query["oauth_signature"] = oauth_Signature; 
      tokenRequestBuilder.Query = query.ToString(); 
      HttpWebRequest request = (HttpWebRequest)WebRequest.Create(tokenRequestBuilder.ToString()); 
      request.ContentType = "application/json; charset=utf-8"; 
      // request.Method = "GET"; 
      request.Method = "POST"; 

      using (var streamWriter = new StreamWriter(request.GetRequestStream())) 
      { 
       string json = File.ReadAllText(@"D:\JsonFile.txt");//File Path for Json String 

       streamWriter.Write(json); 
       streamWriter.Flush(); 
      } 

      var httpResponse = (HttpWebResponse)request.GetResponse(); 
      using (var streamReader = new StreamReader(httpResponse.GetResponseStream())) 
      { 
       var result = streamReader.ReadToEnd(); 
      } 
     } 
Смежные вопросы