getProduct(); $localCurrency = strtoupper(get_option('aeidn_ali_local_currency', '')); if ($localCurrency) { $currencyConversionFactor = 1; } else { $currencyConversionFactor = (float)get_option('aeidn_currency_conversion_factor', 1); } $appKey = $this->getAccount()->getAccountDataKeyValue('appKey'); $requestUrl = 'http://gw.api.alibaba.com/openapi/param2/2/'; $requestUrl .= 'portals.open/api.getPromotionProductDetail/' . $appKey; $requestUrl .= '?fields=productId,productTitle,productUrl,imageUrl,originalPrice,salePrice,'; $requestUrl .= 'discount,evaluateScore,commission,commissionRate,30daysCommission,volume,packageType,'; $requestUrl .= 'lotNum,validTime,storeName,storeUrl,localPrice'; $requestUrl .= '&productId=' . $product->getExternalId(); $requestUrl .= '&language=' . get_option('aeidn_tr_aliexpress_language', 'en'); if ($localCurrency) { $requestUrl .= "&localCurrency=$localCurrency"; } $request = Curl::get($requestUrl); if (is_wp_error($request)) { return ['state' => 'error', 'message' => 'alibaba . com not response!']; } $data = json_decode($request['body'], true); if (isset($data['errorCode']) && (int)$data['errorCode'] === 20010000) { if (isset($data['result']['productId']) && (int)$data['result']['productId'] === (int)$product->getExternalId() ) { $localPrice = $localCurrency ? Utils::fixPrice($data['result']['localPrice']) : Utils::fixPrice($data['result']['salePrice']); $salePrice = Utils::fixPrice($data['result']['salePrice']); $usdCourse = round($localPrice / $salePrice, 2); $product->setPrice(round($localPrice, 2)); $originalPrice = Utils::fixPrice($data['result']['originalPrice']); $product->setRegularPrice(round($originalPrice * $usdCourse, 2)); $product->setUserPrice(round($product->getPrice() * $currencyConversionFactor, 2)); $product->setUserRegularPrice(round($product->getRegularPrice() * $currencyConversionFactor, 2)); $commissionRate = 8; $additionalMeta['commission'] = round($localPrice * ($commissionRate / 100), 2); $additionalMeta['regular_price'] = round( Utils::fixPrice($data['result']['originalPrice']) * $currencyConversionFactor, 2 ); $additionalMeta['sale_price'] = round( Utils::fixPrice($data['result']['salePrice']) * $currencyConversionFactor, 2 ); $additionalMeta['detail_url'] = $data['result']["productUrl"]; $product->setAdditionalMeta($additionalMeta); $product->setDetailUrl($data['result']["productUrl"]); $product->setSellerUrl(isset($data['result']["storeUrl"]) ? $data['result']["storeUrl"] : ""); $product->setImage($data['result']['imageUrl']); $product->save(); return [ "state" => "ok", "message" => "" ]; } else { return ["state" => "ok", "message" => ""]; } } elseif (isset($data['errorCode']) && (int)$data['errorCode'] === 20010000 && isset($data['result']['productId']) ) { return array('state' => 'error', 'message' => 'System Error'); } elseif (isset($data['errorCode']) && ((int)$data['errorCode'] === 20130000 || (int)$data['errorCode'] === 20030100) ) { return array('state' => 'error', 'message' => 'Input parameter Product ID is error'); } elseif (isset($data['error_code']) && (int)$data['error_code'] === 400) { return array('state' => 'error', 'message' => "{$data['error_message']}"); } elseif (isset($data['errorCode']) && (int)$data['errorCode'] === 20030000) { return array('state' => 'error', 'message' => 'Required parameters'); } elseif (isset($data['errorCode']) && (int)$data['errorCode'] === 20030010) { return array('state' => 'error', 'message' => 'Keyword input parameter error'); } elseif (isset($data['errorCode']) && (int)$data['errorCode'] === 20030020) { return array('state' => 'error', 'message' => 'Category ID input parameter error or formatting errors'); } elseif (isset($data['errorCode']) && (int)$data['errorCode'] === 20030030) { return array('state' => 'error', 'message' => 'Commission rate input parameter error or formatting errors'); } elseif (isset($data['errorCode']) && (int)$data['errorCode'] === 20030040) { return array('state' => 'error', 'message' => 'Unit input parameter error or formatting errors'); } elseif (isset($data['errorCode']) && (int)$data['errorCode'] === 20030050) { return [ 'state' => 'error', 'message' => '30 days promotion amount input parameter error or formatting errors' ]; } elseif (isset($data['errorCode']) && (int)$data['errorCode'] === 20030060) { return array('state' => 'error', 'message' => 'Tracking ID input parameter error or limited length'); } elseif (isset($data['errorCode']) && (int)$data['errorCode'] === 20030070) { return array('state' => 'error', 'message' => 'Unauthorized transfer request'); } elseif (isset($data['errorCode']) && (int)$data['errorCode'] === 20020000) { return array('state' => 'error', 'message' => 'System Error'); } else { return array('state' => 'error', 'message' => 'Unknown Error'); } } /** * @param $filter * @param int $page * @return mixed */ protected function loadListRemote($filter, $page = 1) { $db = Db::getInstance()->getDb(); $perPage = get_option('aeidn_ali_per_page', 20); $result = ['total' => 0, 'per_page' => $perPage, 'items' => [], 'error' => '']; if (isset($filter['link_category_id']) && (int)$filter['link_category_id']) { $linkCategoryId = (int)$filter['link_category_id']; } else { $linkCategoryId = 0; } if ($linkCategoryId && ((isset($filter['aeidn_productId']) && !empty($filter['aeidn_productId'])) || (isset($filter['aeidn_query']) && !empty($filter['aeidn_query'])) || (isset($filter['category_id']) && (int)$filter['category_id'] !== 0) ) ) { if (isset($filter['aeidn_productId']) && $filter['aeidn_productId']) { $singleProductId = $filter['aeidn_productId']; } else { $singleProductId = ''; } $query = isset($filter['aeidn_query']) ? urlencode(utf8_encode($filter['aeidn_query'])) : ''; $categoryId = (isset($filter['category_id']) && $filter['category_id']) ? $filter['category_id'] : ''; if (isset($filter['link_category_id']) && (int)$filter['link_category_id']) { $linkCategoryId = (int)$filter['link_category_id']; } else { $linkCategoryId = 0; } if (isset($filter['aeidn_min_price']) && !empty($filter['aeidn_min_price']) && (float)$filter['aeidn_min_price'] > 0.009 ) { $priceFrom = "&originalPriceFrom={$filter['aeidn_min_price']}"; } else { $priceFrom = ''; } if (isset($filter['aeidn_max_price']) && !empty($filter['aeidn_max_price']) && (float)$filter['aeidn_max_price'] > 0.009 ) { $priceTo = "&originalPriceTo={$filter['aeidn_max_price']}"; } else { $priceTo = ''; } if (isset($filter['commission_rate_from']) && !empty($filter['commission_rate_from']) && (float)$filter['commission_rate_from'] > 0.009 ) { $commissionRateFrom = "&commissionRateFrom={$filter['commission_rate_from']}"; } else { $commissionRateFrom = ''; } if (isset($filter['commission_rate_to']) && !empty($filter['commission_rate_to']) && (float)$filter['commission_rate_to'] > 0.009 ) { $commissionRateTo = "&commissionRateTo={$filter['commission_rate_to']}"; } else { $commissionRateTo = ''; } if (isset($filter['volume_from']) && !empty($filter['volume_from']) && (int)$filter['volume_from'] > 0) { $volumeFrom = "&volumeFrom={$filter['volume_from']}"; } else { $volumeFrom = ''; } if (isset($filter['volume_to']) && !empty($filter['volume_to']) && (int)$filter['volume_to'] > 0) { $volumeTo = "&volumeTo={$filter['volume_to']}"; } else { $volumeTo = ''; } $highQualityItems = isset($filter['high_quality_items']) ? '&highQualityItems=true' : ''; if (isset($filter['min_feedback']) && (int)$filter['min_feedback'] > 0) { $feedbackMin = (int)$filter['min_feedback']; } else { $feedbackMin = 0; } if (isset($filter['max_feedback']) && (int)$filter['max_feedback'] > 0) { $feedbackMax = (int)$filter['max_feedback']; } else { $feedbackMax = 0; } if ($feedbackMax < $feedbackMin) { $feedbackMax = 0; } $startCredit = $feedbackMin ? "&startCreditScore={$feedbackMin}" : ''; $endCredit = $feedbackMax ? "&endCreditScore={$feedbackMax}" : ''; $localCurrency = strtoupper(get_option('aeidn_ali_local_currency', '')); if ($localCurrency) { $localCurrencyReq = "&localCurrency=$localCurrency"; $currencyConversionFactor = 1; } else { $localCurrencyReq = ''; $currencyConversionFactor = (float)get_option('aeidn_currency_conversion_factor', 1); } $requestSort = ''; if (isset($filter['orderby'])) { $requestSort = '&sort='; switch ($filter['orderby']) { case 'price': if ($filter['order'] === 'asc') { $requestSort .= 'orignalPriceUp'; } elseif ($filter['order'] === 'desc') { $requestSort .= 'orignalPriceDown'; } break; case 'validTime': if ($filter['order'] === 'asc') { $requestSort .= 'validTimeUp'; } elseif ($filter['order'] === 'desc') { $requestSort .= 'validTimeDown'; } break; default: $requestSort = ''; } } // <--------------------------- $appKey = $this->getAccount()->getAccountDataKeyValue('appKey'); if ($singleProductId) { // search by product id $requestUrl = "http://gw.api.alibaba.com/openapi/param2/2/portals.open/"; $requestUrl .= "api.getPromotionProductDetail/" . $appKey; $requestParam = '?fields=productId,productTitle,productUrl,imageUrl,originalPrice,salePrice,discount'; $requestParam .= ',evaluateScore,commission,commissionRate,30daysCommission,volume,packageType'; $requestParam .= ',lotNum,validTime,storeName,storeUrl,localPrice'; $requestParam .= "&productId=$singleProductId"; $requestParam .= $localCurrencyReq; $requestSort = ''; } else { // search by query and params $requestUrl = "http://gw.api.alibaba.com/openapi/param2/2/portals.open/"; $requestUrl .= "api.listPromotionProduct/" . $appKey; $requestParam = '?fields=totalResults,productId,productTitle,productUrl,imageUrl,originalPrice,'; $requestParam .= 'salePrice,discount,evaluateScore,commission,commissionRate,30daysCommission,volume'; $requestParam .= ',packageType,lotNum,validTime,localPrice'; $requestParam .= "&categoryId={$categoryId}&pageNo={$page}&keywords={$query}&pageSize={$perPage}"; $requestParam .= '&language=' . get_option('aeidn_tr_aliexpress_language', 'en'); $requestParam .= $localCurrencyReq . $commissionRateFrom . $commissionRateTo . $volumeFrom; $requestParam .= $volumeTo . $priceFrom . $priceTo . $startCredit . $endCredit . $highQualityItems; } $fullRequestUrl = $requestUrl . $requestParam . $requestSort; $request = Curl::get($fullRequestUrl); //echo $full_request_url."
"; //echo "
";print_r($request);echo "
"; //$result["call"] = $request_url . $request_param . $request_sort; $errorCode = ''; $items = []; if (is_wp_error($request)) { $result['error'] = 'alibaba.com not response!'; } else { $items = json_decode($request['body'], true); $errorCode = isset($items['errorCode']) ? $items['errorCode'] : ''; //echo "
";print_r($request);echo "
"; } if ($singleProductId && isset($items['result']) && $items['result']) { $items['result'] = array('products' => array($items['result'])); } //echo "
";print_r($items);echo "
"; if ($errorCode === 20010000 && isset($items['result']['products']) && !empty($items['result']['products']) ) { $data = $items['result']['products']; foreach ($data as $item) { //echo "
";print_r($item);echo "
"; $importer = AffiliateImporter::getInstance()->getImporter($this->getType()); $count = $db->get_var("SELECT count(*) FROM " . $importer->getTableName('blacklist') . " WHERE external_id='" . $item['productId'] . "'"); if ($count > 0) { continue; } $additionalMeta = []; $externalId = 'aliexpress#' . $item['productId']; $noImageUrl = plugins_url('assets/img/iconPlaceholder_96x96.gif', $importer->getMainFile()); $product = ProductFactory::getWithId($externalId); $product->setLinkCategoryId($linkCategoryId); $product->setImage(isset($item['imageUrl']) ? $item['imageUrl'] : $noImageUrl); $product->setDetailUrl($item['productUrl']); $product->setTitle(strip_tags($item['productTitle'])); $product->setSubtitle('#notuse#'); $product->setCategoryId(0); $additionalMeta['detail_url'] = $item['productUrl']; $additionalMeta['validTime'] = $item['validTime']; if (trim($product->getCategoryName()) === '') { $product->setCategoryName('#needload#'); } if (trim($product->getKeywords()) === '') { $product->setKeywords('#needload#'); } if (trim($product->getDescription()) === '') { $product->setDescription('#needload#'); } if (trim($product->getPhotos()) === '') { $product->setPhotos('#needload#'); } $additionalMeta['discount'] = $item['discount']; // $additionalMeta['condition'] = "New"; if ($localCurrency) { $localPrice = Utils::fixPrice($item['localPrice']); } else { $localPrice = Utils::fixPrice($item['salePrice']); } $salePrice = Utils::fixPrice($item['salePrice']); $usdCourse = round($localPrice / $salePrice, 2); $product->setPrice(round($localPrice, 2)); $originalPrice = Utils::fixPrice($item['originalPrice']); $product->setRegularPrice(round($originalPrice * $usdCourse, 2)); $additionalMeta['original_discount'] = 100 - round($salePrice * 100 / $originalPrice); //course //$additionalMeta['ship'] = '8%'; $commission_rate = 8; $additionalMeta['commission'] = round($localPrice * ($commission_rate / 100), 2); $additionalMeta['volume'] = $item['volume']; $additionalMeta['rating'] = $item['evaluateScore']; /* this is for one addon -----> */ $fixedRegularPrice = Utils::fixPrice($item['originalPrice']) * $currencyConversionFactor; $additionalMeta['regular_price'] = round($fixedRegularPrice, 2); $fixedSalePrice = Utils::fixPrice($item['salePrice']) * $currencyConversionFactor; $additionalMeta['sale_price'] = round($fixedSalePrice, 2); /* <--------------------------- */ if ($localCurrency) { $product->setCurr(strtoupper($localCurrency)); } else { if ($currencyConversionFactor > 1) { $product->setCurr(strtoupper("CUSTOM (*$currencyConversionFactor)")); } else { $product->setCurr(strtoupper('USD (Default)')); } } $product->setAdditionalMeta($additionalMeta); $product->save(); $product->loadUserPrice($currencyConversionFactor); $product->loadUserImage(); $result['items'][] = $product; } $result['items'] = $this->getAffiliateGoods($result['items']); if (isset($items['result']['totalResults'])) { if ((int)$items['result']['totalResults'] > 10240) { $result['total'] = 10240; } else { $result['total'] = $items['result']['totalResults']; } } } if ((int)$errorCode === 20010000 && empty($items['result']['products'])) { $result['error'] = 'There is no product to display!'; } elseif ((int)$errorCode === 400) { $result['error'] = $items['error_message']; } elseif ((int)$errorCode === 20030000) { $result['error'] = 'Required parameters'; } elseif ((int)$errorCode === 20030010) { $result['error'] = 'Keyword input parameter error'; } elseif ((int)$errorCode === 20030020) { $result['error'] = 'Category ID input parameter error or formatting errors'; } elseif ((int)$errorCode === 20030030) { $result['error'] = 'Commission rate input parameter error or formatting errors'; } elseif ((int)$errorCode === 20030040) { $result['error'] = 'Unit input parameter error or formatting errors'; } elseif ((int)$errorCode === 20030050) { $result['error'] = '30 days promotion amount input parameter error or formatting errors'; } elseif ((int)$errorCode === 20030060) { $result['error'] = 'Tracking ID input parameter error or limited length'; } elseif ((int)$errorCode === 20030070) { $result['error'] = 'Unauthorized transfer request'; } elseif ((int)$errorCode === 20020000) { $result['error'] = 'System Error'; } elseif ((int)$errorCode === 20030100) { $result['error'] = 'Error! Input parameter Product ID'; } } else { if ((isset($filter['aeidn_productId']) && !empty($filter['aeidn_productId'])) || (isset($filter['aeidn_query']) && !empty($filter['aeidn_query'])) || (isset($filter['category_id']) && (int)$filter['category_id'] !== 0) ) { $result["error"] = 'Please set "Link to category" field before searching'; } else { $result["error"] = 'Please enter keywords, product ID, or select an item category from the list.'; } } return $result; } private function getAffiliateGoods($result) { $urls = ''; /** * @var Product $product */ foreach ($result as $product) { $urls .= ($urls ? "," : "") . $product->getDetailUrl(); } $appKey = $this->getAccount()->getAccountDataKeyValue('appKey'); $trackingId = $this->getAccount()->getAccountDataKeyValue('trackingId'); $requestUrl = "http://gw.api.alibaba.com/openapi/param2/2/portals.open/api.getPromotionLinks/"; $requestUrl .= $appKey . "?fields=&trackingId=" . $trackingId . "&urls={$urls}"; $request = Curl::get($requestUrl); if (!is_wp_error($request)) { $data = json_decode($request['body'], true); if (isset($data['errorCode']) && (int)$data['errorCode'] === 20010000) { /** * @var Product $product */ foreach ($result as $key => $product) { $newPromoUrl = ""; foreach ($data['result']['promotionUrls'] as $pu) { if ($pu['url'] === $result[$key]->getDetailUrl()) { $newPromoUrl = $pu['promotionUrl']; break; } } if ($newPromoUrl) { $product->setDetailUrl($newPromoUrl); } } } } return $result; } }