9 Stimmen

ASP.NET Paypal IPN gibt VERIFIED zurück, aber IPN kann nicht gesendet werden

Ich werde versuchen, direkt auf den Punkt zu kommen. Ich arbeite derzeit mit PayPal IPN und habe dieses Problem noch nie gesehen. Ich habe PayPal IPN verwendet und meine Implementierungen waren immer die gleichen. Dieses Mal jedoch führt es zu sehr merkwürdigen Ergebnissen.

Ich bin derzeit bei WinHost.com untergebracht.

Verwendeter Code:

public void MakeHttpPost()
    {

        ErrorLog log = new ErrorLog();
        //Post back to either sandbox or live
        string strSandbox = "https://www.sandbox.paypal.com/cgi-bin/webscr";
        string strLive = "https://www.paypal.com/cgi-bin/webscr";
        HttpWebRequest req = (HttpWebRequest)WebRequest.Create(strSandbox);

        //Set values for the request back
        req.Method = "POST";
        req.ContentType = "application/x-www-form-urlencoded";
        byte[] param = HttpContext.Current.Request.BinaryRead(HttpContext.Current.Request.ContentLength);
        string strRequest = Encoding.ASCII.GetString(param);
        strRequest += "&cmd=_notify-validate";
        req.ContentLength = strRequest.Length;

        //for proxy
        //WebProxy proxy = new WebProxy(new Uri("http://url:port#"));
        //req.Proxy = proxy;

        //Send the request to PayPal and get the response
        StreamWriter streamOut = new StreamWriter(req.GetRequestStream(), System.Text.Encoding.ASCII);
        streamOut.Write(strRequest);
        streamOut.Close();
        StreamReader streamIn = new StreamReader(req.GetResponse().GetResponseStream());
        string strResponse = streamIn.ReadToEnd();
        streamIn.Close();
        log.error = strResponse;
        log.Insert();

        if (strResponse == "VERIFIED")
        {
            PaypalPaymentHistory PPH = new PaypalPaymentHistory();

            PPH.LastName = HttpContext.Current.Request["last_name"];
            PPH.FirstName = HttpContext.Current.Request["first_name"];
            PPH.State = HttpContext.Current.Request["address_state"];
            PPH.Zipcode = HttpContext.Current.Request["address_zip"];
            PPH.Address = HttpContext.Current.Request["address_street"];
            PPH.UserName = HttpContext.Current.Request["option_name2"];
            PPH.PaymentStatus = HttpContext.Current.Request["payment_status"];
            PPH.SelectedPackage = HttpContext.Current.Request["option_selection1"];
            PPH.PayerStatus = HttpContext.Current.Request["payer_status"];
            PPH.PaymentType = HttpContext.Current.Request["payment_type"];
            PPH.PayerEmail = HttpContext.Current.Request["payer_email"];
            PPH.ReceiverId = HttpContext.Current.Request["receiver_id"];
            PPH.TxnType = HttpContext.Current.Request["txn_type"];
            PPH.PaymentGross = HttpContext.Current.Request["payment_gross"];

            PPH.Insert();

        }
        else if (strResponse == "INVALID")
        {
            //log for manual investigation
        }
        else
        {
            //log response/ipn data for manual investigation
        }

    }

Die Idee hier ist, dass ich den Status der Bestellung überprüfen und dann einfügen oder nicht den Datensatz in die Datenbank einfügen, aber dieser Code ist noch in Tests, so dass nichts offiziell ist.

Das Problem, das ich habe, ist, dass, wenn ich durch Sandbox laufen und machen eine Zahlung über meine Website Paypal sendet die IPN-Anfrage. Der Eintrag wird in die Datenbank geworfen und alle Daten werden korrekt zurückgesendet, aber PayPal zeigt an, dass die IPN-Post "fehlgeschlagen" ist und immer auf "Wiederholung" steht. Ich erhalte jedoch "VERIFIED" in strResponse zurück. Dies wiederum führt zu bis zu 8 Datensätzen pro Transaktion. Der Fehler, den paypal meldet, ist 500 - Internal Server Error. Jede Hilfe wäre wahnsinnig geschätzt, da dies ein 2 Tage Kopf bashing Marathon bis zu diesem Punkt gewesen ist!

Danke für jede Hilfe oder Lösung!

P.S. Ich habe fast jede IPN-Frage auf Stackoverflow gelesen und habe nichts dergleichen gesehen.

6voto

rick schott Punkte 20895

Ihre Controller-Aktion schlägt fehl, wenn PayPal ein 500 . Sie müssen den Code debuggen und herausfinden, woran es liegt. Wenn Ihr Controller keine 200 zurück, PayPal wird es weiter versuchen.

Ich mache das immer:

    public ActionResult IPN()
    {     
        //try catch log all my payment info

        //always return blank page so paypal gets a HTTP 200
        return View();
    }

//Sie kennen das vielleicht schon, aber für alle anderen hier ein Beispiel für den Ablauf

  1. Zahlung/Transaktion an PayPal
  2. IPN-Adresse ist für PayPal-Transaktion konfiguriert dann Beiträge an die IPN-Adresse dh: http://yourdomain.com/IPN.aspx
  3. IPN.aspx verarbeitet die IPN-Post und schreibt PaypalPaymentHistory in die Datenbank.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X