API платёжного шлюза интернет-эквайринга Help

Примеры выполнения запросов

cURL

cURL unix
curl --key crt/bspb_test.key --cert crt/bspb_test.pem \ -H "Content-Type: application/json" \ -H "Authorization:Basic base64Credentials" \ -d "{ \"order\": { \"typeRid\": \"Purchase\", \"amount\": \"100.00\", \"currency\": \"RUB\", \"title\": \"Название заказа\", \"description\": \"Описание заказа\", \"hppRedirectUrl\":\"https://pgtest.bspb.ru/status\" } }" https://pgtest.bspb.ru:5443/order


base64Credentials: username:password в Base64-URL (Аутентификация)

#!/bin/bash # Проверка установлен ли jq if ! command -v jq &> /dev/null; then echo "Ошибка: jq не установлен" echo "Установите jq для обработки JSON-ответов:" echo " - Ubuntu/Debian: sudo apt-get install jq" echo " - macOS: brew install jq" echo " - Fedora/CentOS: sudo yum install jq" exit 1 fi RESPONSE=$(curl --key crt/bspb_test.key --cert crt/bspb_test.pem \ -H "Content-Type: application/json" \ -H "Authorization: Basic $(echo -n 'username:password' | base64)" \ -d @- https://pgtest.bspb.ru:5443/order <<'EOF' { "order": { "typeRid": "Purchase", "amount": "100.00", "currency": "RUB", "title": "Название заказа", "description": "Описание заказа", "hppRedirectUrl": "https://pgtest.bspb.ru/status" } } EOF ) # Проверка успешности запроса if [ $? -eq 0 ]; then # Извлечение данных через jq HPP_URL=$(echo "$RESPONSE" | jq -r '.order.hppUrl') ORDER_ID=$(echo "$RESPONSE" | jq -r '.order.id') PASSWORD=$(echo "$RESPONSE" | jq -r '.order.password') FINAL_URL="${HPP_URL}?id=${ORDER_ID}&password=${PASSWORD}" echo "Итоговая ссылка: $FINAL_URL" else echo "Ошибка при выполнении запроса" fi
cURL Windows
curl --key crt/bspb_test.key --cert crt/bspb_test.pem -H "Content-Type: application/json" -H "Authorization:Basic base64Credentials" -d "{"order": {"typeRid": "Purchase", "amount": "100.00", "currency": "RUB", "title": "Название заказа", "description": "Описание заказа", "hppRedirectUrl":"https://pgtest.bspb.ru/status"}}" https://pgtest.bspb.ru:5443/order


base64Credentials: username:password в Base64-URL (Аутентификация)

@echo off setlocal enabledelayedexpansion REM Проверка установлен ли jq where jq >nul 2>nul if %ERRORLEVEL% NEQ 0 ( echo Ошибка: jq не установлен echo Установите jq для обработки JSON-ответов: echo - Скачайте с https://stedolan.github.io/jq/download/ echo - Или используйте: choco install jq exit /b 1 ) REM Выполнение запроса и сохранение ответа curl --key crt/bspb_test.key --cert crt/bspb_test.pem ^ -H "Content-Type: application/json" ^ -H "Authorization: Basic base64Credentials" ^ -d "{\"order\": {\"typeRid\": \"Purchase\", \"amount\": \"100.00\", \"currency\": \"RUB\", \"title\": \"Название заказа\", \"description\": \"Описание заказа\", \"hppRedirectUrl\":\"https://pgtest.bspb.ru/status\"}}" ^ https://pgtest.bspb.ru:5443/order > response.json REM Проверка успешности запроса if %ERRORLEVEL% EQU 0 ( REM Извлечение данных через jq for /f "delims=" %%i in ('jq -r ".order.hppUrl" response.json') do set HPP_URL=%%i for /f "delims=" %%i in ('jq -r ".order.id" response.json') do set ORDER_ID=%%i for /f "delims=" %%i in ('jq -r ".order.password" response.json') do set PASSWORD=%%i REM Формирование итоговой ссылки set FINAL_URL=!HPP_URL!?id=!ORDER_ID!^&password=!PASSWORD! echo Итоговая ссылка: !FINAL_URL! REM Удаление временного файла del response.json ) else ( echo Ошибка при выполнении запроса ) endlocal


base64Credentials: username:password в Base64-URL (Аутентификация)

Языки программирования

<?php // URL, на который нужно отправить запрос $pay_url = "https://pgtest.bspb.ru:5443/order"; // Данные для авторизации $username = ''; $password = ''; $credentials = $username . ':' . $password; $base64Credentials = base64_encode($credentials); // Путь к ключу и сертификату $certificate_path = './crt/bspb_test.pem'; $private_key_path = './crt/bspb_test.key'; // Данные для отправки в формате JSON $body_request = [ 'order' => [ 'typeRid' => 'Purchase', 'amount' => 100.00, 'currency' => 'RUB', 'title' => 'Название заказа', 'description' => 'Описание заказа', 'hppRedirectUrl' => 'https://pgtest.bspb.ru/status' ] ]; // Инициализация cURL-сессии $ch = curl_init($pay_url); // Настройки POST-запроса curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($body_request)); // Установка заголовков для отправки JSON и базовой авторизации curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'Content-Type: application/json', 'Authorization: Basic ' . $base64Credentials ]); // Настройка для использования сертификата и ключа при выполнении запроса curl_setopt($ch, CURLOPT_SSLCERT, $certificate_path); curl_setopt($ch, CURLOPT_SSLKEY, $private_key_path); // Настройка для получения ответа от сервера curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // Выполнение запроса и получение результата $response = curl_exec($ch); // Проверка на наличие ошибок if(curl_errno($ch)) { echo 'Ошибка cURL: ' . curl_error($ch); } else { // Обработка полученного ответа $responseData = json_decode($response, true); if ($responseData) { // Проверка наличия объекта order в ответе if (isset($responseData['order'])) { $order = $responseData['order']; // Проверка наличия необходимых полей в объекте order if (isset($order['hppUrl'], $order['id'], $order['password'])) { // Формирование итоговой ссылки $hppUrl = $responseData['order']['hppUrl']; $order_id = $responseData['order']['id']; $order_password = $responseData['order']['password']; $finalUrl = "$hppUrl?id=$order_id&password=$order_password"; // Использование итоговой ссылки echo "Итоговая ссылка: $finalUrl<br>"; } else { echo 'Объект order не содержит необходимых данных.'; } } else { echo 'Ответ не содержит объекта order.'; } } else { echo 'Ошибка разбора JSON-ответа.'; } } // Закрытие cURL-сессии curl_close($ch);
import requests from requests.auth import HTTPBasicAuth # URL, на который нужно отправить запрос pay_url = 'https://pgtest.bspb.ru:5443' # Заголовки запроса headers = {'Content-Type': 'application/json'} # Данные для авторизации: username, password auth = HTTPBasicAuth('', '') # Путь к ключу и сертификату certificate_path = 'crt/bspb_test.pem' private_key_path = 'crt/bspb_test.key' # Тело запроса create_order = { 'order': { 'typeRid': 'Purchase', 'amount': 100.00, 'currency': 'RUB', 'title': 'Название заказа', 'description': 'Описание заказа', 'hppRedirectUrl': 'https://pgtest.bspb.ru/status' } } # Выполнение запроса и получение результата response = requests.post(f'{pay_url}/order', headers=headers, auth=auth, cert=(certificate_path, private_key_path), json=create_order) # Проверка кода ответа if response.status_code == 200: responseData = response.json() # Проверка наличия объекта order в ответе if 'order' in responseData: order = responseData['order'] # Проверка наличия необходимых полей в объекте order if 'hppUrl' in order and 'id' in order and 'password' in order: hppUrl = order['hppUrl'] order_id = order['id'] order_password = order['password'] # Формирование итоговой ссылки final_url = f'{hppUrl}?id={order_id}&password={order_password}' # Использование итоговой ссылки print(f'Итоговая ссылка: {final_url}') else: print('Объект order не содержит необходимых данных.') else: print('Ответ не содержит объекта order.') else: print(f'Ошибка {response.status_code} при запросе: {response.text}')
const https = require('https'); const fs = require('fs'); // URL, на который отправляется запрос const url = 'https://pgtest.bspb.ru:5443/order'; // Данные для отправки в формате JSON const data = { order: { typeRid: 'Purchase', amount: 100, currency: 'RUB', title: 'Название заказа', description: 'Описание заказа', hppRedirectUrl: 'https://pgtest.bspb.ru/status' } }; const options = { method: 'POST', // Путь к ключу и сертификату key: fs.readFileSync('./crt/bspb_test.key'), cert: fs.readFileSync('./crt/bspb_test.pem'), // Установка заголовков для отправки JSON и базовой авторизации headers: { 'Content-Type': 'application/json', 'Authorization': 'Basic ' + Buffer.from('' + ':' + '').toString('base64') } }; // Отправка запроса и обработка ответа const req = https.request(url, options, (res) => { let responseData = ''; res.on('data', (chunk) => { responseData += chunk; }); res.on('end', () => { // Проверка кода ответа if (res.statusCode === 200) { try { const parsedData = JSON.parse(responseData); // Проверка наличия объекта order в ответе if (parsedData.order) { const order = parsedData.order; // Проверка наличия необходимых полей в объекте order if (order.hppUrl && order.id && order.password) { // Формирование итоговой ссылки const finalUrl = `${order.hppUrl}?orderid=${order.id}&password=${order.password}`; // Использование итоговой ссылки console.log(`Итоговая ссылка: ${finalUrl}`); } else { console.log('Объект order не содержит необходимых данных.'); } } else { console.log('Ответ не содержит объекта order.'); } } catch (error) { console.error('Ошибка:', error); } } else { console.error(`Ошибка ${res.statusCode} при запросе: ${responseData}`); } }); }); req.on('error', (error) => { console.error('Ошибка запроса:', error); }); req.write(JSON.stringify(data)); req.end();
package main import ( "bytes" "crypto/tls" "encoding/base64" "encoding/json" "fmt" "io/ioutil" "net/http" "strconv" ) func main() { // URL, на который отправляется запрос url := "https://pgtest.bspb.ru:5443/order" // Данные для отправки в формате JSON data := map[string]interface{}{ "order": map[string]interface{}{ "typeRid": "Purchase", "amount": 100, "currency": "RUB", "title": "Название заказа", "description": "Описание заказа", "hppRedirectUrl": "https://pgtest.bspb.ru/status", }, } jsonData, err := json.Marshal(data) if err != nil { fmt.Println("Ошибка при кодировании в JSON:", err) return } req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonData)) if err != nil { fmt.Println("Ошибка при создании запроса:", err) return } // Данные для авторизации: username:password auth := "" + ":" + "" basicAuth := "Basic " + base64.StdEncoding.EncodeToString([]byte(auth)) // Заголовки запроса req.Header.Set("Authorization", basicAuth) req.Header.Set("Content-Type", "application/json") // Путь к ключу и сертификату cert, err := tls.LoadX509KeyPair("./crt/bspb_test.pem", "./crt/bspb_test.key") if err != nil { fmt.Println("Ошибка при загрузке ключа и сертификата:", err) return } tlsConfig := &tls.Config{ Certificates: []tls.Certificate{cert}, } transport := &http.Transport{ TLSClientConfig: tlsConfig, } client := &http.Client{ Transport: transport, } resp, err := client.Do(req) if err != nil { fmt.Println("Ошибка при отправке запроса:", err) return } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { fmt.Println("Ошибка при чтении ответа:", err) return } // Проверка кода ответа if resp.StatusCode == http.StatusOK { var responseData map[string]interface{} if err := json.Unmarshal(body, &responseData); err != nil { fmt.Println("Ошибка при разборе JSON:", err) return } // Проверка наличия объекта order в ответе order, ok := responseData["order"].(map[string]interface{}) if !ok { fmt.Println("Ответ не содержит объекта order") return } // Проверка наличия hppUrl, password в объекте order hppUrl, hppUrlExists := order["hppUrl"].(string) password, passwordExists := order["password"].(string) // Проверка наличия id в объекте order rawID, idIsNumber := order["id"] var id string // Проверка типа (float, string) id в объекте order if idIsNumber { idFloat, ok := rawID.(float64) if !ok { fmt.Println("ID не является числом") return } id = strconv.FormatFloat(idFloat, 'f', -1, 64) } else { idString, ok := rawID.(string) if !ok { fmt.Println("ID не является строкой") return } id = idString } if hppUrlExists && passwordExists { // Формирование итоговой ссылки finalURL := fmt.Sprintf("%s?orderid=%s&password=%s", hppUrl, id, password) // Использование итоговой ссылки fmt.Println("Итоговая ссылка:", finalURL) } else { fmt.Println("Объект order не содержит необходимых данных") } } else { fmt.Printf("Ошибка %d при запросе: %s\n", resp.StatusCode, string(body)) } }
// Зависимости (Maven / Gradle): // Source: https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind package ru.bspb.example; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import javax.net.ssl.KeyManagerFactory; import javax.net.ssl.SSLContext; import java.io.FileInputStream; import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.nio.charset.StandardCharsets; import java.security.KeyStore; import java.util.Base64; import java.util.logging.Logger; public class RequestExample { private static final Logger LOGGER = Logger.getLogger(RequestExample.class.getName()); static void main() { try { // URL, на который нужно отправить запрос String payUrl = "https://pgtest.bspb.ru:5443/order"; // Данные для авторизации String username = ""; String password = ""; String credentials = username + ":" + password; String base64Credentials = Base64.getEncoder().encodeToString(credentials.getBytes(StandardCharsets.UTF_8)); // Путь к ключу и сертификату (PKCS12 формат) String certificatePath = "./crt/bspb_test.p12"; String certificatePassword = ""; // Данные для отправки в формате JSON String jsonBody = """ { "order": { "typeRid": "Purchase", "amount": 100.00, "currency": "RUB", "title": "Название заказа", "description": "Описание заказа", "hppRedirectUrl": "https://pgtest.bspb.ru/status" } } """; // Загрузка клиентского сертификата KeyStore keyStore = KeyStore.getInstance("PKCS12"); try (FileInputStream fis = new FileInputStream(certificatePath)) { keyStore.load(fis, certificatePassword.toCharArray()); } KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); kmf.init(keyStore, certificatePassword.toCharArray()); SSLContext sslContext = SSLContext.getInstance("TLS"); sslContext.init(kmf.getKeyManagers(), null, null); // Создание HTTP клиента с SSL контекстом HttpClient client = HttpClient.newBuilder() .sslContext(sslContext) .build(); // Создание запроса HttpRequest request = HttpRequest.newBuilder() .uri(URI.create(payUrl)) .header("Content-Type", "application/json") .header("Authorization", "Basic " + base64Credentials) .POST(HttpRequest.BodyPublishers.ofString(jsonBody)) .build(); // Выполнение запроса и получение результата HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString()); // Проверка кода ответа if (response.statusCode() == 200) { String responseBody = response.body(); // Парсинг JSON с помощью Jackson ObjectMapper objectMapper = new ObjectMapper(); JsonNode rootNode = objectMapper.readTree(responseBody); // Проверка наличия объекта order в ответе if (rootNode.has("order")) { JsonNode orderNode = rootNode.get("order"); // Проверка наличия необходимых полей в объекте order if (orderNode.has("hppUrl") && orderNode.has("id") && orderNode.has("password")) { String hppUrl = orderNode.get("hppUrl").asText(); String orderId = orderNode.get("id").asText(); String orderPassword = orderNode.get("password").asText(); // Формирование итоговой ссылки String finalUrl = String.format("%s?id=%s&password=%s", hppUrl, orderId, orderPassword); LOGGER.info(() -> String.format("Итоговая ссылка: %s", finalUrl)); } else { LOGGER.severe("Объект order не содержит необходимых данных."); } } else { LOGGER.severe("Ответ не содержит объекта order."); } } else { LOGGER.severe(() -> String.format("Ошибка %d при запросе: %s%n", response.statusCode(), response.body())); } } catch (InterruptedException e) { LOGGER.severe(() -> String.format("Ошибка при выполнении запроса: %s", e.getMessage())); Thread.currentThread().interrupt(); } catch (Exception e) { LOGGER.severe(() -> String.format("Ошибка при выполнении запроса: %s", e.getMessage())); } } }
# URL, на который отправляется запрос $url = "https://pgtest.bspb.ru:5443/order" # Данные для авторизации $username = "" $password = "" $base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes("$($username):$($password)")) # Путь к ключу и сертификату $certPath = ".\crt\bspb_test.pem" $keyPath = ".\crt\bspb_test.key" # Создание сертификата из PEM и KEY файлов # Примечание: PowerShell требует .pfx формат, необходима конвертация # openssl pkcs12 -export -out bspb_test.pfx -inkey bspb_test.key -in bspb_test.pem $pfxPath = ".\crt\bspb_test.pfx" $pfxPassword = "" # Пароль, указанный при создании .pfx try { # Загрузка сертификата $cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2($pfxPath, $pfxPassword) # Данные для отправки в формате JSON $body = @{ order = @{ typeRid = "Purchase" amount = 100.00 currency = "RUB" title = "Название заказа" description = "Описание заказа" hppRedirectUrl = "https://pgtest.bspb.ru/status" } } | ConvertTo-Json # Заголовки запроса $headers = @{ "Content-Type" = "application/json" "Authorization" = "Basic $base64AuthInfo" } # Выполнение запроса $response = Invoke-RestMethod -Uri $url -Method Post -Body $body -Headers $headers -Certificate $cert -ContentType "application/json" # Проверка наличия объекта order в ответе if ($response.order) { $order = $response.order # Проверка наличия необходимых полей в объекте order if ($order.hppUrl -and $order.id -and $order.password) { # Формирование итоговой ссылки $finalUrl = "$($order.hppUrl)?id=$($order.id)&password=$($order.password)" # Использование итоговой ссылки Write-Host "Итоговая ссылка: $finalUrl" } else { Write-Host "Объект order не содержит необходимых данных." } } else { Write-Host "Ответ не содержит объекта order." } } catch { Write-Host "Ошибка при выполнении запроса: $($_.Exception.Message)" # Детальная информация об ошибке if ($_.Exception.Response) { $statusCode = $_.Exception.Response.StatusCode.value__ Write-Host "Код ошибки: $statusCode" } }


Windows OpenSSL Аутентификация

21 мая 2026