2016-01-26 7 views
5

私はWooCommerceストアのAndroidアプリを開発しており、GET http動詞WooCommerce REST Apiを使用して、商品、カテゴリ、注文、顧客などのストアデータを取得しています。正常に動作しており、api V2とV3のoAuth 1.0シグネチャを正しく生成できます。さて、私はWriteアクションを実行したいと思います。私はPOST Http動詞を使用する必要があることを同じ文書から学びました。私は同じことをしてみました。私はURL、OAuthのデータと生成した署名を使用してHTTPGETまたはHttpPost要求に任意のPOSTアクションを実行していた場合JAVA/AndroidでWoocommerce REST APIの 'POST' Http Verbを使用するには?

、私は取得しています:

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

私は、ドキュメントに与えられたすべての指示に従って、見つかりましたよGoogleではoAuth署名を生成するために "POST"文字列を使用し、HttpGetとHttpPostを使用してパラメータを送信しようとしましたが失敗しました。

誰でも私に、WooCommerce REST APIを使用して書き込み操作を実行するためのPOST Http verb for Androidを使用するための指示や例を教えてください。 (新しい注文の作成、新しいカテゴリの作成など)

+0

はあなたがアンドロイドでWooCommerce REST APIを実装する方法では、私を助けることはできますか?また、consumer_keyとconsumer_secretを統合し、ボレーを使用してAPIを呼び出す方法。どんな助けもありがとう。 –

答えて

3

同じエラーが発生しました。別のPOSTアダプタクラスを作成する必要がありました。私は、ネットワーク呼び出しのための改造を使用していますが、ここに私のスニペットコードは次のとおりです。

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

[出典:https://gist.github.com/Aroniez/41dbc5942f70641b397e]