PHP Гайд Автооплата через QIWI (VK Keyboard BOT)

hinazuki

Потрачен
Автор темы
346
95
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Привтем всем!
Видел эти две темы про автооплату на форуме: Node.JS - Python и решил их переписать на PHP.

Ждал такой же гайд от @Pakulichev, но кажется он не хотел.
Что нам понадобится:
1) SimpleVK
2) bill-payments-php-sdk
3) Прямые руки.

Видео работы скрипта:



Настройка всех нужных вещей:
Начнем с настройки группы, создаем или используем уже существующую группу.
1) Нажимаем на управление:
1643171926705.png

2) Переходим в раздел "Работа с API":
1643172028983.png

3) Cоздаем токен и подверждаем необходимое:
1643172094398.png

4) Переходим в раздел "Callback API", выбираем версию API - 5.126, в строку адрес пишем свой сайт с ботом, и так же сохраняем секретный ключ:
1643172288781.png

5) Переходим в раздел "Типы событий", делаем как на скрине:
1643172375902.png

6) Последний пункт, выбираем "Long Poll API", включаем его, выбираем версию API - 5.126, переходим в событий и делаем так же:
1643172469458.png

1643172505052.png

7) Включаем сообщение бота и функций ботов в настройках, и так же кнопку начать.
Готово!


1) Переходим на сайт qiwi p2p и входим в свой аккаунт.
2) Переходим в раздел "API" и создаём ключ:
1643172704267.png

3) Обьязатель поставим галочку на URL и пишем туда свой сайт с php скриптом qiwi:
1643172795810.png

4) Копируем секретный ключ.
5) Переходим в раздел "Форма приема переводов" и копируем "themeCode", если его нету то нажимаем на "настройть":
1643172947461.png

qiwi тоже готов!


Переходим теперь к коду.
Загружаем все нужные либы и классы для работы:
PHP:
require_once('simplevk-master/autoload.php'); // Для работы с ВК ботом
require("vendor/autoload.php"); // Для qiwi
use DigitalStar\vk_api\VK_api as vk_api; // Основной класс для работы с ботом

Начнем с бота вк:
PHP:
const VK_KEY = "e5cfac8b5ed93c5550000000000000000000000000000000000000000009e0fbd4d0341090ee9f";  // Токен сообщества
const ACCESS_KEY = "31ce192d";  // Тот самый ключ из сообщества
const VERSION = "5.126"; // Версия API VK

$vk = vk_api::create(VK_KEY, VERSION)->setConfirm(ACCESS_KEY); // Авторизация

$btn_1 = $vk->buttonText('Купить', 'green', ['command' => 'btn_1']); // Кнопки для бота
$btn_2 = $vk->buttonText('Информация', 'blue', ['command' => 'btn_2']);

$vk->initVars($peer_id, $message, $payload, $vk_id, $type, $data); // Инициализация переменных. Проще говоря библиотека сама создает нужные переменные

if ($data->type == 'message_new') {


    if ($message == 'Начать') { // При нажатие кнопки начать появляются все кнопки, у насс их две
        $vk->sendButton($peer_id, "Меню:", [[$btn_1, $btn_2]]);
    }
    if ($message == 'Информация') {
        $vk->sendMessage($peer_id, "Вы нажали на вторую кнопку."); // Вторая кнопка, если будете менять название кнопок в 8 строке, поменяйте тоже на 18 строке
    }



    if (isset($data->object->payload)) {  //получаем payload
        $payload = json_decode($data->object->payload, True);
    } else {
        $payload = null;
    }
    $payload = $payload['command'];




// Теперь пишем действия с кнопками
    if ($payload == 'btn_1') // Первая кнопка, тут не надо ничего менять
        $vk->sendMessage($peer_id, "Вы нажали на первую кнопку.");
  

    if ($message == 'Отключить') // Отключение кнопок, на всякий
        $vk->sendButton($peer_id, "Кнопки скрыты, снова вызвать их, отправьте Начать, Ваш ID $vk_id", [[]]);


        }
Проверяем
1643173835039.png

Как видим все работает!

Теперь работаем с qiwi.
Чтобы создать счет для оплаты:
PHP:
const SECRET_KEY = ''; // Вставляем сюда секретный ключ который взяли с сайта p2p qiwi

$billPayments = new Qiwi\Api\BillPayments(SECRET_KEY); // Авторизация
$billId = $billPayments->generateId(); // Генерируем billId для работы сервисов qiwi
$lifetime = $billPayments->getLifetimeByDay(0.5); // Cколько будет жить счет для оплаты, по стандарту 24 часа
$customFields = ['themeCode' => 'СЮДА']; // Cюда вставляем тот самый код с раздела "Форма приема переводов"

$fields = [
    'amount' => 1, // Сумма
    'currency' => 'RUB', // Валюта
    'comment' => $vk_id, // Комментарий, $vk_id так как с помощью этого будем делать автопроверку на оплату.
    'expirationDateTime' => $lifetime, // Сколько будет жить
    'customFields' => $customFields, // Стиль темы
];
$response = $billPayments->createBill($billId, $fields); // Cоздаем счет
$payUrl = $billPayments->getPayUrl($response, "https://vk.com/"); // Ссылка счета
Проверяем.
1643174349259.png

Всё работает, ссылка генериуется.


Объединяем весь код, и у нас получается готовый бот которые генериует ссылку для оплаты:
PHP:
<?php

require_once('simplevk-master/autoload.php');
require("vendor/autoload.php");

use DigitalStar\vk_api\VK_api as vk_api; // Основной класс

const VK_KEY = "";  // Токен сообщества
const ACCESS_KEY = "";  // Тот самый ключ из сообщества
const VERSION = "5.126"; // Версия API VK
const SECRET_KEY = ''; // Секретный ключ qiwi

$vk = vk_api::create(VK_KEY, VERSION)->setConfirm(ACCESS_KEY); // Авторизация ВК

$billPayments = new Qiwi\Api\BillPayments(SECRET_KEY); // Авторизация qiwi
$billId = $billPayments->generateId(); // Генерируем billId, для создание счета
$lifetime = $billPayments->getLifetimeByDay(0.5); // Сколько будет жить счет оплаты
$customFields = ['themeCode' => 'стиль сюда']; // Стиль счета
 

$btn_1 = $vk->buttonText('Купить', 'green', ['command' => 'btn_1']); // Кнопки
$btn_2 = $vk->buttonText('Информация', 'blue', ['command' => 'btn_2']);


$vk->initVars($peer_id, $message, $payload, $vk_id, $type, $data); // Инициализация переменных. Проще говоря библиотека сама создает нужные переменные


if ($data->type == 'message_new') {


    if ($message == 'Начать') {
        $vk->sendButton($peer_id, "Меню:", [[$btn_1, $btn_2]]);
    }
    if ($message == 'Информация') { // Вторая кнопка
        $vk->sendMessage($peer_id, "Информация о товаре бла бла бла");
    }



    if (isset($data->object->payload)) {  //получаем payload
        $payload = json_decode($data->object->payload, True);
    } else {
        $payload = null;
    }
    $payload = $payload['command'];




// Теперь пишем действия с кнопками
    if ($payload == 'btn_1') // Первая кнопка
        $fields = [ // Нужные переменные для создание счета
            'amount' => 1, // Сумма
            'currency' => 'RUB', // Валюта
            'comment' => $vk_id, // В коментарий записываем id ползвителя который покупает
            'expirationDateTime' => $lifetime, // Сколько будет жить счет
            'customFields' => $customFields, // Стиль
        ];
        $response = $billPayments->createBill($billId, $fields); // Создаем счет
        $payUrl = $billPayments->getPayUrl($response, "https://vk.com/"); // Генерируем ссылку оплаты
        $vk->sendMessage($peer_id, "Для оплаты можете перейти по ссылке: $payUrl\n"); // Отправляем ссылку
    if ($payload == 'btn_2')
  

    if ($message == 'Отключить')
        $vk->sendButton($peer_id, "Кнопки скрыты, снова вызвать их, отправьте Начать, Ваш ID $vk_id", [[]]);


        }
Бот готов, проверяем:
1643174732312.png
1643174816372.png

Как видим все работает.
Мы сделали только часть бота вк и создание ссылки для оплтаты. Теперь проверка оплаты счета.

Для этого создаём отдельный php скрипт на хостинге:
PHP:
require("vendor/autoload.php"); // Подключаем либы
require_once('simplevk-master/autoload.php');

use DigitalStar\vk_api\VK_api as vk_api;

const VK_KEY = ""; // Токен ВК
const VERSION = "5.126";
const SECRET_KEY = ''; // Секретный ключ QIWI
$billPayments = new Qiwi\Api\BillPayments(SECRET_KEY); //  Авторизация
$vk = vk_api::create(VK_KEY, VERSION);

$data = json_decode(file_get_contents('php://input'), true); // Принимаем запрос от qiwi как json
$status1 = $data['bill']['siteId']; // Пиздим с запроса все нужные параметры, а именно billId, siteId, status, comment, version
$status2 = $data['bill']['billId'];
$status3 = $data['bill']['status']['value'];
$status4 = $data['version'];
$coment = $data['bill']['comment'];

if (!function_exists('getallheaders')){  // Берём с запроса qiwi X-Api-Signature-SHA256(это ключ счета), это нужна для проверки
    function getallheaders(){ // чтобы его получить подбираем все HEADERS и ищем нужный
    $headers = [];
    foreach ($_SERVER as $name => $value){
      if (substr($name, 0, 5) == 'HTTP_'){ $headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value; }
    }
    return $headers;
    }
}

$head = array_change_key_case(getallheaders(), CASE_LOWER);
$validSignatureFromNotificationServer = $head[mb_strtolower('x-api-signature-SHA256')]; // записываем наш ключ в переменную
$notificationData = [ // массив с данными для проверки
  'bill' => [
    'siteId' => $status1,
    'billId' => $status2,
    'amount' => ['value' => 1, 'currency' => 'RUB'], // где value' => 1 cтавим нужныую сумму, для меня это рубль
    'status' => ['value' => 'PAID']
  ],
  'version' => $status4
];
$secretKey = ''; // сюда секретный ключ qiwi

$check = $billPayments->checkNotificationSignature( // с помощью либы проверяем, и если все правильно оно возвращает истину
  $validSignatureFromNotificationServer, $notificationData, $secretKey
);

if ($check == "1") { // а тут как раньше
    $vk->sendMessage($coment, "Оплата прошла успешно.");
} else {
    echo "-";
}
Ну как вы поняли, мы создаем ссылку и отправляем юзеру, юзер оплачивает счет. Qiwi отправляем увеодомление о оплате в виде json на наш хостинг, а мы оброботываем это и отправляем информацию о оплате юзеру. Все готово!

Теперь не большой гайд как все это устоновить на хостинг и запустить бота:

1) Выбираем хостинг, я выбрал для тестов бесплатный тариф sprinthost'a(НЕ РЕКЛАМА!)
2) Переходим в файловый менеджер и закидываем туда архив который прикреплен в посте.
3) Извлекаем архив прямо в хостинге
1643175446008.png
1643175448908.png

4) Нажимаем на bot.php и меням все ключи на свой, и так же это делаем на qiwi.php
5) В вк переходим раздел "Callback API", в поле адрес пишем путь до нашего php скрипта бота, внизу копируем ключ и вставляем в скрипте ACCESS_KEY
1643175647008.png

6) Нажимаем на подвердить, должно получится как у меня:
1643175702788.png

7) В киви переходим в раздел "API", и редактирем URL адрес указыаем путь до скрипта qiwi.php
1643175809506.png
1643175833583.png

Готово!
Бот с автооплатой готов!

Я нигде не нашел бота с автооплатой qiwi для вк, и так же другие работы с qiwi p2p php.
 

Вложения

  • 1643174755594.png
    1643174755594.png
    49.2 KB · Просмотры: 50
  • qiwi bot vk 2.rar
    182.9 KB · Просмотры: 114
Последнее редактирование:

meowprd

Тот самый Котовский
Проверенный
1,280
712
а как же проверка хэшей на хостинги в скрипте, который обрабатывает callback от qiwi или элементарная проверка ip серверов qiwi?
 

hinazuki

Потрачен
Автор темы
346
95
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
а как же проверка хэшей на хостинги в скрипте, который обрабатывает callback от qiwi или элементарная проверка ip серверов qiwi?
Можно сделать проверку IP qiwi или же как ты говорил проверка подлинности увоедомление с помощью HMAC с хеш-функцией SHA25, я просто показал способ.
 
Последнее редактирование:

meowprd

Тот самый Котовский
Проверенный
1,280
712
Можно сделать проверку IP qiwi или же как ты говорил проверка подлинности увоедомление с помощью HMAC с хеш-функцией SHA25, я просто показал способ.
Гайд должен быть полноценным гайдом, а не на отьебись
 
  • Нравится
Реакции: moreveal и Roman Grudov

hinazuki

Потрачен
Автор темы
346
95
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Гайд должен быть полноценным гайдом, а не на отьебись
Ладно, я уже почти закончил.

Сделал проверку на подлинность увеодомление от qiwi c помощью HMAC с хеш-функцией SHA25, можно было сделать и с проверкой IP. Но так лучше:
PHP:
require("vendor/autoload.php"); // Подключаем либы
require_once('simplevk-master/autoload.php');

use DigitalStar\vk_api\VK_api as vk_api;

const VK_KEY = ""; // Токен ВК
const VERSION = "5.126";
const SECRET_KEY = ''; // Секретный ключ QIWI
$billPayments = new Qiwi\Api\BillPayments(SECRET_KEY); //  Авторизация
$vk = vk_api::create(VK_KEY, VERSION);

$data = json_decode(file_get_contents('php://input'), true); // Принимаем запрос от qiwi как json
$status1 = $data['bill']['siteId']; // Пиздим с запроса все нужные параметры, а именно billId, siteId, status, comment, version 
$status2 = $data['bill']['billId'];
$status3 = $data['bill']['status']['value'];
$status4 = $data['version'];
$coment = $data['bill']['comment'];

if (!function_exists('getallheaders')){  // Берём с запроса qiwi X-Api-Signature-SHA256(это ключ счета), это нужна для проверки
    function getallheaders(){ // чтобы его получить подбираем все HEADERS и ищем нужный
    $headers = [];
    foreach ($_SERVER as $name => $value){
      if (substr($name, 0, 5) == 'HTTP_'){ $headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value; }
    }
    return $headers;
    }
}

$head = array_change_key_case(getallheaders(), CASE_LOWER);
$validSignatureFromNotificationServer = $head[mb_strtolower('x-api-signature-SHA256')]; // записываем наш ключ в переменную
$notificationData = [ // массив с данными для проверки
  'bill' => [
    'siteId' => $status1,
    'billId' => $status2,
    'amount' => ['value' => 1, 'currency' => 'RUB'], // где value' => 1 cтавим нужныую сумму, для меня это рубль
    'status' => ['value' => 'PAID']
  ],
  'version' => $status4
];
$secretKey = ''; // сюда секретный ключ qiwi

$check = $billPayments->checkNotificationSignature( // с помощью либы проверяем, и если все правильно оно возвращает истину
  $validSignatureFromNotificationServer, $notificationData, $secretKey
);

if ($check == "1") { // а тут как раньше
    $vk->sendMessage($coment, "Оплата прошла успешно.");
} else {
    echo "-";
}

Обновил файл, и гайд чутка.

Есть еще один способ проверки на подлинность, это с помощью IP запроса.
Если кому-то интересно, то оставлю тут код:

PHP:
require_once('simplevk-master/autoload.php'); // Подключаем либу ВК
use DigitalStar\vk_api\VK_api as vk_api;

const VK_KEY = ""; // переменные для авторизация вк
const VERSION = "5.126";
$vk = vk_api::create(VK_KEY, VERSION);

$data = json_decode(file_get_contents('php://input'), true); // принимаем запрос от QIWI в виде json
$status = $data['bill']['status']['value'];
$coment = $data['bill']['comment'];

$ip_list = array (
    array('79.142.0.0', '79.142.255.255'), // диапозон IP QIWI
    array('195.189.0.0', '195.189.255.255'),
    array('91.232.0.0', '91.232.255.255'),
    array('91.213.0.0', '91.213.255.255'),
);
 
function getIP() { // функция определение IP запроса
    if(isset($_SERVER['HTTP_X_REAL_IP'])) return $_SERVER['HTTP_X_REAL_IP'];
    return $_SERVER['REMOTE_ADDR'];
}

function ip_in_list($list, $ip) { // функция которая перебирает диапозон IP
    foreach ($list as $item)
        if (is_array($item) && version_compare($item[0], $ip, '<=') && version_compare($item[1], $ip, '>=') || $ip === $item)
            return true;
    return false;
}

$ip = getIP(); // записываем IP запроса
$check = ip_in_list($ip_list, $ip); // сравниваем его с диапозоном ip

if ($status == "PAID") { // и проверка
    if ($check == "1") {
         $vk->sendMessage($coment, "Оплата прошла успешно.");
    }
}
 
Последнее редактирование:

meowprd

Тот самый Котовский
Проверенный
1,280
712
Ладно, я уже почти закончил.

Сделал проверку на подлинность увеодомление от qiwi c помощью HMAC с хеш-функцией SHA25, можно было сделать и с проверкой IP. Но так лучше:
PHP:
require("vendor/autoload.php"); // Подключаем либы
require_once('simplevk-master/autoload.php');

use DigitalStar\vk_api\VK_api as vk_api;

const VK_KEY = ""; // Токен ВК
const VERSION = "5.126";
const SECRET_KEY = ''; // Секретный ключ QIWI
$billPayments = new Qiwi\Api\BillPayments(SECRET_KEY); //  Авторизация
$vk = vk_api::create(VK_KEY, VERSION);

$data = json_decode(file_get_contents('php://input'), true); // Принимаем запрос от qiwi как json
$status1 = $data['bill']['siteId']; // Пиздим с запроса все нужные параметры, а именно billId, siteId, status, comment, version
$status2 = $data['bill']['billId'];
$status3 = $data['bill']['status']['value'];
$status4 = $data['version'];
$coment = $data['bill']['comment'];

if (!function_exists('getallheaders')){  // Берём с запроса qiwi X-Api-Signature-SHA256(это ключ счета), это нужна для проверки
    function getallheaders(){ // чтобы его получить подбираем все HEADERS и ищем нужный
    $headers = [];
    foreach ($_SERVER as $name => $value){
      if (substr($name, 0, 5) == 'HTTP_'){ $headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value; }
    }
    return $headers;
    }
}

$head = array_change_key_case(getallheaders(), CASE_LOWER);
$validSignatureFromNotificationServer = $head[mb_strtolower('x-api-signature-SHA256')]; // записываем наш ключ в переменную
$notificationData = [ // массив с данными для проверки
  'bill' => [
    'siteId' => $status1,
    'billId' => $status2,
    'amount' => ['value' => 1, 'currency' => 'RUB'], // где value' => 1 cтавим нужныую сумму, для меня это рубль
    'status' => ['value' => 'PAID']
  ],
  'version' => $status4
];
$secretKey = ''; // сюда секретный ключ qiwi

$check = $billPayments->checkNotificationSignature( // с помощью либы проверяем, и если все правильно оно возвращает истину
  $validSignatureFromNotificationServer, $notificationData, $secretKey
);

if ($check == "1") { // а тут как раньше
    $vk->sendMessage($coment, "Оплата прошла успешно.");
} else {
    echo "-";
}

Обновил файл, и гайд чутка.

Есть еще один способ проверки на подлинность, это с помощью IP запроса.
Если кому-то интересно, то оставлю тут код:

PHP:
require_once('simplevk-master/autoload.php'); // Подключаем либу ВК
use DigitalStar\vk_api\VK_api as vk_api;

const VK_KEY = ""; // переменные для авторизация вк
const VERSION = "5.126";
$vk = vk_api::create(VK_KEY, VERSION);

$data = json_decode(file_get_contents('php://input'), true); // принимаем запрос от QIWI в виде json
$status = $data['bill']['status']['value'];
$coment = $data['bill']['comment'];

$ip_list = array (
    array('79.142.0.0', '79.142.255.255'), // диапозон IP QIWI
    array('195.189.0.0', '195.189.255.255'),
    array('91.232.0.0', '91.232.255.255'),
    array('91.213.0.0', '91.213.255.255'),
);
 
function getIP() { // функция определение IP запроса
    if(isset($_SERVER['HTTP_X_REAL_IP'])) return $_SERVER['HTTP_X_REAL_IP'];
    return $_SERVER['REMOTE_ADDR'];
}

function ip_in_list($list, $ip) { // функция которая перебирает диапозон IP
    foreach ($list as $item)
        if (is_array($item) && version_compare($item[0], $ip, '<=') && version_compare($item[1], $ip, '>=') || $ip === $item)
            return true;
    return false;
}

$ip = getIP(); // записываем IP запроса
$check = ip_in_list($ip_list, $ip); // сравниваем его с диапозоном ip

if ($status == "PAID") { // и проверка
    if ($check == "1") {
         $vk->sendMessage($coment, "Оплата прошла успешно.");
    }
}
Можно было заюзать ip2long