2011-04-21 7 views
5

Tuve la aplicación de prueba integrada con Paypal express checkout y funcionaba bien. Pero ahora parece haber algún problema. Después del pago exitoso en paypal cuando mi manejador de IPN comprueba la respuesta, paypal devuelve la respuesta como página html en lugar de "VERIFICADA" o "NO VÁLIDA", y debido a esto no puedo verificar el pago. ¿Hay algún cambio en Paypal recientemente para el pago y envío rápido? A continuación se muestra el código completopago exprés de PayPal devolviendo la respuesta como html en MVC .net

<form id="Paypal" name="Paypal" action="https://www.sandbox.paypal.com/cgi-bin/webscr" 
    method="post"> 
    @Html.Hidden("cmd", "_xclick") 
    @Html.Hidden("business", "[email protected]") 
    @Html.Hidden("item_name", "Payment for course registration") 
    @Html.Hidden("amount", 100) 
    @Html.Hidden("no_shipping", "1") 
    @Html.Hidden("return", "http://localhost:49319/cart/IPN") 
    @Html.Hidden("rm", "2") 
    @Html.Hidden("notify_url", "http://localhost:49319/cart/IPN") 
    @Html.Hidden("cancel_return", "http://localhost:49319/cart/PaymentFailure") 
    @Html.Hidden("currency_code", "CAD") 
    @Html.Hidden("tax_cart", "1") 
    @Html.Hidden("custom", "12") 
    <div class="checkout-button"> 
     <input type="image" src="https://www.paypal.com/en_US/i/btn/btn_xpressCheckout.gif" 
      align="left" style="margin-right: 7px;" /> 
    </div> 
    </form> 

IPN código del controlador:

string paypalUrl = useSandbox ? "https://www.sandbox.paypal.com/cgi-bin/webscr" 
      : "https://www.paypal.com/cgi-bin/webscr"; 


     HttpWebRequest req = (HttpWebRequest)WebRequest.Create(paypalUrl); 

     // Set values for the request back 
     req.Method = "POST"; 
     req.ContentType = "application/x-www-form-urlencoded"; 

     byte[] param = Request.BinaryRead(Request.ContentLength); 
     string strRequest = Encoding.ASCII.GetString(param); 

     StringBuilder sb = new StringBuilder(); 
     sb.Append(strRequest); 

     foreach (string key in formVals.Keys) 
     { 
      sb.AppendFormat("&{0}={1}", key, formVals[key]); 
     } 
     strRequest += sb.ToString(); 
     req.ContentLength = strRequest.Length; 

     //for proxy 
     //WebProxy proxy = new WebProxy(new Uri("http://urlort#"); 
     //req.Proxy = proxy; 
     //Send the request to PayPal and get the response 
     string response = ""; 
     using (StreamWriter streamOut = new StreamWriter(req.GetRequestStream(), System.Text.Encoding.ASCII)) 
     { 

      streamOut.Write(strRequest); 
      streamOut.Close(); 
      using (StreamReader streamIn = new StreamReader(req.GetResponse().GetResponseStream())) 
      { 
       response = streamIn.ReadToEnd(); 
      } 
     } 

     return response; 

Editar: Aquí está cadena de solicitud enviado a PayPal

CONTEXTO = wtgSziM4C5x0SI-9CmKcv2vkSeTLK5P_g6HqzC__YTYkcqziFNcB84p79Ja & myAllTextSubmitID = & cmd = _flow & transaction_subject = 12 & txn_type = web_acce pt & payment_date = 01% 3A59% 3A21 + Mayo + 02% 2C + 2011 + PDT & last_name = Usuario & residence_country = CA & pending_reason = paymentreview & item_name = Pago + de + plato + registro & payment_gross = & mc_currency = CAD & negocio = pramod_1298956597_biz% 40sumerusolutions.com & payment_type = instante & protection_eligibility = No elegible & payer_status = verificada & verify_sign = Ag7LtkvrF1u9.1ScLJwRM4btR1G1A16qsCs-xUl6EpI1rE1UWpodXJsc & txn_id = 15Y20623GD922445F & PAYER_EMAIL = pramod_1298961722_per% 40sumerusolutions.com & impuesto = 0,00 & test_ipn = 1 & nombre apellido = Prueba & receiver_email = pramod_1298956597_biz% 40sumerusolutions.com & cantidad = 1 & payer_id = Z2MRT3Q9L6E28 & receiver_id = RT3M59WESZHEE & item_number = & payment_status = Pendiente de & handling_amount = 0.00 & envío = 0.00 = 850.00 mc_gross & & encargo = 12 & charset = windows-1252 & notify_version = 3,1 & merchant_return_link = + clic aquí & form_charset = UTF-8CONTEXT = wtgSziM4C5x0SI-9CmKcv2vkSeTLK5P_g6HqzC__YTYkcqziFNcB84p79Ja & myAllTextSubmitID = & cmd =_flowtransaction_subject = 12 & txn_type = web_accept & payment_date = 01% 3A59% 3A21 + Mayo + 02% 2C + 2011 + PDT & last_name = Usuario & residence_country = CA & pending_reason = paymentreview & item_name = Pago + de + plato + registro & payment_gross = & mc_currency = CAD & negocio = pramod_1298956597_biz% 40sumerusolutions.com & payment_type = instante & protection_eligibility = No elegible & payer_status = verificada & verify_sign = Ag7LtkvrF1u9.1ScLJwRM4btR1G1A16qsCs-xUl6EpI1rE1UWpodXJsc & txn_id = 15Y20623GD922445F & PAYER_EMAIL = pramod_129896172 2_per% 40sumerusolutions.com & tax = 0.00 & test_ipn = 1 & first_name = Test & receiver_email = pramod_1298956597_biz% 40sumerusolutions.com & cantidad = 1 & payer_id = Z2MRT3Q9L6E28 & receiver_id = RT3M59WESZHEE & item_number = & payment_status = Pendiente de & handling_amount = 0.00 & envío = 0.00 & mc_gross = 850.00 & encargo = 12 & charset = windows-1252 & notify_version = 3,1 & merchant_return_link = clic + aquí & form_charset = UTF-8 & cmd = _notify-validar

Respuesta

5

Ok. Después de muchos intentos de prueba y error y publicando este problema en el foro de PayPal, obtuve mi pasarela de pago en funcionamiento. Aunque no estoy muy satisfecho con la solución, la solución es usar PDT y no usar IPN. La respuesta que recibí del soporte de PayPal fue "El problema es que IPN es un sistema de notificación adicional y hay un poco de retraso en él. Por lo tanto, no es la solución perfecta al 100% para una página de autoretorno".

Paypal me sugirió que use PDT y está funcionando ahora.Voy a poner aquí los pasos para que pueda ayudar a alguien que también se enfrenta a dicha emisión:

  1. Active la función y PDT "AutoReturn" en su cuenta PayPal. Pasos: Ingrese a su cuenta de PayPal clic en el perfil clic en la página web Preferencias de pago establecer retorno automático a En introduzca una URL válida en el cuadro de texto URL de devolución conjunto de transferencia de datos de pago de encendido. Anote la ficha de PDT que se muestra. desplácese hasta la parte inferior de la página y haga clic en "Guardar"

  2. Pase debajo de los parámetros a paypal cmd, business, item_name, amount, return, currency_code, custom.

  3. Cambio IPN código del controlador con el código de PDT, el código de la TFD en mi caso es tan continuación-

    cadena authToken, txToken, consulta; string strResponse;

    authToken = ConfigurationManager.AppSettings["PDTToken"]; 
    
        //read in txn token from querystring 
        txToken = Request.QueryString.Get("tx"); 
    
    
        query = string.Format("cmd=_notify-synch&tx={0}&at={1}", txToken, authToken); 
    
        // Create the request back 
        string url = ConfigurationManager.AppSettings["PayPalUrl"]; 
        HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url); 
    
        // Set values for the request back 
        req.Method = "POST"; 
        req.ContentType = "application/x-www-form-urlencoded"; 
        req.ContentLength = query.Length; 
    
        // Write the request back IPN strings 
        StreamWriter stOut = new StreamWriter(req.GetRequestStream(), System.Text.Encoding.ASCII); 
        stOut.Write(query); 
        stOut.Close(); 
    
        // Do the request to PayPal and get the response 
        StreamReader stIn = new StreamReader(req.GetResponse().GetResponseStream()); 
        strResponse = stIn.ReadToEnd(); 
        stIn.Close();    
    
        // If response was SUCCESS, parse response string and output details 
        if (strResponse.StartsWith("SUCCESS")) 
        { 
    
        } 
    
0

Usted necesita demostrar a sí mismo el html que está siendo devuelto. Es muy probable que su cuenta haya sido suspendida o algo así y Paypal le está respondiendo algo. ¿Puedes mostrarnos ese HTML?

+0

Hola nEEbz, por favor vea la respuesta de paypal actualizada arriba en mi publicación. No tengo ni idea de esto, esto sucede siempre, incluso cuando el pago es exitoso. PD: esto es de Sandbox y no he probado el código en el sitio real de PayPal. Antes de ir con el sitio real, quiero confirmar primero en sandbox. – pramodtech

0

En primer lugar, le sugiero que vaya al Paypal developer support site. Aunque pueden tardar un poco en responder a su problema, la gente de allí tiene mucha experiencia con Paypal y estoy seguro de que podrá darle una respuesta.

En su problema particular, & en mi experiencia Paypal, creo que hay dos tipos de cuentas de Paypal.

El primer tipo de cuenta permite a su sitio web para actuar como un tercero - es decir:

  • el usuario envía la información de pago en su sitio web
  • su sitio web se comunica a Paypal, recibiendo una respuesta
  • puede mostrar esa respuesta al usuario en su sitio web

Esto es, obviamente, lo que está tratando de hacer.

Sin embargo, creo que hay un segundo tipo de cuenta de Paypal. Esta cuenta puede ser más barata, tener requisitos/términos menos restrictivos & condiciones, o simplemente más simple de integrar (de lo contrario, no estoy seguro de por qué la elegiría). Creo que esta cuenta requiere que su sitio web redirija al usuario a Paypal, donde se les dará una respuesta.

  • el usuario envía la información de pago
  • que los redirija a Paypal
  • que ven el estado de pago o algún otro mensaje y hacer clic en un enlace para volver a su sitio web (proveedor).

Podría estar equivocado, pero este es mi recuerdo de trabajar con Paypal API. Le sugiero encarecidamente que vaya al sitio para desarrolladores de Paypal, vinculado anteriormente.

0

estoy teniendo el mismo problema exacto intentando fijar IPN ... Tengo que trabajar cuando envío un "cheque electrónico" de la caja de arena se volverá VERIFICADO, sin embargo cuando intento hacer una pago exprés no será verificado o no válido ... devuelve algo totalmente diferente de echeck ... es muy extraño.

Voy a tratar de preguntar al soporte técnico cuál es la diferencia con estos dos servicios.

0

IPN funciona desde C#, que estaba teniendo el mismo problema que usted (obtener una página HTML que me pide login) y entonces me di cuenta de que estaba perdiendo la siguiente variable en mi post de nuevo a PayPal

cmd=_notify-validate 

tan pronto como lo agregué correctamente, la solicitud a PayPal funcionó como se esperaba.

Otra cosa de qué preocuparse es que devuelva las variables tal como se recibieron en la solicitud de IPN, solo agregue el comando anterior al comienzo de su publicación.

No estoy usando MVC pero estoy haciendo esto con WCF y funciona como un encanto.

Espero que ayude.

Cuestiones relacionadas