4

我是一名 Android 开发人员,是 Woocommerce 的新手,并开始使用 Oauth1.0 身份验证来使用 REST 服务。当我从我的 android 应用程序调用时,我得到了 PostMan(RestClient 插件)的正确响应并得到“无效签名”错误。

这是我的安卓代码:

    OAuthParameters oauth;

    public OAuthParameters authChecking() {
        oauth = new OAuthParameters();
        GenericUrl genericUrl = new GenericUrl("http://localhost/wordpress/wc-api/v3/products/count");

        oauth.consumerKey = "ck_xxxxxxxxxxxxxxxxxxxxxxxxxxx";
        oauth.signatureMethod = "HMAC-SHA1";
        oauth.version = "3.0";
        oauth.computeTimestamp();
        oauth.computeNonce();

        oauth.signer = new OAuthSigner() {
            @Override
            public String getSignatureMethod() {

                return oauth.signatureMethod;
            }

            @Override
            public String computeSignature(String signatureBaseString) throws GeneralSecurityException {

                String key = "cs_xxxxxxxxxxxxxxxxxxxxxxxxxx";

                Mac mac = Mac.getInstance(
                        "HmacSHA1");
                SecretKeySpec secret = new SecretKeySpec(key.getBytes(), "HmacSHA1");

                mac.init(secret);
                byte[] digest = mac.doFinal(signatureBaseString.getBytes());
                Log.e("SIGNATURE Base64", new String(Base64.encode(digest, 0)).trim());

                String signature = new String(com.google.api.client.repackaged.org.apache.commons.codec.binary.Base64.encodeBase64String(digest));
                return signature;
            }
        };
        try {
            oauth.computeSignature("GET", genericUrl);

        } catch (GeneralSecurityException e) {
            e.printStackTrace();
            return null;
        } catch (NullPointerException e) {
            e.printStackTrace();
            return null;
        }
        methodSignatureTest();
        return oauth;
    }


 @Override
    public void requestAPI(Object... param) {
        OAuthParameters oauth = authChecking();
        if (oauth != null) {
            String url = null;
            try {

                Toast.makeText(MainActivity.this, "Signature retrive called", Toast.LENGTH_SHORT).show();
                url = "http://localhost/wordpress/wc-api/v3/products/"+"count?oauth_consumer_key=" + oauth.consumerKey + "&oauth_signature_method=" + oauth.signatureMethod + "&oauth_timestamp=" + oauth.timestamp + "&oauth_nonce=" + oauth.nonce + "&oauth_version=" + oauth.version + "&oauth_signature="
//               + java.net.URLDecoder.decode(oauth.signature, "UTF-8");
                        + URLEncoder.encode(oauth.signature, "UTF-8");
//            +oauth.signature;
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
                url = null;
            }
            Log.v("URL ", url);
            Log.v("SINGNATURE ", oauth.signature);

            getDataFromWeb_Get.getData(this, this, new String[]{"http://localhost/wordpress/wc-api/v3/products/", url});

        }
    }

我在谷歌上搜索了生成签名,但所有人都在说相同的代码。我使用此工具http://oauth.googlecode.com/svn/code/javascript/example/signature.html验证签名但无法验证,因为 PostMan、此工具和 android 生成的签名彼此不同。

4

2 回答 2

1

您必须发送序列中的所有参数。就像我们在 php 中有一个代码

uksort( $params, 'strcmp' );

了解如何在 android.xml 中对参数进行排序。

于 2015-10-07T10:48:27.850 回答
1

经过几天的研究,我也遇到了同样的问题,我终于找到了解决方案,希望这能帮助其他一些人,我浏览了各种文件

1)使用 WooCommerce REST API – 简介

2) woocommerce-rest-api-docs

3)抄写员

4)抄写员:1.3.5

在参考了上述文档和源代码后,我最终创建了一个库,为 woocommerce HTTP android 执行 OAuth 1.0a “单腿”身份验证

完整的描述已添加到我的图书馆的自述部分

在这里查看图书馆

WoocommerceAndroidOAuth1 库

于 2016-10-12T06:26:12.150 回答