Показать сообщение отдельно

  #12  
Старый 26.01.2022, 10:49
hinazuki
Постоянный
Регистрация: 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
,
"Оплата прошла успешно."
)
;
}
}
 
Ответить с цитированием