Взаимодействие с POS - терминальными устройствами и системами коммутации банков - PullRequest
6 голосов
/ 22 ноября 2011

У меня есть проект, в котором мне нужно взаимодействовать с POS - терминальными устройствами и магнитными / чип-картами.Скажем, всякий раз, когда покупатель покупает товар в моем универмаге, сотрудники этого магазина будут раздевать его финансовые карты и совершать платежные транзакции.

Для подобных систем большинство форумов говорят, что следует использовать третье.сторонний API, например:

  • PayPal
  • Braintree
  • Authorize.NET.
  • API Google Check-Out.

Но я думаю, что эти API-интерфейсы следует использовать для такой системы, которая пойдет на международную обработку платежей.Что касается меня, я предполагаю, что моя система не такая большая, как международная система обработки платежей, и начнет работать как небольшая внутренняя система.

Так что я хотел бы знать, что будет лучшим решением и какархитектура системы будет?

Когда я прочитал страницу Authorize.Net , я обнаружил процедуру Обработка кредитной карты .

  • Нужно ли мне следовать всей этой процедуре, независимо от того, является ли мой проект большим или маленьким, международным или внутренним?

  • Мне действительно нужно следовать этой процедуре, чтобы произвести оплатупроцесс с POS - терминальными устройствами?

Одна вещь, которую я знаю, это то, что ISO 8583 является основным протоколом обмена финансовыми сообщениями, потому что большая часть системы программного обеспечения банковской коммутации, для моегорегион, используйте только эти форматы сообщений.Это означает, что я не могу использовать другой формат сообщений, такой как NDC или D912.

1 Ответ

5 голосов
/ 02 декабря 2011

Authorize.net очень прост в использовании. Все, что вам нужно сделать для обработки карт, это отправить сообщение https в формате XML. Есть несколько примеров на сайте разработчиков Authorize.net. Что касается считывания карт, большинство карт-ридеров эмулируют нажатия клавиш. Размах карты выглядит примерно так:

'%B5500692805076849^SMITH/STEPHEN A^12041010000000      00969000000?;5500692805076849=12041010000000969?`

Затем проанализируйте номер карты "5500692805076849", имя "SMITH / STEPHEN A" и дату окончания срока действия "1204" и передать их на Authorize.net

Private Sub cmdCharge_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdCharge.Click
    ' By default, this sample code is designed to post to our test server for
    ' developer accounts: https://test.authorize.net/gateway/transact.dll
    ' for real accounts (even in test mode), please make sure that you are
    ' posting to: https://secure.authorize.net/gateway/transact.dll
    cmdCharge.Enabled = False
    lblResponse.Text = "Processing....."
    Application.DoEvents()
    Dim post_url
    post_url = "https://test.authorize.net/gateway/transact.dll"

    Dim post_values As New Dictionary(Of String, String)

    'the API Login ID and Transaction Key must be replaced with valid values
    post_values.Add("x_login", "XXXXXXX")
    post_values.Add("x_tran_key", "XXXXXXXXX")
    'post_values.Add("x_test_request", "TRUE")
    post_values.Add("x_delim_data", "TRUE")
    post_values.Add("x_delim_char", "|")
    post_values.Add("x_relay_response", "FALSE")

    post_values.Add("x_type", "AUTH_CAPTURE")
    post_values.Add("x_method", "CC")
    post_values.Add("x_card_num", txtCard.Text)
    post_values.Add("x_exp_date", txtExp.Text)

    post_values.Add("x_amount", txtAmount.Text)
    'post_values.Add("x_description", "Sample Transaction")

    post_values.Add("x_first_name", txtFirst.Text)
    post_values.Add("x_last_name", txtLast.Text)
    'post_values.Add("x_address", "1234 Street")
    'post_values.Add("x_state", "WA")
    post_values.Add("x_zip", txtZip.Text)
    post_values.Add("x_card_code", txt3CV.Text)

    ' Additional fields can be added here as outlined in the AIM integration
    ' guide at: http://developer.authorize.net

    ' This section takes the input fields and converts them to the proper format
    ' for an http post.  For example: "x_login=username&x_tran_key=a1B2c3D4"
    Dim post_string As String = ""
    For Each field As KeyValuePair(Of String, String) In post_values
        post_string &= field.Key & "=" & field.Value & "&"
    Next
    ' post_string = Left(post_string, Len(post_string) - 1)
    post_string = post_string.Substring(0, Len(post_string) - 1)

    ' create an HttpWebRequest object to communicate with Authorize.net
    Dim objRequest As HttpWebRequest = CType(WebRequest.Create(post_url), HttpWebRequest)
    objRequest.Method = "POST"
    objRequest.ContentLength = post_string.Length
    objRequest.ContentType = "application/x-www-form-urlencoded"

    ' post data is sent as a stream
    Dim myWriter As StreamWriter = Nothing
    myWriter = New StreamWriter(objRequest.GetRequestStream())
    myWriter.Write(post_string)
    myWriter.Close()

    ' returned values are returned as a stream, then read into a string
    Dim objResponse As HttpWebResponse = CType(objRequest.GetResponse(), HttpWebResponse)
    Dim responseStream As New StreamReader(objResponse.GetResponseStream())
    Dim post_response As String = responseStream.ReadToEnd()
    responseStream.Close()

    ' the response string is broken into an array
    Dim response_array As Array = Split(post_response, post_values("x_delim_char"), -1)

    ' the results are output to the screen in the form of an html numbered list.
    Select Case response_array(0)

        Case "1" 'Approved
            lblResponse.Text = "Transaction Approved. " & vbCrLf & response_array(4)

        Case "2" 'Declined
            lblResponse.Text = "Transaction Declined. " & vbCrLf & response_array(3)

        Case "3" 'Error
            lblResponse.Text = "Transaction Error. " & vbCrLf & response_array(3)

        Case "4" 'Held for Review
            lblResponse.Text = "Transaction Held. " & vbCrLf & response_array(3)

    End Select

    ' individual elements of the array could be accessed to read certain response
    ' fields.  For example, response_array(0) would return the Response Code,
    ' response_array(2) would return the Response Reason Code.
    ' for a list of response fields, please review the AIM Implementation Guide

    cmdCharge.Enabled = True
End Sub
...