Яндекс маркет позволяет заказывать товары непосредственно с яндекса — удобная штука. Мое решение позволяет использовать эту возможность для instant Shop.
описание программы: help.yandex.ru/partnermarket/purchase/about.xml
описание API: api.yandex.ru/market/partner/doc/dg/reference/purchase-methods.xml
1. в таблице cms_shop_orders добавляем поле market_id int(11) — в этом поле будет хоанится айди заказа с маркета
2. Параметры такие:
в аутентификации oauth.yandex.ru/ указываем помимо прочего:
Ссылка на приложение: site.ru (ну ессесн свой сайт укажите 😊)
Callback URI: site.ru/shop/tokens
в маркете:
настройка API покупки
URL API: site.ru/shop/market
Авторизационный токен 63.......
Тип авторизации HEADER
Формат данных JSON
3. файл router.php для шопа
файл frontend.php
//сохраняем товары в нужном формате
$items = array();
foreach($data['order']['items'] as $in_item) {
$item = $inDB->get_fields('cms_shop_items', 'id='.$in_item['offerId'], 'title, price, art_no, seolink, qty, id');
$out_item['title'] = $item['title'];
$out_item['price'] = $item['price'];
$out_item['art_no'] = $item['art_no'];
$out_item['seolink'] = $item['seolink'];
$out_item['qty'] = $item['qty'];
$out_item['cart_qty'] = $in_item['count'];
$out_item['item_id'] = $item['id'];
$out_item['is_deleted'] = 0;
$out_item['cart_id'] = 0;
$out_item['is_digital'] = 0;
$out_item['filename_item'] = '';
$out_item['filename_orig'] = '';
$out_item['filename'] = '';
$out_item['totalprice'] = $item['price']*$item['cart_qty'];
$items[] = $out_item;
}
$order['items'] = $inCore->arrayToYaml($items);
$order['giftcode'] = '';
$order['market_id'] = $data['order']['id']; //это ID заказа в яндекс-маркете
$order['status'] = 0;
$order['user_id'] = 0;
$order['summ'] = $model->calculateOrderSumm($items, $d_type, '');
if ($d_type){
$delivery_types = $model->getDeliveryTypes($order['summ']);
$order['d_type'] = $d_type;
$order['d_price'] = $delivery_types[$d_type]['price'];
} else {
$order['d_type'] = $d_type;
$order['d_price'] = 0;
}
//удаляем старые заказы для этой сессии
$model->deleteExpiredOrders(session_id());
$order['description'] = 'Предварительный заказ с маркета';
//сохраняем новый заказ
$order['id'] = $model->addOrder($order);
$out['order']['id'] = $order['id'];
$out['order']['accepted'] = true;
$output_string = json_encode($out);
header('Content-Type: application/json;charset=utf-8');
print $output_string;
die;
}
if ($do=='market_order_status'){
$header = getallheaders();
//проверяем токен
if($header['Authorization']!=$auth_token){
//неверный токен
header("HTTP/1.0 403 Forbidden");
die;
}
$postdata = file_get_contents("php://input");
//в постдате переданы параметры о заказе в джсон формате
$data = json_decode($postdata, 1);
$order = $inDB->get_fields('cms_shop_orders', 'market_id='.$data['order']['id'], 'id');
$status = 1;
if($data['order']['status']=='PROCESSING') $status = 1;
if($data['order']['status']=='DELIVERY') $status = 4;
if($data['order']['status']=='DELIVERED') $status = 2;
if($data['order']['status']=='CANCELLED') $status = 5;
//обрабатываем комментарий, полный адрес и ФИО покупателя
//преобразуем в кодировку сначала
$customer_comment = iconv('utf-8', 'cp1251', $data['order']['notes']);
$address = "Страна: ".iconv('utf-8', 'cp1251', $data['order']['delivery']['address']['country']).", ";
$address.= "индекс: ".iconv('utf-8', 'cp1251', $data['order']['delivery']['address']['postcode']).", ";
$address.= "город: ".iconv('utf-8', 'cp1251', $data['order']['delivery']['address']['city']).", ";
$address.= "метро: ".iconv('utf-8', 'cp1251', $data['order']['delivery']['address']['subway']).", ";
$address.= "улица: ".iconv('utf-8', 'cp1251', $data['order']['delivery']['address']['street']).", ";
$address.= "дом: {$data['order']['delivery']['address']['house']}, ";
$address.= "корпус: {$data['order']['delivery']['address']['block']}, ";
$address.= "подъезд: {$data['order']['delivery']['address']['entrance']}, ";
$address.= "код домофона: {$data['order']['delivery']['address']['entryphone']}, ";
$address.= "этаж: {$data['order']['delivery']['address']['floor']}, ";
$address.= "номер квартиры: {$data['order']['delivery']['address']['apartment']}, ";
$address.= "ФИО получателя заказа: ".iconv('utf-8', 'cp1251', $data['order']['delivery']['address']['recipient']).", ";
$address.= "тел получателя: {$data['order']['delivery']['address']['phone']}";
$inDB->query("UPDATE cms_shop_orders SET customer_address='{$address}' WHERE id={$order['id']}");
$customer_name = iconv('utf-8', 'cp1251', $data['order']['buyer']['lastName'].' '.$data['order']['buyer']['firstName'])." (заказ с маркета)";
$customer_phone = $data['order']['buyer']['phone'];
$customer_email = $data['order']['buyer']['email'];
$inDB->query("UPDATE cms_shop_orders SET customer_name='{$customer_name}', customer_phone='{$customer_phone}', customer_email='{$customer_email}' WHERE id={$order['id']}");
$inDB->query("UPDATE cms_shop_orders SET status={$status} WHERE id={$order['id']}");
$lttr = "Смена статуса заказа с яндекс маркета. №заказа внутренний №{$order['id']}, №заказа в маркете №{$data['order']['id']}. Новый статус заказа: {$data['order']['status']}";
mail('vicoder@mail.ru', 'смена статуса на сезоте', $lttr); //на почту передается о смене статуса
die;
}
смена о статусе заказа приходит на мыло (например, юзер может ваще отменить заказ)
небольшая правка в функции:
public function addOrder($order){
$item = cmsCore::callEvent('ADD_SHOP_ORDER', $order);
$sql = "INSERT INTO cms_shop_orders (secret_key, date_created, date_payment, date_closed,
customer_name, customer_org, customer_phone, customer_email,
customer_address, customer_comment, customer_inn, items, d_type, d_price,
giftcode, status, summ, user_id, market_id)
VALUES ('{$order['secret_key']}', NOW(), NULL, NULL,
'{$order['customer_name']}', '{$order['customer_org']}', '{$order['customer_phone']}', '{$order['customer_email']}',
'{$order['customer_address']}', '{$order['customer_comment']}', '{$order['customer_inn']}', '{$order['items']}', '{$order['d_type']}', '{$order['d_price']}',
'{$order['giftcode']}', '{$order['status']}', '{$order['summ']}', '{$order['user_id']}', '{$order['market_id']}')";
$this->inDB->query($sql);
$order_id = $this->inDB->get_last_id('cms_shop_orders');
return $order_id;
}
4. В джава скрипте на самом сайте делаем пернаправление (это нужно для аутентификации приложения в яндексе):
$(document).ready(function(){
if (window.location.hash != ""){
window.location.href = "site.ru/shop/tokens?"+window.location.hash.replace(new RegExp("#","g"),"");
}
.....
5. изменеия в файле orders.tpl.php (выводим сообщения, если заказ — с маркета):
...
<?php foreach($items as $num=>$item){ ?>
<tr id="<?php echo $item['id']; ?>" class="item_tr">
<td><?php echo $item['id']; ?></td>
<td>
<div>
<a style="font-weight:bold;font-size:14px;" href="?view=components&do=config&id=<?php echo $component_id; ?>&opt=edit_order&item_id=<?php echo $item['id']; ?>"><?php echo $item['customer_name']; ?></a>
<?if($item['market_id']){?>Номер заказа на Я.Маркете = <?=$item['market_id']?><?}?>
</div>
...
<td><img src="/components/shop/images/status/<?php echo $item['status']; ?>.gif" />
<?if($item['market_id']){?>
<a href="<?=$component_uri?>&opt=set_y_status&order_id=<?=$item['id']?>">Сменить статус в y.market</a><?}?>
</td>
…
описание программы: help.yandex.ru/partnermarket/purchase/about.xml
описание API: api.yandex.ru/market/partner/doc/dg/reference/purchase-methods.xml
1. в таблице cms_shop_orders добавляем поле market_id int(11) — в этом поле будет хоанится айди заказа с маркета
2. Параметры такие:
в аутентификации oauth.yandex.ru/ указываем помимо прочего:
Ссылка на приложение: site.ru (ну ессесн свой сайт укажите 😊)
Callback URI: site.ru/shop/tokens
в маркете:
настройка API покупки
URL API: site.ru/shop/market
Авторизационный токен 63.......
Тип авторизации HEADER
Формат данных JSON
3. файл router.php для шопа
<?php function routes_shop(){ //YANDEX MARKET '_uri' => '/^shop\/tokens$/i', 'do' => 'tokens' ); '_uri' => '/^shop\/market$/i', 'do' => 'market' ); '_uri' => '/^shop\/market\/cart$/i', 'do' => 'market_cart' ); '_uri' => '/^shop\/market\/order\/accept$/i', 'do' => 'market_order_accept' ); '_uri' => '/^shop\/market\/order\/status$/i', 'do' => 'market_order_status' ); .... ....
файл frontend.php
... $menutitle = $inCore->menuTitle(); $auth_token = '63......'; //токен авторизации с яндекс-маркета ... //Подключаем CSS к странице $inPage->addHeadCSS('templates/'.$_CFG['template'].'/css/inshop.css'); //============================================================================// //============================================================================// // // YANDEX MARKET // if ($do=='tokens'){ //получение токена от яндекс OATH $token = $inCore->request2var('access_token', 'str'); if(!$token){ echo 'идет перенаправление'; //через джава скрипт!! (код - в jquery.main.js) } else { $_SESSION['token'] = $token; $state = $inCore->request2var('state', 'int'); //через этот параметр мы передавали ID заказа $inCore->redirect('/admin/index.php?view=components&do=config&id=26&opt=set_y_status&order_id='.$state); //обратно в админку в раздел смена статуса маркета (но уже с токеном) } } if ($do=='market_cart'){ //проверяем токен if($header['Authorization']!=$auth_token){ //неверный токен die; } //в постдате переданы параметры о товарах в джсон формате //возвращаем товары в яндекс foreach($data['cart']['items'] as $in_item) { $item = $inDB->get_fields('cms_shop_items', 'id='.$in_item['offerId'], 'price'); $out_item['feedId'] = $in_item['feedId']; $out_item['offerId'] = $in_item['offerId']; $out_item['count'] = $in_item['count']; $out_item['delivery'] = true; $out_items[] = $out_item; } $out['cart']['items'] = $out_items; //товары //доставка $out['cart']['deliveryOptions'][0]['type'] = 'DELIVERY'; $out['cart']['deliveryOptions'][0]['price'] = 0; $out['cart']['deliveryOptions'][0]['type'] = 'DELIVERY'; //методы оплаты print $output_string; die; } if ($do=='market_order_accept'){ //проверяем токен if($header['Authorization']!=$auth_token){ //неверный токен die; } //в постдате переданы параметры о заказе в джсон формате //оформляем заказ ПОКА БЕЗ ДАННЫХ О ЮЗЕРЕ! (их яндекс для данного события не передает, передает потом при смене статуса заказа) $customer_type = 'fis'; $d_type = 5; //это ID Курьерская служба $order['customer_name'] = 'Предварительный заказ с маркета'; $order['customer_org'] = ''; $order['customer_inn'] = ''; $order['customer_phone'] = ''; $order['customer_email'] = ''; $order['customer_address'] = iconv('utf-8', 'cp1251', $data['order']['delivery']['address']['country'].', '.$data['order']['delivery']['address']['city'].', '.$data['order']['delivery']['address']['street'].' '.$data['order']['delivery']['address']['house']); $order['customer_comment'] = '';
$items = array();
foreach($data['order']['items'] as $in_item) {
$item = $inDB->get_fields('cms_shop_items', 'id='.$in_item['offerId'], 'title, price, art_no, seolink, qty, id');
$out_item['title'] = $item['title'];
$out_item['price'] = $item['price'];
$out_item['art_no'] = $item['art_no'];
$out_item['seolink'] = $item['seolink'];
$out_item['qty'] = $item['qty'];
$out_item['cart_qty'] = $in_item['count'];
$out_item['item_id'] = $item['id'];
$out_item['is_deleted'] = 0;
$out_item['cart_id'] = 0;
$out_item['is_digital'] = 0;
$out_item['filename_item'] = '';
$out_item['filename_orig'] = '';
$out_item['filename'] = '';
$out_item['totalprice'] = $item['price']*$item['cart_qty'];
$items[] = $out_item;
}
$order['items'] = $inCore->arrayToYaml($items);
$order['giftcode'] = '';
$order['market_id'] = $data['order']['id']; //это ID заказа в яндекс-маркете
$order['status'] = 0;
$order['user_id'] = 0;
$order['summ'] = $model->calculateOrderSumm($items, $d_type, '');
if ($d_type){
$delivery_types = $model->getDeliveryTypes($order['summ']);
$order['d_type'] = $d_type;
$order['d_price'] = $delivery_types[$d_type]['price'];
} else {
$order['d_type'] = $d_type;
$order['d_price'] = 0;
}
//удаляем старые заказы для этой сессии
$model->deleteExpiredOrders(session_id());
$order['description'] = 'Предварительный заказ с маркета';
//сохраняем новый заказ
$order['id'] = $model->addOrder($order);
$out['order']['id'] = $order['id'];
$out['order']['accepted'] = true;
$output_string = json_encode($out);
header('Content-Type: application/json;charset=utf-8');
print $output_string;
die;
}
if ($do=='market_order_status'){
$header = getallheaders();
//проверяем токен
if($header['Authorization']!=$auth_token){
//неверный токен
header("HTTP/1.0 403 Forbidden");
die;
}
$postdata = file_get_contents("php://input");
//в постдате переданы параметры о заказе в джсон формате
$data = json_decode($postdata, 1);
$order = $inDB->get_fields('cms_shop_orders', 'market_id='.$data['order']['id'], 'id');
$status = 1;
if($data['order']['status']=='PROCESSING') $status = 1;
if($data['order']['status']=='DELIVERY') $status = 4;
if($data['order']['status']=='DELIVERED') $status = 2;
if($data['order']['status']=='CANCELLED') $status = 5;
//обрабатываем комментарий, полный адрес и ФИО покупателя
//преобразуем в кодировку сначала
$customer_comment = iconv('utf-8', 'cp1251', $data['order']['notes']);
$address = "Страна: ".iconv('utf-8', 'cp1251', $data['order']['delivery']['address']['country']).", ";
$address.= "индекс: ".iconv('utf-8', 'cp1251', $data['order']['delivery']['address']['postcode']).", ";
$address.= "город: ".iconv('utf-8', 'cp1251', $data['order']['delivery']['address']['city']).", ";
$address.= "метро: ".iconv('utf-8', 'cp1251', $data['order']['delivery']['address']['subway']).", ";
$address.= "улица: ".iconv('utf-8', 'cp1251', $data['order']['delivery']['address']['street']).", ";
$address.= "дом: {$data['order']['delivery']['address']['house']}, ";
$address.= "корпус: {$data['order']['delivery']['address']['block']}, ";
$address.= "подъезд: {$data['order']['delivery']['address']['entrance']}, ";
$address.= "код домофона: {$data['order']['delivery']['address']['entryphone']}, ";
$address.= "этаж: {$data['order']['delivery']['address']['floor']}, ";
$address.= "номер квартиры: {$data['order']['delivery']['address']['apartment']}, ";
$address.= "ФИО получателя заказа: ".iconv('utf-8', 'cp1251', $data['order']['delivery']['address']['recipient']).", ";
$address.= "тел получателя: {$data['order']['delivery']['address']['phone']}";
$inDB->query("UPDATE cms_shop_orders SET customer_address='{$address}' WHERE id={$order['id']}");
$customer_name = iconv('utf-8', 'cp1251', $data['order']['buyer']['lastName'].' '.$data['order']['buyer']['firstName'])." (заказ с маркета)";
$customer_phone = $data['order']['buyer']['phone'];
$customer_email = $data['order']['buyer']['email'];
$inDB->query("UPDATE cms_shop_orders SET customer_name='{$customer_name}', customer_phone='{$customer_phone}', customer_email='{$customer_email}' WHERE id={$order['id']}");
$inDB->query("UPDATE cms_shop_orders SET status={$status} WHERE id={$order['id']}");
$lttr = "Смена статуса заказа с яндекс маркета. №заказа внутренний №{$order['id']}, №заказа в маркете №{$data['order']['id']}. Новый статус заказа: {$data['order']['status']}";
mail('vicoder@mail.ru', 'смена статуса на сезоте', $lttr); //на почту передается о смене статуса
die;
}
смена о статусе заказа приходит на мыло (например, юзер может ваще отменить заказ)
небольшая правка в функции:
public function addOrder($order){
$item = cmsCore::callEvent('ADD_SHOP_ORDER', $order);
$sql = "INSERT INTO cms_shop_orders (secret_key, date_created, date_payment, date_closed,
customer_name, customer_org, customer_phone, customer_email,
customer_address, customer_comment, customer_inn, items, d_type, d_price,
giftcode, status, summ, user_id, market_id)
VALUES ('{$order['secret_key']}', NOW(), NULL, NULL,
'{$order['customer_name']}', '{$order['customer_org']}', '{$order['customer_phone']}', '{$order['customer_email']}',
'{$order['customer_address']}', '{$order['customer_comment']}', '{$order['customer_inn']}', '{$order['items']}', '{$order['d_type']}', '{$order['d_price']}',
'{$order['giftcode']}', '{$order['status']}', '{$order['summ']}', '{$order['user_id']}', '{$order['market_id']}')";
$this->inDB->query($sql);
$order_id = $this->inDB->get_last_id('cms_shop_orders');
return $order_id;
}
4. В джава скрипте на самом сайте делаем пернаправление (это нужно для аутентификации приложения в яндексе):
$(document).ready(function(){
if (window.location.hash != ""){
window.location.href = "site.ru/shop/tokens?"+window.location.hash.replace(new RegExp("#","g"),"");
}
.....
5. изменеия в файле orders.tpl.php (выводим сообщения, если заказ — с маркета):
...
<?php foreach($items as $num=>$item){ ?>
<tr id="<?php echo $item['id']; ?>" class="item_tr">
<td><?php echo $item['id']; ?></td>
<td>
<div>
<a style="font-weight:bold;font-size:14px;" href="?view=components&do=config&id=<?php echo $component_id; ?>&opt=edit_order&item_id=<?php echo $item['id']; ?>"><?php echo $item['customer_name']; ?></a>
<?if($item['market_id']){?>Номер заказа на Я.Маркете = <?=$item['market_id']?><?}?>
</div>
...
<td><img src="/components/shop/images/status/<?php echo $item['status']; ?>.gif" />
<?if($item['market_id']){?>
<a href="<?=$component_uri?>&opt=set_y_status&order_id=<?=$item['id']?>">Сменить статус в y.market</a><?}?>
</td>
…
Реклама #
AtlantisWeb 10 лет назад #
А то какаято валка кода, даже под спойлер не убраноне говоря уже про обрамление в