helper = $helper; $this->_logger = $logger; $this->oauth = $oauth; $this->curl = $curl; $this->json = $json; } /** * @param array $data * @return array * @throws InvalidArgumentException */ public function postData(string $service, array $data) { $url = $this->oauth->getEndpoint($service); $this->responseHeaders = []; $oauthCredentials = $this->oauth->getOauthParams($service); $jsonData = $this->json->serialize($data); // $this->_logger->info('Restful Request data: ' . $jsonData); // $this->_logger->info('Restful Request oauthCredentials: ' . $oauthCredentials); try { $this->curl->addHeader("Accept", "application/json"); $this->curl->addHeader("Content-Type", "application/json"); $this->curl->addHeader("Authorization", $oauthCredentials); // $this->curl->addHeader("Cookie", "NS_ROUTING_VERSION=LAGGING"); $this->curl->post($url, $jsonData); // check the status code returned by NetSuite $statusCode = $this->curl->getStatus(); // $this->_logger->info('Restful Status Code: ' . $statusCode); // $this->_logger->info('Restful NetSuite API data: ', ['data' => $data, 'url' => $url]); $header = $this->curl->getHeaders(); $this->responseHeaders = $header; if (!str_starts_with($statusCode, '2')) { // $this->_logger->error("Error: " . $this->curl->getBody()); return [ 'error' => true, 'message' => $this->curl->getBody() ]; } if ($statusCode==204) { return [ 'error' => false, ]; } $response = $this->curl->getBody(); $response = $this->json->unserialize($response); # if response is not an array, unserialize again if (!is_array($response)) { $response = $this->json->unserialize($response); } return $response; } catch (\Exception $e) { $this->_logger->error("Restful error: " . $e->getMessage(), $e->getTrace()); return $response = [ 'error' => true, 'message' => $e->getMessage() ]; } } /** * @return array */ public function getResponseHeaders() { return $this->responseHeaders; } /** * @param string $service * @param array $params * @return array * @throws \Random\RandomException */ public function get(string $service, array $params = []) { $consumerKey = $this->oauth->getConsumerKey(); $consumerSecret = $this->oauth->getConsumerSecret(); $token = $this->oauth->getToken(); $token_secret = $this->oauth->getTokenSecret(); $realm = $this->oauth->getAccountId(); // OAuth parameters $oauth = [ 'oauth_consumer_key' => $consumerKey, 'oauth_token' => $token, 'oauth_nonce' => bin2hex(random_bytes(16)), 'oauth_timestamp' => time(), 'oauth_signature_method' => Oauth::SIGNATURE_METHOD_HMACSHA256, 'oauth_version' => '1.0' ]; $url = $this->oauth->getEndpoint($service); // Combine and sort parameters for signature $all_params = array_merge($params, $oauth); ksort($all_params); // Build base string $base_info = 'GET&' . rawurlencode($url) . '&' . rawurlencode(http_build_query($all_params, '', '&', PHP_QUERY_RFC3986)); // Create signature key $composite_key = rawurlencode($consumerSecret) . '&' . rawurlencode($token_secret); // Generate the signature $oauth_signature = base64_encode(hash_hmac('sha256', $base_info, $composite_key, true)); // Add the signature to the OAuth parameters $oauth['oauth_signature'] = $oauth_signature; // Build the Authorization header $header = 'OAuth realm="' . rawurlencode($realm) . '"'; foreach ($oauth as $key => $value) { $header .= ', ' . rawurlencode($key) . '="' . rawurlencode($value) . '"'; } $fullUrl = $url . '?' . http_build_query($params, '', null, PHP_QUERY_RFC3986); // Send the GET request with cURL $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $fullUrl); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, ["Authorization: $header"]); $response = curl_exec($ch); $status = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); if ($status != 200) { $this->_logger->error("netsuite get request fail: ", ['url' => $fullUrl, 'response' => $response, 'http_code' => $status]); } return [ 'error' => $status != 200, 'response' => json_decode($response, true) ]; } }