Протокол интеграции с фулфилмент / доступ к API

Изменено Fri, 27 Oct 2023 на 03:12 AM


Получение открытого/закрытого ключей


Получение открытого и закрытого ключа для работы с API или подключения интеграции.

В нашей системе логин и пароль для входа по прямой ссылке в систему (https://cdekff.orderadmin.ru)  = открытый и закрытый ключи

В том случае, если вы заходите не через  прямую ссылку, а из ЛК Сдэк во вкладку Фуфлилмент, и забыли пароль или ранее его не задавали, то вам необходимо сделать следующее

Нажимаем на мой профиль

email - это ваш логин для входа по прямой ссылке = открытый ключ

Пароль - для входа по прямой ссылке, всегда скрытый (есть возможность задать новый) = закрытый ключ


Важно:


- Если вы уже настроили интеграцию,  и решите обновить ключи, их нужно будет обновить во всех источниках с которыми была настроена интеграция по старым ключам.

import config
from datetime import datetime
from aiohttp import ClientSession, BasicAuth


class Api:
    def __init__(self, shop_id, sender_id, public_key, private_key, dadata_key, dadata_secret):
        self.client = ClientSession(raise_for_status=True)
        self.auth = BasicAuth(public_key, private_key)
        self.base = 'https://cdek.orderadmin.ru/api/'
        self.shop_id = shop_id
        self.sender = sender_id
        self.dadata_key = dadata_key
        self.dadata_secret = dadata_secret

    async def create_order(self, name, email, phone, order_price, total_price, order_id, address, pvz, products, warehouse_id):
        payload = {
            'shop': self.shop_id,
            'extId': order_id,
            'currency': 1,
            'date': str(datetime.now()),
            'paymentState': config.PAID,
            'orderPrice': order_price,
            'totalPrice': total_price,
            'profile': {
                'name': name,
                'email': email,
                'phone': phone
            },
            'address': {
                'country': 28
            },
            'eav': {
                'order-reserve-warehouse': warehouse_id,
                'delivery-services-request': True,
                'delivery-services-request-data': {
                    'weight': sum(float(product['pack_m']) for product in products),
                    'payment': total_price if config.PAID == 'not_paid' else '0',
                    'estimatedCost': order_price,
                    'retailPrice': float(total_price) - float(order_price),
                    'rate': 49 if pvz == 'courier' else 48,
                    'sender': self.sender
                }
            },
            'orderProducts': []
        }

        if pvz == 'courier':
            async with self.client.post('https://cleaner.dadata.ru/api/v1/clean/address', headers={'Authorization': f'Token {self.dadata_key}', 'X-Secret': self.dadata_secret}, json=[address]) as r:
                address_data = (await r.json())[0]

            params = {
                'filter[0][type]': 'eq',
                'filter[0][field]': 'extId',
                'filter[0][value]': address_data['postal_code']
            }
            locality = await self.method('delivery-services/postcodes', params, 'GET')

            payload['address'].update({
                'street': address_data['street'] or address_data['settlement_with_type'],
                'house': address_data['house'],
                'notFormal': address_data['result'],
                'postcode': address_data['postal_code'],
                'locality': locality['_embedded']['postcodes'][0]['_embedded']['locality']['id']
            })
        else:
            params = {
                'filter[0][type]': 'eq',
                'filter[0][field]': 'extId',
                'filter[0][value]': pvz
            }
            pvz_data = await self.method('delivery-services/service-points', params, 'GET')
            payload['address'].update({
                'notFormal': pvz_data['_embedded']['servicePoints'][0]['rawAddress'],
                'postcode': pvz_data['_embedded']['servicePoints'][0]['raw']['postalCode'],
                'locality': pvz_data['_embedded']['servicePoints'][0]['_embedded']['locality']['id']
            })

            payload['eav']['delivery-services-request-data']['servicePoint'] = pvz_data['_embedded']['servicePoints'][0]['id']

        for product in products:
            payload['orderProducts'].append({
                'productOffer': {
                    'extId': product['lid']
                },
                'count': product['quantity']
            })

        return await self.method('products/order', payload)

    async def method(self, method, payload, t='POST'):
        if t == 'POST':
            async with self.client.post(f'{self.base}{method}', json=payload, auth=self.auth) as r:
                return await r.json()
        elif t == 'GET':
            async with self.client.get(f'{self.base}{method}', params=payload, auth=self.auth) as r:
                return await r.json()






Инструкции по настройке тут:


https://confluence.cdek.ru/pages/viewpage.action?pageId=63359995


Поддержка     |     VK     |     Telegram     |     Сайт     |     Оцените нашу работу



Статья помогла?

Отлично!

Спасибо за ваш отзыв

Извините, что не удалось помочь!

Спасибо за ваш отзыв

Расскажите, как мы можем улучшить эту статью!

Выберите хотя бы одну причину
Требуется проверка CAPTCHA.

Комментарий отправлен

Мы ценим вашу помощь и постараемся исправить статью