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.Это необходимо проверить на удаленном доступном сервере.