 |
|

26.01.2022, 10:45
|
|
Познавший АНТИЧАТ
Регистрация: 04.07.2019
Сообщений: 1,297
С нами:
3611265
Репутация:
183
|
|
Сообщение от Hinazuki
Можно сделать проверку IP qiwi или же как ты говорил проверка подлинности увоедомление с помощью HMAC с хеш-функцией SHA25, я просто показал способ.
Гайд должен быть полноценным гайдом, а не на отьебись
|
|
|

26.01.2022, 10:49
|
|
Постоянный
Регистрация: 12.01.2021
Сообщений: 343
С нами:
2808522
Репутация:
48
|
|
Сообщение от Котовский.
Гайд должен быть полноценным гайдом, а не на отьебись
Ладно, я уже почти закончил.
Сделал проверку на подлинность увеодомление от 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
,
'='
)
||
$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
,
"Оплата прошла успешно."
)
;
}
}
|
|
|

26.01.2022, 13:52
|
|
Познавший АНТИЧАТ
Регистрация: 04.07.2019
Сообщений: 1,297
С нами:
3611265
Репутация:
183
|
|
Сообщение от Hinazuki
Ладно, я уже почти закончил.
Сделал проверку на подлинность увеодомление от 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
,
'='
)
||
$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
|
|
|

26.01.2022, 14:01
|
|
Постоянный
Регистрация: 12.01.2021
Сообщений: 343
С нами:
2808522
Репутация:
48
|
|
Сообщение от Котовский.
Можно было заюзать ip2long
Да можно, позже скину пример с ним.
|
|
|

26.01.2022, 19:39
|
|
Постоянный
Регистрация: 05.10.2020
Сообщений: 509
С нами:
2950908
Репутация:
48
|
|
Всеравно не работает
|
|
|

26.01.2022, 20:30
|
|
Познавший АНТИЧАТ
Регистрация: 28.10.2017
Сообщений: 1,778
С нами:
4495573
Репутация:
183
|
|
Сообщение от Hinazuki
Ждал такой же гайд от @Pakulichev, но кажется он не хотел.
Мне не очень нравится принимать платежи через QIWI, есть огромное множество других платежных сервисов, которые предоставляют большее количество возможностей и способов оплаты. Да, большинство из них недоступно для физических лиц, но при этом доступно для самозанятых. Стать самозанятым, проживая в России, можно в пару кликов, не посещая никакие органы и не заполняя никаких документов, так что все пути открыты.
Более того, для подписок функция рекуррентных платежей незаменима, а в QIWI её нет.
|
|
|

26.01.2022, 20:33
|
|
Постоянный
Регистрация: 12.01.2021
Сообщений: 343
С нами:
2808522
Репутация:
48
|
|
Сообщение от Pakulichev
Мне не очень нравится принимать платежи через QIWI, есть огромное множество других платежных сервисов, которые предоставляют большее количество возможностей и способов оплаты. Да, большинство из них недоступно для физических лиц, но при этом доступно для самозанятых. Стать самозанятым, проживая в России, можно в пару кликов, не посещая никакие органы и не заполняя никаких документов, так что все пути открыты.
Более того, для подписок функция рекуррентных платежей незаменима, а в QIWI её нет.
Мне тоже QIWI не нравится, но я не являюсь гражданином РФ, так что не могу исползвать платежные системы. А те платежные системы без подверждение ФЛ - СКАМ проэкт.
Сообщение от Majunti
Всеравно не работает
Прямые руки надо иметь, я все расписал от А до Я.
|
|
|

05.02.2022, 01:32
|
|
Участник форума
Регистрация: 22.06.2021
Сообщений: 120
С нами:
2576713
Репутация:
18
|
|
А у меня вопрос, где ты взял это?
Код:
Код:
require("vendor/autoload.php"); // Для qiwi
simple vk понятно, скачал и закинул в папку со скриптом, но где ты взял vendor/autoload.php???
Уже час не понимаю где же ты это взял, на гитхабе про это я не нашёл, объясни тупому?
|
|
|

05.02.2022, 07:39
|
|
Постоянный
Регистрация: 12.01.2021
Сообщений: 343
С нами:
2808522
Репутация:
48
|
|
Сообщение от Rafaelofff
А у меня вопрос, где ты взял это?
Код:
Код:
require("vendor/autoload.php"); // Для qiwi
simple vk понятно, скачал и закинул в папку со скриптом, но где ты взял vendor/autoload.php???
Уже час не понимаю где же ты это взял, на гитхабе про это я не нашёл, объясни тупому?
через composer либу устоновил устоновил.

|
|
|

05.02.2022, 12:11
|
|
Участник форума
Регистрация: 22.06.2021
Сообщений: 120
С нами:
2576713
Репутация:
18
|
|
Я не понимаю, всё вроде ок сделал, но не работает, все ключи правильные
Код:
Код:
setConfirm(ACCESS_KEY); // Авторизация
$billPayments = new Qiwi\Api\BillPayments(SECRET_KEY); // Авторизация
$billId = $billPayments->generateId(); // Генерируем billId для работы сервисов qiwi
$lifetime = $billPayments->getLifetimeByDay(0.5); // Cколько будет жить счет для оплаты, по стандарту 24 часа
$customFields = ['themeCode' => 'Aleksandr-BUHUPSgUZw']; // Cюда вставляем тот самый код с раздела "Форма приема переводов"
$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", [[]]);
}
?>
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|