Будем предполагать, что все вышеперечисленное уже под рукой, и можно приступать к разработке!
Ниже будут даны фрагменты кода. В них сознательно приведена только та часть, которая позволит сервису работать, но опущена обработка ошибок и прочие вещи, которые для продакшен-проекта обязательны. Оставим их добавление на совести разработчика.
Итак, для реализации работы с Яндекс.Деньгами через API
1. Создаем набор функций, необходимых для выполнения базовых действий по работе с API
Для обращений к серверу Яндекс.Денег хватит стандартных средств C#, для разбора JSON - можно использовать любимую библиотеку (в примере - используется библиотека от Newtonsoft).
Для начала, создаем класс, в котором будут, как минимум хранится настройки:
public class YamoneyNet
{
/// Задаем константы для работы с API
public static string ClientId = "";
public static string SecretId = "";
public static string RedirectUri = "http://localhost/Redirect.aspx";
public static string Scope = "account-info";
private string _accessToken;
public string AccessToken
{
get
{
return _accessToken;
}
set
{
_accessToken = value;
}
}
}
А как максимум - могут хоть все три следующих метода (для простоты тут будем предполагать, что так и есть). А потребуется нам следующее:
1.1. Умение конструировать URL, на который надо отправить пользователя, чтобы он подтвердил выдачу разрешения:
public static string GetTokenRequestURL()
{
return "https://sp-money.yandex.ru/oauth/authorize?client_id=" + ClientId +
"&redirect_uri=" + RedirectUri + "&response_type=code&scope=" + Scope;
}
1.2. Получение постоянного токена по временному
public string GetAccessTokenFromTemporaryToken(string temporaryToken)
{
System.Net.WebRequest reqPost = System.Net.WebRequest.Create("https://sp-money.yandex.ru/oauth/token");
reqPost.Method = "POST"; // Устанавливаем метод передачи данных в POST
reqPost.Timeout = 120000; // Устанавливаем таймаут соединения
reqPost.ContentType = "application/x-www-form-urlencoded; charset=UTF-8";
System.Net.ServicePointManager.Expect100Continue = false;
// Формируем параметры запроса
string data = "code=" + temporaryToken + "&client_id=" + ClientId + "&client_secret=" +
SecretId + "&grant_type=authorization_code&redirect_uri="
+ System.Web.HttpUtility.UrlEncode(RedirectUri, Encoding.UTF8);
byte[] sentData = Encoding.UTF8.GetBytes(data) ;
reqPost.ContentLength = sentData.Length;
Stream sendStream = reqPost.GetRequestStream() ;
// Выполняем запрос
sendStream.Write(sentData, 0, sentData.Length) ;
sendStream.Close() ;
// Получаем результат
System.Net.WebResponse result = reqPost.GetResponse() ;
string resultString = "";
using (StreamReader reader = new StreamReader(result.GetResponseStream()))
{
resultString = reader.ReadToEnd() ;
}
// Пытаемся разобрать
JObject o = JObject.Parse(resultString);
// и сохранить токен
_accessToken = (string)o.SelectToken("access_token");
// Если есть ошибка - возвращаем ее
return (string)o.SelectToken("error") ;
}
Ну и - надо же что-то уметь делать осмысленное, верно? Например,
1.3. Узнавать баланс пользователя
public string GetAccountInfo()
{
string resultText = "";
try
{
System.Net.WebRequest request = System.Net.WebRequest.Create("https://money.yandex.ru/api/account-info");
request.Method = "POST"; // Устанавливаем метод передачи данных в POST
request.Timeout = 120000; // Устанавливаем таймаут соединения
request.ContentType = "application/x-www-form-urlencoded; charset=UTF-8";
request.Headers.Add("Authorization", "Bearer " + _accessToken);
request.ContentLength = 0;
System.Net.WebResponse result = request.GetResponse() ;
using (StreamReader reader = new StreamReader(result.GetResponseStream()))
{
resultText = reader.ReadToEnd() ;
}
}
catch (System.Net.WebException ex)
{
resultText = "Ошибка: " + ex.Message;
}
return resultText;
}
На этом подготовительные действия заканчиваются, и пора создать что-то видимое пользователю. Например, очень подходит на эту роль
2. Страница приземления
В сущности, основное, что там нужно сделать - это в зависимости от результата выдачи пользователем разрешения отправить его на сайт, либо сообщить, что не что-то не ок и отправить туда же (или куда-то еще, где он сможет с проблемой разобраться).
Самое место этому процессу - в Page_Load (при этом, в данном пример на странице есть лейбл для отображения ошибок, буде таковые появятся - errorText).
protected void Page_Load(object sender, EventArgs e)
{
// Узнаем, чем закончился процесс выдачи токена
string code = Page.Request["code"];
string error = Page.Request["error"];
string errorDescr = Page.Request["error_description"];
if ((code == null) && (error == null))
{
// Что-то пошло не так
errorText.Text = "Ошибка: отсутствуют параметры code или error";
return;
}
if (error!=null)
{
// Раз есть описание ошибки - значит, все равно что-то пошло не так
errorText.Text = "Ошибка: " + error + "описание" + errorDescr;
return;
}
YamoneyNet yaNet = new YamoneyNet() ;
// А если все так - получаем токен из временного ключа
String getTokenResult = yaNet.GetAccessTokenFromTemporaryToken(code);
if (yaNet.AccessToken != "")
{
// Все ок - сохраняем токен (например, как тут, в сессию) и возвращаемся на сайт
Session["token"] = yaNet.AccessToken;
Response.Redirect("default.aspx");
}
else
{
// Получить токен по временному ключу не удалось
errorText.Text = getTokenResult;
}
}
3. Ну и - сводим все это дело воедино на default.aspx
3.1 Если у пользователя нет токена
Отправляем его получать.
YamoneyNet ya = new YamoneyNet() ;
string url = ya.GetRequestForCreateToken() ;
Response.Redirect(url);
3.2 А если есть - то добавляем, например, textBox на форму и выводим текст запроса информации о счете
YamoneyNet ya = new YamoneyNet() ;
string tokenId = (string)Session["token"];
ya.Token.SetToken(tokenId) ;
TextBox1.Text= ya.GetAccountInfo() ;
Собственно, дальше как раз и потребуется немного фантазии, чтобы придумать даже не то, как можно это дело использовать, а как ЕЩЕ можно это дело использовать.