Magento Rest API 错误:`签名无效。添加 searchCriteria 过滤器后验证并重试。`

问题描述 投票:0回答:1
我正在尝试向 magento 2 api 发送 API 请求以检索所有订单。我使用 Illuminate\Support\Facades\Http 从 Laravel 发送此请求。要向 magento IM 验证我自己的身份,请使用集成 Oauth 凭据。 我授予集成资源访问“全部”的权限,以使测试更容易

Magento 版本是 2.4.4

$orderEndpoint = '/rest/V1/orders'; $oauthParams = [ 'oauth_consumer_key' => $clientId, 'oauth_nonce' => md5(uniqid(rand(), true)), 'oauth_signature_method' => 'HMAC-SHA256', 'oauth_timestamp' => time(), 'oauth_token' => $accessToken, ]; ksort($oauthParams); $queryParams = [ 'searchCriteria[currentPage]' => 1, 'searchCriteria[pageSize]' => 10, ]; $baseString = 'GET&' . rawurlencode($baseUrl . $orderEndpoint) . '&' . rawurlencode(http_build_query(array_merge($oauthParams, $queryParams), '', '&', PHP_QUERY_RFC3986)); dump($baseString); $signatureKey = rawurlencode($consumerSecret) . '&' . rawurlencode($tokenSecret); $signature = base64_encode(hash_hmac('sha256', $baseString, $signatureKey, true)); dump($signature); $oauthParams['oauth_signature'] = $signature; $authorizationHeader = 'OAuth ' . http_build_query($oauthParams, '', ', ', PHP_QUERY_RFC3986); $fullUrl = $baseUrl . $orderEndpoint . '?' . http_build_query(array_merge($oauthParams, $queryParams)); dump($fullUrl); $response = Http::withHeaders([ 'Authorization' => $authorizationHeader, ])->get($baseUrl . $orderEndpoint, $queryParams); if ($response->successful()) { $orderData = $response->json(); dd($orderData); } else { dd($response->json()); }
这是我的代码,它的工作原理就像它应该工作的那样,但是当我尝试将 $queryParams 更改为:

$queryParams = [ 'searchCriteria[filter_groups][0][filters][0][field]' => 'status', 'searchCriteria[filter_groups][0][filters][0][value]' => 'complete', 'searchCriteria[currentPage]' => 1, 'searchCriteria[pageSize]' => 10, ];
我收到错误签名无效。验证并重试。

有人知道我做错了什么以及解决方案是什么?

laravel rest magento oauth request
1个回答
0
投票
我知道有些人可能不喜欢这个,但 ChatGPT 为我提供了一个答案,部分解决了 ChatGPT 给我的答案是添加 uksort 的问题

如果添加更多过滤器,它会停止工作,所以如果我添加它,它会再次停止工作

$queryParams = [ 'searchCriteria[filter_groups][0][filters][0][field]' => 'created_at', 'searchCriteria[filter_groups][0][filters][0][value]' => Carbon::now()->subDays(14)->format('Y-m-d H:i:s'), 'searchCriteria[filter_groups][0][filters][0][condition_type]' => 'from', 'searchCriteria[filter_groups][1][filters][0][field]' => 'created_at', 'searchCriteria[filter_groups][1][filters][0][value]' => Carbon::now()->subWeek()->format('Y-m-d H:i:s'), 'searchCriteria[filter_groups][1][filters][0][condition_type]' => 'to', 'searchCriteria[filter_groups][2][filters][0][field]' => 'status', 'searchCriteria[filter_groups][2][filters][0][value]' => 'complete', 'searchCriteria[currentPage]' => 1, 'searchCriteria[pageSize]' => 10, ];


下面的代码是部分修复它的代码

$orderEndpoint = '/rest/V1/orders'; $oauthParams = [ 'oauth_consumer_key' => $clientId, 'oauth_nonce' => md5(uniqid(rand(), true)), 'oauth_signature_method' => 'HMAC-SHA256', 'oauth_timestamp' => time(), 'oauth_token' => $accessToken, ]; ksort($oauthParams); $queryParams = [ 'searchCriteria[filter_groups][0][filters][0][field]' => 'status', 'searchCriteria[filter_groups][0][filters][0][value]' => 'complete', 'searchCriteria[currentPage]' => 1, 'searchCriteria[pageSize]' => 10, ]; // Combine OAuth parameters and query parameters for the base string $allParams = array_merge($oauthParams, $queryParams); // Construct base string $baseString = 'GET&' . rawurlencode($baseUrl . $orderEndpoint) . '&' . rawurlencode(http_build_query($allParams, '', '&', PHP_QUERY_RFC3986)); // Generate signature $signatureKey = rawurlencode($consumerSecret) . '&' . rawurlencode($tokenSecret); $signature = base64_encode(hash_hmac('sha256', $baseString, $signatureKey, true)); // Update OAuth parameters with the signature $oauthParams['oauth_signature'] = $signature; // Build authorization header $authorizationHeader = 'OAuth ' . http_build_query($oauthParams, '', ', ', PHP_QUERY_RFC3986); // Build full URL $fullUrl = $baseUrl . $orderEndpoint . '?' . http_build_query($queryParams); // Make HTTP GET request $response = Http::withHeaders([ 'Authorization' => $authorizationHeader, ])->get($fullUrl); // Handle the response if ($response->successful()) { $orderData = $response->json(); dd($orderData); } else { dd($response->json()); }
    
© www.soinside.com 2019 - 2024. All rights reserved.