# ali2woo-lite/trunk/includes/libs/ae-php-sdk/iop/IopClient.php

AliNext – WooCommerce Dropshipping Plugin for AliExpress, version trunk. 321 lines.

- Page: https://pluginprobe.com/plugins/ali2woo-lite/trunk/code/includes/libs/ae-php-sdk/iop/IopClient.php
- Raw: https://pluginprobe.com/plugins/ali2woo-lite/trunk/raw/includes/libs/ae-php-sdk/iop/IopClient.php
- Modified: 2024-06-25T13:44:36+00:00

Line numbers below start at 1. Link to a line or a range by appending a fragment to the
page URL, for example `https://pluginprobe.com/plugins/ali2woo-lite/trunk/code/includes/libs/ae-php-sdk/iop/IopClient.php#L10-L20`.

```php
<?php
// phpcs:ignoreFile WordPress.WP.AlternativeFunctions.curl_curl_setopt
class IopClient
{
	public $appkey;

	public $secretKey;

	public $gatewayUrl;

	public $connectTimeout;

	public $readTimeout;

	protected $signMethod = "sha256";

	protected $sdkVersion = "iop-sdk-php-20220608";

	public $logLevel;

	public function getAppkey()
	{
		return $this->appkey;
	}

	public function __construct($url = "",$appkey = "",$secretKey = "")
	{
		$length = strlen($url);
	    if($length == 0)
	    {    
			throw new Exception("url is empty",0);
		}
		$this->gatewayUrl = $url;
		$this->appkey = $appkey;
		$this->secretKey = $secretKey;
		$this->logLevel = Constants::$log_level_error;
	}

    protected function generateSign($apiName,$params)
    {
        ksort($params);

        $stringToBeSigned = '';
        if (str_contains($apiName, '/')) {//rest服务协议
            $stringToBeSigned .= $apiName;
        }
        foreach ($params as $k => $v) {
            $stringToBeSigned .= "$k$v";
        }
        unset($k, $v);

        return strtoupper($this->hmac_sha256($stringToBeSigned,$this->secretKey));
    }


	function hmac_sha256($data, $key){
	    return hash_hmac('sha256', $data, $key);
	}

	public function curl_get($url,$apiFields = null,$headerFields = null)
	{
        // phpcs:ignore WordPress.WP.AlternativeFunctions.curl_curl_init
		$ch = curl_init();

		foreach ($apiFields as $key => $value)
		{
			$url .= "&" ."$key=" . urlencode($value);
		}

	    curl_setopt($ch, CURLOPT_URL, $url);
	    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_FAILONERROR, false);
	    curl_setopt($ch, CURLOPT_HEADER, false);
	    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);

	    if ($headerFields) {
	    	$headers = array();
	    	foreach ($headerFields as $key => $value)
			{
				$headers[] = "$key: $value";
			}
			curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
			unset($headers);
	    }

		if ($this->readTimeout) {
			curl_setopt($ch, CURLOPT_TIMEOUT, $this->readTimeout);
		}

		if ($this->connectTimeout) {
			curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $this->connectTimeout);
		}
		
		curl_setopt ( $ch, CURLOPT_USERAGENT, $this->sdkVersion );

		//https ignore ssl check ?
		if (strlen($url) > 5 && strtolower(substr($url,0,5)) == "https" ) {
			curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
			curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
		}
        // phpcs:ignore WordPress.WP.AlternativeFunctions.curl_curl_exec
        $response = curl_exec($ch);
        // phpcs:ignore WordPress.WP.AlternativeFunctions.curl_curl_errno
		$errno = curl_errno($ch);

		if ($errno) {
            // phpcs:ignore WordPress.WP.AlternativeFunctions.curl_curl_close
			curl_close($ch);
			throw new Exception($errno,0);
		}
		else {
            // phpcs:ignore WordPress.WP.AlternativeFunctions.curl_curl_getinfo
			$httpStatusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
            // phpcs:ignore WordPress.WP.AlternativeFunctions.curl_curl_close
			curl_close($ch);
			if (200 !== $httpStatusCode)
			{
				throw new Exception($response, $httpStatusCode);
			}
		}

		return $response;
	}

	public function curl_post($url, $postFields = null, $fileFields = null,$headerFields = null)
	{
        // phpcs:ignore WordPress.WP.AlternativeFunctions.curl_curl_init
		$ch = curl_init();
		curl_setopt($ch, CURLOPT_URL, $url);
		curl_setopt($ch, CURLOPT_FAILONERROR, false);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

		if ($this->readTimeout) {
			curl_setopt($ch, CURLOPT_TIMEOUT, $this->readTimeout);
		}

		if ($this->connectTimeout) {
			curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $this->connectTimeout);
		}

		if ($headerFields) {
	    	$headers = array();
	    	foreach ($headerFields as $key => $value)
			{
				$headers[] = "$key: $value";
			}
			curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
			unset($headers);
	    }

		curl_setopt ( $ch, CURLOPT_USERAGENT, $this->sdkVersion );

		//https ignore ssl check ?
		if (strlen($url) > 5 && strtolower(substr($url,0,5)) == "https" ) {
			curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
			curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
		}

		$delimiter = '-------------' . uniqid();
		$data = '';
		if ($postFields != null) {
			foreach ($postFields as $name => $content) 
			{
			    $data .= "--" . $delimiter . "\r\n";
			    $data .= 'Content-Disposition: form-data; name="' . $name . '"';
			    $data .= "\r\n\r\n" . $content . "\r\n";
			}
			unset($name,$content);
		}

		if ($fileFields != null) {
			foreach ($fileFields as $name => $file) 
			{
			    $data .= "--" . $delimiter . "\r\n";
			    $data .= 'Content-Disposition: form-data; name="' . $name . '"; filename="' . $file['name'] . "\" \r\n";
			    $data .= 'Content-Type: ' . $file['type'] . "\r\n\r\n";
			    $data .= $file['content'] . "\r\n";
			}
			unset($name,$file);
		}
		$data .= "--" . $delimiter . "--";

		curl_setopt($ch, CURLOPT_POST, true);
		curl_setopt($ch, CURLOPT_HTTPHEADER , 
			array(
				'Content-Type: multipart/form-data; boundary=' . $delimiter,
			    'Content-Length: ' . strlen($data)
			)
		);

		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
		curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
        // phpcs:ignore WordPress.WP.AlternativeFunctions.curl_curl_exec
		$response = curl_exec($ch);
		unset($data);
        // phpcs:ignore WordPress.WP.AlternativeFunctions.curl_curl_errno
		$errno = curl_errno($ch);
		if ($errno) {
            // phpcs:ignore WordPress.WP.AlternativeFunctions.curl_curl_close
			curl_close($ch);
			throw new Exception($errno,0);
		}
		else
		{
            // phpcs:ignore WordPress.WP.AlternativeFunctions.curl_curl_getinfo
			$httpStatusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
            // phpcs:ignore WordPress.WP.AlternativeFunctions.curl_curl_close
			curl_close($ch);
			if (200 !== $httpStatusCode) {
				throw new Exception($response,$httpStatusCode);
			}
		}

		return $response;
	}

	public function execute(IopRequest $request, $accessToken = null) {
		$sysParams["app_key"] = $this->appkey;
		$sysParams["sign_method"] = $this->signMethod;
		$sysParams["timestamp"] = $this->msectime();
        $sysParams["method"]=$request->apiName;
        $sysParams["partner_id"] = $this->sdkVersion;
        $sysParams["simplify"] = $request->simplify;
        $sysParams["format"] = $request->format;

        if (null != $accessToken)
		{
			$sysParams["session"] = $accessToken;
		}

		$apiParams = $request->udfParams;
		
		$requestUrl = $this->gatewayUrl;

		if($this->endWith($requestUrl,"/"))
		{
			$requestUrl = substr($requestUrl, 0, -1);
		}

//		$requestUrl .= $request->apiName;
		$requestUrl .= '?';

		if($this->logLevel == Constants::$log_level_debug)
		{
			$sysParams["debug"] = 'true';
		}
		$sysParams["sign"] = $this->generateSign($request->apiName,array_merge($apiParams, $sysParams));

		foreach ($sysParams as $sysParamKey => $sysParamValue)
		{
			$requestUrl .= "$sysParamKey=" . urlencode($sysParamValue) . "&";
		}

		$requestUrl = substr($requestUrl, 0, -1);
		
		$resp = '';

		try
		{
			if($request->httpMethod == 'POST')
			{
				$resp = $this->curl_post($requestUrl, $apiParams, $request->fileParams,$request->headerParams);
			}
			else
			{
				$resp = $this->curl_get($requestUrl, $apiParams,$request->headerParams);			
			}
		}
		catch (Exception $e)
		{
			$this->logApiError($requestUrl, $apiParams,"HTTP_ERROR_" . $e->getCode(),$e->getMessage());
			throw $e;
		}

		unset($apiParams);

		$respObject = json_decode($resp);
		if (isset($respObject->code) && $respObject->code != "0") {
			$this->logApiError($requestUrl, $respObject->code, $respObject->message);
		} else {
			if($this->logLevel == Constants::$log_level_debug || $this->logLevel == Constants::$log_level_info) 
			{
				$this->logApiError($requestUrl, '', '');
			}
		}
		return $resp;
	}

	protected function logApiError($requestUrl, $apiParams, $errorCode, $responseTxt) {
		$localIp = isset($_SERVER["SERVER_ADDR"]) ? $_SERVER["SERVER_ADDR"] : "CLI";
		$logger = new IopLogger;
		$logData = array(
            gmdate("Y-m-d H:i:s"),
            $this->appkey,
            $localIp,
            PHP_OS,
            $this->sdkVersion,
            $requestUrl,
            $errorCode,
            str_replace("\n","",$responseTxt),
            print_r($apiParams, true)
		);
		$logger->log($logData);
	}

	function msectime() {
	   list($msec, $sec) = explode(' ', microtime());
	   return $sec . '000';
	}

	 function endWith($haystack, $needle) {   
	    $length = strlen($needle);
	    if($length == 0)
	    {    
	        return false;  
	    }
	    return (substr($haystack, -$length) === $needle);
	 }

}

```
