Datos personales

miércoles, 18 de abril de 2012

IPN Paypal – Retorno de Variables a Asp.net – Vb

Después de tanto tiempo he logrado recuperar las variables que retornan a mi Website después de un Pago hecho con Paypal. Voy a explicar cómo logramos nuestro objetivo:
Ipn Paypal: La Notificación de Pago Instantanea, es una   funcionalidad muy útil con la cual podemos interactuar con nuestra propia aplicación. Básicamente, nos da la posibilidad de tomar decisiones en el caso que el pago haya sido confirmado o bien ejecutar determinadas rutinas en nuestro programa si el pago no fue aceptado.
Para caso de ejemplo vamos a mutilizar una herramienta de prueba que nos da Paypal, llamada Sandbox, donde podemos crear cuentas de prueba y simular un caso de compra venta con dichas cuentas, claro está, con dinero ficticio
Pasos para configurar IPN
1.       Ingresamos al siguiente link https://developer.paypal.com/us/cgi-bin/ . Si no tenemos una cuenta Sandbox, creamos una. Al finalizar la creación de la cuenta nos llegará un email a nuestra cuenta de correo para dándonos la bienvenida a Sandbox. En mi caso, ya tengo una cuenta creada, así que procedo a Loguearme.
Nota: Tratar de evitar que la cuentas de correo y password sean las mismas de nuestra cuenta paypal, ya que si entregas estas credenciales a otra persona, tendrá acceso a tu cuenta Paypal


2.       Ya dentro de Sandbox vemos un Panel de opciones al lado izquierdo de la página. Ingresamos a la Opción Test Accounts. Aquí es donde crearemos nuestras cuentas de Prueba. Hacemos clic en “New Test Account: Preconfigured”
Nota: Es importante tomar nota del password autogenerado, para poder ingresar posteriormente a las cuentas de prueba
Primero creamos una cuenta Personal (cliente). Para ello elegimos la opción Buyer Aquí ingresamos los datos necesarios. El email lo dejamos igual, ya que Sandbox, generará una cuenta email aleatoria no real. En mi caso, como hará pruebas, en el campo Account Balance coloqué 5000 dólares de saldo. Hacemos clic en Create Account


3.       Ahora seguimos el PASO 2, y nuevamente creamos una cuenta, pero esta vez Cuenta Business (Opción Seller). Clic en Create Account

4.       Ahora nuestro Panel principal debería quedar de la siguiente forma:
En círculos estoy identificando los tipos de cuentas.



5.       Para mi ejemplo he creado una aplicación en Asp.net 2005 – Vb, con la que envio datos a Paypal, y luego recepciono las variables. Para ellos vamos a crear dos páginas:
La primera página tendrá la siguiente forma:

Y su codeBehind es el siguiente:
Partial Class paypal_sendPaypal
    Inherits System.Web.UI.Page

    Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim item As String = "Lapiz"
        Dim link As String = "https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_xclick&business=raydia_1334695546_biz@misitio.com&item_name=" + item + "&amount=" + CStr(50.5) + "&no_shipping=1&item_number=Feb2012004563" '         Response.Redirect(link)
    End Sub
End Class

Con este código, le indico a Paypal (Sandbox): la cuenta business (quien vende), el ítem (articulo), el amount(precio) y ítem_number (código del articulo)




La 2da página (para mi ejemplo) es una Página en blanco que al recibir los datos de PayPal (Sandbox), enviará un email a mi cuenta de correo (el manejo de la información recibida, depende de cada necesidad) con todos los datos recibidos
Muestro el codeBehind: ipn.aspx.vb
Nota: Esta clase la da Paypal, solo hay que adaptarla a lo que necesitamos https://cms.paypal.com/mx/cgi-bin/?cmd=_render-content&content_ID=developer/library_code_ipn_code_samples

Imports System.Net
Imports System.IO
Imports Capa_negocio
Partial Class paypal_ipn
    Inherits System.Web.UI.Page
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        'Aqui definimos de quein vamos a recibir valores de Paypal o Sandbox. Para este ejemplo usaremos la variable strSandbox
        Dim strSandbox As String = "https://www.sandbox.paypal.com/cgi-bin/webscr"
        Dim strLive As String = "https://www.paypal.com/cgi-bin/webscr"

        Dim req As HttpWebRequest = CType(WebRequest.Create(strSandbox), HttpWebRequest) ' creamos el request

        'Set values for the request back
        req.Method = "POST"
        req.ContentType = "application/x-www-form-urlencoded"
        Dim Param() As Byte = Request.BinaryRead(HttpContext.Current.Request.ContentLength)
        Dim strRequest As String = Encoding.ASCII.GetString(Param)

        strRequest = strRequest + "&cmd=_notify-validate" ' hasta aqui ya tenemos recuprados los valores
        Dim x As String = strRequest
        req.ContentLength = strRequest.Length

        'for proxy
        'Dim proxy As New WebProxy(New System.Uri("http://url:port#"))
        'req.Proxy = proxy

        'Send the request to PayPal and get the response
        Dim streamOut As StreamWriter = New StreamWriter(req.GetRequestStream(), Encoding.ASCII)
        streamOut.Write(strRequest)
        streamOut.Close()
        Dim streamIn As StreamReader = New StreamReader(req.GetResponse().GetResponseStream())
        Dim strResponse As String = streamIn.ReadToEnd()

        Dim objEmail As New clsEmail 'clase personalizada para envio de correos (propia)
        Dim SUBJECT As String


        If strResponse = "VERIFIED" Then ' si el proceso terminó correctamente
            SUBJECT = "Confirmación Paypal - BIEN - " & Date.Now
            Dim mensaje As String = ""
            Try
                'el strRequest, viene en un formato var=valor&var1=valor1....Por tanto lo descompongo con 2 SPLIT
                'El primero para separar por el caracter "&" : var=valor 
                'El segundo para separar por el caracter "=" :
                'Como las variables vienen de una url, vienen con una codificacion que no es totalmente legible
                '(ejemplo @ se representa por %40, ect) utilizamos HttpUtility.UrlDecode para decodificar los datos extraidos

                Dim descomponer() As String = strRequest.Split("&")
                For i As Integer = 0 To descomponer.Length - 1
                    Dim linea As String = descomponer(i)
                    Dim dividir() As String = linea.Split("=")
                    mensaje = mensaje & dividir(0) & vbTab & ":" & vbTab & HttpUtility.UrlDecode(dividir(1)) & vbCrLf
                Next
                objEmail.SendMail(objEmail.emailFrom, objEmail.mailPruebas, "", SUBJECT, "Paypal está OK - " & vbCrLf & mensaje, _
                    False, System.Net.Mail.MailPriority.High)
            Catch ex As Exception
                Throw
            End Try

        ElseIf strResponse = "INVALID" Then
            SUBJECT = "Confirmación Paypal - MAL - " & Date.Now
            Try
                objEmail.SendMail(objEmail.emailFrom, objEmail.mailPruebas, "", SUBJECT, "Paypal está INVALIDO", _
                    True, System.Net.Mail.MailPriority.High)
            Catch ex As Exception
                Throw
            End Try

            'log for manual investigation
        Else
            SUBJECT = "Confirmación Paypal - NO SE - " & Date.Now
            Try
                objEmail.SendMail(objEmail.emailFrom, objEmail.mailPruebas, "", SUBJECT, "Paypal está - NINGUNA", _
                    True, System.Net.Mail.MailPriority.High)
            Catch ex As Exception
                Throw
            End Try
            'Response wasn't VERIFIED or INVALID, log for manual investigation
        End If
        streamIn.Close()
    End Sub

End Class

6.       Ahora que ya tenemos nuestras páginas, vamos a configurar la Url de Retorno nuestra cuenta Business para que al finalizar un Pago PayPal, las variables retornen a nuestra página ipn.aspx. Para ello seleccionamos la cuenta Business y hacemos clic en ENTER SANSBOX TEST SITE


7.       Dentro de nuestra cuenta Business, hacemos clic en Perfil

8.       En Perfil, hacemos clic en la opción Preferencias de Notificación de Pago Instantanea

9.       Hacemos clic en Editar Configuración, y escribimos la dirección url de nuestra página IPN.aspx. También hacemos clic en Recibir mensajes IPN. Clic en Guardar


10.       Ok, hasta aquí ya tenemos configurada nuestra cuenta para que envie mensajes a nuestra página Ipn.aspx. Ahora probamos nuestra Aplicación





11.       Al revisar mi cuenta de correo Eléctrónico, llegó esto:

Espero haber sido de ayuda. Saludos