Android связывает модернизацию с Woocommerce и получает ошибку woocommerce_rest_authentication_error - PullRequest
0 голосов
/ 04 марта 2019

для связи Retrofit с Woocommerce, чтобы получить список продуктов и другую информацию из магазина. У меня есть следующий код, после тестирования некоторого кода, чтобы узнать, в чем проблема получения ошибки woocommerce_rest_authentication_error, которую я не могу найти,

Я создал ключ rest-api на woocommerce и включаю,

Key:     ck_e00f1b5d64e49d0edcbf54527acb7c98467812ae
Secret:  cs_e0a6db78e4c14232f06023739d91969bf5e2276b

У меня нет проблем с тем, чтобы поделиться этой информацией для потребителей, это для теста

public Response intercept(Chain chain) throws IOException {
    Request original = chain.request();
    HttpUrl originalHttpUrl = original.url();

    final String nonce = new TimestampService().getNonce();
    final String timestamp = new TimestampService().getTimestampInSeconds();

    String dynamicStructureUrl = original.url().scheme() + "://" + original.url().host() + original.url().encodedPath();

    String firstBaseString = original.method() + "&" + urlEncoded(dynamicStructureUrl);

    String generatedBaseString = "";
    if(original.url().encodedQuery()!=null) {
        generatedBaseString = original.url().encodedQuery() + "&oauth_consumer_key=" + consumerKey + "&oauth_nonce=" + nonce + "&oauth_signature_method=HMAC-SHA1&oauth_timestamp=" + timestamp + "&oauth_version=1.0";
    }
    else {
        generatedBaseString = "oauth_consumer_key=" + consumerKey + "&oauth_nonce=" + nonce + "&oauth_signature_method=HMAC-SHA1&oauth_timestamp=" + timestamp + "&oauth_version=1.0";
    }

    ParametersList result = new ParametersList();
    result.addQuerystring(generatedBaseString);
    generatedBaseString=result.sort().asOauthBaseString();

    String secondBaseString = "&" + generatedBaseString;

    if (firstBaseString.contains("%3F")) {
        secondBaseString = "%26" + urlEncoded(generatedBaseString);
    }

    String baseString = firstBaseString + secondBaseString;


    String signature = new HmacSha1SignatureService().getSignature(baseString, consumerSecret, "");
    Log.i("Signature", signature);

    HttpUrl url = originalHttpUrl.newBuilder()
            .addQueryParameter(OAUTH_SIGNATURE_METHOD, OAUTH_SIGNATURE_METHOD_VALUE)
            .addQueryParameter(OAUTH_CONSUMER_KEY, consumerKey)
            .addQueryParameter(OAUTH_VERSION, OAUTH_VERSION_VALUE)
            .addQueryParameter(OAUTH_TIMESTAMP, timestamp)
            .addQueryParameter(OAUTH_NONCE, nonce)
            .addQueryParameter(OAUTH_SIGNATURE, signature)
            .build();

    // Request customization: add request headers
    Request.Builder requestBuilder = original.newBuilder()
            .addHeader("Content-Type", "application/json")
            .url(url);

    Request request = requestBuilder.build();
    return chain.proceed(request);
}

url в этом методе есть такой вывод, например:

http://www.aklin.ir/wp/wp-json/wc/v3/products?page=1&order=desc&orderby=date&lang=en&oauth_signature_method=HMAC-SHA1&oauth_consumer_key=ck_e00f1b5d64e49d0edcbf54527acb7c98467812ae&oauth_version=1.0&oauth_timestamp=1551696391&oauth_nonce=2248123466&oauth_signature=OkDAMG77%2FvQ%2FHYRP262UPBpLeOs%3D

и кажется, что все параметры верны, но я получаю ошибку связи

класс подписи:

public class HmacSha1SignatureService implements Signature
{
    private static final String EMPTY_STRING = "";
    private static final String CARRIAGE_RETURN = "\r\n";
    private static final String UTF8 = "UTF-8";
    private static final String HMAC_SHA1 = "HmacSHA1";
    private static final String METHOD = "HMAC-SHA1";

    public String getSignature(String baseString, String apiSecret, String tokenSecret)
    {
        try
        {
            return doSign(baseString, OAuthEncoder.encode(apiSecret) + '&' + OAuthEncoder.encode(tokenSecret));
        }
        catch (Exception e)
        {
            throw new OAuthSignatureException(baseString, e);
        }
    }

    private String doSign(String toSign, String keyString) throws Exception
    {
        SecretKeySpec key = new SecretKeySpec((keyString).getBytes(UTF8), HMAC_SHA1);
        Mac mac = Mac.getInstance(HMAC_SHA1);
        mac.init(key);
        byte[] bytes = mac.doFinal(toSign.getBytes(UTF8));

        return bytesToBase64String(bytes).replace(CARRIAGE_RETURN, EMPTY_STRING);
    }

    private String bytesToBase64String(byte[] bytes)
    {
        return Base64.encodeToString(bytes,Base64.NO_WRAP);
    }
    public String getSignatureMethod()
    {
        return METHOD;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...