Ниже приведены примера кода на 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? >