Интеграция бухгалтерии с E-conomic

E-conomic это датская бухгалтерская (accounting) система. Нам то может и дела нет до неё, но всё-таки попробую описать её возможности и интеграцию, поскольку она активно расширяется (уже охватывает 9 стран) и полезна для деловых людей так или иначе связанных с продажами, счетами, юридическими лицами и налогами. Кроме того она уже интегрирована с некоторыми платёжными системами, например с датской epay.

Прежде всего имеет смысл ознакомится с обучающими видео того, что система умеет. Для программистов же важней всего - схема БД/концептуальная диаграмма.

economic_data_model.png Как видно над самыми большими объектами и происходят основные операции — создание счетов, плательщика, продукта, заказа и подписки — invoice, debtor, product, order, subscription соответсвенно. Все мелкие таблички лишь уточняют детали.. как то валюта, налоги или единицы измерения.

Для интеграции со сторонними сервисами доступен API через SOAP 1.2, который очень скудно документирован и число объектов-методов трудно поддаётся пониманию без знания структуры. Например такой код примерно получается при добавлении клиента

$resClient = new SoapClient('https://www.e-conomic.com/secure/api1/EconomicWebService.asmx?wsdl', array('soap_version' => SOAP_1_2)); $resClient->connect(array( 'agreementNumber' => <em>ваш_номер_договора</em>, 'userName' => <em>логин</em>, 'password' => <em>пароль</em> )); $arrExDebtor = $resClient->Debtor_FindByNumber(array('number' => 57945)); //ищем какого-то специального пользователя по ID if (!isset($arrExDebtor->Debtor_FindByNumberResult->Number)){ $resClient->Debtor_Create(array( 'number' => 57945, 'debtorGroupHandle' => array('Number' => 3), //добавляем в третью группу 'name' => 'Artjom Kurapov', 'vatZone' => 'HomeCountry' //зона налогов. Для не входящих в Европейский Союз = Abroad )); } $resClient->Debtor_SetCurrency(array( 'debtorHandle' => array('Number'=> 57945), 'valueHandle' => array('Code'=>978) //да, это код евро согласно ISO ));

Обратите внимание что я всюду опустил try-catch для краткости и множество других обязательных методов по внесению данных. В общем случае каждый запрос надо оборачивать.

Авторизация в Google с OAuth 1.0

Google как и Твиттер, предоставляет разработчикам возможность использовать OAuth 1.0 для авторизации пользователя стороннему приложению предоставлению конкретных данных по API, причём поскольку Google не централизованный Facebook и у него много полноценных сервисов типа Youtube и Picasa, то для каждого из них выборка данных своя. В общем эта авторизация (ключевые слова - OpenID, AuthSub, Federated Login) и доступ к данным (ключевые слова - JSON, XML, REST, Atom) называется Google Data Protocol.

Диалог подтверждения доступа к услугам Google с ошибкой перевода про приватность

Используем Zend Framework

OAuth библиотек много - есть поставляемая для твиттера библиотека, есть поставляемая для гугла.. но я воспользуюсь Zend - платформой.

1. Регистрируем домен = приложение, запоминаем Consumer Key + Secret. На локальной машине не получится - надо полноценно работающий домен

2. Ставим из Zend Framework два модуля - Crypt и Oauth.

3. Создаём настройки где указываем пути к услугам авторизации

$aGoogleConfig = array( 'callbackUrl' => 'http://kurapov.name', 'siteUrl' => 'https://www.google.com/accounts/', 'authorizeUrl' => 'https://www.google.com/accounts/OAuthAuthorizeToken', 'requestTokenUrl' => 'https://www.google.com/accounts/OAuthGetRequestToken', 'accessTokenUrl' => 'https://www.google.com/accounts/OAuthGetAccessToken', <span style="font-family:Calibri,sans"> </span>'consumerKey' => 'kurapov.name', 'consumerSecret' => 'netetonenastojashijsekreteokfpwoekrf' ); $consumer = new Zend_Oauth_Consumer($aGoogleConfig); $token = null;

OAuthоризация и API социальных сетей

Вчера я выступал в девклубе с общим обзором API социальных сетей и многое из того что хотел сказать, как это всегда бывает, забылось. В частности темы приватности и будующего. Видео прилагается будет как только.. Так что пока презентацию выложу. И насчёт возникшего вопроса..

аутентификация = истинность (пользователя), от англ. authentic = настоящий, подлинный
авторизация = разрешение (на действия)

OAuth занимается именно авторизацией (разрешением действий приложению благодаря токену), но не запрашиваемыми привилегиями или последующими действиями с API. А вот authentication должна делать сама социальная сеть.

Файлы

Backend-авторизация в facebook через OAuth 2.0

Facebook Graph API - новая версия программного интерфейса фейсбука где данные пользователя передаются в JSON формате, а список связанных объектов и привилегий значительно понятней (друзья, фото, видео, события, группы, посещения, события и тп. ). Например так выглядит информация обо мне (я чуток урезал).

{ "id": "712392972", "name": "Artjom Kurapov", "first_name": "Artjom", "last_name": "Kurapov", "link": "http://www.facebook.com/artkurapov", "about": "http://kurapov.name", 
   "verified": true,
}

Впрочем проблем с прошлого раза не убавилось и каша как со стандартами, так и с документацией остаётся - API меняется так часто, что документация в wiki не поспевает, интернет полон старых решений и разобраться в элементарных вещах не так то просто.

Авторизация в Twitter с OAuth 1.0

Твиттер (а также Yahoo, Google, Facebook и LinkedIn ) штоб-его-заногу перешёл на безопасный OAuth и я вспомнил как в своё время с матюгами несколько дней ставил серверную часть OpenID на сайт. А они ведь похожи (авторам нравится буковка О, ага). Вобщем - как это работает? Если раньше был пользователь и твиттер, а мы со своим приложением притворялись пользователем используя его логин-пароль, то теперь чётко выделяются три лица
  • пользователь со своим браузером (client)
  • мы-разработчики со своим сайтом или desktop-приложением (consumer)
  • Твиттер предоставляющий всякие услуги (service provider)