parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Ты скажи с чем проблема...

Sumo 27.11.2017 11:47 / 27.11.2017 11:49

Я недавно подключал к своему билингу интернет-эквайринг. Так там у сбера достаточно удобный rest-интерфейс. Если не заморачиваться со всякими возвратами (делать из через веб-инетрфес банка, если понадобится), то нужно реализовать всего две функции — выставить счет, проверить счет.

Другое дело как ты это будешь у себя обрабатывать в «билинге». Как минимум надо сделать атк, чтобы второй раз оплата не проходила, но это на уровне СУБД сделать несложно.

Код вроде примитивный:
@CLASS
pfSberbankCardsRest

@USE
pf/types/pfClass.p
pf/io/pfCFile.p
pf/tests/pfAssert.p

@BASE
pfClass

@create[aOptions]
## aOptions.timeout(10)
## aOptions.userName
## aOptions.password
  ^cleanMethodArgument[]
  ^BASE:create[]
  ^pfAssert:isTrue(def $aOptions.userName)[Не задат userName магазина.]
  ^pfAssert:isTrue(def $aOptions.password)[Не задат password для магазина.]

  $_urlPrefix[https://3dsec.sberbank.ru/payment/rest/]
  $_userName[$aOptions.userName]
  $_password[$aOptions.password]

  $_timeout(^aOptions.timeout.int(10))

@_formatDate[aDate][locals]
  $d[^date::create[$aDate]]
  $result[^d.year.format[%04d]-^d.month.format[%02d]-^d.day.format[%02d]T^d.hour.format[%02d]:^d.minute.format[%02d]:^d.month.second.format[%02d]]

@createOrder[aBill;aOptions]
## aBill.orderID - номер заказа
## aBill.amount - сумма выставляемого счёта в рублях.
## aBill.comment - комментарий.
## aOptions.returnURL — адрес страницы возврата в магазин
  ^cleanMethodArgument[aBill]
  ^cleanMethodArgument[]
  ^pfAssert:isTrue(def $aBill.orderID)[Не задан номер заказа.]
  ^pfAssert:isTrue($aBill.amount > 0)[Сумма счета должна быть положительной.]
  $result[]

  $lResponse[^pfCFile:load[text;$_urlPrefix/register.do;
    $.method[GET]
    $.chrset[utf-8]
    $.any-status(true)
    $.timeout($_timeout)
    $.form[
      $.userName[$_userName]
      $.password[$_password]
      $.orderNumber[$aBill.orderID]
      $.amount[^math:ceiling($aBill.amount*100)]
      ^if(def $aBill.comment){
        $.description[$aBill.comment]
      }
      $.returnUrl[$aOptions.returnURL]
    ]
  ]]
  ^if($lResponse.status ne "200"){
    ^throw[pfSberbankCardsRest.fail;HTTP error $lResponse.status;$lResponse.text]
  }
  $result[^json:parse[^taint[as-is][$lResponse.text]]]

@orderStatus[aSBOrderID;aOptions]
  ^cleanMethodArgument[]
  ^pfAssert:isTrue(def $aSBOrderID)[Не задан номер заказа в системе Сбербанка.]
  $result[]

  $lResponse[^pfCFile:load[text;$_urlPrefix/getOrderStatus.do;
    $.method[GET]
    $.chrset[utf-8]
    $.any-status(true)
    $.timeout($_timeout)
    $.form[
      $.userName[$_userName]
      $.password[$_password]
      $.orderId[$aSBOrderID]
    ]
  ]]
  ^if($lResponse.status ne "200"){
    ^throw[pfSberbankCardsRest.fail;HTTP error $lResponse.status;$lResponse.text]
  }
  $result[^json:parse[^taint[as-is][$lResponse.text]]]