Форум программистов, компьютерный форум, киберфорум
PHP: API, боты
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.79/29: Рейтинг темы: голосов - 29, средняя оценка - 4.79
1 / 1 / 0
Регистрация: 22.01.2015
Сообщений: 77

Скрипт платежной системы(интеркасса)

30.12.2015, 02:40. Показов 6099. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, помогите разобраться со скриптом пополнения баланса на сайте.
После успешной оплаты переправляет как положено на сайт и пишет "Успешно." но баланс не пополняется

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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.12.2015, 02:40
Ответы с готовыми решениями:

Подключение платежной системы payanyway
Всем привет! В программировании не очень силён, но пытаюсь подключить платежную систему payanyway на сайт. сайт на php и сам прием...

Интеграция платежной системы Екомм ТБС банка на сайт
Здравствуйте, пытаюсь интегрировать платежную систему ufc ecomm TBC банка на сайт, но не как не выходит, вот код На сколько я знаю...

Интеркасса к сайту
Ребят, кто работал с интеркассой, помогите! Проблема в том что мне нужно написать скрипт, который при успешной оплате через интеркассу,...

3
Эксперт PHP
3886 / 3226 / 1351
Регистрация: 01.08.2012
Сообщений: 10,878
30.12.2015, 09:31
Это ваш скрипт? Если нет, лучше спросить у автора.
0
1 / 1 / 0
Регистрация: 22.01.2015
Сообщений: 77
30.12.2015, 10:34  [ТС]
Цитата Сообщение от Jodah Посмотреть сообщение
Это ваш скрипт? Если нет, лучше спросить у автора.
спрашивал, игнорирует
0
Эксперт PHP
3886 / 3226 / 1351
Регистрация: 01.08.2012
Сообщений: 10,878
30.12.2015, 13:25
kilpro_css, просто обычный скрипт можно было бы скопипастить себе и проверить, а в вашем случае нужно читать документацию платёжной системы, сидеть разбираться, тестировать... проблема ведь может быть со стороны самой платёжной системы, может какие-то настройки в личном кабинете нужно включить/выключить.

Не думаю, у кого-то из форумчан будет желание разбираться с этим, во всяком случае бесплатно.

Цитата Сообщение от kilpro_css Посмотреть сообщение
игнорирует

Не по теме:

Возможно после НГ проснётся. :) Сейчас наверное уже не до этого.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.12.2015, 13:25
Помогаю со студенческими работами здесь

Интеркасса Interkassa
Доброго времени суток! Вопрос: я сделал тестовый платёж и собирался посмотреть, какие параметры возвращаются из интеркассы, т.е. тупо...

ИНТЕРКАССА / POST при успешной оплате
Есть сайт. Краткая суть такова. 1) Пользователь вводит свой e-mail и нажимает кнопку оплатить. 2) Его отправляет на интеркассу и там...

скрипт платежной системы
Нужна помощь :) Ситуация такая: клиент производит оплату через робокассу на сайте, деньги на счет приходят, но на сайте появляется...

скрипт платежной системы Robokassa
Здравствуйте делал скрипт оплаты робокассы в тестовом режиме так как уже все готово активировал аккаунт как теперь скрипт перевести в режим...

Скрипт платежной системы на php
Доброго времени суток, уважаемые пользователи форума КиберФорум! Для меня вот уже год остается актуальным вопрос: как создать скрипт...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Обмен данными в микросервисной архитектуре
ArchitectMsa 06.04.2025
Когда разработчики начинают погружаться в мир микросервисов, они часто сталкиваются с парадоксальным правилом: "два сервиса не должны делить один источник данных". Эта мантра звучит повсюду в. . .
PostgreSQL в Kubernetes: Автоматизация обслуживания с CNPG
Mr. Docker 06.04.2025
Администраторы баз данных сталкиваются с целым рядом проблем при обслуживании PostgreSQL в Kubernetes: как обеспечить правильную репликацию данных, как настроить автоматическое переключение при. . .
Async/await в TypeScript
run.dev 06.04.2025
Асинхронное программирование — это подход к разработке программного обеспечения, при котором операции выполняются независимо друг от друга. В отличие от синхронного выполнения, где каждая последующая. . .
Многопоточность в C#: Синхронизация потоков
UnmanagedCoder 06.04.2025
Многопоточное программирование стало неотъемлемой частью разработки современных приложений на C#. С появлением многоядерных процессоров возможность выполнять несколько задач параллельно значительно. . .
TypeScript: Классы и конструкторы
run.dev 06.04.2025
TypeScript, как статически типизированный язык, построенный на основе JavaScript, привнес в веб-разработку новый уровень надежности и структурированности кода. Одним из важнейших элементов этой. . .
Многопоточное программирование: Rust против C++
golander 06.04.2025
C++ существует уже несколько десятилетий и его поддержка параллелизма постепенно наращивалась со временем. Начиная с C++11, язык получил стандартную библиотеку для работы с потоками, а в последующих. . .
std::vector в C++: от основ к оптимизации производительности
NullReferenced 05.04.2025
Для многих программистов знакомство с std::vector происходит на ранних этапах изучения языка, но между базовым пониманием и подлинным мастерством лежит огромная дистанция. Контейнер std::vector. . .
Реляционная модель и правила Кодда: фундамент современных баз данных
Codd 05.04.2025
Конец 1960-х — начало 1970-х годов был периодом глубоких трансформаций в области хранения и обработки данных. На фоне растущих потребностей бизнеса и правительственных структур существовавшие на тот. . .
Асинхронные операции в Django с Celery
py-thonny 05.04.2025
Разработчики Django часто сталкиваются с проблемой, когда пользователь нажимает кнопку отправки формы и. . . ждёт. Секунды растягиваются в минуты, терпение иссякает, а интерфейс приложения замирает. . . .
Использование кэшей CPU: Максимальная производительность в Go
golander 05.04.2025
Разработчикам хорошо известно, что эффективность кода зависит не только от алгоритмов и структур данных, но и от того, насколько удачно программа взаимодействует с железом. Среди множества факторов,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер