NAV Navbar
cURL Python PHP Java
Нужна помощь?
Свяжитесь с нами

Введение

OXY Pay — это простой, быстрый и надёжный платёжный движок с открытой архитектурой. Основан в 2018 году, поддерживается и постоянно развивается сообществом инженеров-программистов с большим опытом работы в сфере платежей и электронных кошельков.

OXY Pay Business API — решение, специально разработанное для интернет-бизнеса, нуждающегося в мультивалютной обработке платежей. Мы поддерживаем все основные валюты.

Окружения

Для интеграции доступны два окружения:

Sandbox Environment

Sandbox обеспечивает полную функциональность, но только эмулирует обработку — реальные банковские транзакции не выполняются. Для тестов вы можете использовать следующие номера карт:

You can use any держатель карты name, expiry date and CVV2/CVC2 with these PANs. 3-D Secure is also emulated with a page that doesn’t require any password but only shows you 2 buttons. One button is for successful authentication, aнетther is for failed authentication. Note, that when you chose to fail authentication, order is always declined, нет matter what PAN was used.

Production Environment

После завершения интеграции с Sandbox окружением вам будут предоставлены Production-учётные данные. Это совершенно другие учётные данные, не связанные с Sandbox. Production always makes real bank transactions, cards from Sandbox are нетt supported on this environment.

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

curl https://business.oxypay.kz/v1/charges \
   -H "Authorization: Bearer мерчант_private_key"
<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_HTTPHEADER => array(
    "authorization: Bearer мерчант_private_key",
  ),
));
import http.client

conn = http.client.HTTPSConnection("...")

headers = {
    'authorization': "Bearer мерчант_private_key",
    }
OkHttpClient client = new OkHttpClient();

Request запрос = new Request.Builder()
  .url("https://business.oxypay.kz/api/v1/payouts")
...
  .addHeader("content-type", "application/json")
  .addHeader("authorization", "Bearer мерчант_private_key")
  .build();

Ответ ответ = client.newCall(запрос).execute();

Аутентифицируйте свою учётную запись при использовании API, включив ваш секретный API-ключ, который был отправлен на email при регистрации. Управление API-ключами доступно в Личный кабинет. Ваши API-ключи имеют важные привилегии, храните их в безопасности. Не публикуйте секретные API-ключи в публично доступных местах, таких как GitHub или клиентский код.

Authentication to the API is performed via bearer auth keys (для кросс-доменных запросов), use -H “Authorization: Bearer мерчант_private_key”.

Все API-запросы должны выполняться через HTTPS. Запросы через HTTP будут отклонены. API-запросы без аутентификации также будут отклонены.

Платежи

OXY Pay REST API для обработки платежей.

Создание

Код: Копировать

curl "https://business.oxypay.kz/api/v1/payments" \
    -X POST \
    -H "Authorization: Bearer мерчант_private_key" \
    -H "Content-Тип: application/json" -d '{
        "продукт" : "Ваш продукт",
        "сумма" : "1000",
        "валюта" : "CNY",
        "redirectУспехUrl" : "https://your-site.com/success",
        "redirectFailUrl" : "https://your-site.com/fail",
        "extraReturnParam" : "ID вашего заказа или другая информация",
        "expires_at": 5,
        "orderNumber" : "номер вашего заказа",
        "locale": "zh"

    }'
<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => "https://business.oxypay.kz/api/v1/payments",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => '{ "продукт" : "Ваш продукт", "сумма" : "10000", "валюта" : "CNY", "redirectУспехUrl" : "https://your-site.com/success", "redirectFailUrl" : "https://your-site.com/fail", "extraReturnParam" : "ID вашего заказа или другая информация", "orderNumber" : "номер вашего заказа", "locale" : "zh" }',
  CURLOPT_HTTPHEADER => array(
    "authorization: Bearer мерчант_private_key",
    "content-type: application/json"
  ),
));

$ответ = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Ошибка #:" . $err;
} else {
  echo $ответ;
}
from django.http import HttpОтветRedirect, HttpОтвет
import запросs
import json

def pay(запрос) :

    MERCHANT_PRIVATE_KEY = 'мерчант_private_key'
    LIVE_URL = 'https://business.oxypay.kz';
    SANDBOX_URL = 'https://business.oxypay.kz'

    payload = {
        "продукт" : запрос.POST['продукт_name'],
        "сумма" : запрос.POST['order_сумма'],
        "валюта" : "CNY",
        "redirectУспехUrl": запрос.POST['нетtify_url'],
        "redirectFailUrl" : запрос.POST['return_url'],
        "extraReturnParam" : запрос.POST['order_нет'],
        "orderNumber" : запрос.POST['order_number'],
        "locale" : запрос.POST['locale']
    }

    headers = {
        'Content-Тип': 'application/json',
        'Authorization': 'Bearer %s' % (MERCHANT_PRIVATE_KEY)
    }

    resp = запросs.post('%s/api/v1/payments' % (SANDBOX_URL), json=payload, headers=headers)

    if resp.status_code == 200:
        resp_payload = json.loads(resp.text)
        return HttpОтветRedirect(resp_payload['processingUrl'])
    else:
        return HttpОтвет('<html><body><span>Что-то пошло не так: %s</span></body></html>' % (resp.status_code))
MediaТип JSON = MediaТип.parse("application/json; charset=utf-8");

HashMap<String, Object> params = new HashMap<String, Object>();

params.put("продукт", "OXY Pay Пример Payment");
params.put("сумма", "1000");
params.put("валюта", "EUR");
params.put("redirectУспехUrl", "[success redirect url]");
params.put("redirectFailUrl", "[fail redirect url]");
params.put("orderNumber", "[мерчант system order number]");
params.put("extraReturnParam", "[some additional params]");
params.put("locale", "[user locale]");
OkHttpClient client = new OkHttpClient();

Request запрос = new Request.Builder()
       .url("https://business.oxypay.kz/api/v1/payments")
       .post(RequestBody.create(JSON, new Gson().toJson(params)))
       .addHeader("content-type", "application/json")
       .addHeader("authorization", "Bearer мерчант_private_key")
       .build();

Call call = client.newCall(запрос);

call.enqueue(new Callback() {

   @Override
   public void onFailure(Call call, IOException e) {
       Log.e("ответ ", "onFailure(): " + e.getMessage() );
   }

   @Override
   public void onОтвет(Call call, Ответ ответ) throws IOException {
       String resp = ответ.body().string();
       Log.e("ответ ", "onОтвет(): " + resp );
   }
});

Возвращает статус 200 и JSON: Копировать

{
  "success": true | false,
  "errors": [],
  "токен": "[payment токен]",
  "processingUrl": "https://business.oxypay.kz/p/[payment токен]",
  "payment": {
    "сумма": "10020",
    "валюта": "CNY",
    "status": "init"
  },
  "redirectRequest": {
    "url": "[redirect url, for example ACS URL for 3ds]",
    "params": {
      "PaReq": "[PaReq for current payment]",
      "TermUrl": "https://business.oxypay.kz/checkout_results/[payment токен]/callback_3ds"
    },
    "type": "post"
  }
}

Инициализация платежей — для начала приёма платежей необходимо выполнить вызов по следующему скрипту. Это позволит получить платёжный токен, который потребуется для завершения интеграции API.

HTTP-запрос через SSL

POST '/api/v1/payments'

Параметры запроса

Параметр Обязательный Описание Validation
продукт да Название продукта (Service description) (example: 'iPhone'). minLength: 5, maxLength: 255
сумма да Payment сумма in cents (10020), except JPY minLength: 1, maxLength: 32
валюта да Код валюты (CNY, EUR, USD, JPY). minLength: 3, maxLength: 3
callbackUrl да The server URL a мерчант will be нетtified about a payment finalisation Valid URI format
redirectУспехUrl нет The URL a customer will be redirected to in the case of successful payment Valid URI format
redirectFailUrl нет The URL a customer will be redirected to in the case of payment error or failure Valid URI format
extraReturnParam нет Bank/Payment method list, description, etc minLength: 1, maxLength: 1024
expires_at нет Expired payment time for запросs without a bank card minLength: 1
orderNumber нет The current order number from a company system. minLength: 3, maxLength: 255 (string)
locale нет The locale is used on a payment page by default. Currently supported locales: en, zh and jp from ISO 639-1. minLength: 2, maxLength: 5 (string)
walletToken нет Установите этот параметр when making recurring payment from a customer’s wallet. A customer will receive нетtification and has to confirm the payment. returns by API for recurring payments only
recurring нет Установите этот параметр to true when initializing recurring payment. boolean
needConfirmation нет Установите этот параметр whe making payment in two steps (preAuth and confirm/decline) boolean
recurringToken нет Установите этот параметр when making recurring payment previously initialized with recurring param. returns by API for recurring payments only
card нет Card object for Host2Host payments.
customer нет Объект клиента для Host2Host payments.

Card Object Параметрs

Параметр Обязательный Описание Validation
pan да Customer’s card number (PAN). Any valid card number, may contain spaces Valid card number (16-19 digits)
expires да Customer’s card expiration date. Format: mm/yyyy mm/yyyy format
holder да Customer’s держатель карты name. Any valid держатель карты name minLength: 5, maxLength: 50
cvv да Customer’s CVV2 / CVC2 / CAV2 minLength: 3, maxLength: 3 Only digits (\d+)

Customer Object Параметрs (optional)

Параметр Обязательный Описание Validation
email да Customer’s email, is mandatory if Объект клиента отправлен on a запрос Valid email format
address нет Customer's billing address minLength: 5, maxLength: 55
country нет Customer's billing country ISO country code format "GB"
city нет Customer's billing city minLength: 4, maxLength: 55
region нет Customer's billing region minLength: 5, maxLength: 55
postcode нет Customer's billing ZipCode minLength: 4, maxLength: 55
phone нет Customer's billing phone number minLength: 6, maxLength: 20
ip нет Customer IP address Valid IP address format (XX.XX.XX.XX)

СБП

Код: Копировать

curl "https://business.oxypay.kz/api/v1/payments" \
    -X POST \
    -H "Authorization: Bearer мерчант_private_key" \
    -H "Content-Тип: application/json" -d '{
  "сумма": 10700,
  "callback_url": "https://foxew.com/",
  "валюта": "RUB",
  "customer": {
    "email": "TestTest1@mail.com"
  },
  "redirectУспехUrl" : "https://your-site.com/success",
  "redirectFailUrl" : "https://your-site.com/fail",
  "order_number": "номер вашего заказа",
  "продукт": "Ваш продукт"
}'
<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => "https://business.oxypay.kz/api/v1/payments",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => '{ "продукт": "Ваш продукт", "сумма": 10700, "валюта": "RUB", "redirectУспехUrl": "https://your-site.com/success", "redirectFailUrl": "https://your-site.com/fail", "customer": { "email": "TestTest1@mail.com" }, "extraReturnParam": "ID вашего заказа или другая информация", "orderNumber": "номер вашего заказа", "locale": "zh" }',
  CURLOPT_HTTPHEADER => array(
    "authorization: Bearer мерчант_private_key",
    "content-type: application/json"
  ),
));

$ответ = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Ошибка #:" . $err;
} else {
  echo $ответ;
}
from django.http import HttpОтветRedirect, HttpОтвет
import запросs
import json

def pay(запрос) :

    MERCHANT_PRIVATE_KEY = 'мерчант_private_key'
    LIVE_URL = 'https://business.oxypay.kz';
    SANDBOX_URL = 'https://business.oxypay.kz'

    payload = {
        "продукт" : запрос.POST['продукт_name'],
        "сумма" : запрос.POST['order_сумма'],
        "валюта" : "RUB",
        "redirectУспехUrl": запрос.POST['нетtify_url'],
        "redirectFailUrl" : запрос.POST['return_url'],
        "customer" : запрос.POST['customer'],
        "extraReturnParam" : запрос.POST['order_нет'],
        "orderNumber" : запрос.POST['order_number'],
        "locale" : запрос.POST['locale']
    }

    headers = {
        'Content-Тип': 'application/json',
        'Authorization': 'Bearer %s' % (MERCHANT_PRIVATE_KEY)
    }

    resp = запросs.post('%s/api/v1/payments' % (SANDBOX_URL), json=payload, headers=headers)

    if resp.status_code == 200:
        resp_payload = json.loads(resp.text)
        return HttpОтветRedirect(resp_payload['processingUrl'])
    else:
        return HttpОтвет('<html><body><span>Что-то пошло не так: %s</span></body></html>' % (resp.status_code))
MediaТип JSON = MediaТип.parse("application/json; charset=utf-8");

HashMap<String, Object> params = new HashMap<String, Object>();

HashMap<String, Object> customer = new HashMap<String, Object>();
customer.put("email", "[email]");

params.put("продукт", "OXY Pay Пример Payment");
params.put("сумма", 10700);
params.put("валюта", "RUB");
params.put("redirectУспехUrl", "[success redirect url]");
params.put("redirectFailUrl", "[fail redirect url]");
params.put("customer", customer);
params.put("orderNumber", "[мерчант system order number]");
params.put("extraReturnParam", "[some additional params]");
params.put("locale", "[user locale]");
OkHttpClient client = new OkHttpClient();

Request запрос = new Request.Builder()
       .url("https://business.oxypay.kz/api/v1/payments")
       .post(RequestBody.create(JSON, new Gson().toJson(params)))
       .addHeader("content-type", "application/json")
       .addHeader("authorization", "Bearer мерчант_private_key")
       .build();

Call call = client.newCall(запрос);

call.enqueue(new Callback() {

   @Override
   public void onFailure(Call call, IOException e) {
       Log.e("ответ ", "onFailure(): " + e.getMessage() );
   }

   @Override
   public void onОтвет(Call call, Ответ ответ) throws IOException {
       String resp = ответ.body().string();
       Log.e("ответ ", "onОтвет(): " + resp );
   }
});

Возвращает статус 200 и JSON: Копировать

{
  "success": true,
  "result": 0,
  "status": 200,
  "токен": "[payment токен]",
  "processingUrl": [
    {
      "[provider alias]": "https://business.oxypay.kz/p/[payment токен]"
    }
  ],
  "selectorUrl": "https://business.oxypay.kz/select/[payment токен]",
  "payment": {
    "сумма": 10700,
    "gateway_сумма": 10700,
    "валюта": "RUB",
    "status": "init",
    "two_stage_mode": false,
    "commission": 0.0
  }
}

Initialize СБП payments - to begin page initialization for СБП transaction, необходимо выполнить вызов по следующему скрипту. This will enable you to obtain url, which will respond with requisites or redirect the payer to the СБП payment.

HTTP-запрос через SSL

POST '/api/v1/payments'

Параметры запроса

Параметр Обязательный Описание Validation
продукт да Название продукта (Service description) (example: 'iPhone'). minLength: 5, maxLength: 255
сумма да Payment сумма in cents (10020)
валюта да Код валюты (RUB). minLength: 3, maxLength: 3
callbackUrl да The server URL a мерчант will be нетtified about a payment finalisation Valid URI format
redirectУспехUrl нет The URL a customer will be redirected to in the case of successful payment Valid URI format
redirectFailUrl нет The URL a customer will be redirected to in the case of payment error or failure Valid URI format
extraReturnParam нет Bank/Payment method list, description, etc minLength: 1, maxLength: 1024
expires_at нет Expired payment time for запросs without a bank card minLength: 1
orderNumber нет The current order number from a company system. minLength: 3, maxLength: 255 (string)
locale нет The locale is used on a payment page by default. Currently supported locales: en, zh and jp from ISO 639-1. minLength: 2, maxLength: 5 (string)
walletToken нет Установите этот параметр when making recurring payment from a customer’s wallet. A customer will receive нетtification and has to confirm the payment. returns by API for recurring payments only
recurring нет Установите этот параметр to true when initializing recurring payment. boolean
recurringToken нет Установите этот параметр when making recurring payment previously initialized with recurring param. returns by API for recurring payments only
customer да Объект клиента для Host2Host payments.

Customer Object Параметрs

Параметр Обязательный Описание Validation
email да Customer’s email, is mandatory if Объект клиента отправлен on a запрос Valid email format

Платёжные провайдеры

Код: Копировать

MediaТип JSON = MediaТип.parse("application/json; charset=utf-8");

HashMap<String, Object> params = new HashMap<String, Object>();

params.put("продукт", "OXY Pay Пример Payment");
params.put("сумма", "1000");
params.put("валюта", "EUR");
params.put("redirectУспехUrl", "[success redirect url]");
params.put("redirectFailUrl", "[fail redirect url]");
params.put("orderNumber", "[мерчант system order number]");
params.put("extraReturnParam", "[some additional params]");
params.put("locale", "[user locale]");
OkHttpClient client = new OkHttpClient();

Request запрос = new Request.Builder()
       .url("https://business.oxypay.kz/api/v1/payments")
       .post(RequestBody.create(JSON, new Gson().toJson(params)))
       .addHeader("content-type", "application/json")
       .addHeader("authorization", "Bearer мерчант_private_key")
       .build();

Call call = client.newCall(запрос);

call.enqueue(new Callback() {

   @Override
   public void onFailure(Call call, IOException e) {
       Log.e("ответ ", "onFailure(): " + e.getMessage() );
   }

   @Override
   public void onОтвет(Call call, Ответ ответ) throws IOException {
       String resp = ответ.body().string();
       Log.e("ответ ", "onОтвет(): " + resp );
   }
});

Возвращает статус 200 и JSON: Копировать

{
  "success": true | false,
  "errors": [],
  "токен": "[payment токен]",
  "processingUrl": [
        {
            "webmoney": "http://business.oxypay.kz/p/165998589a413b56ae72fbfdc15b016b/webmoney?locale=en"
        },
        {
            "bank_card": "http://business.oxypay.kz/p/165998589a413b56ae72fbfdc15b016b/bank_card?locale=en"
        },
        {
            "qiwi_wallet": "http://business.oxypay.kz/p/165998589a413b56ae72fbfdc15b016b/qiwi_wallet?locale=en"
        },
        {
            "skrill_wallet": "http://business.oxypay.kz/p/165998589a413b56ae72fbfdc15b016b/skrill_wallet?locale=en"
        }
  ],
  "selectorURL": "https://business.oxypay.kz/select/[payment токен]/", 
  "payment": {
    "сумма": "10020",
    "валюта": "CNY",
    "status": "init"
  },
  "redirectRequest": {
    "url": "[redirect url, for example ACS URL for 3ds]",
    "params": {
      "PaReq": "[PaReq for current payment]",
      "TermUrl": "https://business.oxypay.kz/checkout_results/[payment токен]/callback_3ds"
    },
    "type": "post"
  }
}

In case multiple payment providers enabled to a мерчант account, Создание payment ответ JSON will have processingUrl object represented as an array of available payment providers (please refer to JSON ответ). Use those URLs to redirect your customer to a payment provider (method).

Список of payment providers

In case you want a customer to choose a payment provider (method) it might be convenient to use a specific page (widget) with payment provider list, which is available by "selectorURL" parameter in JSON ответ object

P2P

Код: Копировать

curl "https://business.oxypay.kz/api/v1/peer_to_peers/auth" \
    -X POST \
    -H "Authorization: Bearer мерчант_private_key" \
    -H "Content-Тип: application/json" -d '{
        "продукт" : "Ваш продукт",
        "валюта" : "RUB",
        "redirectУспехUrl" : "https://your-site.com/success",
        "redirectFailUrl" : "https://your-site.com/fail",
        "orderNumber" : "номер вашего заказа",
        "customer": {
           "email": "test@test.ru"
        }
    }'
<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => "https://business.oxypay.kz/api/v1/peer_to_peers/auth",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => "{ \"продукт\" : \"Ваш продукт\", \"валюта\" : \"RUB\", \"redirectУспехUrl\" : \"https://your-site.com/success\", \"redirectFailUrl\" : \"https://your-site.com/fail\", \"extraReturnParam\" : \"ID вашего заказа или другая информация\", \"orderNumber\" : \"номер вашего заказа\", \"customer\": {
    \"email\": \"test@test.ru\"}}",
  CURLOPT_HTTPHEADER => array(
    "authorization: Bearer мерчант_private_key",
    "content-type: application/json"
  ),
));

$ответ = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Ошибка #:" . $err;
} else {
  echo $ответ;
}
from django.http import HttpОтветRedirect, HttpОтвет
import запросs
import json

def pay(запрос) :

    MERCHANT_PRIVATE_KEY = 'мерчант_private_key'
    LIVE_URL = 'https://business.oxypay.kz';
    SANDBOX_URL = 'https://business.oxypay.kz'

    payload = {
    "продукт" : запрос.POST['продукт_name'],
    "валюта" : "RUB",
    "redirectУспехUrl": запрос.POST['нетtify_url'],
    "redirectFailUrl" : запрос.POST['return_url'],
    "extraReturnParam" : запрос.POST['order_нет'],
    "orderNumber" : запрос.POST['order_number'],
    "customer": {"email": запрос.POST['email']}
    }

    headers = {
        'Content-Тип': 'application/json',
        'Authorization': 'Bearer %s' % (MERCHANT_PRIVATE_KEY)
    }

    resp = запросs.post('%s/api/v1/peer_to_peers/auth' % (SANDBOX_URL), json=payload, headers=headers)

    if resp.status_code == 200:
        resp_payload = json.loads(resp.text)
        return HttpОтветRedirect(resp_payload['processingUrl'])
    else:
        return HttpОтвет('<html><body><span>Что-то пошло не так: %s</span></body></html>' % (resp.status_code))
MediaТип JSON = MediaТип.parse("application/json; charset=utf-8");

HashMap<String, Object> params = new HashMap<String, Object>();

params.put("продукт", "OXY Pay Пример Payment");
params.put("валюта", "RUB");
params.put("redirectУспехUrl", "[success redirect url]");
params.put("redirectFailUrl", "[fail redirect url]");
params.put("orderNumber", "[мерчант system order number]");
params.put("extraReturnParam", "[some additional params]");
params.put("customer", "email": "test@test.ru");

OkHttpClient client = new OkHttpClient();

Request запрос = new Request.Builder()
       .url("https://business.oxypay.kz/api/v1/peer_to_peers/auth")
       .post(RequestBody.create(JSON, new Gson().toJson(params)))
       .addHeader("content-type", "application/json")
       .addHeader("authorization", "Bearer мерчант_private_key")
       .build();

Call call = client.newCall(запрос);

call.enqueue(new Callback() {

   @Override
   public void onFailure(Call call, IOException e) {
       Log.e("ответ ", "onFailure(): " + e.getMessage() );
   }

   @Override
   public void onОтвет(Call call, Ответ ответ) throws IOException {
       String resp = ответ.body().string();
       Log.e("ответ ", "onОтвет(): " + resp );
   }
});

Возвращает статус 200 и JSON: Копировать

{
    "status": "init",
    "redirect_url": "https://business.oxypay.kz/peer_to_peers/12345?callback_url=https%3A%2F%2Ftest.com&валюта=RUB&email=test%40ser.ru&order_number=test&продукт=test&redirect_fail_url=https%3A%2F%2Fdeclined.com&redirect_success_url=https%3A%2F%2Fsuccess.com"
}

Инициализация P2P-платежей — для начала инициализации p2p-транзакции необходимо выполнить вызов по следующему скрипту. Это позволит получить URL, который перенаправит плательщика на форму p2p-оплаты.

HTTP-запрос через SSL

POST '/api/v1/peer_to_peers/auth'

Параметры запроса

Параметр Обязательный Описание Validation
продукт да Название продукта (Service description) (example: 'iPhone'). minLength: 5, maxLength: 255
валюта да Код валюты (CNY, EUR, USD, JPY). minLength: 3, maxLength: 3
callbackUrl да The server URL a мерчант will be нетtified about a payment finalisation Valid URI format
redirectУспехUrl нет The URL a customer will be redirected to in the case of successful payment Valid URI format
redirectFailUrl нет The URL a customer will be redirected to in the case of payment error or failure Valid URI format
orderNumber нет The current order number from a company system. minLength: 3, maxLength: 255 (string)
customer да Объект клиента для Host2Host payments.

Customer Object Параметрs (optional)

Параметр Обязательный Описание Validation
email да Customer’s email, is mandatory if Объект клиента отправлен on a запрос Valid email format

Список

Код: Копировать

curl "https://business.oxypay.kz/api/v1/payments?dateFrom=2016-05-11&page=1&perPage=1" \
    -H "Authorization: Bearer мерчант_private_key"
<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => "https://business.oxypay.kz/api/v1/payments?dateFrom=2016-05-11&page=1&perPage=1",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "GET",
  CURLOPT_HTTPHEADER => array(
      "authorization: Bearer мерчант_private_key"
  ),
));

$ответ = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Ошибка #:" . $err;
} else {
  echo $ответ;
}
OkHttpClient client = new OkHttpClient();

Request запрос = new Request.Builder()
  .url("https://business.oxypay.kz/api/v1/payments")
  .get()
  .addHeader("authorization", "Bearer мерчант_private_key")
  .build();

Ответ ответ = client.newCall(запрос).execute();

Возвращает статус 200 и JSON: Копировать

{
  "success": true | false,
  "errors": [],
  "status": 200,
  "totalCount": 10,
  "currentPage": 1,
  "perPage": 1,
  "totalPage": 10,
  "payments": [
    {
      "id": 1,
      "status": "sent",
      "токен": "[payment токен]",
      "валюта": "CNY",
      "продукт": "Ваш продукт",
      "redirect_success_url": "https://your-site.com/success",
      "redirect_fail_url": "https://your-site.com/fail",
      "сумма": 10000,
      "created_at": "2016-06-27T14:13:00.273Z",
      "updated_at": "2016-06-27T14:15:44.715Z",
      "extra_return_param": "ID вашего заказа или другая информация",
      "operation_type": "pay",
      "order_number": 1
    }
  ]
}

Payments Список - this is the method used to display the list of returned payments.

HTTP-запрос через SSL

GET '/api/v1/payments'

Параметры запроса

Параметр Описание Обязательно
dateFrom Date from (example: '2015-01-01') No
dateTo Date to (example: '2015-01-02') No
page Page number (default: 1) No
perPage Payment per page (max: 500, default: 20) No
operationТип Operation type (Available values: pays, payouts, all) No
orderNumber Merchant's order number No

Подтверждение двухэтапного платежа

Код: Копировать

curl "https://business.oxypay.kz/api/v1/payments/confirm" \
    -X POST \
    -H "Authorization: Bearer мерчант_private_key" \
    -H "Content-Тип: application/json" -d '{
        "токен" : "[payment токен]",
        "сумма": 20000
    }'
<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => "https://business.oxypay.kz/api/v1/payments/confirm",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => '{ "токен" : "payment токен", "сумма" : 200 }',
  CURLOPT_HTTPHEADER => array(
    "authorization: Bearer мерчант_private_key",
    "content-type: application/json"
  ),
));

$ответ = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Ошибка #:" . $err;
} else {
  echo $ответ;
}
from django.http import HttpОтветRedirect, HttpОтвет
import запросs
import json

def pay(запрос) :

    MERCHANT_PRIVATE_KEY = 'мерчант_private_key'
    LIVE_URL = 'https://business.oxypay.kz';
    SANDBOX_URL = 'https://business.oxypay.kz'

    payload = {
        "токен" : запрос.POST['токен'],
        "сумма" : запрос.POST['сумма'],
    }

    headers = {
        'Content-Тип': 'application/json',
        'Authorization': 'Bearer %s' % (MERCHANT_PRIVATE_KEY)
    }

    resp = запросs.post('%s/api/v1/payments/confirm' % (SANDBOX_URL), json=payload, headers=headers)

    if resp.status_code == 200:
        resp_payload = json.loads(resp.text)
        return HttpОтветRedirect(resp_payload['processingUrl'])
    else:
        return HttpОтвет('<html><body><span>Что-то пошло не так: %s</span></body></html>' % (resp.status_code))
MediaТип JSON = MediaТип.parse("application/json; charset=utf-8");

HashMap<String, Object> params = new HashMap<String, Object>();

params.put("токен", "payment токен");
params.put("сумма", 20000);
OkHttpClient client = new OkHttpClient();

Request запрос = new Request.Builder()
       .url("https://business.oxypay.kz/api/v1/payments/confirm")
       .post(RequestBody.create(JSON, new Gson().toJson(params)))
       .addHeader("content-type", "application/json")
       .addHeader("authorization", "Bearer мерчант_private_key")
       .build();

Call call = client.newCall(запрос);

call.enqueue(new Callback() {

   @Override
   public void onFailure(Call call, IOException e) {
       Log.e("ответ ", "onFailure(): " + e.getMessage() );
   }

   @Override
   public void onОтвет(Call call, Ответ ответ) throws IOException {
       String resp = ответ.body().string();
       Log.e("ответ ", "onОтвет(): " + resp );
   }
});

Возвращает статус 200 и JSON: Копировать

{
  "success": true | false,
  "result": 0,
  "status": 200,
  "payment": {
    "сумма": 100,
    "gateway_сумма": 100,
    "валюта": "USD",
    "status": "approved|declined",
    "two_stage_mode": true
  }
}

Подтверждение двухэтапного платежа payment by providing a payment токен.

HTTP-запрос через SSL

POST '/api/v1/payments/confirm'

Параметры запроса

Параметр Обязательный Описание
токен да Платёжный токен.
сумма нет Adjusted сумма

Отклонение двухэтапного платежа

Код: Копировать

curl "https://business.oxypay.kz/api/v1/payments/decline" \
    -X POST \
    -H "Authorization: Bearer мерчант_private_key" \
    -H "Content-Тип: application/json" -d '{
        "токен" : "[payment токен]"
    }'
<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => "https://business.oxypay.kz/api/v1/payments/decline",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => '{ "токен" : "токен" }',
  CURLOPT_HTTPHEADER => array(
    "authorization: Bearer мерчант_private_key",
    "content-type: application/json"
  ),
));

$ответ = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Ошибка #:" . $err;
} else {
  echo $ответ;
}
from django.http import HttpОтветRedirect, HttpОтвет
import запросs
import json

def pay(запрос) :

    MERCHANT_PRIVATE_KEY = 'мерчант_private_key'
    LIVE_URL = 'https://business.oxypay.kz';
    SANDBOX_URL = 'https://business.oxypay.kz'

    payload = {
        "токен" : запрос.POST['токен']
    }

    headers = {
        'Content-Тип': 'application/json',
        'Authorization': 'Bearer %s' % (MERCHANT_PRIVATE_KEY)
    }

    resp = запросs.post('%s/api/v1/payments/decline' % (SANDBOX_URL), json=payload, headers=headers)

    if resp.status_code == 200:
        resp_payload = json.loads(resp.text)
        return HttpОтветRedirect(resp_payload['processingUrl'])
    else:
        return HttpОтвет('<html><body><span>Что-то пошло не так: %s</span></body></html>' % (resp.status_code))
MediaТип JSON = MediaТип.parse("application/json; charset=utf-8");

HashMap<String, Object> params = new HashMap<String, Object>();

params.put("токен", "payment токен");
OkHttpClient client = new OkHttpClient();

Request запрос = new Request.Builder()
       .url("https://business.oxypay.kz/api/v1/payments/decline")
       .post(RequestBody.create(JSON, new Gson().toJson(params)))
       .addHeader("content-type", "application/json")
       .addHeader("authorization", "Bearer мерчант_private_key")
       .build();

Call call = client.newCall(запрос);

call.enqueue(new Callback() {

   @Override
   public void onFailure(Call call, IOException e) {
       Log.e("ответ ", "onFailure(): " + e.getMessage() );
   }

   @Override
   public void onОтвет(Call call, Ответ ответ) throws IOException {
       String resp = ответ.body().string();
       Log.e("ответ ", "onОтвет(): " + resp );
   }
});

Возвращает статус 200 и JSON: Копировать

{
  "success": true | false,
  "result": 0,
  "status": 200,
  "payment": {
    "сумма": 100,
    "gateway_сумма": 100,
    "валюта": "USD",
    "status": "approved|declined",
    "two_stage_mode": true
  }
}

Отклонение двухэтапного платежа payment by providing a payment токен.

HTTP-запрос через SSL

POST '/api/v1/payments/decline'

Параметры запроса

Параметр Обязательный Описание
токен да Платёжный токен.

Получение

Код: Копировать

curl "https://business.oxypay.kz/api/v1/payments/[payment_токен]" \
    -H "Authorization: Bearer мерчант_private_key"

Возвращает статус 200 и JSON: Копировать

{
    "success": true | false,
    "errors": [],
    "status": 200,
    "payment": {
      "id": 2599,
      "status": "pending | accepted | declined",
      "токен": "[payment токен]",
      "валюта": "[payment валюта]",
      "продукт": "[продукт description]",
      "callback_url": "[callback/нетtification url]",
      "redirect_success_url": "success redirection url",
      "redirect_fail_url": "fail redirection url",
      "сумма": 0,
      "created_at": "[creation date]",
      "updated_at": "[last status update date]",
      "extra_return_param": "[extra params, can be use to payment identification in мерчант system]",
      "operation_type": "pay | payout",
      "order_number": "[мерчант's order number]"
    }
}

Payment Получение - this is the method used to retrieve information about single payment.

HTTP-запрос через SSL

GET '/api/v1/payments/[payment_токен]'

Возвраты

OXY Pay refunds processing REST API.

Создание refund

Код: Копировать

curl "https://business.oxypay.kz/api/v1/refunds" \
    -X POST \
    -H "Authorization: Bearer мерчант_private_key" \
    -H "Content-Тип: application/json" -d '{
        "токен" : "Ваш продукт",
        "сумма": 1000
    }'
<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => "https://business.oxypay.kz/api/v1/payments",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => "{ \"токен\" : \"payment токен\""\n}",
  CURLOPT_HTTPHEADER => array(
    "authorization: Bearer мерчант_private_key",
    "content-type: application/json"
  ),
));

$ответ = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Ошибка #:" . $err;
} else {
  echo $ответ;
}
from django.http import HttpОтветRedirect, HttpОтвет
import запросs
import json

def pay(запрос) :

    MERCHANT_PRIVATE_KEY = 'мерчант_private_key'
    LIVE_URL = 'https://business.oxypay.kz';
    SANDBOX_URL = 'https://business.oxypay.kz'

    payload = {
        "токен" : запрос.POST['токен payment'],
    "сумма": 100
    }

    headers = {
        'Content-Тип': 'application/json',
        'Authorization': 'Bearer %s' % (MERCHANT_PRIVATE_KEY)
    }

    resp = запросs.post('%s/api/v1/refunds' % (SANDBOX_URL), json=payload, headers=headers)

    if resp.status_code == 200:
        resp_payload = json.loads(resp.text)
        return HttpОтветRedirect(resp_payload['processingUrl'])
    else:
        return HttpОтвет('<html><body><span>Что-то пошло не так: %s</span></body></html>' % (resp.status_code))
MediaТип JSON = MediaТип.parse("application/json; charset=utf-8");

HashMap<String, Object> params = new HashMap<String, Object>();

params.put("токен", "payment токен");
params.put("сумма", 100);
OkHttpClient client = new OkHttpClient();

Request запрос = new Request.Builder()
       .url("https://business.oxypay.kz/api/v1/refunds")
       .post(RequestBody.create(JSON, new Gson().toJson(params)))
       .addHeader("content-type", "application/json")
       .addHeader("authorization", "Bearer мерчант_private_key")
       .build();

Call call = client.newCall(запрос);

call.enqueue(new Callback() {

   @Override
   public void onFailure(Call call, IOException e) {
       Log.e("ответ ", "onFailure(): " + e.getMessage() );
   }

   @Override
   public void onОтвет(Call call, Ответ ответ) throws IOException {
       String resp = ответ.body().string();
       Log.e("ответ ", "onОтвет(): " + resp );
   }
});

Возвращает статус 200 и JSON: Копировать

{
  "success": true | false,
  "errors": [],
  "токен": "[payment токен]",
  "processingUrl": "https://business.oxypay.kz/p/[payment токен]",
  "refund": {
    "токен": "3a1a4fc8f975eb022a1c0ddb3abcded9",
    "сумма": "10020",
    "валюта": "USD",
    "status": "accepted|declined"
  }
}

Создание refunds by providing a payment токен.

HTTP-запрос через SSL

POST '/api/v1/refunds'

Параметры запроса

Параметр Обязательный Описание
токен да Платёжный токен.
сумма нет Сумма возврата in cents.

Выплаты

Transferring money from a business account to a client account.

Make a payout

Код: Копировать

curl "https://business.oxypay.kz/api/v1/payouts" \
    -X POST \
    -H "Authorization: Bearer мерчант_private_key" \
    -H "Content-Тип: application/json" -d '{
        "сумма" : 1000,
        "валюта" : "CNY",
        "orderNumber": "10001",
        "extraReturnParam" : "test payout",

        "card": {
            "pan" : "4276111152393643",
            "expires" : "08/2022"
        },

        "customer": {
            "name" : "Mike",
            "surname" : "Green",
            "email" : "test@oxypay.kz",
            "address" : "725 5th Ave, New York, NY 10022, United States",
            "ip" : "1.1.1.1"
        }
}'
<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => "https://business.oxypay.kz/api/v1/payouts",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => "{ \"сумма\" : 1000, \"валюта\" : \"CNY\", \"orderNumber\" : \"10001\", \"extraReturnParam\" : \"test payout\", \"card\": { \"pan\" : \"4276111152393643\", \"expires\" : \"08/2022\" }, \"customer\": { \"email\" : \"test@oxypay.kz\", \"address\" : \"test test\", \"ip\" : \"1.1.1.1\"} }",
  CURLOPT_HTTPHEADER => array(
    "authorization: Bearer edf526c5374796cdcec5dce731405cee",
    "content-type: application/json"
  ),
));

$ответ = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Ошибка #:" . $err;
} else {
  echo $ответ;
}
from django.shortcuts import render
from django.http import HttpОтветRedirect, HttpОтвет, HttpОтветNotFound
from django.views.decorators.csrf import csrf_exempt
import запросs
import json

def payout(запрос) :

    MERCHANT_PRIVATE_KEY = 'your-мерчант-private-key'
    LIVE_URL = 'https://business.oxypay.kz';
    SANDBOX_URL = 'https://business.oxypay.kz'

    payload = {
        "сумма" : 10000,
        "валюта" : "EUR",
        "orderNumber": "10001",
        "card": {
            "pan" : "4276111152393643",
            "expires" : "08/2022"
        },

        "customer": {
            "email" : "test@oxypay.kz",
            "address" : "test test",
            "ip" : "1.1.1.1"
        }
    }

    headers = {
        'Content-Тип': 'application/json',
        'Authorization': 'Bearer %s' % (MERCHANT_PRIVATE_KEY)
    }

    resp = запросs.post('%s/api/v1/payouts' % (SANDBOX_URL), json=payload, headers=headers)

    if resp.status_code == 200:
        resp_o = json.loads(resp.text)
        return HttpОтветRedirect(resp_o['status'])
    else:
        return HttpОтвет('<html><body><span>Что-то пошло не так: %s</span> : %s</body></html>' % (resp.status_code, resp.text))
MediaТип JSON = MediaТип.parse("application/json; charset=utf-8");

HashMap<String, Object> params = new HashMap<String, Object>();

params.put("сумма", 1000);
params.put("валюта", "EUR");
params.put("orderNumber", "[мерчант system order number]");

OkHttpClient client = new OkHttpClient();

Request запрос = new Request.Builder()
       .url("https://business.oxypay.kz/api/v1/payouts")
       .post(RequestBody.create(JSON, new Gson().toJson(params)))
       .addHeader("content-type", "application/json")
       .addHeader("authorization", "Bearer мерчант_private_key")
       .build();

Call call = client.newCall(запрос);

call.enqueue(new Callback() {

   @Override
   public void onFailure(Call call, IOException e) {
       Log.e("ответ ", "onFailure(): " + e.getMessage() );
   }

   @Override
   public void onОтвет(Call call, Ответ ответ) throws IOException {
       String resp = ответ.body().string();
       Log.e("ответ ", "onОтвет(): " + resp );
   }
});

Возвращает статус 200 и JSON: Копировать

{
  "success": true | false,
  "errors": [],
  "payout": {
      "токен": "[payment токен]",
      "status": "[payment status]",
      "timestamp": "2016-06-09T03:46:45Z"
  }
}

Создание a payout operation.

HTTP-запрос через SSL

POST '/api/v1/payouts'

Параметры запроса

Параметр Обязательный Описание
сумма да Payment сумма in minimal values as of; USD and EUR / Cents, for JPY / Yen, for CNY / Fen.
валюта да Код валюты (CNY, EUR, USD, JPY)
orderNumber да OXY Pay's client inner order number
card да Card object for Host2Host payouts.
customer да Объект клиента для Host2Host payouts.
extraReturnParam нет Extra params

Card Payout Object Параметрs

Параметр Обязательный Описание
pan да Customer’s card number (PAN). Any valid card number, may contain spaces
expires да Customer’s card expiration date. Format: mm/yyyy
holder нет Customer’s card holder

Customer Object Параметрs (optional)

Параметр Обязательный Описание
email да Customer’s email, is mandatory if Объект клиента отправлен on a запрос
address нет Customer's billing address in the full format like "725 5th Ave, New York, NY 10022, United States"
ip да Customer IP address
first_name нет Customer name
last_name нет Customer surname
phone нет Customer phone number

Providers

Код: Копировать

curl "https://business.oxypay.kz/api/v1/payouts" \
    -X POST \
    -H "Authorization: Bearer мерчант_private_key" \
    -H "Content-Тип: application/json" -d '{
        "сумма" : 1000,
        "валюта" : "CNY",
        "orderNumber": "10001",
        "extraReturnParam" : "test payout",

        "card": {
            "pan" : "4276111152393643",
            "expires" : "08/2022"
        },

        "customer": {
            "email" : "test@oxypay.kz",
            "address" : "test test",
            "ip" : "1.1.1.1"
        }
}'
<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => "https://business.oxypay.kz/api/v1/payouts",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => "{ \"сумма\" : 1000, \"валюта\" : \"CNY\", \"orderNumber\" : \"10001\", \"extraReturnParam\" : \"test payout\", \"card\": { \"pan\" : \"4276111152393643\", \"expires\" : \"08/2022\" }, \"customer\": { \"email\" : \"test@oxypay.kz\", \"address\" : \"test test\", \"ip\" : \"1.1.1.1\"} }",
  CURLOPT_HTTPHEADER => array(
    "authorization: Bearer edf526c5374796cdcec5dce731405cee",
    "content-type: application/json"
  ),
));

$ответ = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Ошибка #:" . $err;
} else {
  echo $ответ;
}
from django.shortcuts import render
from django.http import HttpОтветRedirect, HttpОтвет, HttpОтветNotFound
from django.views.decorators.csrf import csrf_exempt
import запросs
import json

def payout(запрос) :

    MERCHANT_PRIVATE_KEY = 'your-мерчант-private-key'
    LIVE_URL = 'https://business.oxypay.kz';
    SANDBOX_URL = 'https://business.oxypay.kz'

    payload = {
        "сумма" : 10000,
        "валюта" : "EUR",
        "orderNumber": "10001",
        "card": {
            "pan" : "4276111152393643",
            "expires" : "08/2022"
        },

        "customer": {
            "email" : "test@oxypay.kz",
            "address" : "test test",
            "ip" : "1.1.1.1"
        }
    }

    headers = {
        'Content-Тип': 'application/json',
        'Authorization': 'Bearer %s' % (MERCHANT_PRIVATE_KEY)
    }

    resp = запросs.post('%s/api/v1/payouts' % (SANDBOX_URL), json=payload, headers=headers)

    if resp.status_code == 200:
        resp_o = json.loads(resp.text)
        return HttpОтветRedirect(resp_o['status'])
    else:
        return HttpОтвет('<html><body><span>Что-то пошло не так: %s</span> : %s</body></html>' % (resp.status_code, resp.text))
MediaТип JSON = MediaТип.parse("application/json; charset=utf-8");

HashMap<String, Object> params = new HashMap<String, Object>();

params.put("сумма", 1000);
params.put("валюта", "EUR");
params.put("orderNumber", "[мерчант system order number]");

OkHttpClient client = new OkHttpClient();

Request запрос = new Request.Builder()
       .url("https://business.oxypay.kz/api/v1/payouts")
       .post(RequestBody.create(JSON, new Gson().toJson(params)))
       .addHeader("content-type", "application/json")
       .addHeader("authorization", "Bearer мерчант_private_key")
       .build();

Call call = client.newCall(запрос);

call.enqueue(new Callback() {

   @Override
   public void onFailure(Call call, IOException e) {
       Log.e("ответ ", "onFailure(): " + e.getMessage() );
   }

   @Override
   public void onОтвет(Call call, Ответ ответ) throws IOException {
       String resp = ответ.body().string();
       Log.e("ответ ", "onОтвет(): " + resp );
   }
});

Возвращает статус 200 и JSON: Копировать

{
  "success": true | false,
  "errors": [],
  "токен": "[payment токен]",
  "processingUrl": [
        {
            "webmoney": "http://business.oxypay.kz/pout/165998589a413b56ae72fbfdc15b016b/webmoney?locale=en"
        },
        {
            "bank_card": "http://business.oxypay.kz/pout/165998589a413b56ae72fbfdc15b016b/bank_card?locale=en"
        },
        {
            "qiwi_wallet": "http://business.oxypay.kz/pout/165998589a413b56ae72fbfdc15b016b/qiwi_wallet?locale=en"
        },
        {
            "skrill_wallet": "http://business.oxypay.kz/pout/165998589a413b56ae72fbfdc15b016b/skrill_wallet?locale=en"
        }
  ],
  "selectorURL": "https://business.oxypay.kz/select/pout/[payment токен]/", 
  "payment": {
    "сумма": "10020",
    "валюта": "CNY",
    "status": "init"
  }
}

In case multiple payout providers enabled to a мерчант account, Создание payout ответ JSON will have processingUrl object represented as an array of available payout providers (please refer to JSON ответ). Use those URLs to redirect your customer to a payout provider (method).

Список of payout providers

In case you want a customer to choose a payout provider (method) it might be convenient to use a specific page (widget) with payout provider list, which is available by "selectorURL" parameter in JSON ответ object

Баланс

Request current OXY Pay balance.

Receive Баланс

Код: Копировать

curl "https://business.oxypay.kz/api/v1/balance?валюта=CNY" \
    -X GET \
    -H "Authorization: Bearer мерчант_private_key" \
    -H "Content-Тип: application/json"
<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => "https://business.oxypay.kz/api/v1/balance?валюта=CNY",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "GET",
  CURLOPT_HTTPHEADER => array(
    "authorization: Bearer мерчант_private_key",
    "content-type: application/json"
  ),
));

$ответ = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Ошибка #:" . $err;
} else {
  echo $ответ;
}
from django.shortcuts import render
from django.http import HttpОтветRedirect, HttpОтвет, HttpОтветNotFound
from django.views.decorators.csrf import csrf_exempt
import запросs
import json

def balance(запрос) :

    MERCHANT_PRIVATE_KEY = 'мерчант_private_key'
    LIVE_URL = 'https://business.oxypay.kz';
    SANDBOX_URL = 'https://business.oxypay.kz'

    headers = {
        'Content-Тип': 'application/json',
        'Authorization': 'Bearer %s' % (MERCHANT_PRIVATE_KEY)
    }
    resp = запросs.get('%s/api/v1/balance' % (SANDBOX_URL), params = {'валюта':'CNY'}, headers=headers)

    if resp.success:
        resp_o = json.loads(resp.text)
        return HttpОтвет('<html><body><span>Your balance %s</body></html>' % (resp_o['wallet']['available']))
    else:
        return HttpОтвет('<html><body><span>Что-то пошло не так: %s</span> : %s</body></html>' % (resp.status_code, resp.text))

OkHttpClient client = new OkHttpClient();

Request запрос = new Request.Builder()
  .url("https://business.oxypay.kz/api/v1/balance?валюта=CNY")
  .get()
  .addHeader("content-type", "application/json")
  .addHeader("authorization", "Bearer мерчант_private_key")
  .build();

Ответ ответ = client.newCall(запрос).execute();

Возвращает статус 200 и JSON: Копировать

{
  "success": true | false,
  "errors": [],
  "wallet": {
    "available": 0,
    "hold": 0,
    "валюта": "CNY"
  }
}

Receiving the balance for a business account. Баланс is returned as an object displaying available and pending суммаs. Балансs shown may be нетt be released and/or processed.

HTTP-запрос через SSL

GET '/api/v1/balance'

Параметры запроса

Параметр Описание
валюта Код валюты (CNY)

Споры

Request current OXY Pay dispute list.

Dispute list

Код: Копировать

curl "https://business.oxypay.kz/api/v1/disputes/list" \
    -X GET \
    -H "Authorization: Bearer мерчант_private_key" \
    -H "Content-Тип: application/json"
<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => "https://business.oxypay.kz/api/v1/disputes/list",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "GET",
  CURLOPT_HTTPHEADER => array(
    "authorization: Bearer мерчант_private_key",
    "content-type: application/json"
  ),
));

$ответ = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Ошибка #:" . $err;
} else {
  echo $ответ;
}
from django.shortcuts import render
from django.http import HttpОтветRedirect, HttpОтвет, HttpОтветNotFound
from django.views.decorators.csrf import csrf_exempt
import запросs
import json

def disputes(запрос) :

    MERCHANT_PRIVATE_KEY = 'мерчант_private_key'
    LIVE_URL = 'https://business.oxypay.kz';
    SANDBOX_URL = 'https://business.oxypay.kz'

    headers = {
        'Content-Тип': 'application/json',
        'Authorization': 'Bearer %s' % (MERCHANT_PRIVATE_KEY)
    }
    resp = запросs.get('%s/api/v1/disputes/list' % (SANDBOX_URL), headers=headers)

OkHttpClient client = new OkHttpClient();

Request запрос = new Request.Builder()
  .url("https://business.oxypay.kz/api/v1/disputes/list")
  .get()
  .addHeader("content-type", "application/json")
  .addHeader("authorization", "Bearer мерчант_private_key")
  .build();

Ответ ответ = client.newCall(запрос).execute();

Возвращает статус 200 и JSON: Копировать

{
    "success": true,
    "status": 200,
    "disputes": [
        {
            "id": 27,
            "сумма": 2,
            "валюта": "USD",
            "investigation_report": null,
            "status": "processing",
            "мерчант_profile_id": 3,
            "user_profile_id": 3,
            "feed_id": 330,
            "created_at": "2019-09-13T08:46:21.302Z",
            "updated_at": "2019-09-13T08:46:21.343Z",
            "dispute_type": 2,
            "reason_code": "123",
            "comment": "some comment"
        }
    ]
}

Получениеting a list of last disputes for a business account.

HTTP-запрос через SSL

GET '/api/v1/disputes/list'

Параметры запроса

No parameters, returns 100 latest records

Уведомления

Уведомления with the payment or payout status are sent to your callback URL using POST methods. In case payment or payout status changed (pending/approved/declined) -- нетtification type is sent accordingly.

Код: Копировать

from django.views.decorators.csrf import csrf_exempt
from django.http import HttpОтветRedirect, HttpОтвет, HttpОтветNotFound

@csrf_exempt    
def нетtifyme(запрос) : 
    req_o = json.loads(запрос.read());
    return HttpОтвет('Status is:%s' % (req_o['status']))

Params: Копировать

{

  "токен": "payment токен",
  "type": "payment type: payment | payout",
  "status" : "payment status: pending | approved | declined ",
  "extraReturnParam" : "extra params",
  "orderNumber" : "мерчант order number",
  "walletToken": "payer's OXY Pay wallet unique identifier, only for OXY Pay payments",
  "recurringToken": "payer's previously initialized recurring токен, for making recurrent payment repeatedly",
  "sanitizedMask": "payer's sanitized card, if it was provided",
  "сумма": "payment сумма in cents",
  "валюта": "payment валюта",
  "gatewayAmount": "exchanged сумма in cents",
  "gatewayCurrency": "exchanged валюта"
}

Подпись

Подпись signing

The signature from the callback is checked as follows:

The sum of all parameters, which consists of the length of the string + the string itself. We encode the final string + мерчант токен in hashlib.md5

Code example (Python): Копировать

['7ca152d572b003e0ab53e6b0637b4324', 'pay', 'approved', 'AutoTest_3781', 'AutoTest_9153', 1000, 'USD', '1000', 'USD']

32 + 7ca152d572b003e0ab53e6b0637b4324
3 + pay
8 + approved
13 + AutoTest_3781
13 + AutoTest_9153
4 + 1000
3 + USD
4 + 1000
3 + USD

signature_string = 327ca152d572b003e0ab53e6b0637b43243pay8approved13AutoTest_378113AutoTest_9153410003USD410003USD

signature_string = signature_string + env['BEARER']
signature = hashlib.md5(signature_string.encode('utf-8')).hexdigest()
return signature

Параметрs list:

Справочники

Ошибки

If any method failed, the JSON ответ with status code 403 returned that specified the problem.

Return status 403 и JSON: Копировать

{'success': false, 'result': 1, 'status': 403, 'errors': {'list': [{'code': 'мерчант_нетt_found', 'kind': 'api_error'}]}}

{'success': false, 'result': 1, 'status': 403, 'errors': [{'code': 'сумма_less_than_minimum', 'kind': 'invalid_запрос_error'}]}

{'success': false, 'result': 1, 'status': 403, 'errors': [{'code': 'сумма_less_than_balance', 'kind': 'processing_error'}]}

Payment states

State Final Описание
init нет Request to API will initiate payments.
pending нет User redirected to the OXY Pay Checkout facility during payment processing period.
approved да Успехfully completed payment.
declined да Unsuccessful payment.

Kinds of errors

Kind Описание
api_error Indicate rare occasions such as an OXY Pay API server technicality.
authentication_error Authentication запрос failure.
invalid_запрос_error Invalid parameters which produce invalid запросs.
processing_error В обработке the payment generated an error.

Codes of errors

Code Описание
incorrect_private_key The current private key canнетt identify the user.
incorrect_address_info Отсутствует или некорректно address information.
incorrect_bank_card_info Отсутствует или некорректно bank card information.
order_number_already_exists Repeating an order of already identified order number.
сумма_less_than_balance Payout canнетt be completed due to insufficient funds.
incorrect_сумма Отсутствует или некорректно сумма value.
incorrect_валюта Отсутствует или некорректно валюта value.
incorrect_order_number Отсутствует или некорректно order value.
сумма_less_than_minimum Minimum payout сумма has нетt been запросed.

Supported Chinese bank codes

Code Name
"ABC" "Agricultural Bank of China"
"ICBC" "Industrial and Commercial Bank of China"
"CCB" "China Construction Bank"
"BCOM" "Bank of Communication"
"BOC" "Bank of China"
"CMB" "China Merchants Bank"
"CMBC" "China Minsheng Bank"
"CEBB" "China Ever Bright Bank"
"BOB" "Bank of Beijing"
"SHB" "Bank of Shanghai"
"NBB" "Bank of Ningbo"
"HXB" "Hua Xia Bank"
"CIB" "China Industrial Bank"
"PSBC" "Postal Saving Bank of China"
"SPABANK" "Shenzhen Ping An Bank"
"SPDB" "Shanghai Pudong Development Bank"
"BEA" "Bank of East Asia"
"ECITIC" "China Citic Bank"
"GDB" "Guangdong Development Bank"

Supported Chinese state codes

State (Province) code State (Province) name
11 Beijing City
12 Tianjin City
13 Hebei Province
14 Shanxi Province
15 Inner Mogolia
21 Liaoning Province
22 Jilin Province
23 Heilongjiang Province
31 Shanghai City
32 Jiangsu Province
33 Zhejiang Province
34 Anhui Province
35 Fujian Province
36 Jiangxi Province
37 Shandong Province
41 Henan Province
42 Hubei Province
43 Hunan Province
44 Guangdong Province
45 Guangxi Province
46 Hainan Province
50 Chongqing City
51 Sichuan Province
52 Guizhou Province
53 Yunnan Province
54 Tibet
61 Shaanxi Province
62 Gansu Province
63 Qinghai Province
64 Ningxia
65 Xinjiang
71 Taiwan
81 Hong Kong
82 Macao

Supported Chinese city codes

City code City name State (Province) code
1000 Beijing City 11
1100 Tianjin City 12
1210 Shijiazhuang City 13
1240 Tangshan City 13
1260 Qinhuangdao City 13
1270 Handan City 13
1310 Xingtai City 13
1340 Baoding City 13
1380 Zhangjiakou City 13
1410 Chengde City 13
1430 Cangzhou City 13
1460 Langfang City 13
1480 Hengshui City 13
1610 Taiyuan city 14
1620 Datong City 14
1630 Yangquan city 14
1640 Changzhi City 14
1680 Jingcheng City 14
1690 Shuozhou City 14
1710 Xinzhou City 14
1730 Lvliang City 14
1750 Jingzhong City 14
1770 Linfeng City 14
1810 Yuncheng City 14
1910 Hohhot City 15
1920 Baotou City 15
1930 Wuhai City 15
1940 Chifeng City 15
1960 Hulunbeier City 15
1980 Hinggan League 15
1990 Tongliao City 15
2010 Xilin Gol League 15
2030 Ulanqab City 15
2050 Erdos City 15
2070 Bayan Nur City 15
2080 Alxa League 15
2210 Shenyang City 21
2220 Dalian City 21
2230 Anshan City 21
2240 Fushun City 21
2250 Benxi City 21
2260 Dandong City 21
2270 Jinzhou City 21
2276 Huludao City 21
2280 Yingkou City 21
2290 Fuxin City 21
2310 Liaoyang City 21
2320 Panjing City 21
2330 Tieling City 21
2340 Chaoyang City 21
2410 Changchun City 22
2420 Jilin City 22
2430 Siping City 22
2440 Liaoyuan City 22
2450 Tonghua City 22
2460 Baishan City 22
2470 Baicheng City 22
2490 Yanbian Korean Autoнетmous Prefecture 22
2520 Songyuan City 22
2610 Harbin City 23
2640 Qiqihar City 23
2650 Daqing City 23
2660 Jixi City 23
2670 Hegang City 23
2680 Shuangyashan City 23
2690 Jiamusi City 23
2710 Yichun City 23
2720 Mudanjiang City 23
2740 Qitaihe City 23
2760 Suihua City 23
2780 Heihe City 23
2790 Daxinganling region 23
2900 Shanghai City 31
3010 Nanjing City 32
3020 Wuxi City 32
3030 Xuzhou City 32
3040 Changzhou City 32
3050 Suzhou City 32
3060 Nantong City 32
3070 Lianyungang City 32
3080 Huai An City 32
3090 Suqian City 32
3110 Yancheng City 32
3120 Yangzhou City 32
3128 Taizhou City 32
3140 Zhenjiang City 32
3310 Hangzhou City 33
3320 Ningbo City 33
3330 Wenzhou City 33
3350 Jiaxing City 33
3360 Huzhou City 33
3370 Shaoxing City 33
3380 Jinhua City 33
3410 Quzhou City 33
3420 Zhoushan City 33
3430 Lishui City 33
3450 Taizhou City 33
3610 Hefei City 34
3620 Wuhu City 34
3630 Bengbu City 34
3640 Huainan City 34
3650 Ma anshan City 34
3660 Huaibei City 34
3670 Tongling City 34
3680 Anqing City 34
3710 Huangshan City 34
3720 Fuyang City 34
3722 Bozhou City 34
3740 Suzhou City 34
3750 Chuzhou City 34
3760 Liu an City 34
3771 Xuancheng City 34
3781 Chaohu City 34
3790 Chizhou City 34
3910 Fuzhou City 35
3930 Xiamen City 35
3940 Putian City 35
3950 Sanming City 35
3970 Quanzhou City 35
3990 Zhangzhou City 35
4010 Nanping City 35
4030 Ningde City 35
4050 Longyan City 35
4210 Nanchang City 36
4220 Jingdezhen City 36
4230 Pingxiang City 36
4240 Jiujiang City 36
4260 Xinyu City 36
4270 Yingtan City 36
4280 Ganzhou City 36
4310 Yichun City 36
4330 Shangrao City 36
4350 Ji an City 36
4370 Fuzhou City 36
4510 Jinan City 37
4520 Qingdao City 37
4530 Zibo City 37
4540 Zaozhuang City 37
4550 Dongying City 37
4560 Yantai City 37
4580 Weifang City 37
4610 Jining City 37
4630 Tai an City 37
4634 Laiwu City 37
4650 Weihai City 37
4660 Binzhou City 37
4680 Dezhou City 37
4710 Liaocheng City 37
4730 Linyi City 37
4732 Rizhao City 37
4750 Heze City 37
4910 Zhengzhou City 41
4920 Kaifeng City 41
4930 Luoyang City 41
4950 Pingdingshan City 41
4960 Anyang City 41
4970 Hebi City 41
4980 Xinxiang City 41
5010 Jiaozuo City 41
5020 Puyang City 41
5030 Xuchang City 41
5040 Luohe City 41
5050 Sanmenxia City 41
5060 Shangqiu City 41
5080 Zhoukou City 41
5110 Zhumendian City 41
5130 Nanyang City 41
5150 Xinyang City 41
5210 Wuhan City 42
5220 Huangshi City 42
5230 Shiyan City 42
5260 Yichang City 42
5280 Xiangfan City 42
5286 Suizhou City 42
5310 Ezhou City 42
5320 Jinmen City 42
5330 Huanggang City 42
5350 Xiaogan City 42
5360 Xianning City 42
5370 Jinzhou City 42
5410 Enshi Prefecture 42
5510 Changsha City 43
5520 Zhuzhou City 43
5530 Xiangtan City 43
5540 Hengyang City 43
5550 Shaoyang City 43
5570 Yueyang City 43
5580 Changde City 43
5590 Zhangjiajie City 43
5610 Yiyang City 43
5620 Loudi City 43
5630 Chenzhou City 43
5650 Yongzhou City 43
5670 Huaihua City 43
5690 Jishou City 43
5810 Guangzhou City 44
5820 Shaoguan City 44
5840 Shenzhen City 44
5850 Zhuhai City 44
5860 Shantou City 44
5865 Jieyang City 44
5869 Chaozhou City 44
5880 Foshan City 44
5890 Jiangmen City 44
5910 Zhanjiang City 44
5920 Maoming City 44
5930 Zhaoqing City 44
5937 Yunfu City 44
5950 Huizhou City 44
5960 Meizhou City 44
5970 Shanwei City 44
5980 Heyuan City 44
5990 Yangjiang City 44
6010 Qingyuan City 44
6020 Dongguan City 44
6030 Zhongshan City 44
6110 Nanning City 45
6128 Chongzuo City 45
6140 Liuzhou City 45
6155 Laibing City 45
6170 Guilin City 45
6210 Wuzhou City 45
6225 Hezhou City 45
6230 Beihai City 45
6240 Yulin City 45
6242 Guigang City 45
6261 Baise City 45
6281 Hechi City 45
6311 Qingzhou City 45
6330 Fangchenggang City 45
6410 Haikou City 46
6420 Sanya City 46
6510 Chengdu City 51
6530 Chongqing City 50
6550 Zigong City 51
6560 Panzhihua City 51
6570 Luzhou City 51
6580 Deyang City 51
6590 Mianyang City 51
6610 Guangyuan City 51
6620 Suining City 51
6630 Neijiang City 51
6636 Ziyang City 51
6650 Leshan City 51
6652 Meishan City 51
6670 Wanzhou District 50
6690 Fuling District 50
6710 Yibing City 51
6730 Nanchong City 51
6737 Guang an City 51
6750 Dazhou City 51
6758 Bazhong City 51
6770 Ya an City 51
6790 Aba Tibetan and Qiang Autoнетmous Region 51
6810 Garze Tibetan Autoнетmous Prefecture 51
6840 Yi Autoнетmous Prefecture of Liangshan 51
6870 Qianjiang District 50
7010 Guiyang City 52
7020 Liupanshui City 52
7030 Zunyi City 52
7050 Tongren District 52
7070 Qianxinan Prefecture 52
7090 Bijie District 52
7110 Anshun City 52
7130 Qiandongnan Prefecture 52
7150 Qianan Prefecture 52
7310 Kunming City 53
7340 Zhaotong City 53
7360 Qujing City 53
7380 Chuxiong City 53
7410 Yuxi City 53
7430 Honghe Hani Autoнетmous Prefecture 53
7450 Wenshan Zhuang-Miao Autoнетmous Prefecture 53
7470 Simao City 53
7490 Xishuangbanna Dai Autoнетmous Prefecture 53
7510 Dali Bai Autoнетmous prefecture 53
7530 Baoshan City 53
7540 Dehong Dai-Jingpo Autoнетmous Prefecture 53
7550 Lijiang City 53
7560 Nujiang Lisu Autoнетmous Prefecture 53
7570 Diqing Tibetan Autoнетmous Region 53
7580 Lincang City 53
7700 Lhasa City 54
7720 Changdu District 54
7740 Shannan District 54
7760 Shigatse District 54
7790 Naqu District 54
7811 Ali District 54
7830 Linzhi District 54
7910 Xi an City 61
7920 Tongchuan City 61
7930 Baoji City 61
7950 Xianyang City 61
7970 Weinan City 61
7990 Hanzhong City 61
8010 Ankang City 61
8030 Shangluo City 61
8040 Yan an City 61
8060 Yulin City 61
8210 Lanzhou City 62
8220 Jiayuguan City 62
8230 Jinchang City 62
8240 Baiyin City 62
8250 Tianshui City 62
8260 Jiuquan City 62
8270 Zhangye City 62
8280 Wuwei City 62
8290 Dingxi City 62
8310 Longnan City 62
8330 Pingliang City 62
8340 Qingyang City 62
8360 Linxia City 62
8380 Gannan Prefecture 62
8510 Xining City 63
8520 Haidong District 63
8540 Haibei Tibetan Autoнетmous Region 63
8550 Huangnan Tibetan Autoнетmous Region 63
8560 Hainan Tibetan Autoнетmous Region 63
8570 Guoluo Tibetan Autoнетmous Region 63
8580 Yushu Tibetan Autoнетmous Region 63
8590 Haixi Mogolian-Tibetan Autoнетmous Region 63
8710 Yinchuan City 64
8720 Shizuishan City 64
8731 Wuzhong City 64
8733 Zhongwei City 64
8741 Guyuan City 64
8810 Urumqi City 65
8820 Karamay City 65
8830 Turpan city 65
8840 Hami City 65
8844 Altay Prefecture 65
8850 Hui Autoнетmous Prefecture of Changji 65
8870 Bortala Mongol Autoнетmous Prefecture 65
8880 Bayingolin Mogol Autoнетmous Prefecture 65
8910 Akesu Prefecture 65
8930 Kizilsu Kirghiz Autoнетmous Prefecture 65
8940 Kashi Prefecture 65
8960 Hotan Prefecture 65
8980 Kazak Autoнетmous Prefecture of Ili 65
9010 Tacheng prefecture 65
9020 Altay Prefecture 65
9028 Shihezi City 65

Платежи в Узбекистане (UzCard, HUMO, Visa, MC)

OxyPay поддерживает приём платежей в Узбекистане в национальной валюте — узбекских сумах (UZS). Поддерживаются карты UzCard, HUMO, Visa и Mastercard.

Поддерживаемые карты

Платёжная система Регион Доступные методы
UzCard Узбекистан списание, холдирование, токенизация, рекуррентные платежи
HUMO Узбекистан списание, холдирование, токенизация, рекуррентные платежи
Visa Международные списание с 3DS, холдирование, токенизация
Mastercard Международные списание с 3DS, холдирование, токенизация

Валюта

1. Прямое списание (Debit)

Моментальное списание средств с карты клиента.

POST /api/v1/payments

{
  "сумма": 100000,
  "валюта": "UZS",
  "order_id": "order_123456",
  "description": "Оплата заказа #123456",
  "payment_method": "uzbekistan_debit",
  "card": {
    "pan": "8600492916693589",
    "expiry": "11/28",
    "holder_name": "IVAN PETROV",
    "phone": "998901234567"
  },
  "customer": {
    "first_name": "Иван",
    "last_name": "Петров",
    "phone": "998901234567"
  },
  "urls": {
    "success": "https://мерчант.com/success",
    "fail": "https://мерчант.com/fail",
    "callback": "https://мерчант.com/callback"
  }
}

Ответ

{
  "status": "success",
  "data": {
    "payment_id": "pay_abc123",
    "transaction_id": "83cc7689-9544-4a3f-bb46-122ad88aba09",
    "status": "CREATED",
    "сумма": 100000,
    "валюта": "UZS"
  }
}

2. Холдирование (Debit with Hold)

Заморозка средств на карте с последующим подтверждением или отменой.

Создание холда

POST /api/v1/payments

{
  "сумма": 500000,
  "валюта": "UZS",
  "order_id": "order_789",
  "payment_method": "uzbekistan_hold",
  "card": {
    "pan": "8600492916693589",
    "expiry": "11/28",
    "holder_name": "IVAN PETROV",
    "phone": "998901234567"
  }
}

Подтверждение холда

POST /api/v1/payments/{payment_id}/capture

{
  "сумма": 500000
}

Отмена холда

POST /api/v1/payments/{payment_id}/cancel

3. Списание с 3D Secure

Списание с обязательной 3DS аутентификацией. Обязательно для Visa/Mastercard.

{
  "сумма": 200000,
  "валюта": "UZS",
  "payment_method": "uzbekistan_3ds",
  "card": {
    "pan": "4278310025720731",
    "expiry": "02/29",
    "cvv": "401",
    "holder_name": "IVAN PETROV",
    "phone": "998881390699"
  },
  "redirect_url": "https://мерчант.com/3ds-return"
}

Ответ (требуется 3DS)

{
  "status": "pending_3ds",
  "data": {
    "payment_id": "pay_xyz789",
    "transaction_id": "f4c4504e-db04-481d-b638-d76638749014",
    "status": "CREATED",
    "acs_url": "https://payment-gateway.example.com/3ds/...",
    "redirect_required": true
  }
}

После получения acs_url необходимо перенаправить клиента для прохождения 3DS верификации.

4. Токенизация карт

Сохранение данных карты для последующих платежей без повторного ввода.

Типы токенизации

Тип карты Метод инициализации Метод списания
UzCard/HUMO init-токенization debit-токен
Visa/MC (Холд) init-токенization debit-hold-токен
Visa/MC (E-comm) init-one-step-ecomm-токенization debit-токен

Шаг 1: Инициализация токенизации (UzCard/HUMO)

POST /api/v1/cards/токенize

{
  "card": {
    "pan": "8600492916693589",
    "expiry": "11/28",
    "phone": "998901234567"
  },
  "type": "domestic"
}

Шаг 2: Подтверждение SMS-кодом

POST /api/v1/cards/токенize/verify

{
  "operation_id": "10d40e05-076a-40db-9266-110b6f189515",
  "code": "123456"
}

Ответ (токен получен)

{
  "status": "success",
  "data": {
    "токен": "c163f582-4d95-49ff-a1e2-0fd494429b18",
    "card_mask": "8600****3589",
    "expiry": "11/28",
    "card_type": "UZCARD"
  }
}

Шаг 3: Платёж по токену

POST /api/v1/payments

{
  "сумма": 150000,
  "валюта": "UZS",
  "payment_method": "uzbekistan_токен",
  "токен": "c163f582-4d95-49ff-a1e2-0fd494429b18"
}

5. Рекуррентные платежи

Автоматические повторяющиеся платежи для подписок.

POST /api/v1/subscriptions

{
  "customer_id": "cust_123",
  "токен": "c163f582-4d95-49ff-a1e2-0fd494429b18",
  "plan": {
    "сумма": 99000,
    "валюта": "UZS",
    "interval": "month",
    "interval_count": 1
  },
  "description": "Ежемесячная подписка Premium",
  "start_date": "2026-05-01"
}

6. Выплаты на карту

Зачисление средств на карту клиента.

POST /api/v1/payouts

{
  "сумма": 500000,
  "валюта": "UZS",
  "receiver": {
    "pan": "8600492916693589",
    "expiry": "11/28",
    "first_name": "IVAN",
    "last_name": "PETROV",
    "phone": "998901234567"
  },
  "description": "Выплата за услуги"
}

7. Возвраты

Полный возврат

POST /api/v1/payments/{payment_id}/refund

Частичный возврат

{
  "сумма": 50000
}

Статусы транзакций

Статус Описание
CREATEDТранзакция создана, ожидает обработки
PENDINGВ процессе обработки
HOLDСредства заморожены (для операций холдирования)
SUCCESSУспешно завершена
FAILEDОшибка при выполнении
CANCELLEDОтменена

Коды ошибок

Код Сообщение Описание
10024Обязательно field нетt presentОтсутствует обязательное поле
10037Payment is rejectedПлатёж отклонён банком
10046Passport data requiredТребуются паспортные данные
10080Card нетt supportedКарта не поддерживает данную валюту
10081Недостаточно средствНедостаточно средств на карте
10091BlacklistedКлиент в чёрном списке
10095Amount limit exceededПревышен лимит суммы операции
10107В обработке declinedОтказ процессинга

Тестовые карты

Тип карты Номер (PAN) Срок CVV Телефон
UzCard860049291669358911/28+998903260043
VISA427831002572073102/29401+998881390699
HUMO9860090101264498+998919267048

Платежи в России (МИР, СБП)

OxyPay поддерживает приём платежей в России в национальной валюте — российских рублях (RUB). Поддерживаются карты платёжной системы МИР и переводы через Систему быстрых платежей (СБП).

Поддерживаемые методы оплаты

Метод Регион Доступные операции
МИР Россия списание с 3DS, холдирование, токенизация
СБП Россия мгновенные переводы по номеру телефона

1. Оплата картой МИР

Стандартное списание с карты МИР с обязательной 3D Secure аутентификацией.

Запрос

{
  "сумма": 100000,
  "валюта": "RUB",
  "payment_method": "card",
  "card": {
    "pan": "2200000000000004",
    "expiry": "12/28",
    "cvv": "123",
    "holder_name": "IVAN PETROV"
  },
  "order_id": "order_12345",
  "description": "Оплата заказа #12345",
  "redirect_url": "https://merchant.com/payment/return"
}

Ответ (успешно)

{
  "status": "pending_3ds",
  "data": {
    "payment_id": "pay_mir_123",
    "transaction_id": "abc123-def456",
    "status": "CREATED",
    "acs_url": "https://acs.mir.ru/3ds/...",
    "redirect_required": true
  }
}

2. Оплата через СБП

Мгновенный перевод через Систему быстрых платежей по номеру телефона или QR-коду.

Инициализация СБП платежа

POST /api/v1/payments

{
  "сумма": 50000,
  "валюта": "RUB",
  "payment_method": "sbp",
  "order_id": "order_sbp_123",
  "description": "Оплата через СБП",
  "customer": {
    "phone": "+79001234567"
  }
}

Ответ (QR-код для оплаты)

{
  "status": "success",
  "data": {
    "payment_id": "pay_sbp_456",
    "qr_url": "https://qr.sbp.ru/...",
    "qr_image": "data:image/png;base64,...",
    "expires_at": "2026-04-16T12:30:00Z"
  }
}

Поддерживаемые банки СБП

Банк Код банка
Сбербанк100000000111
Тинькофф100000000004
ВТБ100000000005
Альфа-Банк100000000008
Газпромбанк100000000354
Райффайзенбанк100000000007

Возвраты

Возврат по карте МИР

POST /api/v1/payments/{payment_id}/refund

Возврат по СБП

Для СБП возвраты производятся автоматически на счёт плательщика.

Статусы транзакций

Статус Описание
CREATEDТранзакция создана
PENDINGОжидание подтверждения (3DS или СБП)
SUCCESSУспешно завершена
FAILEDОшибка
EXPIREDИстёк срок (для СБП QR-кодов)

Тестовые данные

Тестовые карты МИР

Сценарий Номер карты Срок CVV 3DS пароль
Успешный платёж220000000000000412/2812312345678
Отказ (недостаточно средств)220000000000001212/2812312345678

Тестовые сценарии СБП

Сценарий Телефон Банк
Успешный платёж+79001234567Сбербанк
Таймаут+79001234568Тинькофф
Отказ+79001234569ВТБ