• Новые темы в этом разделе публикуются автоматически при добавлении файла в менеджер ресурсов.
    Ручное создание новых тем невозможно.

Скрипт Qiwi P2P для L2 2021-08-29

Нет прав для скачивания
прошу прощения за тупость, забыл bind-address указать для mysql, почему то был уверен что он был *
кстати если нет подключения к БД то скрипт обрабатывается с пустыми полями
 
все просто - в файле sign.php не обрабатываются исключения работы скрипта db.class.php (PDO)
 
в общем то всё работает в стоке если всё правильно прописано (lucera 3)
 
Как не старался к стреcс вебу подключить выдает ошибку "Не хватает параметров для создания счета", через тест форму ошибку 500, тобиш пустую форму отправляет, мб нужно права какие либо выдать? или запрос к бд не не правильный?
 
1. Какие форма передает параметры? Проверка на передачу было?
2. А запрос к БД проверялся на правильность с нужными данными?
3. Если передает пустую форму, может jquery не подключен, ошибки в консоли есть?

Слишком мало инфы.
 
Obi крутой чел!Все норм работает, вопрос снят.
 
Obi крутой чел!Все норм работает, вопрос снят.
Я бы за такие бессмысленные сообщения бан давал.

Чувак, если ты столкнулся с проблемой, потом решил - пиши что делал, где была проблема, как исправил.
Возможно кто-то тоже наступит на грабли по которым ты прошел.
 
Реакции: kick
Logan22, версия php ниже 5.4, а скритах используется объявления массивов
PHP:
$array = [];

да да, все еще есть те, кто пользуются такими версиями php

видимо стоило указать требования
 
Последнее редактирование:
Доброго времени суток, первый раз попровал сделать ничего не получился как бы не настроил либо "персонаж не найден" либо "сервер не найден". Попробовал еще раз, читая ваши комментарии, получилось немножко, все заходит, нету никаких ошибок, но после оплаты не вкидывает на первоначальную страницу и персонажу не дает монеты. Php 5,6, внизу отправлю как я настроил, если ошибся, может подскажете:

<?php

// Ваш ключ идентификации полученный в p2p.qiwi.com
define( 'PUBLIC_KEY', 'xxxxxxxxxxxxxxxxxxx' ); Вводил публичный ключ который дают в киви

//
define( 'SECRET_KEY', 'xxxxxxxxxxxxxxxxxxxxx' ); Вводил секретный ключ который дают в киви

// URL для переадресации на ваш сайт в случае успешного перевода
define( 'SUCCESS_URL', ' ' ); Свой аддрес сайта

// ID выдаваемого предмета
define( 'ITEM_ID', 57 ); Итем

// Стоимость одного предмета
define( 'ITEM_PRICE', 1 ); Количество

// Конфиг подключения к игровой бд
$config = [
'server1' => [
'dbhost' => 'localhost',
'dbuser' => 'root',
'dbpass' => 'root', пас mysql
'dbname' => 'l2jdb', путь к бд сервера
'dbport' => 3306,
'charset' => 'utf8'
],
'server2' => [
'dbhost' => 'localhost',
'dbuser' => 'root',
'dbpass' => 'root',
'dbname' => 'l2jdb',
'dbport' => 3306,
'charset' => 'utf8'
],
'server3' => [
'dbhost' => 'localhost',
'dbuser' => 'root',
'dbpass' => 'root',
'dbname' => 'l2jdb',
'dbport' => 3306,
'charset' => 'utf8'
]
];

?>

<?php


тут вообще ничего не трогал т.к тут все берется из config.php или ошибаюсь?

class DB
{
private $dbh = null;

public function __construct( $config )
{
$dbhost = $config['dbhost'];
$dbport = $config['dbport'];
$dbuser = $config['dbuser'];
$dbpass = $config['dbpass'];
$dbname = $config['dbname'];
$charset = $config['charset'];

$dsn = "mysql:host=$dbhost;port=$dbport;dbname=$dbname;charset=$charset";
$options = [
\PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
\PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION
];

try
{
$this->dbh = new \PDO( $dsn, $dbuser, $dbpass, $options );
}
catch ( \PDOException $e )
{
die( $e->getMessage() );
}
}

public function prepareAndExecute( $sql, array $parameters = null, $bind = true, $bindValue = true )
{
try
{
if ( $stmt = $this->dbh->prepare( $sql ) )
{
if ( $bind && is_array( $parameters ) )
{
foreach ( $parameters as $key => $value )
{
$parameter = is_numeric( $key ) ? $key + 1 : $key;
$bindValue
? $stmt->bindValue( $parameter, $value )
: $stmt->bindParam( $parameter, $value );
}
}

if ( $stmt->execute( $bind ? null : $parameters ) )
{
return $stmt;
}
}
}
catch ( \PDOException $e )
{
die( $e->getMessage() );
}

return false;
}

public function fetch( $sql, array $parameters = null, $bind = true, $bindValue = true )
{
if ( $stmt = $this->prepareAndExecute( $sql, $parameters, $bind, $bindValue ) )
{
try
{
if ( $result = $stmt->fetch() )
{
return $result;
}
}
catch ( \PDOException $e )
{
die( $e->getMessage() );
}
}

return false;
}

public function fetchAll( $sql, array $parameters = null, $bind = true, $bindValue = true )
{
if ( $stmt = $this->prepareAndExecute( $sql, $parameters, $bind, $bindValue ) )
{
try
{
if ( $results = $stmt->fetchAll() )
{
return $results;
}
}
catch ( \PDOException $e )
{
die( $e->getMessage() );
}
}

return false;
}
}

?>

<script src=" "></script>
<script>
document.addEventListener( "DOMContentLoaded", function( event )
{
$( "#qiwi-payment" ).submit( function( event )
{
var result = true;
var char_name = $( "#qiwi-payment input[name^='account']" ).val();
var count = $( "#qiwi-payment #count" ).val();
var server_id = $( "#qiwi-payment select[name^='customFields[server_id]']" ).val();

console.log( "server id: " + server_id );

$.ajax(
{
type: "POST",
url: "/qiwi/sign.php",
data: ( { "server_id": server_id, "char_name": char_name, "count": count } ),
async: false,
dataType: "json",
success: function( response )
{
if ( response["error"] !== undefined )
{
$( "#qiwi-payment .message" ).html( response["error"]["message"] );
result = false;
}
else
{
$( "#qiwi-payment .message" ).html( '' );

$( "#qiwi-payment input[name^='publicKey']" ).val( response["publicKey"] );
$( "#qiwi-payment input[name^='billId']" ).val( response["billId"] );
$( "#qiwi-payment input[name^='amount']" ).val( response["amount"] );
$( "#qiwi-payment input[name^='successUrl']" ).val( response["successUrl"] );
}
}
});

return result;
});
});
</script>
<form id="qiwi-payment" action=" " method="GET" accept-charset="UTF-8">
<input type="hidden" name="publicKey" value="" /> тут вставил публичный ключ
<input type="hidden" name="billId" value="" />
<input type="hidden" name="amount" value="" />
<input type="hidden" name="successUrl" value="" />
<div class="form-group">
<label for="char">Ник персонажа:</label>
<input class="form-control" name="account" required="" type="text" value="" placeholder="" />
</div>
<div class="form-group">
<label for="sum">Сумма:</label>
<input id="count" class="form-control" required="" type="number" value="1" min="1" max="5000" />
</div>
<div class="message" style="color:red;"></div>
<input type="submit" value="Пополнить" />
</form>

<?php

тут тоже ничего не трогал


ini_set( 'display_errors', '0' );
error_reporting( E_ALL );

header( "Content-type: application/json" );

$XMLHttpRequest = isset( $_SERVER['HTTP_X_REQUESTED_WITH'] ) && $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest';

if ( $XMLHttpRequest )
{
require 'config.php';
require 'db.class.php';

$char_name = isset( $_POST['char_name'] ) ? $_POST['char_name'] : '';
$count = isset( $_POST['count'] ) ? $_POST['count'] : 0;
$server_id = isset( $_POST['server_id'] ) ? $_POST['server_id'] : '';

if ( isset( $config[ $server_id ] ) )
{
$db = new DB( $config[ $server_id ] );

if ( $char = $db->fetch( "SELECT obj_Id FROM characters WHERE char_name = ?", [ $char_name ] ) )
{
// Сумма платежа ( кол-во предметов на его стоимость )
$amount = ( $count * ITEM_PRICE );

// ID платежа
$billId = time();

$data = [
'publicKey' => PUBLIC_KEY,
'amount' => $amount,
'billId' => $billId,
'successUrl' => SUCCESS_URL
];
}
else
{
$data = [
'error' => [
'message' => 'Персонаж с ником ' . $char_name . ' не найден!'
]
];
}
}
else
{
$data = [
'error' => [
'message' => 'Сервер ' . $server_id . ' не найден!'
]
];
}
}
else
{
$data = [
'error' => [
'code' => 403,
'message' => 'Forbidden'
]
];
}

echo json_encode( $data );

?>

<?php

ini_set( 'display_errors', '0' );
error_reporting( E_ALL );

$json = file_get_contents( 'php://input' );

$decoded = json_decode( $json, true );

$siteId = isset( $decoded['bill']['siteId'] ) ? $decoded['bill']['siteId'] : '';
$char_name = isset( $decoded['bill']['customer']['account'] ) ? $decoded['bill']['customer']['account'] : '';
$amount = isset( $decoded['bill']['amount']['value'] ) ? $decoded['bill']['amount']['value'] : 0;
$currency = isset( $decoded['bill']['amount']['currency'] ) ? $decoded['bill']['amount']['currency'] : '';
$billId = isset( $decoded['bill']['billId'] ) ? $decoded['bill']['billId'] : 0;
$status = isset( $decoded['bill']['status']['value'] ) ? $decoded['bill']['status']['value'] : '';
$server_id = isset( $decoded['bill']['customFields']['server_id'] ) ? $decoded['bill']['customFields']['server_id'] : '';

if ( $status != 'PAID' )
die( 'Not paid!' );

$sign = isset( $_SERVER['HTTP_X_API_SIGNATURE_SHA256'] ) ? $_SERVER['HTTP_X_API_SIGNATURE_SHA256'] : '';

$invoice_parameters = "$currency|$amount|$billId|$siteId|$status";

require 'config.php';

$hash = hash_hmac('sha256', $invoice_parameters, SECRET_KEY );

if ( $sign !== $hash )
die( 'Bad sign!' );

require 'db.class.php';

if ( !isset( $config[ $server_id ] ) )
die( 'Сервер ' . $server_id . ' не найден!' );

$db = new DB( $config[ $server_id ] );

if ( !( $char = $db->fetch( "SELECT obj_Id FROM characters WHERE char_name = ?", [ $char_name ] ) ) )
die( 'Персонаж с ником ' . $char_name . ' не найден!' );

$owner_id = $char['obj_Id'];
$count = ( int ) ( $amount / ITEM_PRICE ); // TODO: floor || ceil

$description = 'Qiwi payment id #' . $billId;

$sql = "INSERT INTO `items_delayed` ( `payment_id`, `owner_id`, `item_id`, `count`, `payment_status`, `description` ) VALUES ( ?, ?, ?, ?, ?, ? )"; тут подправил под себя

if ( $db->prepareAndExecute( $sql, [ $billId, $owner_id, ITEM_ID, $count, 0, $description ] )->rowCount() )
die( 'Платеж #' . $billId . ' принят!' );

echo 'Платеж #' . $billId . ' не принят!';

?>
 
там на киви уже ограны стоят врядле получится сильно разбежаться )
 
Может кто помочь? не бесплатно конечно. Скину пару сотки, напишите в лс.

Может кто помочь? не бесплатно конечно. Скину пару сотки, напишите в лс.
Если есть другой, готовый, чтобы брать и переделать под себя, работал без ошибок, куплю. Напишите в лс.
 
Из коробки не писал запрос в БД
Java:
$dbhost  = $config['dbhost'];
        $dbport  = $config['dbport'];
        $dbuser  = $config['dbuser'];
        $dbpass  = $config['dbpass'];
        $dbname  = $config['dbname'];
        $charset = $config['charset'];
        
        $dsn = "mysql:host=$dbhost;port=$dbport;dbname=$dbname;charset=$charset";
но после редактирования db.class.php, вроде заработало.
Java:
$dbhost  = $config['dbhost'];
        $dbport  = $config['dbport'];
        $dbuser  = $config['dbuser'];
        $dbpass  = $config['dbpass'];
        $dbname  = $config['dbname'];
        
        $dsn = "mysql:host=$dbhost;port=$dbport;dbname=$dbname;charset=utf8";