Ich möchte meine Erfahrungen bei der Automatisierung des Exports von Bestellungen von Aliexpress in mehrere CRMs teilen. Die angegebenen Beispiele sind in PHP geschrieben, es gibt jedoch auch Bibliotheken für die Arbeit mit Aliexpress für andere Sprachen. Die Struktur der Anfragen und Antworten ist ähnlich. Wenn Sie vor der Aufgabe stehen, Aliexpress zu integrieren, hoffe ich, dass Sie diesen Artikel hilfreich finden.
Nehmen wir also an, Sie haben bereits ein Geschäft bei Aliexpress. Und Sie haben den Menüpunkt "Entwickler" gewählt. Zum Zeitpunkt der Veröffentlichung gab es einige Probleme bei der Lokalisierung der Entwicklerkonsole. Diese werden möglicherweise in Zukunft behoben. Wenn jedoch bereits erstellte Anwendungen nicht in der Konsole angezeigt werden oder das Aufrufen der Konsole vom Büro des Verkäufers aus nicht funktioniert, funktioniert dies nicht. Es gibt ein paar Tipps:
Folgen Sie dem Link https://seller.aliexpress.ru/login?return_url=https%3A%2F%2Fseller.aliexpress.ru Dies behebt einen Fehler mit einer Weiterleitung zur chinesischen Version der Konsole, in der dies nicht möglich ist Erstellen Sie eine Anwendung
, . , - , . .. , . , «main account not auth subAccount»
SDK . - App Key App Secret. – access_token . . App Key, App Secret access_token, SDK, PHP-, appkey, secretKey sessionKey. , access_token :
. .. , Aliexpress CRM. Aliexpress, . code, curl https://oauth.aliexpress.com/token access_token
https://oauth.aliexpress.com/authorize. access_token
. , access_token – 1 . . «testing». - 1 . , AliPay ( ). , .. – , , , , .. . Aliexpress 2020 .
. , - .
Selenium , .. access_token .
, Ailexpress , CRM.
include "TopSdk.php";
date_default_timezone_set('Asia/Shanghai');
$c = new TopClient;
$c->appkey = 'xxxxxxxxxxx';
$c->secretKey = 'xxxxxxxxxxxxxxxxxxxxxxxxxx';
$sessionKey = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
$i = 1;
$req = new AliexpressSolutionProductListGetRequest;
$aeop_a_e_product_list_query = new ItemListQuery;
$aeop_a_e_product_list_query->current_page=$i;
$aeop_a_e_product_list_query->product_status_type="onSelling";
$req->setAeopAEProductListQuery(json_encode($aeop_a_e_product_list_query));
$rez = $c->execute($req, $sessionKey);
var_dump($rez);
$rez . $i. 1, , $rez->result->total_page . . – . . . , . id ( , )
foreach($rez->result->aeop_a_e_product_display_d_t_o_list->item_display_dto as $item){
echo $item->product_id."\t".$item->subject."\n";
}
(, ..), id , . .
$req = new AliexpressSolutionProductInfoGetRequest;
$req->setProductId($id);
$rez = $c->execute($req, $sessionKey);
var_dump ($rez);
, , .
foreach($rez->result->aeop_ae_product_s_k_us->global_aeop_ae_product_sku as $sku){
echo $sku ->id."\t".$sku ->sku_code."\n";
}
c . , , API . , , , .
. , , Product code . . , , , Product code.
. CRM.
$req = new AliexpressSolutionOrderGetRequest;
$param0 = new OrderQuery;
$param0->create_date_end="2221-12-31 12:12:12";
$param0->create_date_start="2021-03-30 12:12:12";
$param0->order_status_list = array("PLACE_ORDER_SUCCESS","IN_CANCEL","WAIT_SELLER_SEND_GOODS","SELLER_PART_SEND_GOODS","WAIT_BUYER_ACCEPT_GOODS","FUND_PROCESSING","IN_ISSUE","IN_FROZEN","WAIT_SELLER_EXAMINE_MONEY","RISK_CONTROL", "FINISH");
$param0->current_page=$i;
$req->setParam0(json_encode($param0));
$rez = $c->execute($req, $sessionKey);
, , . order_status_list. , . , , , .
. «RU shopper» .., , . , . , Aliexpress, .
, . , Aliexpress , - « ». . , Aliexpress, , , 20 .
$req = new AliexpressSolutionOrderInfoGetRequest;
$param1 = new OrderDetailQuery;
$param1->ext_info_bit_flag="11111";
$param1->order_id=$order;
$req->setParam1(json_encode($param1));
$rez = $c->execute($req, $sessionKey);
$n = str_replace("'","''",$rez->result->data->receipt_address->contact_person); //
$p = $rez->result->data->receipt_address->phone_country . $rez->result->data->receipt_address->mobile_no;
//$p = normalize_phone($p) // ..
$zi = $rez->result->data->receipt_address->zip;
$gor = $rez->result->data->receipt_address->city;
$pro = $rez->result->data->receipt_address->province;
$adr = $rez->result->data->receipt_address->detail_address;
if(isset ($rez->result->data->receipt_address->address2)) $adr .=$rez->result->data->receipt_address->address2;
foreach($rez->result->data->child_order_ext_info_list->global_aeop_tp_order_product_info_dto as $item){
$pid = $item->product_id;
$j=json_decode($item->sku);
$s = "";
if(isset ($j->sku[0])) {
$s = $j->sku[0]->pValueId;
}
$cn =$item->quantity;
$pr =$item->unit_price->amount ;
echo $pid."\t". $s." \t " .$cn ." \t ".$pr."\n";
}
, Aliexpress .
, . CRM . , . , Aliexpress, - , .
Ich habe sie aus meinen Projekten genommen und von Integrationen (einschließlich Aliexpress) gelöst. Jedes Beispiel erstellt einen Kontakt, dann einen Lead / Deal, weist ihm einen Kontakt zu und fügt ein Produkt hinzu. Ich helfe Ihnen gerne bei der Integration gegen eine geringe Gebühr, wenn Sie sich entscheiden, Aliexpress zu verkaufen. Darüber hinaus rückt die Zeit für den Urlaub näher und zusätzliches Geld wird weder mich noch Sie stören. Mail für die Kommunikation tlx {dog} list.ru. Es gibt umfangreiche Erfahrung in der Integration von Fulfillment, Telefonie und anderen APIs in verschiedene CRMs und allgemeine Automatisierungsfähigkeiten.
amoCRM
$subdomain = "xxxxxxxxx";
function amo_call($access_token, $link, $data) {
$headers = [
'Authorization: Bearer ' . $access_token
];
$curl = curl_init(); // cURL
curl_setopt($curl,CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl,CURLOPT_USERAGENT,'amoCRM-oAuth-client/1.0');
curl_setopt($curl,CURLOPT_URL, $link);
curl_setopt($curl,CURLOPT_CUSTOMREQUEST,'POST');
curl_setopt($curl,CURLOPT_POSTFIELDS,json_encode($data));
curl_setopt($curl,CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl,CURLOPT_HEADER, false);
curl_setopt($curl,CURLOPT_SSL_VERIFYPEER, 1);
curl_setopt($curl,CURLOPT_SSL_VERIFYHOST, 2);
$out = curl_exec($curl); // API
$code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
$code = (int)$code;
$errors = [
400 => 'Bad request',
401 => 'Unauthorized',
403 => 'Forbidden',
404 => 'Not found',
500 => 'Internal server error',
502 => 'Bad gateway',
503 => 'Service unavailable',
];
try
{
if ($code < 200 || $code > 204) {
return -1;
}
}
catch(\Exception $e)
{
return -1;
}
$response = json_decode($out, true);
return $response;
}
/*
// $access_token. , , .
$link = 'https://' . $subdomain . '.amocrm.ru/oauth2/access_token'; // URL
$data = [
'client_id' => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxx',
'client_secret' => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
'grant_type' => 'authorization_code',
'code' => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
'redirect_uri' => 'http://xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,
];
$curl = curl_init(); // cURL
curl_setopt($curl,CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl,CURLOPT_USERAGENT,'amoCRM-oAuth-client/1.0');
curl_setopt($curl,CURLOPT_URL, $link);
curl_setopt($curl,CURLOPT_HTTPHEADER,['Content-Type:application/json']);
curl_setopt($curl,CURLOPT_HEADER, false);
curl_setopt($curl,CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($curl,CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($curl,CURLOPT_SSL_VERIFYPEER, 1);
curl_setopt($curl,CURLOPT_SSL_VERIFYHOST, 2);
$out = curl_exec($curl); // API
$code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
$code = (int)$code;
$errors = [
400 => 'Bad request',
401 => 'Unauthorized',
403 => 'Forbidden',
404 => 'Not found',
500 => 'Internal server error',
502 => 'Bad gateway',
503 => 'Service unavailable',
];
try
{
if ($code < 200 || $code > 204) {
throw new Exception(isset($errors[$code]) ? $errors[$code] : 'Undefined error', $code);
}
}
catch(\Exception $e)
{
die(": ' . $e->getMessage() . PHP_EOL . ' : ' . $e->getCode());
}
$response = json_decode($out, true);
var_dump($response);
$access_token = $response['access_token']; //Access
$refresh_token = $response['refresh_token']; //Refresh
$token_type = $response['token_type']; //
$expires_in = $response['expires_in']; //
*/
$access_token ="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
// . . /api/v4/contacts filter[custom_fields_values]
//
$p ="+79000000000";
$n= " ";
$qnt = 1;
$ord = "xxxxxxxxxxxxxxxxx";
$link='https://'.$subdomain.'.amocrm.ru/api/v2/contacts';
$data = array (
'add' =>
array (
0 =>
array (
'name' => $n,
'custom_fields'=>array(
array(
'id' => '953127',
'values' => array(
array(
"value"=>$p,
"enum"=> "MOB"
),
),
),
),
) ,
) ,
) ;
$response = amo_call($access_token, $link, $data);
if ($response==-1) {
die("- /n");
} else {
var_dump($response);
$cid = $response["_embedded"]["items"][0]["id"];
//
$pipeline_id = '4188580';
$lead_status_id = '39384853';
$lead_name =" Aliexpress № " . $ord;
$link='https://'.$subdomain.'.amocrm.ru/api/v2/leads';
$data = array (
'add' =>
array (
0 =>
array (
'name' => $lead_name,
'status_id' => $lead_status_id, //id
'pipeline_id' => $pipeline_id,
'contacts_id'=> array (
$cid
),
),
),
);
$response = amo_call($access_token, $link, $data);
if ($response==-1) {
die("- /n");
} else {
$did = $response["_embedded"]["items"][0]["id"];
var_dump($response);
//
$link='https://'.$subdomain.'.amocrm.ru/api/v4/leads/'.$did.'/link';
$data = array (
0 =>array (
'to_entity_id' => 327219, //id api html ( )
'to_entity_type' =>'catalog_elements',
'metadata' => array(
"quantity" => $qnt,
"catalog_id" => 5321 // id ,
),
),
);
$response = amo_call($access_token, $link, $data);
if ($response==-1) {
die("- /n");
} else {
var_dump($response);
//
}
}
Bitrix24
function b24_call($queryUrl, $queryData) {
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_SSL_VERIFYPEER => 0,
CURLOPT_POST => 1,
CURLOPT_HEADER => 0,
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_URL => $queryUrl,
CURLOPT_POSTFIELDS => $queryData,
));
$out = curl_exec($curl);
$code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
if ($code < 200 || $code > 204) {
return -1;
}
curl_close($curl);
$response = json_decode($out, true);
return $response;
}
$p ="+79000000000";
$n= " ";
$zi = "111111";
$pro = " ";
$gor = "";
$adr = ". 1";
$qnt = 1;
$ord = "xxxxxxxxxxxxxxxxx";
// crm.contact.list array('filter' => array('PHONE' => $ph))
$queryUrl = 'https://xxxxxxxxxx.ru/rest/48/xxxxxxxxxxxxxxxxx/crm.contact.add.json';
$queryData = http_build_query(array(
'fields' => array(
"NAME"=> $n,
"PHONE" => array(array('VALUE' =>$p, 'VALUE_TYPE' => 'MOBILE')),
),
'params' => array("REGISTER_SONET_EVENT" => "N")
));
$response= b24_call($queryUrl, $queryData);
if ($response==-1) {
die("- /n");
} else {
var_dump($response);
$cid = $response["result"];
echo "!".$cid."!\n";
$queryUrl = 'https://xxxxxxxxxx.ru/rest/48/xxxxxxxxxxxxxxxxx/crm.requisite.add.json';
$queryData = http_build_query(array(
'fields'=> array(
"PRESET_ID"=> 3,
"ENTITY_TYPE_ID"=> 3,
"ENTITY_ID"=> $cid,
"NAME"=>"",
"ACTIVE"=>"Y",
"SORT"=>100
)
));
$response= b24_call($queryUrl, $queryData);
if ($response==-1) {
die("- /n");
} else {
var_dump($response);
$rid = $response["result"];
$queryUrl = 'https://xxxxxxxxxx.ru/rest/48/xxxxxxxxxxxxxxxxx/crm.address.add.json';
$queryData = http_build_query(array(
'fields'=> array(
"TYPE_ID"=> 1,
"ENTITY_TYPE_ID"=> 8,
"ENTITY_ID"=> $rid,
"POSTAL_CODE"=> "$zi",
"PROVINCE"=> "$pro",
"CITY"=> "$gor",
"ADDRESS_1"=> "$adr",
"COUNTRY"=> ""
)
));
$response= b24_call($queryUrl, $queryData);
if ($response==-1) {
die("- /n");
} else {
var_dump($response);
$lead_name = " Aliexpress № " . $ord;
$queryUrl = 'https://xxxxxxxxxx.ru/rest/48/xxxxxxxxxxxxxxxxx/crm.lead.add.json';
$queryData = http_build_query(array(
'fields' => array(
"TITLE" => $lead_name,
"TYPE_ID" => "GOODS",
"STAGE_ID" => "NEW",
"CONTACT_ID"=> $cid,
"CURRENCY_ID"=> "RUB",
),
'params' => array("REGISTER_SONET_EVENT" => "Y")
));
$response= b24_call($queryUrl, $queryData);
if ($response==-1) {
die("- /n");
} else {
var_dump($response);
$did = $response["result"];
$items = array();
$items[] = array('PRODUCT_ID' => "2968", 'PRICE' => "1.00", 'QUANTITY' => $qnt);
$queryUrl = 'https://xxxxxxxxxx.ru/rest/48/xxxxxxxxxxxxxxxxx/crm.lead.productrows.set.json';
$queryData = http_build_query(array(
"id" => $did,
"rows"=>$items
));
$response= b24_call($queryUrl, $queryData);
if ($response==-1) {
die("- /n");
} else {
var_dump($response);
//
}
}
}
}
}
RetailCRM
$crmKey = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
function retail_call($url, $postData) {
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($curl, CURLOPT_FAILONERROR, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl, CURLOPT_TIMEOUT, 30);
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $postData);
$out = curl_exec($curl);
$code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
if ($code < 200 || $code > 204) {
return -1;
}
curl_close($curl);
$response = json_decode($out, true);
return $response;
}
$p ="+79000000000";
$n= " ";
$zi = "111111";
$pro = " ";
$gor = "";
$adr = ". 1";
$qnt = 1;
$ord = "xxxxxxxxxxxxxxxxx";
$url = 'https://xxxxxxxxxx..ru/api/v5/customers/create';
$postData = array(
'site' =>'xxxxxxxxxx.ru',
'customer' => json_encode(array(
'firstName' =>$n,
)),
'apiKey' => $crmKey,
);
$rez = retail_call($url, $postData);
var_dump($rez);
$cid = $rez["id"];
$url = 'https://xxxxxxxxxx.ru/api/v5/orders/create';
$postData = array(
'site' =>'xxxxxxxxxx.ru',
'order' => json_encode(array(
'customer'=> array(
'id' => $cid,
),
'items' => array(
array(
'quantity' => 6,
'offer'=> array(
'externalId' => 'xxxxxxxxxxx',
)
),
))),
'apiKey' => $crmKey,
);
$rez = retail_call($url, $postData);
var_dump($rez);
echo "\n".$rez["id"]."\n";
Selen (um access_token zu erhalten)
from selenium import webdriver
from time import sleep
browser = webdriver.Firefox()
browser.get("https://seller.aliexpress.ru/")
sleep(5)
browser.switch_to.frame(browser.find_element_by_css_selector("iframe.iframe-with-loader_iframe__QQc_0"))
e = browser.find_element_by_id("fm-login-id")
e.send_keys("xxxxxx@xxxxxxxx.ru")
e = browser.find_element_by_id("fm-login-password")
e.send_keys("xxxxxxxxxxxxx")
e = browser.find_element_by_id("fm-login-submit")
e.click()
sleep(15)
browser.get("https://oauth.aliexpress.com/authorize?&response_type=token&client_id=XXXXXXXX&state=1212&view=web&sp=ae")
sleep(5)
try:
e = driver.find_element_by_id("sub")
e.click()
except Exception:
print('Session login')
sleep(5)
txt = "-1"
try:
e = driver.find_element_by_id("wrap")
print(e.get_attribute('innerHTML'))
txt = e.get_attribute('innerHTML')
except Exception:
print('Session login')
x = txt.split("access_token: ")
y = x[1].split("<br>")
print y[0]