Qiwi API Class PHP - Класс для работы с API Qiwi
32

Qiwi API Class PHP - Класс для работы с API Qiwi

Хочу рассказать вам про такой class как Qiwi API Class PHP, точнее класс называется просто Qiwi API Class. Служит он для упрощения работы с API системой Qiwi. Данный класс облегчит разработку при необходимости использовать API от Qiwi. Чем он поможет? Да все просто, в классе есть все необходимое для работы с персональным кошельком, причем все запросы готовы к использованию и вам нужно лишь только правильно воспользоваться ими. Давайте разберемся в нем более детально (ссылка для скачивания класса в конце статьи).

 

Как работает Qiwi API Class PHP:

Класс авторизуется в кошельке через специальное API от Qiwi, то есть вам не нужно вводить никакие пароли и светить ими, ожидаю что их сопрут. Все работает на уровне самого Qiwi, то есть через официальное API. Что на мой взгляд достаточно удобно, нежели как раньше некоторые использовали Curl, для получения и обработки данных  с кошелька.

Ранее я сказал, что класс нужен для работы с персональным кошельком, да это действительно так. Он работает только с персональным кошельком, причем вам не нужно проходить идентификацию и не нужно подключаться к ishop от qiwi.

Для работы с классом вам потребуется само собой qiwi кошелек, а именно номер киви кошелька и его token. Как получить токен говорить я не буду, в официальной документации все есть, причем вполне понятно и подробно.

 

Доступные методы:

Метод Описание
getAccount(Array $params) Профиль пользователя
getPaymentsHistory(Array $params) История платежей
getPaymentsStats(Array $params) Статистика платежей
getBalance() Баланс QIWI Кошелька
getTxn($txnId) Определенная транкзация ($txnId, Array $params)
getCheck($txnId, Array $params) Квитанция платежа
getTax($providerId) Комиссионные тарифы
sendMoneyToQiwi(Array $params) Перевод на QIWI Кошелек
sendMoneyToProvider($providerId, Array $params) Оплата услуг по ID получателя

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

 

Установка и подключение Qiwi API Class:

1. Скачайте архив с классом

2. Скопируйте Qiwi.php из папки src/ и подключите его в вашем скрипте:

require_once 'Qiwi.php';
$qiwi = new Qiwi('79996661212', 'a9760264ca3e817264ee2340aa877');
$sendMoney = $qiwi->sendMoneyToQiwi([
    'id' => 'time() + 10 * 5',
    'sum' => [
        'amount'   => 1000,
        'currency' => '643'
    ], 
    'paymentMethod' => [
        'type' => 'Account',
        'accountId' => '643'
    ],
    'comment' => 'Тестовый платеж',
    'fields' => [
        'account' => '+79996661212'
    ]
]);

 

Получение последних 50 записей из истории платежей за 30 дней:

require_once 'Qiwi.php';
$qiwi = new Qiwi('79969108406', 'a9760264ca3e817264ee2340aa877');
$getHistory = $qiwi->getPaymentsHistory([
	'startDate' => '2018-03-01T00:00:00+03:00',
	'endDate' => '2018-03-01T00:00:00+03:00',
	'rows' => '50'
]);

 

Получение данных по определенной транзакции:

require_once 'Qiwi.php';
$qiwi = new Qiwi('79969108406', 'a9760264ca3e817264ee2340aa877');
$getTxn = $qiwi->getTxn('11963463493');

 

Вот собственно и все, с остальными методами работать можно по той же аналогии, что и с примерами выше. Если что-то непонятно будет, пишите в комментариях, также если найдете какие-то ошибки в работе класса пишите, буду исправлять по мере поступления и по мере свободного времени. Также если у вас есть предложения по расширению и обновлению класса, то пишите, будем вместе думать как лучше все сделать и стоит ли это того. Скачать самую последнюю версию класса вы можете по ссылке ниже, она ведет на GitHub, где всегда будет последняя версия. На этом все, всем спасибо за внимание.

Скачать - Qiwi API Class PHP с GitHub

 

Запись опубликована В категории: PHP

Shnapik

Вебмастер с опытом ищет приют! Возьмите меня, а то меня рвут!

32 комментариев

  1. Подскажите метод определения платежной системы банковской карты.

    • Если вы про перевод средств, то вот номера:

      ID - идентификатор провайдера. Возможные значения:

      • 466 - Тинькофф Банк
      • 464 - Альфа-Банк
      • 821 - Промсвязьбанк
      • 815 - Русский Стандарт

      Всё есть в документации, здесь же (в классе), собраны лишь методы для удобно работы с ними, чтобы вам не писать постоянно одно и тоже, а можно лишь подключить его. В остальном всё как в документации работает.

      • Я имею в виду в класс добавить метод определения банковской карты (1963 VISA / 21013 MasterCard / 31652 МИР)

        Необходимо получить ответ как в документации:
        {
        "code": {
        "value": "0",
        "_name": "NORMAL"
        },
        "data": null,
        "message": "1963",
        "messages": null
        }

        • Все методы из класса в правильном ответе получают то же, что и в документации. Если речь об этом, если нет, то немного не понимаю что конкретно нужно.
          Какой метод из класса используете вы?

          • В классе у вас есть метод: sendMoneyToProvider($providerId, Array $params)

            Мне нужен метод определения $providerId для банковской карты.

            При вводе банковской карты сначала я буду получать верна ли моя карта и ее $providerId, а затем будут отправляться средства на указанную карту.

            Данного метода в вашем классе нет. 

            В документации используются другие заголовки и хост:
            POST /card/detect.action HTTP/1.1
            Host: qiwi.com
            Accept: application/json
            Content-Type: application/x-www-form-urlencoded
            Cache-Control: no-cache

            cardNumber=4256********1231

            Здесь будет другой запрос cURL.

            Пробовал дописать метод, но он не работает:

            public function providerId($cardNumber) {
            $data = array(
            'cardNumber'=> $cardNumber
            );
            return $this->sendRequestCard('card/detect.action', $data);
            }
  2. Дмитрий, понять какой метод используется, точнее параметр (его id), для метода sendMoneyToProvider. Можно извне, например при post запросе в селекте выбора карты (где value будет иметь идентификатор провайдера).

     

    Заголовки же все те же используются:

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

     

    Понять верна ли карта или нет, через данный класс не получится. Можно лишь это понять будет во время перевода, например когда мы отправляем средства и нам выдает ошибку. Вы можете написать свои функции с проверкой "правильно ли введены данные", например по длине символов...

  3. При попытке передать деньги выводится ошибка
    Array ( [message] => Json validation error List((obj.paymentMethod.accountId,List(ValidationError(List(error.expected.jsstring),WrappedArray()))), (obj.sum.currency,List(ValidationError(List(error.expected.jsstring),WrappedArray()))), (obj.id,List(ValidationError(List(error.expected.jsstring),WrappedArray())))) )

    Другие методы класса тоже не работает

    • Метод перевода средств исправлен в примере, теперь всё работает как надо. В статье и на гитхабе новые примеры уже указаны Спасибо:)

    • При каких обстоятельствах? Какой метод используется? Как используется, что подключается кроме данного скрипта, как он подключается.... Не хватает немного вот этой информации.

      • Пытаюсь перевести с Qiwi на Qiwi методом "sendMoneyToQiwi", в итоге когда делаю запрос выбивает "Техническая ошибка под кодом 300", подключается с помощью "require_once 'Qiwi.php';", без проблем работает "getBalance()", а вот перевод выбивает постоянно ошибку, уже какой день пробую а толку 0, хотя токен у меня разрешен на перевод без СМС

          • <?php
            class Qiwi {
                private $_phone;
                private $_token;
                private $_url;
             
                function __construct($phone, $token) {
                    $this->_phone = $phone;
                    $this->_token = $token;
                    $this->_url   = 'https://edge.qiwi.com/';
                }
                private function sendRequest($method, array $content = [], $post = false) {
                    $ch = curl_init();
                    if ($post) {
                        curl_setopt($ch, CURLOPT_URL, $this->_url . $method);
                        curl_setopt($ch, CURLOPT_POST, 1);
                        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($content));
                    } else {
                        curl_setopt($ch, CURLOPT_URL, $this->_url . $method . '/?' . http_build_query($content));
                    }
                    curl_setopt($ch, CURLOPT_HTTPHEADER, [
                        'Accept: application/json',
                        'Content-Type: application/json',
                        'Authorization: Bearer ' . $this->_token,
                        'Host: edge.qiwi.com'
                    ]); 
                    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                    $result = curl_exec($ch);
                    curl_close($ch);
                    return json_decode($result, 1);
                }
                public function getAccount(Array $params = []) {
                    return $this->sendRequest('person-profile/v1/profile/current', $params);
                }
                public function getPaymentsHistory(Array $params = []) {
                    return $this->sendRequest('payment-history/v2/persons/' . $this->_phone . '/payments', $params);
                }
                public function getPaymentsStats(Array $params = []) {
                    return $this->sendRequest('payment-history/v2/persons/' . $this->_phone . '/payments/total', $params);
                }
                public function getTxn($params) {
                    return $this->sendRequest('payment-history/v2/transactions/' . $params);
                } 
                public function getBalance() {
                    return $this->sendRequest('funding-sources/v1/accounts/current')['accounts'];
                }
                public function getTax($providerId) {
                    return $this->sendRequest('sinap/providers/'. $providerId .'/form');
                } 
                public function sendMoneyToQiwi(Array $params = []) {
                    return $this->sendRequest('sinap/api/v2/terms/99/payments', $params, 1);
                }
                public function sendMoneyToProvider($providerId, Array $params = []) {
                    return $this->sendRequest('sinap/api/v2/terms/'. $providerId .'/payments', $params, 1);
                }
            }
            ?>
  4. Я не про код класса, он по идее остается неизменным. Я про код файла где подключается данный класс и в котором используются методы....

    • $tel = $_POST['vtel'];
      $amount = $_POST['vamount'];
      $comment = $_POST['vcomment'];
      $qiwi = new Qiwi($phone, $token);
      $sendMoney = $qiwi->sendMoneyToQiwi([
      'id' => 'time() + 10 * 5',
      'sum' => [
      'amount'   => $amount,
      'currency' => '643'
      ],
      'paymentMethod' => [
      'type' => 'Account',
      'accountId' => '643'
      ],
      'comment' => $comment,
      'fields' => [
      'account' => '+'.$tel
      ]
      ]);
      var_dump($sendMoney); 
      //В консоль идет отчет, где собственно и получаю ошибку
  5. Там можно указать любой id, главное чтобы был уникальный. Можно брать даже дату и время в Unix формате, всегда будет уникальным...

  6. Добра Вам. Класс Огонь! Долго искал и нашел. Но то что мне больше надо. не работает

    Метод - getTxn
    Указываю Номер транзакции ********

    Ответ

    Array
    (
    [serviceName] => payment-history
    [errorCode] => payment.history.not.found
    [userMessage] => Payment history not found
    )

    Но она есть в истории.
    Подскажите что делать?

    • Спасибо за информацию, данный метод в классе немного устарел, завтра - послезавтра постарюсь обновить и залить всё на гитхаб. Не всегда есть время отслеживать обновления других сервисов, для обновления скриптов. Хорошо что люди напоминают об этом:)

      • Спасибо буду ждать.
        И подкину не много инфы. Я у них на сайте сейчас developer.qiwi тестил API

        И вот что получал

        Тело ответа

        {
        "serviceName": "payment-history",
        "errorCode": "payment.history.not.found",
        "userMessage": "История платежей не найдена"
        }

        И это с двух акков! Я конечно допускаю, что сам что-то не так делаю. Но я старался быть предельно внимательным. Все ровно не найден

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

  7. Подскажите, почему getBalance() возвращает NULL?

    getBalance();
     
    echo '';
    var_dump($balance);
    echo '';
    ?>

    При выпуске токена запрос баланса включен, другие методы, например, getPaymentsHistory() работают нормально.

    • API QIWI обновился, класс немного устарел, постараюсь завтра - послезавтра поправить всё и обновить его на гите. (комментарий отредактирую и подпишу что класс обновлен). Спасибо за информацию.

    • Класс обновлен, в нем добавлен еще 1 метод новый, исправлены все старый. Всё работает как и должно работать. Также расширены некоторые классы. Новый класс уже на гитхабе, в новом релизе, можно скачивать.

  8. После обновления getBalance() возвращает:

    array(3) {
      ["serviceName"]=&gt;
      string(15) "funding-sources"
      ["errorCode"]=&gt;
      string(18) "http.url.not.found"
      ["userMessage"]=&gt;
      string(19) "Operation not found"
    }

    и в обновлении небольшая синтаксическая ошибка в 48 строке

    • Спасибо не заметил, поправил данный метод. Также убрал синтаксическую ошибку из-за лишней скобочки. Всё работает. Метод получения баланса не работал из-за отсутствия слеша в адресе:) Спасибо.

      Релизы также обновил, всё работает как надо!

    • Теперь всё отлично, спасибо вам большое человеческое за ваши труды.
      ПС: Разместили бы здесь форму для доната, благодарных посетителей то тут наверное будет еще не мало.

      • Думал уже об этом, размещу на досуге. Хотя не думаю что будет востребованно)))

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *