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

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

30.12.2015, 02:40. Показов 6041. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.12.2015, 02:40
Ответы с готовыми решениями:

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

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

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

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

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

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

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

Не по теме:

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

0
30.12.2015, 13:25
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.12.2015, 13:25
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru