Интеграция с платежным шлюзом 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

В 2-3 раза экономнее и быстрее, чем заказная разработка
Более гибкая, чем коробочные решения и облачные сервисы
Используйте готовые решения и изменяйте под свои потребности
Нужна бесплатная консультация?
Планируете делать веб-проект?
Сайт использует Cookie. Правила конфиденциальности OK