PayPal Ipn с MVC 3 vb.net Status 200, но не регистрирует транзакцию вообще ... - PullRequest
1 голос
/ 23 октября 2011

Используя VB MVC 3 с Razor ... я могу создать PayPal IPN в любом контроллере?скажем, я поставил его в свой контроллер, скажем, IPN.Не будет ли тогда URL-адрес http://www.testsite.com/IPN?и если это правильно.Нужно ли создавать пустую страницу просмотра с именем Ipn или как вообще называется действие Ipn ??С этой точки зрения нужно ли содержать какой-либо синтаксис бритвы?Я был четвертым после каждого поста, который я мог найти о IPN, но для MVC 3 vb.net ничего нет. Это было отредактировано ... Я получил статус обработчика IPN, возвращающий 200. И когда я запускаю его черезтестер я получаю успех ... Однако фактические тестовые транзакции не вводятся в базу данных ... Кто-нибудь знает, почему это может быть ????Функция контроллера Ipn такова:

    End Function
<AcceptVerbs(HttpVerbs.Post)>
Function IPN_Handler(ByVal sender As Object, ByVal e As System.EventArgs)
    Dim strFormValues As String = Request.Form.ToString()
    Dim strNewValue

    Dim Txn_id As String = Request.Form("txn_id")
    Dim mc_gross_1 As String = Request.Form("mc_gross_1")
    Dim mc_gross_2 As String = Request.Form("mc_gross_2")
    Dim mc_gross_3 As String = Request.Form("mc_gross_3")
    Dim mc_gross_4 As String = Request.Form("mc_gross_4")
    Dim num_cart_items As String = Request.Form("num_cart_items")
    Dim Receiver_email As String = Request.Form("receiver_email")
    Dim Item_name1 As String = Request.Form("item_name1")
    Dim Item_name2 As String = Request.Form("item_name2")
    Dim Item_name3 As String = Request.Form("item_name3")
    Dim Item_name4 As String = Request.Form("item_name4")
    Dim Quantity As String = Request.Form("quantity")
    Dim Invoice As String = Request.Form("invoice")
    Dim Custom As Integer = Request.Form("custom")
    Dim transaction_subject As Integer = Request.Form("transaction_subject")
    Dim Payment_status As String = Request.Form("payment_status")
    Dim Pending_reason As String = Request.Form("pending_reason")
    If Payment_status <> "Pending" Then
        Pending_reason = " "
    End If
    Dim Payment_date As String = Request.Form("payment_date")
    Dim Payment_fee As String = Request.Form("payment_fee")
    Dim Payment_gross As String = Request.Form("payment_gross")
    Dim Txn_type As String = Request.Form("txn_type")
    Dim First_name As String = Request.Form("first_name")
    Dim Last_name As String = Request.Form("last_name")
    Dim Address_street As String = Request.Form("address_street")
    Dim Address_city As String = Request.Form("address_city")
    Dim Address_state As String = Request.Form("address_state")
    Dim Address_zip As String = Request.Form("address_zip")
    Dim Address_country As String = Request.Form("address_country")
    Dim Address_status As String = Request.Form("address_status")
    Dim Address_country_code As String = Request.Form("address_country_code")
    Dim Payer_email As String = Request.Form("payer_email")
    Dim Payer_status As String = Request.Form("payer_status")
    Dim Payer_id As Integer = Request.Form("payer_id")
    Dim Payment_type As String = Request.Form("payment_type")
    Dim Notify_version As String = Request.Form("notify_version")
    Dim Verify_sign As String = Request.Form("verify_sign")
    Dim Ipn_Track_Id As String = Request.Form("ipn_track_id")

    Dim req As HttpWebRequest = CType(WebRequest.Create("https://www.sandbox.paypal.com/cgi-bin/webscr"),  _
                    HttpWebRequest)

    req.Method = "POST"
    req.ContentType = "application/x-www-form-urlencoded"
    strNewValue = strFormValues + "&cmd=_notify-validate"
    req.ContentLength = strNewValue.Length
    Dim stOut As StreamWriter = New StreamWriter(req.GetRequestStream(), _
                                                 Encoding.ASCII)

    stOut.Write(strNewValue)
    stOut.Close()

    Dim strResponse As HttpWebResponse = CType(req.GetResponse(), HttpWebResponse)
    Dim ipnResponseStream As Stream = strResponse.GetResponseStream
    Dim encode As Encoding = System.Text.Encoding.GetEncoding("utf-8")
    Dim readStream As New StreamReader(ipnResponseStream, encode)
    Dim read(256) As [Char]
    Dim count As Integer = readStream.Read(read, 0, 256)
    While count > 0
        Dim IpnResponse As New [String](read, 0, count)
        count = readStream.Read(read, 0, 256)

        If IpnResponse = "VERIFIED" Then
            Dim db As New mysql_31309_schoolEntities
            Dim _payment_tracker As New payment_tracker
            _payment_tracker.txn_id = Txn_id
            _payment_tracker.Class_1_ID = Item_name1
            _payment_tracker.Class_2_ID = Item_name2
            _payment_tracker.Class_3_ID = Item_name3
            _payment_tracker.Class_4_ID = Item_name4
            _payment_tracker.num_cart_items = num_cart_items
            _payment_tracker.reciever_email = Receiver_email
            _payment_tracker.payer_id = Custom
            _payment_tracker.payment_status = Payment_status
            _payment_tracker.payment_date = Payment_date
            _payment_tracker.first_name = First_name
            _payment_tracker.last_name = Last_name
            _payment_tracker.address1 = Address_street
            _payment_tracker.city = Address_city
            _payment_tracker.state = Address_state
            _payment_tracker.zipcode = Address_zip
            _payment_tracker.payment_fee = Payment_fee
            _payment_tracker.payment_gross = Payment_gross
            If Payment_status <> "Pending" Then
                _payment_tracker.pending_reason = " "
            Else
                _payment_tracker.payment_status = Payment_status
            End If
            _payment_tracker.ipn_track_id = Ipn_Track_Id
            db.payment_tracker.AddObject(_payment_tracker)
            db.SaveChanges()

        Else
            If Payment_status = "Completed" Then

                Dim reg As reg_info = db.reg_info.Single(Function(f) f.id = Payer_id)
                reg.paid = "Paid"
                reg.date_paid = Payment_date
                reg.payment_method = Payment_type
                db.SaveChanges()


            Else
                If IpnResponse = "INVALID" Then
                    Return Nothing

                End If
            End If

        End If

    End While

    readStream.Close()
    strResponse.Close()


    Return Nothing

End Function

1 Ответ

1 голос
/ 26 октября 2011

Paypal IPN и MVC 3 VB.NET в сочетании с удаленным хостингом могут быть чем-то большим, чем просто проблема ... Я, наконец, заработал ... Не создавая функцию контроллера вообще ... В итоге я сделал aspxприложение.для ipn .. Бросив его в корневую папку.Указание PayPal на файл ASPX.И затем сделать небольшую подпрограмму в моем реальном домашнем контроллере, которая проверяет изменения, внесенные в таблицу, в которую записывает ipn.Если он находит что-то новое и завершенное, он обрабатывает платеж оттуда.Это единственный способ, которым я не смог получить ошибку 500 ... Для успешной отладки ipn я фактически начал с простого исходного кода PayPal для ipn ... Получил, говоря, успешно на тестере IPN, оттуда ядобавил к нему небольшие блоки кода для каждой из задач, которые он должен выполнить ... Затем я снова запустил бы его через тестер PayPal IPN ... Если бы это было успешно, то я знал, что смогу продолжить с немного большим количеством кода... Если в 500 раз он потерпел неудачу в любое время, я узнал, что это было что-то в том, что я только что добавил ... Не очень я знаю, но я рассчитываю, что мои 2 недели перехода от работы к неудаче и не знаю, почему может помочь кому-то еще...

Не могу не подчеркнуть, насколько важна последняя часть этого.Просто сначала используйте базовый обработчик IPN, потому что отладка довольно сложна, поскольку ее невозможно отладить обычным образом через VS.Начните с малого и продолжайте тестирование с помощью ipn-тестера PayPal после каждого изменения, чтобы убедиться, что оно не сломано.

В интересах помощи другим людям, которые считают документацию слишком плохой.Ниже приведен рабочий пример обработчика IPN PayPal.

Представление asp.net - это просто пустая страница сервера asp.net, названная для этого примера IPN_Handler.ascx.И выглядит следующим образом:

<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="Ipn_Handler.aspx.vb" Inherits="yourNamespace.Ipn_Handler" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
  <title></title>
</head>
<body>
  <form id="form1" runat="server">
  <div>

  </div>
  </form>
</body>

И пример для кода файла выглядит следующим образом.Обратите внимание, что это исходит от работающего обработчика IPN, поэтому есть НЕСКОЛЬКО ссылок, которые вам могут не понадобиться.

  Imports System.Net
  Imports System.IO
  Imports System.Text
  Imports System.Collections.Specialized
  Imports System.Web.Mail
  Imports MySql.Data.MySqlClient
  Imports System.Security.Principal
  Imports System.Data
  Imports System.Linq
  Imports System.Web.Mvc
  Imports System.Reflection
  Imports System.Data.OleDb
  Imports System.ComponentModel

Public Class Ipn_Handler
 Inherits System.Web.UI.Page

  Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    Dim strFormValues As String = Request.Form.ToString()
    Dim strNewValue

    Dim Txn_id As String = Request.Form("txn_id")
    Dim mc_gross_1 As String = Request.Form("mc_gross_1")
    Dim mc_gross_2 As String = Request.Form("mc_gross_2")
    Dim mc_gross_3 As String = Request.Form("mc_gross_3")
    Dim mc_gross_4 As String = Request.Form("mc_gross_4")
    Dim num_cart_items As String = Request.Form("num_cart_items")
    Dim Receiver_email As String = Request.Form("receiver_email")
    Dim Item_name1 As String = Request.Form("item_name1")
    Dim Item_name2 As String = Request.Form("item_name2")
    Dim Item_name3 As String = Request.Form("item_name3")
    Dim Item_name4 As String = Request.Form("item_name4")
    Dim Quantity As String = Request.Form("quantity")
    Dim Invoice As String = Request.Form("invoice")
    Dim Custom As Integer = Request.Form("custom")
    Dim transaction_subject As Integer = Request.Form("transaction_subject")
    Dim Payment_status As String = Request.Form("payment_status")
    Dim Pending_reason As String = Request.Form("pending_reason")
    If Payment_status <> "Pending" Then
        Pending_reason = " "
    End If
    Dim Payment_date As String = Request.Form("payment_date")
    Dim Payment_fee As String = Request.Form("payment_fee")
    Dim Payment_gross As String = Request.Form("payment_gross")
    Dim Txn_type As String = Request.Form("txn_type")
    Dim First_name As String = Request.Form("first_name")
    Dim Last_name As String = Request.Form("last_name")
    Dim Address_street As String = Request.Form("address_street")
    Dim Address_city As String = Request.Form("address_city")
    Dim Address_state As String = Request.Form("address_state")
    Dim Address_zip As String = Request.Form("address_zip")
    Dim Address_country As String = Request.Form("address_country")
    Dim Address_status As String = Request.Form("address_status")
    Dim Address_country_code As String = Request.Form("address_country_code")
    Dim Payer_email As String = Request.Form("payer_email")
    Dim Payer_status As String = Request.Form("payer_status")
    Dim Payer_id As Integer = Request.Form("payer_id")
    Dim Payment_type As String = Request.Form("payment_type")
    Dim Notify_version As String = Request.Form("notify_version")
    Dim Verify_sign As String = Request.Form("verify_sign")
    Dim Ipn_Track_Id As String = Request.Form("ipn_track_id")

    Dim req As HttpWebRequest = CType(WebRequest.Create("https://www.sandbox.paypal.com/cgi-bin/webscr"),  _
                    HttpWebRequest)

    req.Method = "POST"
    req.ContentType = "application/x-www-form-urlencoded"
    strNewValue = strFormValues + "&cmd=_notify-validate"
    req.ContentLength = strNewValue.Length
    Dim stOut As StreamWriter = New StreamWriter(req.GetRequestStream(), _
                                                 Encoding.ASCII)

    stOut.Write(strNewValue)
    stOut.Close()

    Dim strResponse As HttpWebResponse = CType(req.GetResponse(), HttpWebResponse)
    Dim ipnResponseStream As Stream = strResponse.GetResponseStream
    Dim encode As Encoding = System.Text.Encoding.GetEncoding("utf-8")
    Dim readStream As New StreamReader(ipnResponseStream, encode)
    Dim read(256) As [Char]
    Dim count As Integer = readStream.Read(read, 0, 256)
    While count > 0
        Dim IpnResponse As New [String](read, 0, count)
        count = readStream.Read(read, 0, 256)

        If IpnResponse = "VERIFIED" Then
            '//Logic to handle what to do on Verified response.

            If Payment_status = "Completed" Then

                '// The Payment_status variable can be used to trap a completed payment response and do work.

                End If


            ElseIf IpnResponse = "INVALID" Then
            '// This is where possible hacking attempts will be caught by paypal and returned as invalid.
            Else


            End If

    End While

    readStream.Close()
    strResponse.Close()




End Sub

End Class

Простой способ проверить, поместили ли вы этот пример в правильное место для вашей настройки,перейти к самому IPN.Возможно, поместив простое сообщение в разметку представления страницы IPN_Handler.ascx.Независимо от того, какой URL вы используете для просмотра, вам нужно будет ввести его на PayPal в настройке IPN URL-адреса.Не сообщайте мне о проблемах с Localhost.Это необходимо проверить на удаленном доступном сервере.

...