Как стать автором
Обновить

Интеграция с Робокассой (ASP.NET)

Время на прочтение4 мин
Количество просмотров2.8K
Задача: Организовать приём электронных денег.
Был некий проект, который подразумевал отъем денег у пользователей за определённые услуги. В качестве инструмента отъема была выбрана робокасса – ресурс серьёзный, удобный, развивающийся (недавно прикрутили оплату СМСками, присутствует, но пока не активна, оплата кредитными картами).

Итак, регистрируемся.

После регистрации указываем некоторые данные для взаимодействия с робокассой:

Идея сайта: Каждый пользователь регистрируется, пополняет свой баланс на сайте, и, собственно, тратит эти деньги на услуги.

Пользователь зарегистрировался.

Пополнить баланс: для этого надо отправить своеобразно сформированный запрос на URL робокассы. Для отправки запроса использую следующий класс:
Public Class RemotePost
  Private Inputs As System.Collections.Specialized.NameValueCollection = New System.Collections.Specialized.NameValueCollection

  Public Url As String = ""
  Public Method As String = «post»
  Public FormName As String = «form1»
  Public Sub Add(ByVal name As String, ByVal value As String)
    Inputs.Add(name, value)
  End Sub
  Public Sub Post()
    System.Web.HttpContext.Current.Response.Clear()
    System.Web.HttpContext.Current.Response.Write("<html><head>")
    System.Web.HttpContext.Current.Response.Write(String.Format("</head><body onload="«document.{0}.submit()»">", FormName))
    System.Web.HttpContext.Current.Response.Write(String.Format("<form name=""{0}"" method=""{1}"" action=""{2}"" >", FormName, Method, Url))
    Dim i As Integer = 0
    Do While i < Inputs.Keys.Count
      System.Web.HttpContext.Current.Response.Write(String.Format("<input name=""{0}"" type="«hidden»" value=""{1}"">", Inputs.Keys(i), Inputs(Inputs.Keys(i))))
      i += 1
    Loop
    System.Web.HttpContext.Current.Response.Write("</form>")
    System.Web.HttpContext.Current.Response.Write("</body></html>")
    System.Web.HttpContext.Current.Response.End()
  End Sub
End Class

Формируем запрос:
Dim myremotepost As RemotePost = New RemotePost()
myremotepost.Add(«out_summ», txtPay.Text)
'сколько пользователь отдаёт
myremotepost.Add(«mrh», «mylogin»)
'id продовца в робокассе
Dim temp As Integer = pay.Add(txtPay.Text, Membership.GetUser.UserName, Now)
'класс pay – средство взаимодействия с таблицей pay
'(поля: pay – сумма платежа, user – имя платящего пользователя, date – дата платежа,
'id – идентификатор, статус – «ОК», когда платёж прошел).
'Pay.add – заполняет все поля, возвращает id.
myremotepost.Add(«inv_id», temp)
'id платежа
myremotepost.Add(«inv_desc», «бла бла бла»)
'описание платежа, отображается в робокассе
myremotepost.Add(«crc», md5.MD5Hash(«mylogin:» & txtPay.Text.Trim & ":" & temp & ":secret_1"))
'контрольная сумма MD5 — строка представляющая собой 32-разрядное число
'в 16-ричной форме и любом регистре (всего 32 символа 0-9, A-F).
'Формируется по строке, содержащей все обязательные параметры,
'разделенные ':', с добавлением Пароль #1
myremotepost.Url = «www.roboxchange.com/ssl/calc.asp»
'отправили запрос
myremotepost.Post()

После работает робокасса, если всё ок, то вам вернётся запрос на «Success URL».
Ловим его:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    Dim str As String = ""
    Dim h As String = ""
    Dim id As String = ""
    If Not (Request.Form(«out_summ») Is Nothing) Then
      str += (Request.Form(«out_summ»)) & ":"
    End If
    If Not (Request.Form(«inv_id») Is Nothing) Then
      str += (Request.Form(«inv_id»)) & ":"
      id = (Request.Form(«inv_id»))
    End If
    If Not (Request.Form(«crc») Is Nothing) Then
      h += (Request.Form(«crc»))
    End If
    str += «secret_2»
   'Пароль #2
    If md5.MD5Hash(str) = h Then
      pay.ok(id)
      'pay.ok – по id находит платёж, ставит его статус как «ок»
        'и добавляет сумму платежа пользователю.
      Response.Write(«OK» & id)
        'ответили робокассе, что запрос обработан
    End If
End Sub

Собственно, всё, пользователь получил деньги на свой счет, может тратить =)
_________________________
Класс md5
Public Class md5
  Shared Function MD5Hash(ByVal instr As String) As String
    Dim strHash As String = String.Empty

    For Each b As Byte In New System.Security.Cryptography.MD5CryptoServiceProvider().ComputeHash(Encoding.[Default].GetBytes(instr))
      strHash += b.ToString(«X2»)
    Next
    Return strHash
End Function

Описание интерфейсов/Примеры как для ASP.NET, так и для других языков:
www.robokassa.ru/Doc/Ru/Interface.aspx
Красивые скобки на совести Source Code Highlighter
Теги:
Хабы:
Всего голосов 17: ↑13 и ↓4+9
Комментарии6

Публикации