Интеграция с платежным шлюзом LifePay

Платежный шлюз LifePay позволяет организовать прием средст на сайте. 

Сайт шлюза - https://life-pay.ru

Выставление счета: https://apidoc.life-pay.ru/bill/index/#create

Оповещение о результате: https://apidoc.life-pay.ru/notification/index#

Выставление счета

Узнаем в ЛК lifepay свой апи-ключ, сохраняем в настройках

Создаем вызов внешнего АПИ (например, в форме в SaveItem в SELECT 2).

Исходящий апи-запрос (request)

CREATE PROCEDURE [dbo].[api_lifepay_bill_request]
@parameters ExtendedDictionaryParameter READONLY,  -- (Key, Value2)
@username nvarchar(32)  -- current site user
AS
BEGIN
declare @finID int=isnull(try_cast((SELECT Value2 from @parameters where [Key]='finID') as int),0)  –документ, с которого берем параметры

-- SELECT 1  Msg, Result, Url (outer request url)
select '' Msg, 1 Result, 'https://api.life-pay.ru/v1/bill' Url 

declare @prm nvarchar(max)=
(select '{"apikey":"'+dbo.as_setting('lifepay_key','')+'",'+
         ' "login":"'+dbo.as_setting('lifepay_login','')+'",'+
         ' "amount":'+cast(f.amount as nvarchar)+','+
         ' "description":"Оплата за заказ '+cast(o.id as nvarchar)+' от '+convert(nvarchar,o.created,104)+'",'+
         ' "customer_phone":"'+u.phone+'",'+ –телефон в формате 7хххххххххх
         ' "customer_email":"'+u.email+'"}'
         from srv_finances f
            join srv_orders o on o.id=f.orderID
            join as_users u on u.id in(f.userFromID,f.userToID)
         where f.id=@finID)

–заносим в протокол
insert as_trace(header,[text],code,created) values('lifepay request','prm='+@prm,'lifepay',getdate())

-- SELECT 2 PARAMETERS - request parameters
select 'data' name, @prm value, 'json' [type]

END

API-ответ (response)

CREATE PROCEDURE [dbo].[api_lifepay_bill_response]
@response nvarchar(max),
@parameters ExtendedDictionaryParameter READONLY,  --(Key, Value2 - same as in request)
@username nvarchar(32)
AS
BEGIN
declare @finID int=isnull(try_cast((SELECT Value2 from @parameters where [Key]='finID') as int),0)
declare @code int=-1, @msg nvarchar(max)='not json'
    if isJson(@response)=1 select @code=isnull(try_cast(json_value(@response,'$.code')as int),-2), @msg=isnull(json_value(@response,'$.message'),'')

–протоколируем
insert as_trace(header,[text],code,created) values('lifepay response',left('code='+cast(@code as nvarchar)+',message='+@msg+',other='+@response,2000),'lifepay',getdate())

–если ошибок нет - запоминаем внешний ИД счета
if @code=0 update srv_finances set lifepay_num=json_value(@response,'$.data.number') where id=@finID
    if @code>0 update srv_finances set statusID=(select id from srv_financeStatuses where code='error') where id=@finID

-- SELECT 1
select '' Msg, 1 Result, @response Response
-- SELECT 2 Outer actions
END

Оповещение о проведении операции

Cоздаем обработку входящего вызова АПИ

в настройках ЛК lifepay в закладке интеграции прописываем путь к методу

CREATE PROCEDURE [dbo].[api_lifepay-status_lifepay-status]
@parameters ExtendedDictionaryParameter READONLY,
@username nvarchar(256)
as
begin
declare @s nvarchar(max)=isnull((select value2 from @parameters where [key]='data'),'')
    
–протоколируем

    insert as_trace(header,[text],code,created) values('lifepay      webhook',left(@s,2000),'lifepay',getdate())

    if isJson(@s)=0 begin
        select 'Ошибка: запрос не в JSON' Msg, 0 Result, 405 errorCode
        return
    end

    declare @num nvarchar(50)=json_value(@s,'$.number')
    declare @status nvarchar(50)=json_value(@s,'$.status')
    declare @finID int=isnull((select id from srv_finances where lifepay_num=@num),0)
    if @finID=0 begin
        select 'Ошибка: не найден первичный документ' Msg, 0 Result, 404 errorCode
        return
    end
    

-- SELECT 1 - API result metadata
select '' Msg, 1 Result, 0 errorCode
--select 2
    update srv_finances set statusID=(select id from srv_financeStatuses where code=iif(@status='success','pay','error')), statusDate=getdate() where id=@finID

    declare @orderID int=(select orderID from srv_finances where id=@finID)

exec dbo.srv_orderChangeStatus @orderID=@orderID, @status='', @comment='', @username='admin' –обработка смены статуса документа



-- SELECT 2 -  API data with free col names

end
Falcon Space - функциональная веб-платформа разработки на узком стеке MS SQL/Bootstrap. Вводная по Falcon Space
Насколько полезной была статья?

Google поиск по нашей документации

Falcon Space

Это снижение стоимости владения

за счет меньшего количества людей для поддержки и узкого стека разработки. Про снижение стоимости владения продуктом

Это быстрое внесение изменений

по ходу эксплуатации программы. Как создается функционал на платформе

Это простой удобный интерфейс

адаптация под мобильные устройства. Про юзабилити платформы

Нужна бесплатная консультация?
Получить оценку проекта
Создайте концепцию проекта на основе нашего шаблона и получите оценку проекта в виде КП.
Демо-сайт решений
Базисные решения, которые можно гибко адаптировать под себя: менять внешний вид, бизнес-логику и даже структуру базы данных.
Сайт использует Cookie. Правила конфиденциальности OK