使用带有http和javascript(而不是https)的woocommerce rest api v1

时间:2016-12-22 18:57:01

标签: http angular oauth woocommerce-rest-api oauth-1.0a

我正在使用oauth-signature生成我的oauth签名以与woocommerce api连接。我按照woocommerce rest api documentation中所述的所有步骤进行了操作:

  

所需参数为: oauth_consumer_key,oauth_timestamp,oauth_nonce,oauth_signature和oauth_signature_method 。 oauth_version不是必需的,应该省略。   OAuth随机数可以是任意随机生成的32个字符(推荐)字符串,该字符串对于使用者密钥是唯一的。等...

但是以下请求仍然未经授权:

http://siglar.no/wp-json/wc/v1/orders?oauth_consumer_key=ck_1ca1c6ff1a93de4836ee52c766538043d7f15d07&oauth_timestamp=1482431903&oauth_nonce=P5SM1FGeFVpdRyHWp4HHYOMlYAhxE6Gl&oauth_signature=cEETZUnSNQD6uorII9c%2B5SXf0M8%3D&oauth_signature_method=HMAC-SHA1

(别担心,这些密钥仅供本地使用)

响应:

{"code":"woocommerce_rest_cannot_view","message":"Beklager, du kan ikke liste ressurser.","data":{"status":401}}

我使用WP 4.7,WC 2.6.9,为WC激活API,为WC等激活SSL。

我还检查过这是按照库的要求完成的:

  

使用签名基本字符串和您的消费者密钥生成签名,并使用&使用HMAC-SHA1哈希算法的字符。

时区是UNIX,应根据需要生成nonce。那么你们有些人发现了这个问题吗?这是我的代码:

constructor(private http: Http) {

    var d = new Date();
    var httpMethod = 'GET',
        url = 'http://siglar.no/wp-json/wc/v1/orders',
        ck = 'ck_1ca1c6ff1a93de4836ee52c766538043d7f15d07',
        cs = 'cs_ce323425064c37688d614e4ff43a5489c6f78017',
        sm = 'HMAC-SHA1',
        nc = this.nonceGen(),
        timestamp = Math.floor(d.getTime()/ 1000),
        parameters = {
            oauth_consumer_key : ck,
            oauth_timestamp : timestamp,
            oauth_nonce : nc,
            oauth_signature_method : sm
        },
        // generates a RFC 3986 encoded, BASE64 encoded HMAC-SHA1 hash
        encodedSignature = oauthSignature.generate(httpMethod, url, parameters, cs);

    this.http.get(
        url + '?oauth_consumer_key='+ck+'&oauth_timestamp='+timestamp+'&oauth_nonce='+nc+'&oauth_signature='+encodedSignature+'&oauth_signature_method='+sm
    ).subscribe(data => {
        console.log('fetched');
        console.log(data);
    });

}

public nonceGen() {
    let length = 32;
    let text = "";
    let possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
    for(let i = 0; i < length; i++) {
        text += possible.charAt(Math.floor(Math.random() * possible.length));
    }
    return text;
}

其他人对此有什么好运吗?

2 个答案:

答案 0 :(得分:3)

我终于让它运转了。

不知怎的,它不适合我的本地wordpress安装,但它确实适用于我的live wordpress网站:

Angular2代码:

constructor(private http: Http) {

    var oauth = OAuth({
        consumer: {
            key: 'ck_...',
            secret: 'cs_...'
        },
        signature_method: 'HMAC-SHA1',
        hash_function: function(base_string, key) {
            return CryptoJS.enc.Base64.stringify(CryptoJS.HmacSHA1(base_string, key));
        }
    });

    var requestData = {
        url: 'http://siglarweb.no/wp-json/wc/v1/orders',
        method: 'GET'
    };

    this.http.get(
        requestData.url + '?' + jQuery.param(oauth.authorize(requestData))
    ).subscribe(data => {
        console.log(data);
    });

}

使用的库(通过npm安装):

npm install crypto-js --save npm install oauth-1.0a --save

必填文件:

"scripts": [
    "../node_modules/crypto-js/crypto-js.js",
    "../node_modules/oauth-1.0a/oauth-1.0a.js"
  ]

答案 1 :(得分:0)

我们遇到了401 unauthorised响应和类似woocommerce_rest_invalid_signature这样的响应代码的问题。

事实证明,哈希时使用的URL与我们访问的URL不同,哈希中使用的URL 缺少斜杠