для связи 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;
}
}