Cначала поговорим об API.
Существует несколько категорий eBay API, например Trading API, Finding API, Shopping API и т.д. Эти категории, как понятно из названия, служат разным целям, и требуют разных входных данных для выполнения вызова и предоставляют результат в разных форматах.
Все вызовы осуществляются через один из заранее заданных форматов обмена данными, например XML, SOAP, JSON.
Каждый разработчик должен сгенерировать пачку ключей в разделе для разработчиков. Причем эти ключи делятся на две категории - боевые(production) и холостые(sandbox). Холостые ключи нужны для отладки приложения, например что бы отладить покупку какого-нибудь фиктивного товара на фиктивные деньги. Тройка ключей состоит из DevId, AppId и CertId.
Ещё один важный пункт, так называемая "eBay User Consent Form". С помощью этой формы вы налаживаете обратную связь между пользователем и eBay`ем. Об этом чуть дальше. Главное здесь нужно сгенерировать два RuName`а, один с настройкой Authorization Type: ID Verification , другой с настройкой Authorization Type: Authorization.
Поехали дальше, как я писал выше - есть несколько способов общения с eBay, мы выбираем не самый легкий и очевидный - SOAP. Почему не самый легкий? В идеале есть WSDL файл, на основании которого генерится API вашего приложения, и все счастливы. Практически вся куча примеров с eBay Documentation Center и API Test Tool ориентированы на XML. Плюс обязательно почитайте как правильно выбрать и составить адресс API GateWay`я (практика показала что это https://api.sandbox.ebay.com/wsapi?callname=API_CALL_NAME для холостого набора ключей и вместо API_CALL_NAME подставьте название того метода, который вы вызываете, иначе всё валится).
Итак, наметим цель - аутентификация пользователя на своем сайте, с помощью eBay
Наметим шаги:
- Получаем SessionID с помощью вызова GetSessionID(здесь и далее речь идёт о Trading API)
- Отправляем пользователя по специально сформированной ссылке на eBay
- eBay предлагает пользователю залогинится
- После успешной аутентификации, он говорит что такое-то приложение хочет знать это реально вы или кто-то прикалывается? Вы конечно соглашаетесь
- eBay уведомляет сайт что пользователь залогинился и согласился
- Вы с помощью метода ConfirmIdentity узнаете его идентификатор
- ???
- PROFIT
Немного кода
Первым делом когда я погуглил erlang + soap мне вывалилась ссылка на yaws + soap, вот на этом примере мы и будем тренироваться. Для эксперементов нам потребуется yaws(я использовал версию 1.76) - веб сервер на erlang, библиотека erlsom(1.2.1), библиотека для http запросов ibrowse(2.1.3) и WSDL файл с ebay.com
Устанавливаем yaws, erlsom, ibrowse и убеждаемся что они прописаны в пути(можно сделать из шелла erl с помощью функции code:get_path())
запускаем шелл erl
AppId = "YourAppID",
DevId = "YourDevId",
AuthCert = "YourCertId",
RuName = "RuName with AuthType: ID Verification",
Version = "709",
WsdlURL = "/path/to/wsdl/ebaySvc.wsdl",
ssl:start(),
%% делаем файл с рекордами для дальнейшего инклуда
yaws_soap_lib:write_hrl(WsdlURL, "soap.hrl"),
%% подключаем рекорды в шелл
rr("soap.hrl""),
Wsdl = yaws_soap_lib:initModel(WsdlURL),
{ok, _, [#'p:GetSessionIDResponseType'{'SessionID' = SessionID}]} = yaws_soap_lib:call(
Wsdl, "GetSessionID", [
#'p:CustomSecurityHeaderType'{'Credentials' = DevCredentials}], [#'p:GetSessionIDRequestType'{'RuName' = RuName, 'Version' = Version}
]
).
%% далее посылаем пользователя по ссылке https://signin.sandbox.ebay.com/ws/eBayISAPI.dll?SignIn&RuName=RuName="RuName с настройкой AuthType: ID Verification"&SessID="SessionID, который вернулся в предыдущем обращении к API"
%% после того, как пользователь нажал accept на сайте eBay, вызываем следующий метод
yaws_soap_lib:call(Wsdl, "ConfirmIdentity", [#'p:CustomSecurityHeaderType'{'Credentials' = DevCredentials}], [#'p:ConfirmIdentityRequestType'{'SessionID' = SessionID, 'Version' = Version}]).
Вуаля! как просто ;)
Второй RuName, который мы генерили в начале нужен нам, что бы получить AuthToken - такая штука, которая нужна для всех запросов
функция для получения этого токена - FetchToken
вот пример на erlang:
{ok, _, [#'p:GetSessionIDResponseType'{'SessionID' = SessionID2}]} = yaws_soap_lib:call(
Wsdl, "GetSessionID", [
#'p:CustomSecurityHeaderType'{'Credentials' = DevCredentials}], [#'p:GetSessionIDRequestType'{'RuName' = RuName2, 'Version' = Version}
]
).
yaws_soap_lib:call(Wsdl, "FetchToken", [#'p:CustomSecurityHeaderType'{'Credentials' = DevCredentials}], [#'p:FetchTokenRequestType'{'SessionID' = SessionID2, 'Version' = Version}]).