Способы подключения

Подключение по API

Пример кода на PHP для интеграции со шлюзом

Пример кода на PHP для интеграции со шлюзом


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

Пример кода на PHP для интеграции со шлюзом по WS:

1<? php
2/**
3 * ДАННЫЕ ДЛЯ ПОДКЛЮЧЕНИЯ К ПЛАТЕЖНОМУ ШЛЮЗУ
4 *
5 * USERNAME Логин магазина, полученный при подключении.
6 * PASSWORD Пароль магазина, полученный при подключении.
7 * WSDL Адрес описания веб-сервиса.
8 * RETURN_URL Адрес, на который надо перенаправить пользователя
9 * в случае успешной оплаты.
10 */
11define('USERNAME', 'USERNAME');
12define('PASSWORD', 'PASSWORD');
13define('WSDL', 'https://server/payment/webservices/merchant-ws?wsdl');
14define('RETURN_URL', 'http://your.site/ws.php');
15
16/**
17 * КЛАСС ДЛЯ ВЗАИМОДЕЙСТВИЯ С ПЛАТЕЖНЫМ ШЛЮЗОМ
18 * Класс наследуется от стандартного класса SoapClient.
19 */
20class Gateway extends SoapClient {
21
22    /**
23     * АВТОРИЗАЦИЯ В ПЛАТЕЖНОМ ШЛЮЗЕ
24     * Генерация SOAP-заголовка для WS_Security.
25     *
26     * ОТВЕТ
27     * SoapHeader SOAP-заголовок для авторизации
28     */
29    private function generateWSSecurityHeader() {
30        $xml = '
31            <wsse:Security SOAP-ENV:mustUnderstand="1" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
32                <wsse:UsernameToken>
33                    <wsse:Username>'. USERNAME. '</wsse:Username>
34                    <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">'. PASSWORD. '</wsse:Password>
35                    <wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">'. sha1(mt_rand()). '</wsse:Nonce>
36                </wsse:UsernameToken>
37            </wsse:Security>';
38
39        return new SoapHeader('http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd', 'Security', new SoapVar($xml, XSD_ANYXML), true);
40    }
41
42    /**
43     * ВЫЗОВ МЕТОДА ПЛАТЕЖНОГО ШЛЮЗА
44     * Переопределение функции SoapClient: __call().
45     *
46     * ПАРАМЕТРЫ
47     * method Метод из API.
48     * data Массив данных.
49     *
50     * ОТВЕТ
51     * response Ответ.
52     */
53    public function __call($method, $data) {
54        $this→__setSoapHeaders($this→generateWSSecurityHeader()); // Устанавливаем заголовок для авторизации
55        return parent: __call($method, $data); // Возвращаем результат метода SoapClient: __call()
56    }
57}
58
59/**
60 * ВЫВОД ФОРМЫ НА ЭКРАН
61 */
62if ($_SERVER['REQUEST_METHOD'] == 'GET' &&! isset($_GET['orderId'])) {
63    echo '
64        <form method="post" action="/ws.php">
65            <label>Order number</label><br />
66            <input type="text" name="orderNumber" /><br />
67            <label>Amount</label><br />
68            <input type="text" name="amount" /><br />
69            <button type="submit">Submit</button>
70        </form>
71    ';
72}
73
74/**
75 * ОБРАБОТКА ДАННЫХ ИЗ ФОРМЫ
76 */
77else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
78    $client = new Gateway(WSDL);
79    $data = array('orderParams' => array(
80        'returnUrl' => RETURN_URL,
81        'merchantOrderNumber' => urlencode($_POST['orderNumber']),
82        'amount' => urlencode($_POST['amount'])
83));
84
85    /**
86     * РЕГИСТРАЦИЯ ОДНОСТАДИЙНОГО ПЛАТЕЖА В ПЛАТЕЖНОМ ШЛЮЗЕ
87     * registerOrder
88     *
89     * ПАРАМЕТРЫ
90     * merchantOrderNumber Уникальный идентификатор заказа в магазине.
91     * amount Сумма заказа.
92     * returnUrl Адрес, на который надо перенаправить пользователя в случае успешной оплаты.
93     *
94     * ОТВЕТ
95     * В случае ошибки:
96     * errorCode Код ошибки. Список возможных значений приведен в таблице ниже.
97     * errorMessage Описание ошибки.
98     *
99     * В случае успешной регистрации:
100     * orderId Номер заказа в платежной системе. Уникален в пределах системы.
101     * formUrl URL платежной формы, на который надо перенаправить браузер клиента.
102     *
103     * Код ошибки Описание
104     * 0 Обработка запроса прошла без системных ошибок.
105     * 1 Заказ с таким номером уже зарегистрирован в системе;
106     * Неверный номер заказа.
107     * 3 Неизвестная (запрещенная) валюта.
108     * 4 Отсутствует обязательный параметр запроса.
109     * 5 Ошибка значения параметра запроса.
110     * 7 Системная ошибка.
111     */
112    $response = $client→__call('registerOrder', $data);
113
114    /**
115     * РЕГИСТРАЦИЯ ДВУХСТАДИЙНОГО ПЛАТЕЖА В ПЛАТЕЖНОМ ШЛЮЗЕ
116     * registerOrderPreAuth
117     *
118     * Параметры и ответ точно такие же, как и в предыдущем методе.
119     * Необходимо вызывать либо registerOrder, либо registerOrderPreAuth.
120     */
121// $response = $client→__call('registerOrderPreAuth', $data);
122
123    if ($response→errorCode! = 0) { // В случае ошибки вывести ее
124        echo 'Ошибка #'. $response→errorCode. ': '. $response→errorMessage;
125    } else { // В случае успеха перенаправить пользователя на платежную форму
126        header('Location: '. $response→formUrl);
127        die();
128    }
129
130}
131
132/**
133 * ОБРАБОТКА ДАННЫХ ПОСЛЕ ПЛАТЕЖНОЙ ФОРМЫ
134 */
135else if ($_SERVER['REQUEST_METHOD'] == 'GET' && isset($_GET['orderId'])){
136    $client = new Gateway(WSDL);
137    $data = array('orderParams' => array('orderId' => $_GET['orderId']));
138
139    /**
140     * ЗАПРОС СОСТОЯНИЯ ЗАКАЗА
141     * getOrderStatus
142     *
143     * ПАРАМЕТРЫ
144     * orderId Номер заказа в платежной системе. Уникален в пределах системы.
145     *
146     * ОТВЕТ
147     * ErrorCode Код ошибки. Список возможных значений приведен в таблице ниже.
148     * OrderStatus По значению этого параметра определяется состояние заказа в платежной системе.
149     * Список возможных значений приведен в таблице ниже. Отсутствует, если заказ не был найден.
150     *
151     * Код ошибки Описание
152     * 0 Обработка запроса прошла без системных ошибок.
153     * 2 Заказ отклонен по причине ошибки в реквизитах платежа.
154     * 5 Доступ запрещён;
155     * Пользователь должен сменить свой пароль;
156     * Номер заказа не указан.
157     * 6 Неизвестный номер заказа.
158     * 7 Системная ошибка.
159     *
160     * Статус заказа Описание
161     * 0 Заказ зарегистрирован, но не оплачен.
162     * 1 Предавторизованная сумма захолдирована (для двухстадийных платежей).
163     * 2 Проведена полная авторизация суммы заказа.
164     * 3 Авторизация отменена.
165     * 4 По транзакции была проведена операция возврата.
166     * 5 Инициирована авторизация через ACS банка-эмитента.
167     * 6 Авторизация отклонена.
168     */
169    $response = $client→__call('getOrderStatus', $data);
170
171    // Вывод кода ошибки и статус заказа
172    echo '
173        <b>Error code:</b> '. $response→errorCode. '<br />
174        <b>Order status:</b> '. $response→orderStatus. '<br />
175    ';
176}
177
178? >

Пример кода на PHP для интеграции со шлюзом по REST:

1<? php
2
3/**
4 * ДАННЫЕ ДЛЯ ПОДКЛЮЧЕНИЯ К ПЛАТЕЖНОМУ ШЛЮЗУ
5 *
6 * USERNAME Логин магазина, полученный при подключении.
7 * PASSWORD Пароль магазина, полученный при подключении.
8 * GATEWAY_URL Адрес платежного шлюза.
9 * RETURN_URL Адрес, на который надо перенаправить пользователя
10 * в случае успешной оплаты.
11 */
12define('USERNAME', 'USERNAME');
13define('PASSWORD', 'PASSWORD');
14define('GATEWAY_URL', 'https://server/payment/rest/');
15define('RETURN_URL', 'http://your.site/rest.php');
16
17/**
18 * ФУНКЦИЯ ДЛЯ ВЗАИМОДЕЙСТВИЯ С ПЛАТЕЖНЫМ ШЛЮЗОМ
19 *
20 * Для отправки POST запросов на платежный шлюз используется
21 * стандартная библиотека cURL.
22 *
23 * ПАРАМЕТРЫ
24 * method Метод из API.
25 * data Массив данных.
26 *
27 * ОТВЕТ
28 * response Ответ.
29 */
30function gateway($method, $data) {
31    $curl = curl_init(); // Инициализируем запрос
32    curl_setopt_array($curl, array(
33        CURLOPT_URL => GATEWAY_URL.$method, // Полный адрес метода
34        CURLOPT_RETURNTRANSFER => true, // Возвращать ответ
35        CURLOPT_POST => true, // Метод POST
36        CURLOPT_POSTFIELDS => http_build_query($data) // Данные в запросе
37));
38    $response = curl_exec($curl); // Выполняем запрос
39
40    $response = json_decode($response, true); // Декодируем из JSON в массив
41    curl_close($curl); // Закрываем соединение
42    return $response; // Возвращаем ответ
43}
44
45/**
46 * ВЫВОД ФОРМЫ НА ЭКРАН
47 */
48if ($_SERVER['REQUEST_METHOD'] == 'GET' &&! isset($_GET['orderId'])) {
49    echo '
50        <form method="post" action="/rest.php">
51            <label>Order number</label><br />
52            <input type="text" name="orderNumber" /><br />
53            <label>Amount</label><br />
54            <input type="text" name="amount" /><br />
55            <button type="submit">Submit</button>
56        </form>
57    ';
58}
59
60/**
61 * ОБРАБОТКА ДАННЫХ ИЗ ФОРМЫ
62 */
63else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
64    $data = array(
65        'userName' => USERNAME,
66        'password' => PASSWORD,
67        'orderNumber' => urlencode($_POST['orderNumber']),
68        'amount' => urlencode($_POST['amount']),
69        'returnUrl' => RETURN_URL
70);
71
72    /**
73     * ЗАПРОС РЕГИСТРАЦИИ ОДНОСТАДИЙНОГО ПЛАТЕЖА В ПЛАТЕЖНОМ ШЛЮЗЕ
74     * register.do
75     *
76     * ПАРАМЕТРЫ
77     * userName Логин магазина.
78     * password Пароль магазина.
79     * orderNumber Уникальный идентификатор заказа в магазине.
80     * amount Сумма заказа в копейках.
81     * returnUrl Адрес, на который надо перенаправить пользователя в случае успешной оплаты.
82     *
83     * ОТВЕТ
84     * В случае ошибки:
85     * errorCode Код ошибки. Список возможных значений приведен в таблице ниже.
86     * errorMessage Описание ошибки.
87     *
88     * В случае успешной регистрации:
89     * orderId Номер заказа в платежной системе. Уникален в пределах системы.
90     * formUrl URL платежной формы, на который надо перенаправить браузер клиента.
91     *
92     * Код ошибки Описание
93     * 0 Обработка запроса прошла без системных ошибок.
94     * 1 Заказ с таким номером уже зарегистрирован в системе.
95     * 3 Неизвестная (запрещенная) валюта.
96     * 4 Отсутствует обязательный параметр запроса.
97     * 5 Ошибка значения параметра запроса.
98     * 7 Системная ошибка.
99     */
100    $response = gateway('register.do', $data);
101
102    /**
103     * ЗАПРОС РЕГИСТРАЦИИ ДВУХСТАДИЙНОГО ПЛАТЕЖА В ПЛАТЕЖНОМ ШЛЮЗЕ
104     * registerPreAuth.do
105     *
106     * Параметры и ответ точно такие же, как и в предыдущем методе.
107     * Необходимо вызывать либо register.do, либо registerPreAuth.do.
108     */
109// $response = gateway('registerPreAuth.do', $data);
110
111    if (isset($response['errorCode'])) { // В случае ошибки вывести ее
112        echo 'Ошибка #'. $response['errorCode']. ': '. $response['errorMessage'];
113    } else { // В случае успеха перенаправить пользователя на платежную форму
114        header('Location: '. $response['formUrl']);
115        die();
116    }
117}
118
119/**
120 * ОБРАБОТКА ДАННЫХ ПОСЛЕ ПЛАТЕЖНОЙ ФОРМЫ
121 */
122else if ($_SERVER['REQUEST_METHOD'] == 'GET' && isset($_GET['orderId'])){
123    $data = array(
124        'userName' => USERNAME,
125        'password' => PASSWORD,
126        'orderId' => $_GET['orderId']
127);
128
129    /**
130     * ЗАПРОС СОСТОЯНИЯ ЗАКАЗА
131     * getOrderStatus.do
132     *
133     * ПАРАМЕТРЫ
134     * userName Логин магазина.
135     * password Пароль магазина.
136     * orderId Номер заказа в платежной системе. Уникален в пределах системы.
137     *
138     * ОТВЕТ
139     * ErrorCode Код ошибки. Список возможных значений приведен в таблице ниже.
140     * OrderStatus По значению этого параметра определяется состояние заказа в платежной системе.
141     * Список возможных значений приведен в таблице ниже. Отсутствует, если заказ не был найден.
142     *
143     * Код ошибки Описание
144     * 0 Обработка запроса прошла без системных ошибок.
145     * 2 Заказ отклонен по причине ошибки в реквизитах платежа.
146     * 5 Доступ запрещён;
147     * Пользователь должен сменить свой пароль;
148     * Номер заказа не указан.
149     * 6 Неизвестный номер заказа.
150     * 7 Системная ошибка.
151     *
152     * Статус заказа Описание
153     * 0 Заказ зарегистрирован, но не оплачен.
154     * 1 Предавторизованная сумма захолдирована (для двухстадийных платежей).
155     * 2 Проведена полная авторизация суммы заказа.
156     * 3 Авторизация отменена.
157     * 4 По транзакции была проведена операция возврата.
158     * 5 Инициирована авторизация через ACS банка-эмитента.
159     * 6 Авторизация отклонена.
160     */
161    $response = gateway('getOrderStatus.do', $data);
162
163    // Вывод кода ошибки и статус заказа
164    echo '
165        <b>Error code:</b> '. $response['ErrorCode']. '<br />
166        <b>Order status:</b> '. $response['OrderStatus']. '<br />
167    ';
168}
169? >