Публічний
Google Pay
Зручний спосіб оплати від Google.
Схема роботи API оплата карткою server-server
Отримання платіжних даних:
Параметри постачальника платіжних послуг:
const gateway = 'liqpay';
const gatewayMerchantId = 'public_key';
(Публічний ключ - ідентифікатор магазину. Отримати ключ можна в налаштуваннях магазину)
Доступні платіжні системи:
const allowedCardNetworks = ["MASTERCARD", "VISA"];
Доступні методи авторизації:
const allowedCardAuthMethods = ["PAN_ONLY", "CRYPTOGRAM_3DS"];
BillingAddress та ShippingAddress:
Ніяких додаткових BillingAddress або ShippingAddress параметрів не потрібно
Приклад коду відображення кнопки і отримання платежів для веб-сайту:
const baseRequest = {
apiVersion: 2,
apiVersionMinor: 0
};
const allowedCardNetworks = ["MASTERCARD", "VISA"];
const allowedCardAuthMethods = ["PAN_ONLY", "CRYPTOGRAM_3DS"];
const tokenizationSpecification = {
type: 'PAYMENT_GATEWAY',
parameters: {
'gateway': 'liqpay',
'gatewayMerchantId': 'your public key'
}
};
const baseCardPaymentMethod = {
type: 'CARD',
parameters: {
allowedAuthMethods: allowedCardAuthMethods,
allowedCardNetworks: allowedCardNetworks
}
};
const cardPaymentMethod = Object.assign(
{},
baseCardPaymentMethod,
{
tokenizationSpecification: tokenizationSpecification
}
);
let paymentsClient = null;
function getGoogleIsReadyToPayRequest() {
return Object.assign(
{},
baseRequest,
{
allowedPaymentMethods: [baseCardPaymentMethod]
}
);
}
function getGooglePaymentDataRequest() {
const paymentDataRequest = Object.assign({}, baseRequest);
paymentDataRequest.allowedPaymentMethods = [cardPaymentMethod];
paymentDataRequest.transactionInfo = getGoogleTransactionInfo();
paymentDataRequest.merchantInfo = {
merchantId: '12345678901234567890',
merchantName: 'Example Merchant'
};
return paymentDataRequest;
}
function getGooglePaymentsClient() {
if ( paymentsClient === null ) {
paymentsClient = new google.payments.api.PaymentsClient({environment: 'PRODUCTION'});
}
return paymentsClient;
}
function onGooglePayLoaded() {
const paymentsClient = getGooglePaymentsClient();
paymentsClient.isReadyToPay(getGoogleIsReadyToPayRequest())
.then(function(response) {
if (response.result) {
addGooglePayButton();
}
})
.catch(function(err) {
console.error(err);
});
}
function addGooglePayButton() {
const paymentsClient = getGooglePaymentsClient();
const button = paymentsClient.createButton({onClick: onGooglePaymentButtonClicked});
document.getElementById('container').appendChild(button);
}
function getGoogleTransactionInfo() {
return {
countryCode: 'US',
currencyCode: 'USD',
totalPriceStatus: 'FINAL',
// set to cart total
totalPrice: '1.00'
};
}
function prefetchGooglePaymentData() {
const paymentDataRequest = getGooglePaymentDataRequest();
paymentDataRequest.transactionInfo = {
totalPriceStatus: 'NOT_CURRENTLY_KNOWN',
currencyCode: 'USD'
};
const paymentsClient = getGooglePaymentsClient();
paymentsClient.prefetchPaymentData(paymentDataRequest);
}
function onGooglePaymentButtonClicked() {
const paymentDataRequest = getGooglePaymentDataRequest();
paymentDataRequest.transactionInfo = getGoogleTransactionInfo();
const paymentsClient = getGooglePaymentsClient();
paymentsClient.loadPaymentData(paymentDataRequest)
.then(function(paymentData) {
processPayment(paymentData);
})
.catch(function(err) {
console.error(err);
});
}
function processPayment(paymentData) {
const gpay_token_object = paymentData.paymentMethodData.tokenizationData.token;
const gpay_token = btoa(gpay_token_object); // base64 encode
// send gpay_token to liqpay api
}
Оплата з використанням отриманих платежів:
Формування запиту до API при самостійній інтеграції:
Необхідні URL для роботи в залежності від обраної моделі:
- https://www.liqpay.ua/api/request — Server-Server;
- https://www.liqpay.ua/api/3/checkout — Client-Server;
Для виклику API LiqPay необхідно передати параметри data і signature (Server - Server) POST методом або перенаправити клієнта (Client-Server) використовуючи POST метод, де:
data
- json рядок з параметрами APIs закодована функцією base64, base64_encode( json_string ),
signature
- унікальний підпис кожного запиту base64_encode( sha1( private_key + data + private_key) ),
base64_encode
- повертає рядок, закодований методом base64,
sha1
- повертає хеш у вигляді бінарного рядку з 20 символів.
Формування data і signature, приклад:
Для підключення прийому оплати через LiqPay, формуємо json рядок з параметрами виклику апі, де:
Parameter | Required | Type | Description | |
---|---|---|---|---|
version | Required | Number | Версія API. Наприклад: 3 | |
public_key | Required | String | Публічний ключ - ідентифікатор створеної компанії. Наприклад: i00000000 | |
private_key | Required | String | Приватний ключ створеної компанії (не надається нікому крім Вашого розробника). Наприклад: a4825234f4bae72a0be04eafe9e8e2bada209255 | |
action | Required | String | Тип операції. Можливі значення: pay - платіж, hold - блокування коштів на рахунку відправника, subscribe - регулярний платіж, paydonate - пожертва, auth - предавторізація картки | |
amount | Required | Number | Сума платежу. Наприклад: 5, 7.34 | |
currency | Required | String | Валюта платежу. Можливі значення:USD, EUR, UAH. Додаткові валюти можуть бути встановлені за запитом компанії | |
description | Required | String | Призначення платежу | |
order_id | Required | String | Унікальний ID покупки у Вашому магазині. Максимальна довжина 255 символів |
Більше параметрів в документації
Приклад створення json_string:
json_string =
{"public_key":"i00000000","version":"3","action":"pay","amount":"3","currency":"UAH","description":"test","order_id":"000001"}
Приклад кодування json_string функцією base64_encode, компанія отримує data:
data = eyJwdWJsaWNfa2V5IjoiaTAwMDAwMDAwIiwidmVyc2lvbiI6IjMiLCJhY3Rpb24iOiJwYXkiLCJhbW91bnQiOiIzIiwiY3VycmVuY3kiOiJVQUgiLCJkZXNjcmlwdGlvbiI6InRlc3QiLCJvcmRlcl9pZCI6IjAwMDAwMSJ9
Приклад формування signature, компанія формує рядок sign_string шляхом конкатенації private_key + data + private_key:
sign_string = a4825234f4bae72a0be04eafe9e8e2bada209255eyJwdWJsaWNfa2V5IjoiaTAwMDAwMDAwIiwidmVyc2lvbiI6IjMiLCJhY3Rpb24iOiJwYXkiLCJhbW91bnQiOiIzIiwiY3VycmVuY3kiOiJVQUgiLCJkZXNjcmlwdGlvbiI6InRlc3QiLCJvcmRlcl9pZCI6IjAwMDAwMSJ9a4825234f4bae72a0be04eafe9e8e2bada209255
Після застосування функцій base64_encode( sha1( sign_string) ) отримуємо рядок:
signature = wR+UZDC4jjeL/qUOvIsofIWpZh8=
Приклад відправки запиту до LiqPay:
1.Для перенаправлення клієнта на сторінку оплати LiqPay (Client - Server) необхідно сформувати HTML-форму:
<form method="POST" action="https://www.liqpay.ua/api/3/checkout" accept-charset="utf-8">
<input type="hidden" name="data"
value="eyJwdWJsaWNfa2V5IjoiaTAwMDAwMDAwIiwidmVyc2lvbiI6IjMiLCJhY3Rpb24iOiJwYXkiLCJhbW91bnQiOiIzIiwiY3VycmVuY3kiOiJVQUgiLCJkZXNjcmlwdGlvbiI6InRlc3QiLCJvcmRlcl9pZCI6IjAwMDAwMSJ9"/>
<input type="hidden" name="signature" value="wR+UZDC4jjeL/qUOvIsofIWpZh8="/><input
type="image" src="//static.liqpay.ua/buttons/payUk.png"/></form>
<input type="hidden" name="data"
value="eyJwdWJsaWNfa2V5IjoiaTAwMDAwMDAwIiwidmVyc2lvbiI6IjMiLCJhY3Rpb24iOiJwYXkiLCJhbW91bnQiOiIzIiwiY3VycmVuY3kiOiJVQUgiLCJkZXNjcmlwdGlvbiI6InRlc3QiLCJvcmRlcl9pZCI6IjAwMDAwMSJ9"/>
<input type="hidden" name="signature" value="wR+UZDC4jjeL/qUOvIsofIWpZh8="/><input
type="image" src="//static.liqpay.ua/buttons/payUk.png"/></form>
2.Для взаємодії (Server - Server) отримані data і signature необхідно відправити на url https://www.liqpay.ua/api/request:
curl --silent -XPOST https://www.liqpay.ua/api/request --data-
urlencodedata="eyJwdWJsaWNfa2V5IjoiaTAwMDAwMDAwIiwidmVyc2lvbiI6IjMiLCJhY3Rpb24iOiJwYXkiLCJhbW91bnQiOiIzIiwiY3VycmVuY3kiOiJVQUgiLCJkZXNjcmlwdGlvbiI6InRlc3QiLCJvcmRlcl9pZCI6IjAwMDAwMSJ9"/>
--data-urlencode
signature="wR+UZDC4jjeL/qUOvIsofIWpZh8="
urlencodedata="eyJwdWJsaWNfa2V5IjoiaTAwMDAwMDAwIiwidmVyc2lvbiI6IjMiLCJhY3Rpb24iOiJwYXkiLCJhbW91bnQiOiIzIiwiY3VycmVuY3kiOiJVQUgiLCJkZXNjcmlwdGlvbiI6InRlc3QiLCJvcmRlcl9pZCI6IjAwMDAwMSJ9"/>
--data-urlencode
signature="wR+UZDC4jjeL/qUOvIsofIWpZh8="
3.Статус операції буде відправлений на server_url
4.Успішне завершення оплати
Параметри для формування data:
Parameter | Required | Type | Description | |
---|---|---|---|---|
version | Required | Number | Версія API. Поточне значення - 3 | |
public_key | Required | String | Публічний ключ - ідентифікатор магазину. Отримати ключ можна в налаштуваннях магазину | |
action | Required | String | pay | |
paytype | Required | String | gpay | |
amount | Required | Number | Сума платежу. Наприклад: 5, 7.34 | |
gpay_token | Required | String | JSON рядок з параметра token (отриманий від Google), закодований функцією base64 | |
order_id | Required | String | Унікальний ID покупки у Вашому магазині. Максимальна довжина 255 символів | |
currency | Required | String | Валюта платежу. Можливі значення: USD, EUR, UAH | |
description | Required | String | Призначення платежу | |
language | Optional | String | Мова клієнта uk, en | |
result_url | Optional | String | URL у Вашому магазині на який покупця буде переадресовано після завершення покупки. Максимальна довжина 510 символів | |
server_url | Optional | String | URL API в Вашому магазині для повідомлень про зміну статусу платежу (сервер -> сервер). Максимальна довжина 510 символів. Детальніше |
Параметри розщеплення платежу:
Parameter | Required | Type | Description | |
---|---|---|---|---|
split_tickets_only | Optional | Boolean | Ознака не фактичного розщеплення. Якщо значення split_tickets_only: true та массив split_rules передаються, платіж пройде без фактичного розщеплення на декількох отримувачів |
Параметри відповіді:
Parameter | Type | Description | |
---|---|---|---|
language | String | Мова клієнта uk, en | |
result | String | Результат виконання запиту ok, error | |
confirm_phone | String | Телефон платника. На цей номер було відправлено OTP пароль підтвердження платежу та підв‘язаний кабінет платника LiqPay. Телефон вказується в міжнародному форматі (Україна +380). Наприклад: +380950000001 (з +) або 380950000001 (без +) |
Приклад відповіді:
{
"action": "pay",
"payment_id": 165172,
"status": "success",
"version": 3,
"type": "buy",
"paytype": "gpay",
"public_key": "i000000000",
"acq_id": 414963,
"order_id": "98R1U1OV1485849059893399",
"liqpay_order_id": "NYMK3AE61501685438251925",
"description": "description",
"sender_phone": "380950000001",
"sender_first_name": "first_name",
"sender_last_name": "last_name",
"sender_card_mask2": "473118*50",
"sender_card_bank": "pb",
"sender_card_type": "visa",
"sender_card_country": 804,
"dcc_allowed": [{
"amount": 3.5984,
"rate": 27.7905,
"commission": 0.0,
"currency": "USD"
}],
"ip": "8.8.8.8",
"card_token": "CDRES215658546306B200061FCC53A86B",
"amount": 100.0,
"currency": "UAH",
"sender_commission": 0.0,
"receiver_commission": 0.0,
"agent_commission": 0.0,
"amount_debit": 100.0,
"amount_credit": 100.0,
"commission_debit": 0.0,
"commission_credit": 0.0,
"currency_debit": "UAH",
"currency_credit": "UAH",
"sender_bonus": 0.0,
"amount_bonus": 0.0,
"bonus_type": "bonusplus",
"bonus_procent": 0.0,
"authcode_debit": "388000",
"authcode_credit": "329007",
"rrn_debit": "000663747000",
"rrn_credit": "000663747003",
"mpi_eci": "7",
"language":"uk",
"result":"ok",
"confirm_phone": "380680375936",
"is_3ds": false,
"create_date": 1501685446633,
"end_date": 1501685446633,
"transaction_id": 165172
}