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 = "customer@test.ru",
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 = "customer@test.ru",
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