Подготовка бэкенда
Добавьте на ваш бэкенд метод API для получения токенов заказа и пользователя, например, /startPaymentWithSavedCard
. Метод должен:
- Получить объект
Customer
.- Если
Customer
уже создан, запросить его через метод GetCustomerByID или GetCustomers с параметромexternal_id
. - Если для текущего авторизованного пользователя ещё не создан
Customer
, создать его через метод CreateCustomer.
- Если
- Получить объект
Order
.- Если
Order
уже создан, запросить его через метод GetOrderByID или GetOrders с параметромexternal_id
. Крайне рекомендуется выполнить этот шаг для того, чтобы избежать дублирования заказов и возможного дублирования оплат. - Если для текущего заказа еще не создан
Order
, создать его через метод CreateOrder. В параметрах передать значениеcustomer_id
, это нужно, чтобы при оплате новой картой, ее можно было сохранить для текущего пользователя.
- Если
- Вернуть
access_token
-ы из полученных объектовOrder
иCustomer
.
Пример:
API_URL = "https://stage-api.ioka.kz"
API_KEY = 'YOUR_API_KEY'
app = Flask()
app.route('/startPaymentWithSavedCard', methods=['POST'])
def start_payment_with_saved_card():
order = customer = None # Инициализация `Order` и `Customer` объектов
# Получаем тело запроса с необходимыми свойствами (`external_id`, `amount`, `description` и т.д.)
payload = json.loads(request.data)
# 1: Запрашиваем объект `Customer` с помощью `external_id`
response = requests.get(
url=f"{API_URL}/v2/customers",
headers={
'API-KEY': API_KEY
},
params={
'external_id': payload['customer_external_id']
}
)
if response.status_code == 200:
# `Customer` найден. Парсим и сохраняем объект.
customer = response.json()[0]
elif response.status_code == 404:
# `Customer` не найден. Создаём новый объект путём передачи `external_id`, `email` и (опционально) `phone`
response = requests.post(
url=f"{API_URL}/v2/customers",
headers={
'Content-Type': 'application/json',
'API-KEY': API_KEY
},
json={
"external_id": payload['customer_external_id'],
"email": payload['email'],
"phone": payload['phone']
}
)
if response.status_code == 200:
# `Customer` создан. Парсим и сохраняем объект.
customer = response.json()
if customer is None:
# Что-то пошло не так. Обрабатываем и возвращаем ошибку.
return jsonify({
'status': 'error'
})
# 2: Запрашиваем объект `Order` с помощью `external_id`
response = requests.get(
url=f"{API_URL}/v2/orders",
headers={
'API-KEY': API_KEY
},
params={
'external_id': payload['order_external_id']
}
)
if response.status_code == 200:
# `Order` найден. Парсим и сохраняем объект.
order = response.json()[0]
# Дополнительно: Можно обновить свойство `customer_id` у объекта `Order` если оно отличается от того, которое было получено в объекте `Customer`
elif response.status_code == 404:
# `Order` не найден. Создаём новый объект путём передачи `external_id`, `amount` и (опционально) `customer_id`
response = requests.post(
url=f"{API_URL}/v2/orders",
headers={
'Content-Type': 'application/json',
'API-KEY': API_KEY
},
json={
"external_id": payload['order_external_id'],
"amount": payload['amount'],
"customer_id": customer['id'],
# `customer_id` это свойство того объекта `customer`, который мы только что создали
}
)
if response.status_code == 200:
# `Order` создан. Парсим и сохраняем объект.
order = response.json()
if order:
# 3. Валидные объекты `Order` и `Customer` доступны. Возвращаем `access_token` обоих объектов.
return jsonify({
"order_access_token": order['access_token'],
"customer_access_token": customer['access_token']
})
# Что-то пошло не так. Обрабатываем и возвращаем ошибку.
return jsonify({
'status': 'error'
})
При необходимости создайте вебхуки, чтобы обрабатывать изменения состояния заказа. Скорее всего, вам понадобится обрабатывать события оплаты или авторизации платежа.