2016-01-26 23 views
5

Pracuję nad aplikacją na Androida w moim sklepie WooCommerce i otrzymuję dane sklepu takie jak produkty, kategorie, zamówienia, klienci itp. Za pomocą GET http czasownika WooCommerce REST Api. Działa to dobrze i mogę wygenerować sygnaturę OAuth 1.0 dla api V2 i V3 poprawnie. Teraz chcę wykonać akcję zapisu. Nauczyłem się z tej samej dokumentacji, że muszę używać czasownika POST Http. Próbowałem tego samego i utknąłem.Jak używać "POST" Http Verb z Woocommerce REST API w JAVA/Android?

Kiedy jestem wykonywania jakichkolwiek działań POST z HttpGet lub HttpPost żądanie za pomocą URL, dane OAuth i generowany podpis, Dostaję:

{"errors":[{"code":"woocommerce_api_authentication_error","message":"Invalid Signature - provided signature does not match"}]} 

Obserwuję wszystkie instrukcje podane w dokumencie i znalezione również w Google, użył ciągu "POST" do wygenerowania podpisu OAuth, próbował wysłać parametry za pomocą HttpGet i HttpPost, ale nie udało się.

Czy ktoś może podać mi jakieś instrukcje lub przykład, aby użyć czasownika POST Http dla Androida, aby wykonać akcję zapisu za pomocą interfejsu API REST WooCommerce. (jak Utwórz nowe zamówienie, Utwórz nową kategorię itp.)

+0

Czy możesz mi pomóc, w jaki sposób wdrożyć woocommerce REST API w android? I jak integrować consumer_key i consumer_secret i wywoływać api używając siatkówki. Każda pomoc będzie doceniona. –

Odpowiedz

3

Wystąpił ten sam błąd i musiałem utworzyć inną klasę adaptera POST. Używam modernizację połączeń sieciowych i tu jest mój urywek kodu:

package me.gilo.a55thavenue.data; 

import android.util.Base64; 
import android.util.Log; 

import com.squareup.okhttp.HttpUrl; 
import com.squareup.okhttp.Interceptor; 
import com.squareup.okhttp.OkHttpClient; 
import com.squareup.okhttp.Request; 
import com.squareup.okhttp.Response; 

import org.apache.http.NameValuePair; 
import org.apache.http.client.utils.URLEncodedUtils; 
import org.apache.http.message.BasicNameValuePair; 

import java.io.IOException; 
import java.io.UnsupportedEncodingException; 
import java.net.URLEncoder; 
import java.security.InvalidKeyException; 
import java.security.NoSuchAlgorithmException; 
import java.util.ArrayList; 
import java.util.Collections; 
import java.util.Comparator; 

import javax.crypto.Mac; 
import javax.crypto.spec.SecretKeySpec; 

import retrofit.GsonConverterFactory; 
import retrofit.Retrofit; 
import retrofit.RxJavaCallAdapterFactory; 

/** 
* Created by Aron on 10/31/2015. 
*/ 
public class PostRestAdapter { 

    static String oauth_nonce = ""; 
    static String oauth_timestamp = ""; 
    static String oauth_signature_method = "HMAC-SHA1"; 

    static ArrayList<NameValuePair> params; 

    public static API createAPI(final String endpoint) { 

     setParams(endpoint); 

     // Define the interceptor, add authentication headers 
     Interceptor interceptor = new Interceptor() { 
      @Override 
      public Response intercept(Chain chain) throws IOException { 

       HttpUrl.Builder builder = chain.request().httpUrl().newBuilder(); 
       for (NameValuePair entry : params) { 
        builder.addQueryParameter(entry.getName(), entry.getValue()); 
       } 

       Request newRequest = chain.request() 
         .newBuilder() 
         .url(builder.build()) 
         .build(); 

       return chain.proceed(newRequest); 
      } 
     }; 


     // Add the interceptor to OkHttpClient 
     OkHttpClient client = new OkHttpClient(); 
     client.interceptors().add(interceptor); 


     Retrofit retrofit = new Retrofit.Builder() 
       .baseUrl(API.BASE_URL) 
       .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) 
       .addConverterFactory(GsonConverterFactory.create()) 
       .client(client) 
       .build(); 
     return retrofit.create(API.class); 
    } 

    public static ArrayList<NameValuePair> setParams(String endpoint) { 

     final String uri = API.BASE_URL + endpoint; 

     oauth_nonce = getOauth_nonce(); 
     oauth_timestamp = getOauth_timestamp(); 

     params = new ArrayList<>(); 
     params.add(new BasicNameValuePair("oauth_consumer_key", API.CONSUMER_KEY)); 
     params.add(new BasicNameValuePair("oauth_nonce", oauth_nonce)); 
     params.add(new BasicNameValuePair("oauth_timestamp", oauth_timestamp)); 
     params.add(new BasicNameValuePair("oauth_signature_method", oauth_signature_method)); 

     Collections.sort(params, new SortParams()); 

     String encodedParams = URLEncodedUtils.format(params, "utf-8"); 
     Log.d("encodedParamString", encodedParams); 

     String string_to_sign = ""; 
     try { 
      string_to_sign = (new StringBuilder("POST&")).append(URLEncoder.encode(uri, "utf-8")).append("&").append(URLEncoder.encode(encodedParams, "utf-8")).toString(); 
     } catch (UnsupportedEncodingException e) { 
      e.printStackTrace(); 
     } 

     Log.d("string to sign", string_to_sign); 

     try { 
      Mac mac = Mac.getInstance("HMAC-SHA1"); 
      String secret = API.CONSUMER_SECRET; 
      if (API.WP_API_VERSION.equals("3")) { 
       secret = API.CONSUMER_SECRET + "&"; 
      } 
      mac.init(new SecretKeySpec(secret.getBytes("utf-8"), "HMAC-SHA1")); 
      String signature = Base64.encodeToString(mac.doFinal(string_to_sign.getBytes("utf-8")), 0).trim(); 
      Log.d("signature", signature); 
      params.add(new BasicNameValuePair("oauth_signature", signature)); 
     } catch (NoSuchAlgorithmException | InvalidKeyException | UnsupportedEncodingException e) { 
      e.printStackTrace(); 
     } 

     return params; 
    } 

    public static String getOauth_nonce() { 
     return (new StringBuilder(String.valueOf(Math.random() * 100000000D))).toString(); 
    } 

    public static String getOauth_timestamp() { 
     long stamp = (long) (System.currentTimeMillis()/1000D); 
     Log.d("stamp", stamp + ""); 
     return (new StringBuilder(String.valueOf(stamp))).toString(); 
    } 

    static class SortParams implements Comparator<NameValuePair> { 

     @Override 
     public int compare(NameValuePair nameValuePair1, NameValuePair nameValuePair2) { 
      return nameValuePair1.getName().compareTo(nameValuePair2.getName()); 
     } 
    } 
} 

[Źródło: https://gist.github.com/Aroniez/41dbc5942f70641b397e]