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

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, Array $params) Определенная транкзация
getCheck($txnId, Array $params) Квитанция платежа
getTax($providerId) Комиссионные тарифы
sendMoneyToQiwi(Array $params) Перевод на QIWI Кошелек
sendMoneyToProvider($providerId, Array $params) Оплата услуг по ID получателя
sendMoneyToOther(Array $params) Платеж по свободным реквизитам

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

 

Установка и подключение 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: Версия 1.4 от 15.05.2018

Версия Qiwi API Class PHP: Версия 1.2 от 26.05.2018

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

 

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

Shnapik

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

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

  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 строке

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

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

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

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

  9. Версия класса обновлена, если кому-то какие-то еще методы нужны, которых нет, то пишите в комментариях. Буду добавлять их. Также теперь в конце статьи стоит версия Qiwi API и версия Qiwi API Class PHP, чтобы было удобнее ориентироваться при выходах обновлений.

  10. Привет, спасибо за скрипт! Можете помочь реализовать систему оплаты по примечанию,то есть человек вводит баланс,и ему пишет сумму которую он должен перевести на кошелек,а так же рандомный код (комментарий к оплате), после чего скрипт проверяет платеж на это примечание и сумму

    • Делал подобное, как раз с помощью данного класса. Сегодня-завтра завал разберу, и потом выложу уже его сюда (как отдельную статью).

       

      Суть его достаточно проста и примитивна. Нажимаем "Оплатить", далее переводим с киви на киви сумму указанную + указываем комментарий. Переходим на страницу проверки платежа, вводим номер заказа и комментарий при оплате, далее если оплата прошла, то скрипт выдает товар. В БД при этом статус меняется.

    • Получение последних 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'
      ]);

       

  11. Подскажите как вывести баланс на экран? или историю транзакций

    • Для получения истории смотрите документацию класса, либо комментарии выше. Для вывода баланса кошелька, есть метод getBalance()

  12. Подскажите в чем проблема?

    require_once 'Qiwi.php';
    $qiwi = new Qiwi('+380680******', '5c86ce99f65eb23ba***************');
    $balance = $qiwi->getBalance();
    echo $balance;

    Пытаюсь вывести баланс на экран, но страница выдает ошибку...

  13. Присоединяюсь к просьбе Станислава. Тоже такая реализация нужна. Будем благодарны.

  14. Нет, я всё помню. Сейчас времени побольше. Думаю на след. неделе успею выложить статью уже. Она в целом почти готова полностью. Извиняюсь что так на долго затянул всё это, время... Я писал данный метод проверки платежа в своем фреймворке, партировать его оттуда в просто php скрипт немного проблемно, даже не столько проблемно выдернуть код и выложить его, сколько расписать его подробное назначение. Да и для работы с БД я использую ORM библиотеку. Потому пришлось переписать часть кода... Вообщем остается ждать, на этой неделе всё уже будет, постараюсь как можно быстрее, знаю что многие ждут уже...

    • В связи с обновлениями API Qiwi, класс будет обновлен. Статья пока остается под вопросом, так как появился новый метод "Уведомления (хуки)". В классе он появится обязательно, также и остальные методы будут постепенно добавляться.

  15. Можешь написать пример кода, как сделать проверку платежа, если пользователь совершил оплату через форму, то есть сделать прием на сайте. Хотелось бы увидеть форму для платежа и обработчик

    • Читаем сообщение выше в комментариях. "Класс будет обновлен", когда именно будет обновлен пока сказать не могу. Нужно и с киви разобраться и найти время свободное, думаю конец августа это будет или начало сентября уже...

      • Я писал за прием, за то что класс будет обновлен я прочитал. Спасибо за ответ

        • Так я и ответил за прием средств на сайте. Или вам нужно просто форму, при клике в которой на кнопку "Оплатить" - перекидывало на сайт qiwi и всё. В бд не добавлялось ничего, никаких проверок не было? Своего рода пожертвования?

           

          Обработчиком выступает данный класс. А форма для платежа обычная...

           

          Либо я вас не понял, либо вы меня не поняли и немного не поняли суть того что вам нужно...

          • Примерно как на Payeer прием оплаты через мерчант

    • Форма обычная, обработчик - будет позже из данного класса. Раньше только, если вы его придумаете. Про это я говорил. Ибо если без обработки платежа, тупо форма, то можно и сейчас всё делать, но это равнозначно редиректу на сайт киви для пополнения - перевода, без обратной связи.

      Чтобы сайт мог как-то взаимодействовать, нужно обновлять класс. Об этом я говорил ранее в комментариях, так что придется подождать немного. Нет сейчас возможности заняться им.

  16. Приветствую.
    Добавьте еще инициализацию платежа и реализацию оповещений (webhook).
    С Уважением

    • Добрый вечер, про оповещения я и имел ввиду. Теперь с их помощью можно проверять оплату (пополнение, расходы и т.п.), а не через историю платежей.

      А что касается инициализации платежа, что конкретно тут нужно? В чем необходимость дополнения для класса?

      • Неправильно выразился - "инициализация формы оплаты".

        Понятно, что с помощью оповещений не нужно искать в истории платеж. А когда добавите это в свой класс функций?

        • Как окажусь у компьютера, конец августа - начало сентября. Примерно так. Тогда и оплата будет, и обновление класса. Скорее всего будет и модуль оплаты для OpenCart...

  17. Так понимаю, сейчас даже текущий нет смысла устанавливать?

    • Его нет смысла устанавливать, т.к. это всего лишь набор нескольких функций и ничего более

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

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