将 woocommerce rest api v1 与 http 和 javascript(不是 https)一起使用
Posted
技术标签:
【中文标题】将 woocommerce rest api v1 与 http 和 javascript(不是 https)一起使用【英文标题】:Use woocommerce rest api v1 with http and javascript (not https) 【发布时间】:2017-05-08 11:34:51 【问题描述】:我正在使用 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;
其他人对此有任何运气吗?
【问题讨论】:
我在这里找到了一个“不起作用”的解决方案:github.com/woocommerce/woocommerce/issues/6493 但这对我不起作用。 quote => "我将github.com/bettiolo/oauth-signature-js/blob/master/dist/… 替换为 this._key = consumerSecret;" (看起来他使用的是 wc api 'legacy v2' 而我使用的是最新的 'v1')^ 【参考方案1】:我终于让它工作了。
不知何故,它不适用于我的本地 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"
]
【讨论】:
如何在ts文件中导入crypto和0auth? (对不起新手问题) @GY22 -npm install crypto-js oauth-1.0a --save
然后在 index.html 中包含核心 js 文件或使用 angular-cli config 加载它们
@Steffan.can 你能说说如何使用 oauth1.0a 和 Angular2 的加密 js 发布数据
@AISUNDAR 这取决于其余的 api 服务器。只需使用普通的 ajax 请求并按照 oauthbible.com 了解您想要如何授权。 Jquerys ajax 端点工作正常..【参考方案2】:
我们遇到了401 unauthorised
响应的问题,响应代码类似于woocommerce_rest_invalid_signature
。
事实证明,我们在散列时使用的 URL 与我们访问的 URL 不同,在散列中使用的 URL 缺少尾部斜杠。
【讨论】:
以上是关于将 woocommerce rest api v1 与 http 和 javascript(不是 https)一起使用的主要内容,如果未能解决你的问题,请参考以下文章
使用自定义Wordpress API端点更新WooCommerce产品
Woocommerce Paypal REST api 与 React JS 的集成
在 WooCommerce Rest API 创建产品的那一刻修改产品
WooCommerce REST API v2:如何处理付款?
将 Woocommerce REST API 与 WP-API 的 JWT 身份验证一起使用时,无法获得超过 12 个结果