SDK модуль для внедрения эквайринга Райффайзенбанка.
Установка с помощью nugget:
nuget install Raiffeisen.Ecom**Raiffeisenbank e-commerce API: https://pay.raif.ru/doc/ecom.html
Для использования SDK требуется секретный ключ secretKey и идентификатор мерчанта publicId, подробности в документации и на сайте банка.
var ecom = Ecom.Create(
secretKey: "***",
publicId: "***"
);Параметры конструктора:
secretKey- секретный ключ, обязательный;publicId- идентификатор мерчанта, обязательный;host- хост api, по умолчаниюhttps://e-commerce.raiffeisen.ru;fingerprint- отпечаток User-Agent для клиента, не обязательный;client- HTTP клиент, не обязательный;converter- конвертор JSON, не обязательный;validator- валидатор моделей, не обязательный.
Пользователь совершает следующие действия в процессе платежа:
- Выбирает товары/услуги в корзину магазина и нажимает кнопку “Оплатить”;
- Партнер открывает платежную форму;
- Клиент вводит реквизиты на платежной форме и подтверждает платеж.
Метод PostCallbackUrl устанавливает адресс приема событий.
ecom.PostCallbackUrl<Model.Callback.CallbackResponse,>(
new Model.Callback.CallbackRequest
{
CallbackUrl = "http://test.ru/"
}
);Метод GeneratePayUrl возвращает ссылку на платежную форму.
ecom.GeneratePayUrl(
new Model.Pay.PayParams
{
Amount = 9.99M,
OrderId = "testOrder",
SuccessUrl = "http://test.ru/"
}
);Вывод:
https://e-commerce.raiffeisen.ru/pay/?publicId=***&amount=10&orderId=testOrder&successUrl=http%3A%2F%2Ftest.ru%2F
Метод PostPayUrl возвращает ссылку платежную форму в виде html-страницы.
await ecom.PostPay(
new Raiffeisen.Ecom.Model.Pay.PayRequestReceipt120
{
Amount = 9.99M,
OrderId = "testOrder",
SuccessUrl = "http://test.ru/",
Receipt = new Model.Receipt120.Receipt120Request
{
customer = new Model.Receipt120.Customer,
items = new []
}
}
);Метод GetPayJs вернет JavaScript для отображения платежной формы в браузере.
Данный метод подходит для передачи чеков.
ecom.GetPayJs(
new Raiffeisen.Ecom.Model.Pay.PayRequestReceipt105
{
Amount = 10M,
OrderId = "testOrder",
Receipt = new Model.Receipt105.Receipt105Request
{
Items = new [
new Model.Receipt105.Item
{
Name = "Тестовый товар",
Price = 10M,
Quantity = 1M,
PaymentObject = Model.Receipt105.PaymentObject.Commodity,
PaymentMode = Model.Receipt105.PaymentMode.FullPrepayment,
Amount = 10M,
VatType = Model.Receipt105.VatType.Vat20
}
]
}
}
);Вывод:
(({
publicId,
formData,
url = 'https://e-commerce.raiffeisen.ru/pay',
method = 'openPopup',
sdk = 'PaymentPageSdk',
src = 'https://pay.raif.ru/pay/sdk/v2/payment.styled.min.js',
}) => new Promise((resolve, reject) => {
const openPopup = () => {
new this[sdk](publicId, {url})[method](formData).then(resolve).catch(reject);
};
if (!this.hasOwnProperty(sdk)) {
const script = this.document.createElement('script');
script.src = src;
script.onload = openPopup;
script.onerror = reject;
this.document.head.appendChild(script);
} else openPopup();
}))({
"publicId": "***",
"url": "https://e-commerce.raiffeisen.ru/pay",
"formData": {
"orderId": "testOrder",
"amount": 10,
"receipt": {
"items": [
{
"name": "Тестовый товар",
"price": 10,
"quantity": 1,
"paymentObject": "COMMODITY",
"paymentMode": "FULL_PAYMENT",
"amount": 10,
"vatType": "VAT20"
}
]
}
}
})Данный JS можно встроить на страницу непосредственно с помощью тега SCRIPT или использовать как Promise в собственных сценариях.
Метод GetOrderTransaction возвращает информацию о статусе транзакции.
await ecom.GetOrderTransaction(
new Model.Order.OrderParams
{
OrderId = "testOrder"
}
);Вывод:
new Model.Transaction.TransactionResponse
{
Code = Model.Response.Code.Success,
Transaction = new Model.Transaction.Transaction
{
Id = 120059,
OrderId = "testOrder",
Status = new Model.Transaction.Status
{
Value = Model.Transaction.Value.SUCCESS,
Date = DateTimeOffset.ParseExact('2019-07-11T17:45:13+03:00', Util.DateTimeOffsetConverter.Format)
},
PaymentMethod = Model.Transaction.PaymentMethod.Acquiring,
PaymentParams = new Model.Transaction.PaymentParams
{
Rrn = 935014591810,
AuthCode = 25984
},
Amount = 12500.5M,
Comment = "Покупка шоколадного торта",
Extra = new
{
additionalInfo = "Sweet Cake"
}
}
};Метод PostOrderRefund создает возврат по заказу.
await ecom.PostOrderRefund(
new Model.Refund.RefundParams
{
OrderId = "testOrder",
RefundId = "testRefund"
},
new Model.Refund.RefundRequest
{
Amount = 150
}
);Вывод:
new Model.Refund.RefundResponse
{
Code = Model.Response.Code.Success,
Amount = 150,
RefundStatus = Model.Refund.RefundStatus.InProgress
};Метод GetOrderRefund возвращает статус возврата.
await ecom.GetOrderRefund(
new Model.Refund.RefundParams
{
OrderId = "testOrder",
RefundId = "testRefund"
}
);Вывод:
new Model.Refund.RefundStatusResponse
{
Code = Model.Response.Code.Success,
Amount = 150,
RefundStatus = Model.Refund.RefundStatus.Completed
};Метод GetOrder возвращает данные о заказе.
await ecom.GetOrder(
new Model.Order.OrderParams
{
OrderId = "testOrder"
}
);Вывод:
new Model.Order.OrderResponse
{
Amount = 12500.5M,
Comment = "Покупка шоколадного торт",
Extra = new
{
AdditionalInfo = "sweet cake"
},
Status = new Model.Order.Status
{
Value = Model.Order.New,
Date = DateTimeOffset.ParseExact('2019-08-24T14:15:22+03:00', Util.DateTimeOffsetConverter.Format)
},
ExpirationDate = DateTimeOffset.ParseExact('2019-08-24T14:15:22+03:00', Util.DateTimeOffsetConverter.Format)
};Метод DeleteOrder удаляет заказ, если он не был оплачен.
await ecom.DeleteOrder(
new Model.Order.OrderParams
{
OrderId = "testOrder"
}
);Методы GetOrderReceipts105 и GetOrderReceipts120 возвращают список чеков соответствующей версии.
await ecom.GetOrderReceipts105(
new Model.Order.OrderParams
{
OrderId = "testOrder"
}
);Вывод:
new []
{
new Model.Receipt105.Receipt105Response
{
ReceiptNumber = "3000827351831",
ReceiptType = Model.Receipt105.ReceiptType.Refund,
Status = Model.Receipt105.Status.Done,
OrderNumber = "testOrder",
Total = 1200,
new Model.Receipt105.Customer
{
Email = "[email protected]",
Name = "Иванов Иван Иванович"
},
new []
{
new Model.Receipt105.Item
{
Name = "Шоколадный торт",
Price = 1200,
Quantity = 1,
PaymentObject = Model.Receipt105.PaymentObject.Commodity,
PaymentMode = Model.Receipt105.PaymentMode.FullPrepayment,
MeasurementUnit = "шт",
NomenclatureCode = "00 00 00 01 00 21 FA 41 00 23 05 41 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 12 00 AB 00",
VatType = Model.Receipt105.VatType.Vat20,
AgentType = Model.Receipt105.AgentType.Another,
SupplierInfo = new Model.Receipt105.SupplierInfo
{
Phone = "+79991234567",
Name = "ООО «Ромашка»",
Inn = "1234567890"
}
}
}
}
};Методы GetOrderRefundReceipt105 и GetOrderRefundReceipt120 возвращают чек возврата соответствующей версии.
await ecom.GetOrderRefundReceipt105(
new Model.Refund.RefundParams
{
OrderId = "testOrder",
RefundId = "testRefund"
}
);Вывод:
new Model.Receipt105.Receipt105Response
{
ReceiptNumber = "3000827351831",
ReceiptType = Model.Receipt105.ReceiptType.Refund,
Status = Model.Receipt105.Status.Done,
OrderNumber = "testOrder",
Total = 1200,
new Model.Receipt105.Customer
{
Email = "[email protected]",
Name = "Иванов Иван Иванович"
},
new []
{
new Model.Receipt105.Item
{
Name = "Шоколадный торт",
Price = 1200,
Quantity = 1,
PaymentObject = Model.Receipt105.PaymentObject.Commodity,
PaymentMode = Model.Receipt105.PaymentMode.FullPrepayment,
MeasurementUnit = "шт",
NomenclatureCode = "00 00 00 01 00 21 FA 41 00 23 05 41 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 12 00 AB 00",
VatType = Model.Receipt105.VatType.Vat20,
AgentType = Model.Receipt105.AgentType.Another,
SupplierInfo = new Model.Receipt105.SupplierInfo
{
Phone = "+79991234567",
Name = "ООО «Ромашка»",
Inn = "1234567890"
}
}
}
};Метод IsValidPaymentNotification проверяет подпись уведомления о платеже.
var signature = "***";
var eventBody = @"{
""event"": ""payment"",
""transaction"": {
""id"": 120059,
""orderId"": ""testOrder"",
""status"": {
""value"": ""SUCCESS"",
""date"": ""2019-07-11T17:45:13+03:00""
},
""paymentMethod"": ""acquiring"",
""paymentParams"": {
""rrn"": 935014591810,
""authCode"": 25984
},
""amount"": 12500.5,
""comment"": ""Покупка шоколадного торта"",
""extra"": {
""additionalInfo"": ""Sweet Cake""
}
}
}";
Asset.isTrue(
ecom.IsValidPaymentNotification(json, hash)
);- .Net Core 3.1 или .Net 6.0 Framework