10

残りの API を使用して Magento に製品を追加しようとすると、「oauth_problem=nonce_used」メッセージで 401 ステータスが返されます。奇妙なことに、製品はまだ輸入されていますが、在庫情報を更新するための製品 ID が返されないため、本当に気が遠くなります。

Magentoのインストールは真新しい(crucialwebhostインストーラー)1.7.0.2で、使用しているコードはほとんどmagentoサイトからコピーして貼り付けたものです...

$callbackUrl = '****';
$temporaryCredentialsRequestUrl = "*****/oauth/initiate?oauth_callback=".urlencode($callbackUrl);
$adminAuthorizationUrl = '*****/admin/oauth_authorize';
$accessTokenRequestUrl = '*****/oauth/token';
$apiUrl = '*****/api/rest';

$consumerKey = '*****';
$consumerSecret = '******';

try
{
$authType = ($_SESSION['state'] == 2) ? OAUTH_AUTH_TYPE_AUTHORIZATION : OAUTH_AUTH_TYPE_URI;
$oauthClient = new OAuth($consumerKey, $consumerSecret, OAUTH_SIG_METHOD_HMACSHA1, $authType);
$oauthClient->enableDebug();

if(!isset($_GET['oauth_token']) && !$_SESSION['state'])
{
  $requestToken = $oauthClient->getRequestToken($temporaryCredentialsRequestUrl);
  $_SESSION['secret'] = $requestToken['oauth_token_secret'];
  $_SESSION['state'] = 1;
  header('Location: '.$adminAuthorizationUrl.'?oauth_token='.$requestToken['oauth_token']);
  exit;
} else if($_SESSION['state'] == 1)
{
  $oauthClient->setToken($_GET['oauth_token'], $_SESSION['secret']);
  $accessToken = $oauthClient->getAccessToken($accessTokenRequestUrl);
  $_SESSION['state'] = 2;
  $_SESSION['token'] = $accessToken['oauth_token'];
  $_SESSION['secret'] = $accessToken['oauth_token_secret'];
  header('Location: '.$callbackUrl);
  exit;
} else
{
  $oauthClient->setToken($_SESSION['token'], $_SESSION['secret']);
  $resourceUrl = "$apiUrl/products";


  $productData = json_encode(array(
'type_id' => 'simple',
    'attribute_set_id' => 4,
    'sku' => $local_product['sku'],
    'weight' => 1,
    'status' => 1,
'visibility' => 4,
    'name' => $local_product['name'],
    'description' => $local_product['description'],
    'short_description' => $local_product['description'],
    'price' => $local_product['price'],
    'tax_class_id' => 0,
  ));
  $headers = array('Content-Type' => 'application/json');
  $oauthClient->fetch($resourceUrl, $productData, OAUTH_HTTP_METHOD_POST, $headers);
  $respHeader = $oauthClient->getLastResponseHeaders();


}

} catch(OAuthException $e)
{
  print_r($e);
}
}

session_destroy();

正確なエラー: {"messages":{"error":[{"code":401,"message":"oauth_problem=nonce_used"}]}}

4

5 に答える 5

8

Mage_Api2_Model_Resource で、227 行目あたりを見つけます。

$this->getResponse()->setHeader('Location', $newItemLocation);

この直後に挿入します:

 $this->getResponse()->setHttpResponseCode(202); 

参照: ウィキペディア「HTTP の場所」:

HTTP Location ヘッダー フィールドは、次の 2 つの状況で、HTTP サーバーからの応答で返されます。

  1. Web ブラウザーに別の Web ページをロードするように要求すること。この場合、HTTP ステータス コード 3xx で Location ヘッダーを送信する必要があります。
  2. 新しく作成されたリソースの場所に関する情報を提供するため。この場合、HTTP ステータス コード 201 または 202 で Location ヘッダーを送信する必要があります。
于 2014-05-28T20:38:17.097 に答える
1

私はまったく同じ問題を抱えており、問題を追跡するのに何週間も費やしました。Apache と PHP と Rewriting の奇妙な組み合わせのようです。最後に、クリーン インストールを作成したところ、問題はなくなりました。また、問題が発生する可能性のある 2 つ目のインストールを作成しようとしましたが、失敗しました。エラーは本番システムでのみ発生し、テスト インストールでは発生しませんでした...

于 2013-10-08T22:39:32.760 に答える