QIWI Payment | NEW API

248
23 мая 2018, 19:40

никак не пойму, как отправить правильно POST запрос на сайт QIWI, для произведения платежа. Мой код, который не работает.

        string url = "https://edge.qiwi.com/sinap/api/v2/terms/99/payments";
        DateTime foo = DateTime.UtcNow;
        long unixTime = ((DateTimeOffset)foo).ToUnixTimeSeconds();
        var id = 1000 * unixTime;
        var danni = new HttpRequest();
        danni.Cookies = new CookieDictionary();
        danni.AddParam("Content-type", "application/json");
        danni.AddHeader("Accept", "application/json");
        danni.AddHeader("Authorization", "Bearer " +  textBox1.Text);

        var reqParams = new RequestParams();
        reqParams["id"] = id;
        reqParams["sum"] = "{amount="+textBox3.Text + "&currency=643}";
        reqParams["paymentMethod"] = "{type=Account&accountId=643}";
        reqParams["fields"] = "{account=" + textBox2.Text+"}";


        string resp = danni.Post(url, reqParams).ToString();

Страница API QIWI: https://developer.qiwi.com/ru/qiwi-wallet-personal/index.html#p2p

Прошу помочь, буду очень благодарен.

Answer 1

Согласно документации, параметры запроса должны передаваться в теле запроса json строкой. Вы же передаете их в параметрах запроса(RequestParams).

JSON строку вы можете построить например с помощью библиотеки Newtonsoft.Json(подключите через nuget пакет) вот таким образом

    string id ="111";
    double amount = 110;
    JObject jsonQueryBody = new JObject(
                new JProperty("id", id),
                new JProperty("sum", new JObject(
                                    new JProperty("amount", amount),
                                    new JProperty("currency", 643)
                                    )),
                new JProperty("paymentMethod", new JObject(
                                    new JProperty("type", "Account"),
                                    new JProperty("accountId", 643)
                                    )),
                new JProperty("fields", new JObject(
                                    new JProperty("account", "+79121112233")
                                    ))
                                    );
     string body = jsonQueryBody.ToString();

Далее уже передаете сформированную json-строку в POST-запрос.

Answer 2

Заходим в документацию и... Начинаем разбирать:

Тело

Параметры передаются в теле запроса в формате JSON. Все параметры обязательны.

Писать JSON самому - гиблое дело. Я лично предпочитаю использовать библиотеку Newtonsoft.Json (буду использовать ее в ответе).

  • Сначала создадим по таблице из документации нужную нам структуру данных:

    public class Root
    {
        public string Id { get; set; }
        public Sum Sum { get; set; }
        public PaymentMethod PaymentMethod { get; set; }
        public Field Fields { get; set; }
        public string Comment { get; set; }
    }
    public class Sum
    {
        public Sum(int amount, string currency)
        {
            Amount = amount;
            Currency = currency;
        }
        public int Amount { get; set; }
        public string Currency { get; set; }
    }
    public class PaymentMethod
    {
        public PaymentMethod(string type, string accountId)
        {
            Type = type;
            AccountId = accountId;
        }
        public string Type { get; set; }
        public string AccountId { get; set; }
    }
    public class Field
    {
        public Field(string account)
        {
            Account = account;
        }
        public string Account { get; set; }
    }
    

Как можно заметить, все строго по таблице, которая диктует нам правила...

  • Далее заполним его:

    var body = new Root
    {
        Id = "123456",
        Sum = new Sum(1, "test"),
        PaymentMethod = new PaymentMethod("test", "00112233"),
        Fields = new Field("test"),
        Comment = "Test"
    };
    

На этом мы с составлением тела запроса закончили.

POST запрос

Лезем в документацию и читаем следующее:

HEADERS
Accept: application/json
Content-type: application/json
Authorization: Bearer ***

Создадим метод для отправки:

public async Task<string> SendRequest(string url, string token, object body, CancellationToken ct)
{
    string data;
    using (var client = new HttpClient())
    {
        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
        var content = new StringContent(JsonConvert.SerializeObject(body), Encoding.UTF8, "application/json");
        var result = await client.PostAsync(url, content, ct);
        data = await result.Content.ReadAsStringAsync();
        result.EnsureSuccessStatusCode();
    }
    return data;
}

Вот и все, таким образом вы грамотно отправите запрос на сервер в нужном формате и асинхронно (что полезно при работе с web).

Формат отправляемых данных будет такой:

{"Id":"123456","Sum":{"Amount":1,"Currency":"test"},"PaymentMethod":{"Type":"test","AccountId":"00112233"},"Fields":{"Account":"test"},"Comment":"Test"}
Answer 3

Решил данную проблему, оставлю код тут, мало-ли такие же как и я будут искать решение:

        HttpRequest request = new HttpRequest();
        request.AddHeader("Authorization", "Bearer " + textBox1.Text);
        string json = "{\"id\":\""+ id +"\",\"sum\":{\"amount\":"+ textBox3.Text + ", \"currency\":\"643\"}, \"paymentMethod\":{\"type\":\"Account\", \"accountId\":\"643\"}, \"fields\":{\"account\":\"" + textBox2.Text + "\"}}";
        string content = request.Post("https://edge.qiwi.com/sinap/api/v2/terms/99/payments", json, "application/json").ToString();
READ ALSO
TextBox C#. Разная длина у символов

TextBox C#. Разная длина у символов

Когда открываем файл блокнотом видим, что у символов одинаковая длина

167
MySQL и C# [WPF]

MySQL и C# [WPF]

Ситуация:

211
Как уменьшить пинг ответа с сервера

Как уменьшить пинг ответа с сервера

Есть ссылка для получения данных через API, https://apibinance

234