Введение
OXY Pay — это простой, быстрый и надёжный платёжный движок с открытой архитектурой. Основан в 2018 году, поддерживается и постоянно развивается сообществом инженеров-программистов с большим опытом работы в сфере платежей и электронных кошельков.
OXY Pay Business API — решение, специально разработанное для интернет-бизнеса, нуждающегося в мультивалютной обработке платежей. Мы поддерживаем все основные валюты.
Окружения
Для интеграции доступны два окружения:
- Продакшн окружение: https://business.oxypay.kz
Sandbox Environment
Sandbox обеспечивает полную функциональность, но только эмулирует обработку — реальные банковские транзакции не выполняются. Для тестов вы можете использовать следующие номера карт:
- 4617611794313933: CONFIRMED as 3-D Secure transaction
- 4626233193837898: DECLINED as 3-D Secure transaction
- 4392963203551251: CONFIRMED as нетn 3-D Secure transaction
- 4730198364688516: DECLINED as нетn 3-D Secure transaction
- 4627342642639018: APPROVED PAYOUT
- 4968357931420422: DECLINED PAYOUT
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 |
|---|---|---|---|
| да | 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 |
|---|---|---|---|
| да | 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 |
|---|---|---|---|
| да | 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)
| Параметр | Обязательный | Описание |
|---|---|---|
| да | 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:
- токен
- paymentТип
- status
- extraReturnParam
- orderNumber
- сумма
- валюта
- gatewayAmount
- gatewayCurrency
Справочники
Ошибки
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 |