我正在尝试了解如何使用使用OAuth库的TradeKing API发布数据。在与API支持专家交谈后,他解释说唯一缺少的是完成请求所需的OAuth标头。
我对OAuth的体验非常有限,官方文档中没有一个POST
PHP示例。感谢您提供有关如何成功生成适用于API的OAuth标头的任何帮助。
我尝试在下面的代码中提供以下URL中的示例,但是,似乎它已被折旧,并且最新版本中缺少示例中使用的所有内置函数:
https://gist.github.com/JCBarry/2853042
提前致谢!
官方POST
文档
https://developers.tradeking.com/documentation/accounts-id-orders-post
这就是我的尝试:
<?php
// Your keys/secrets for access
$consumer_key = '0cc175b9c0f1b6a831c399e269772661';
$consumer_secret = 'ff2513194e75315625628304c9eb66e8';
$access_token = '150a96573adf12b21dab621e85497e6e';
$access_secret = '5c7b57d450a71d378a5eda991f809e56';
$oauth = new OAuth($consumer_key,$consumer_secret,OAUTH_SIG_METHOD_HMACSHA1,OAUTH_AUTH_TYPE_AUTHORIZATION);
$oauth->disableSSLChecks();
$oauth->setToken($access_token,$access_secret);
$url = 'https://api.tradeking.com/v1/accounts/12345678/orders/preview.xml';
$data = '<?xml version="1.0"?>
<FIXML xmlns="http://www.fixprotocol.org/FIXML-5-0-SP2">
<Order TmInForce="0" Typ="1" Side="1" Acct="12345678">
<Instrmt SecTyp="CS" Sym="F"/>
<OrdQty Qty="1"/>
</Order>
</FIXML>';
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
echo $response = curl_exec($ch);
?>
这是我得到的错误:
Error AuthenticationFailure signature_method_rejected /v1/accounts/12345678/orders/preview.xml
答案 0 :(得分:1)
根据API,您需要发送一个类似于此
的Authorization标头/*
Authorization: OAuth
oauth_consumer_key="672e71387c0a126f4e13296ecfb2b7bc",
oauth_nonce="cfdb7f42de425d94fbc24c11a920c33e",
oauth_signature="Vfm148kAgBZ6azEHqds43aY2UsEg3D",
oauth_signature_method="HMAC-SHA1",
oauth_timestamp="1306871932",
oauth_token="819682555b63ab8bd90a4138138e7365",
oauth_version="1.0"
*/
尝试以下代码。您需要定义$oauth_nonce
和$oauth_signature
。
$header = [
"Authorization: OAuth \n" .
'oauth_consumer_key="'.$consumer_key.'"' . " \n" .
'oauth_nonce="'.$oauth_nonce.'"' . " \n" .
'oauth_signature="'.$oauth_signature.'"' . " \n" .
'oauth_signature_method="HMAC-SHA1"' . " \n" .
'oauth_timestamp="'.time().'"' . " \n" .
'oauth_token="'.$access_token.'"' . " \n" .
'oauth_version="1.0"'
];
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
答案 1 :(得分:1)
他们的API看起来很好记录,然后我就无法理解你的问题了。
<强>接头强>
对于经过身份验证的呼叫,我们要求您通过有效的OAuth标头发送。对于未经身份验证的请求,没有任何必需的标头。
在您提供的代码示例中,这些标头完全缺少您使用curl_exec()
触发的HTTP请求。所以你的例子根本不会起作用,如果那会想知道。
然而,想知道您首先使用OAuth extension,然后使用Curl extension。这是两个不同的概念。他们并没有神奇地一起工作。
所以对我来说,你很可能看起来还没有决定你真正想要编程的东西(按行),我建议你抛弃代码,因为它只是以你自己的方式站立。
首先从头开始研究OAuth是什么,要使用哪个Oauth和HTTP客户端库,以及如何使用您在问题中引用的基于OAuth的API。由于您尝试使用的API已经有很好的文档记录,因此我确信您应该能够立即提出一个具体的编程问题,这个问题应该不那么模糊,因此很容易回答。
答案 2 :(得分:1)
要使其正常工作,首先必须获得oauth令牌。这是一个可行的代码:
// Change this! Use the right values!
$consumer_key = '0cc175b9c0f1b6a831c399e269772661';
$consumer_secret = 'ff2513194e75315625628304c9eb66e8';
$access_token = '150a96573adf12b21dab621e85497e6e';
$access_secret = '5c7b57d450a71d378a5eda991f809e56';
try {
$oauth = new OAuth($consumer_key,$consumer_secret);
$oauth->setToken($access_token,$access_secret);
$access_token_info = $oauth->getAccessToken("https://developers.tradeking.com/oauth/request_token");
if(!empty($access_token_info)) {
print_r($access_token_info);
} else {
print "Failed fetching access token, response was: " . $oauth->getLastResponse();
}
} catch(OAuthException $E) {
echo "Response: ". $E->lastResponse . "\n";
如果一切正常,你会得到这样的回复:
Array
(
[oauth_token] => some_token
[oauth_token_secret] => some_token_secret
[...extra data here...]
)
使用此信息,您可以在发出curl请求之前设置所需的OAuth标头:
$ch = curl_init($url);
$header = [...]; // Fill this array with info store in $access_token_info variable
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
echo $response = curl_exec($ch);