2016-01-26 57 views
5

Tôi đang phát triển một ứng dụng Android của cửa hàng WooCommerce và tôi nhận được dữ liệu lưu trữ như Sản phẩm, Danh mục, Đơn đặt hàng, Khách hàng, v.v. sử dụng động từ GET http WooCommerce REST Api. Nó hoạt động tốt và tôi có thể tạo chữ ký oAuth 1.0 cho api V2 và V3 đúng cách. Bây giờ, tôi muốn thực hiện hành động Viết. Tôi đã học được từ cùng một tài liệu mà tôi cần sử dụng động từ POST Http. Tôi đã cố gắng cho cùng và bị mắc kẹt.Làm thế nào để sử dụng 'POST' Http Verb của API REST Woocommerce trong JAVA/Android?

Khi tôi thực hiện bất kỳ hành động POST với HttpGet hoặc HttpPost yêu cầu sử dụng URL, dữ liệu OAuth và chữ ký được tạo ra, tôi nhận được:

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

Tôi đang làm theo tất cả các hướng dẫn được đưa ra trong tài liệu và thấy trên Google, sử dụng chuỗi "POST" để tạo chữ ký oAuth, đã thử gửi các tham số bằng HttpGet và HttpPost nhưng không thành công.

Bất cứ ai có thể vui lòng cung cấp cho tôi một số hướng dẫn hoặc ví dụ để sử dụng động từ POST Http cho Android để thực hiện tác vụ viết bằng API REST WooCommerce. (như Tạo Đơn hàng Mới, Tạo Danh mục Mới, v.v.)

+0

Bạn có thể giúp tôi ra, làm thế nào để thực hiện WooCommerce REST API trong android? Và cách tích hợp consumer_key & consumer_secret và gọi api bằng volley. Bất kỳ trợ giúp sẽ được đánh giá cao. –

Trả lời

3

Tôi chạy vào cùng một lỗi và những gì tôi phải làm là tạo một lớp bộ điều hợp POST khác. Tôi đang sử dụng trang bị thêm cho các cuộc gọi mạng và đây là đoạn mã của tôi:

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

[Nguồn: https://gist.github.com/Aroniez/41dbc5942f70641b397e]

Các vấn đề liên quan