Скрипт платежной системы(интеркасса)
30.12.2015, 02:40. Показов 6041. Ответов 3
Здравствуйте, помогите разобраться со скриптом пополнения баланса на сайте.
После успешной оплаты переправляет как положено на сайт и пишет "Успешно." но баланс не пополняется
config.php
PHP | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
| <?php
$config = array (
/*
* MySQL_DRIVER - Драйвер для подключения к базе данных
* Может принимать значения (Регистр любой) - PDO (Рекомендовано), MySQLi или MySQL (Не рекомендовано!)
* Если вы не знаете зачем нужен этот параметр, то не изменяйте его!
*/
'mysql_driver' => 'MySQLi', // Драйвер для подключения к базе данных
/*
* Настройки базы данных
*/
'host' => 'localhost', // MySQL Хост (IP/Domain)
'user' => 'пользователь', // MySQL Пользователь
'pass' => 'пароль', // MySQL Пароль
'bd_name' => 'база', // MySQL База Данных
'table' => 'money', // Таблица с валютой
'column_money' => 'realmoney', // Столбик рублей
'column_user' => 'username', // Столбик имён
/*
* Настройки системы
* USER_PARAM - уникальный пареметр, это может быть ID или никнейм (логин) игрока, зависит от параметра COLUMN_USER
* Для CMS DLE - $_SESSION['dle_user_id'], но тогда COLUMN_USER - 'user_id'
*/
'path' => 'payment', // Путь до файла payment.php от корня, без / (payment - поумолчанию)
'user_param' => 'test', // Уникальный параметр, напримаер логин или id игрока, зависит от параметра COLUMN_USER
/*
* Единые настройки платёжных системы
*/
'description' => 'Пополнение счёта игрока - ', // Описание платежа. DESCRIPTION USER_PARAM
'max_pay' => 1000, // Максимальная сумма пополнения
/*
* MESSAGE - Вместо обычного текста, можно использовать HTML-тег META для переадресации на сайт.
* META, обладает свойством REFRESH - <META HTTP-EQUIV="REFRESH" CONTENT="N;URL=адрес">
* N - Время, через которое пользователя отправит на указанный http. http - Ссылка на сайт
* Например: <META HTTP-EQUIV="REFRESH" CONTENT="0;URL=http://casioo.ru/">
*/
'message' => array (
'success' => 'Успешно.', // сообщение в случае успешной оплаты
'fail' => 'Ошибка!', // сообщение в случае ошибки или неудачной оплаты.
),
/*
* Настройки платёжных систем
* Пожробнее смотрите в инструкции.
*/
'pay_system' => array (
'interkassa' => array( // Настройки InterKassa
'enable' => true, // Принимать платежи данной системы?
'shop_id' => 'id магазина', // ID магазина InterKassa
'cur' => 'RUB', // Тип валюты (RUB UAH USD EUR)
'key' => 'ключ', // Секретный ключ
'test_key' => 'тестовый ключ', // Местовый секретный ключ
'testing' => false // Включить режим тестирования?
),
'unitpay' => array( // Настройки UnitPay
'enable' => false, // Принимать платежи данной системы?
'project_id' => '', // ID(Номер) проекта || demo - в случае тестого платежа
'key' => '', // Секретный ключ
),
/*'robokassa' => array( // Настройки RoboKassa
'enable' => false, // Принимать платежи данной системы?
'password1' => '', // Пароль #1 В следующей версии.
'password2' => '', // Пароль #2
'login' => '', // Логин (Имя проекта) || demo - в случае тестого платежа
),*/
)
);
?> |
|
payment.class.php
PHP | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
| <?php
class payment
{
public function __construct()
{
global $config;
$this->config = $config;
$this->mysql_driver = strtolower($config['mysql_driver']);
$this->ik = $config['pay_system']['interkassa'];
$this->up = $config['pay_system']['unitpay'];
//$this->rk = $config['pay_system']['robokassa']; // Ждём следующую версию
}
public function ik_sort($param)
{
$data['ik_co_id'] = $this->ik['shop_id'];
foreach ($param as $key => $value) // убирает параметры без /ik_/
{
if (!preg_match('/ik_/', $key)) continue;
$data[$key] = $value; // сохраняем параметры
}
return $data;
}
public function ik_sign($param) // интеркасса генератор контрольной цифровой подписи со стороны сервера
{
$data = $this->ik_sort($param);
$ikSign = $data['ik_sign']; // сохраняем приходящую переменную
unset($data['ik_sign']); // удаляем придодащую переменную, для генирации подписи
$key = ($data['ik_pw_via'] == 'test_interkassa_test_xts') ? $this->ik['test_key'] : $this->ik['key'];
if ($data['ik_pw_via'] == 'test_interkassa_test_xts' && !$this->ik['testing']) return false;
ksort ($data, SORT_STRING); // сортируем массив
array_push($data, $key); // внедряем переменуую $key в массив
$signStr = implode(':', $data); // записываем массив в формат @string через :
$sign = base64_encode(md5($signStr, true)); // хешируем подпись
return ($sign == $ikSign) ? true : false;
}
public function up_json_reply($type = "error", $params) // системный ответ для сервера unitpay, json
{
if ($type == "check" || $type == "pay") $type = "success";
$reply = array( // системный массив
'error' => array(
"jsonrpc" => "2.0",
"error" => array("code" => -32000, "message" => $this->config['message']['fail']),
'id' => $params['projectId']
),
'success' => array(
"jsonrpc" => "2.0",
"result" => array("message" => $this->config['message']['success']),
'id' => $params['projectId']
)
);
return json_encode($reply[$type]); // возвращаем json
}
public function up_sign($reply) { // Проверка цифровой подписи unitpay
ksort($reply); // сортируем массив
$exp = explode("-", $this->up['project_id']);
$Sign = $reply['sign']; // сохраняем подпись
unset($reply['sign']); // удаляем подпись
$reply['projectId'] = $exp[0]; // заменяем существующий ид проекта на свой, дабы убедиться, что запрос от нашего UP
$return = (md5(join(null, $reply).$this->up['key']) != $Sign) ? "error" : "success"; // генирация и проверка подписи
return $this->up_json_reply($return, $reply);
}
public function mysql_prepare($sql, $db, $binds)
{
foreach($binds as $key => $bind) {
$a[] = $key;
$b[] = "'{$bind}'";
}
$query = mysql_query(str_replace($a, $b, $sql), $db);
return (!$query) ? false : true;
}
public function pay_systems($pay_system)
{
foreach($this->config['pay_system'] as $system => $options)
{
if ($pay_system == $system && $options['enable']) return true;
}
return false;
}
public function pay_form($amount, $user, $pay_system) // генерация GET запроса
{
$amount = (int) $amount;
if ($amount > $this->config['max_pay'] || $amount <= 0 || !$this->pay_systems($pay_system)) return "/{$this->config['path']}/payment.php?reply=fail";
$desc = "{$this->config['description']} {$user}";
switch ($pay_system) {
case "interkassa" :
return "https://sci.interkassa.com/?ik_co_id={$this->ik['shop_id']}&ik_pm_no={$user}&ik_am={$amount}&ik_cur={$this->ik['cur']}&ik_desc={$desc}";
break;
case "unitpay" :
return "https://unitpay.ru/pay/{$this->up['project_id']}?sum={$amount}&account={$user}&desc={$desc}";
break;
case "robokassa" :
// Ждём следующую версию
break;
default:
return "/{$this->config['path']}/payment.php?reply=fail";
break;
}
}
public function pay($amount, $user) // пополнение счета
{
$sql = "UPDATE `{$this->config['table']}` SET `{$this->config['column_money']}` = {$this->config['column_money']} + :amount WHERE `{$this->config['column_user']}` = :user";
if(extension_loaded("MySQLi") && $this->mysql_driver == "auto" || $this->mysql_driver == "mysqli") {
$conn = new mysqli($this->config['host'], $this->config['user'], $this->config['pass'], $this->config['bd_name']);
$stmt = $conn->prepare(str_replace(array(":amount", ":user"), "?", $sql));
$stmt->bind_param("is", $amo, $username);
$username = $user; $amo = (int) $amount;
return $stmt->execute();
} else if(extension_loaded("PDO") && extension_loaded("PDO_MySQL") && $this->mysql_driver == "auto" || $this->mysql_driver == "pdo"){
$conn = new PDO("mysql:host={$this->config['host']};dbname={$this->config['bd_name']}", $this->config['user'], $this->config['pass']);
$query = $conn->prepare($sql);
return $query->execute(array(":amount" => (int) $amount, ":user" => $user));
} else {
$conn = mysql_connect($this->config['host'], $this->config['user'], $this->config['pass']) or die('Ошибка подключения: '.mysql_error());
$db = mysql_select_db($this->config['bd_name'], $conn);
$user = mysql_real_escape_string(htmlspecialchars($user, ENT_QUOTES));
return $this->mysql_prepare($sql, $conn, array(":amount"=>(int)$amount, ":user"=>$user)) or die(mysql_error());
}
}
}
?> |
|
payment.php
PHP | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
| <?php
session_start();
include "config.php";
require_once("payment.class.php");
$pay = new payment();
if (isset($_REQUEST['amount']) && isset($_REQUEST['payment'])) {
header ("Location: ".$pay->pay_form($_REQUEST['amount'], $pay->config['user_param'], $_REQUEST['payment']));
} else if (isset($_REQUEST['method']) && isset($_REQUEST['params'])) {
switch (strtolower($_REQUEST['method'])) {
case "check" :
echo $pay->up_sign($_REQUEST['params']);
break;
case "pay" :
echo $pay->up_sign($_REQUEST['params']);
$pay->pay($_REQUEST['params']['sum'], $_REQUEST['params']['account']);
break;
default :
$pay->up_json_reply("error", $_REQUEST['params']);
break;
}
exit();
} else {
if (isset($_GET['reply'])) {
echo $config['message'][$_GET['reply']];
} else {
if(!$pay->ik_sign($_REQUEST)) exit("403");
$pay->pay($_REQUEST['ik_am'], $_REQUEST['ik_pm_no']);
}
}
?> |
|
Интерфейс интеркассы:
URL успешной оплаты: http://сайт/payment/payment.php?reply=success
URL неуспешной оплаты: http://сайт/payment/payment.php?reply=fail
0
|