2011-04-21 42 views
5

我有测试应用程序集成了PayPal快速结帐,它运行良好。但现在看来有些问题。在PayPal成功付款后,当我的IPN处理程序检查响应PayPal时将响应返回为HTML页面而不是“VERIFIED”或“INVALID”,因此我无法验证付款。 PayPal最近是否有任何更改用于快速结账?下面是完整的代码PayPal快速结帐返回MVC中的HTML响应.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处理程序代码:

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; 

编辑: 这里被请求字符串发送到贝宝

CONTEXT = wtgSziM4C5x0SI-9CmKcv2vkSeTLK5P_g6HqzC__YTYkcqziFNcB84p79Ja & myAllTextSubmitID = & CMD = _flow & transaction_subject = 12 & txn_type = web_acce PT & PAYMENT_DATE = 01%3A59%3A21 +月+ 02%2C + 2011 + PDT &姓氏=用户& residence_country = CA & pending_reason = paymentreview & ITEM_NAME =付款为+当然+注册& payment_gross = & mc_currency = CAD &业务+ = pramod_1298956597_biz%40sumerusolutions.com & payment_type =即时& protection_eligibility =不合格的& payer_status =验证& verify_sign = Ag7LtkvrF1u9.1ScLJwRM4btR1G1A16qsCs-xUl6EpI1rE1UWpodXJsc & txn_id = 15Y20623GD922445F & PAYER_EMAIL = pramod_1298961722_per%40sumerusolutions.com &税= 0.00 &的test_ipn = 1 &如first_name =测试& RECEIVER_EMAIL = pramod_1298956597_biz%40sumerusolutions.com &量= 1 & payer_id = Z2MRT3Q9L6E28 & receiver_id = RT3M59WESZHEE & = ITEM_NUMBER & PAYMENT_STATUS =待定& handling_amount = 0.00 &航运= 0.00 & mc_gross = 850.00 &定制= 12 &字符集=窗口1252 & notify_version = 3.1 & merchant_return_link =点击+此处& form_charset = UTF-8CONTEXT = wtgSziM4C5x0SI-9CmKcv2vkSeTLK5P_g6HqzC__YTYkcqziFNcB84p79Ja & myAllTextSubmitID = & CMD = _flow & transaction_subject = 12 & txn_type = web_accept & PAYMENT_DATE = 01%3A59%3A21 +月+ 02%2C + 2011 + PDT &姓氏=用户& residence_country = CA & pending_reason = paymentreview & ITEM_NAME =付款为+当然+注册& payment_gross + = & mc_currency = CAD &业务= pramod_1298956597_biz%40sumerusolutions.com & payment_type =即时& protection_eligibility =不合格的& payer_status =验证& verify_sign = Ag7LtkvrF1u9.1ScLJwRM4btR1G1A16qsCs-xUl6EpI1rE1UWpodXJsc & txn_id = 15Y20623GD922445F & PAYER_EMAIL = pramod_129896172 2_per%40sumerusolutions.com & tax = 0.00 & test_ipn = 1 & first_name =测试& receiver_email = pramod_1298956597_biz%40sumerusolutions。COM &数量= 1 & payer_id = Z2MRT3Q9L6E28 & receiver_id = RT3M59WESZHEE & ITEM_NUMBER = & PAYMENT_STATUS =待定& handling_amount = 0.00 &运费= 0.00 & mc_gross = 850.00 &定制= 12 &的charset =窗口1252 & notify_version = 3.1 & merchant_return_link =点击+ here & form_charset = UTF-8 & cmd = _notify-validate

回答

5

好的。经过大量的试验和错误,并在贝宝论坛发布这个问题,我得到了我的支付网关工作。虽然我对解决方案并不满意,但解决方案是使用PDT,不使用IPN。我从PayPal支持获得的回复是 “问题是IPN是一个额外的通知系统,它有一点延迟,所以它不是100%完美的自动回复页面的解决方案。”

贝宝建议我使用光动力疗法,它现在工作。我把此处的步骤,以便它可以帮助别人谁也面临着这样的问题:

  1. 激活“自动返回”和PDT在您的PayPal帐户功能。步骤: 登录到您的PayPal帐户 点击个人资料 点击网站付款习惯设定 设置自动返回到在 在返回URL文本框中 集付款数据传输上输入一个有效的URL。记下显示的PDT令牌。 滚动到页面底部并单击“保存”

  2. 将以下参数传递给paypal cmd,business,item_name,amount,return,currency_code,custom。

  3. 与PDT代码更改IPN处理程序代码,在我的情况PDT代码为如下─

    串的authToken,txToken,查询; 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

您需要显示正在返回的html。您的帐户很有可能被暂停或Paypal正在对您做出回应。你能告诉我们HTML吗?

+0

嗨nEEbz,请参阅我的文章上面更新以上贝宝的回复。我对此毫无头绪,即使付款成功,也会发生这种情况。 PS - 这是从沙盒,我没有测试实际的PayPal网站上的代码。在进入实际站点之前,我首先要在沙箱上进行确认。 – pramodtech 2011-04-23 08:20:55

0

首先,我建议你去Paypal developer support site。虽然他们可能需要一些时间来回答您的问题,但那里的人员对Paypal非常有经验,我相信他们能够给您一个答案。

在您的特定问题上,我的Paypal体验中的&,我相信有两种类型的贝宝帐户。

第一种类型的帐户允许您的网站作为一个第三方 - 那就是:

  • 用户提交您的网站上
  • 你的网站贝宝通信,接收响应
  • 付款信息
  • 您可以在网站上向用户显示该回复

这显然是您要做的。

不过,我相信还有第二种Paypal账户。这个帐户可能会更便宜,具有较少限制条件或条件限制条件,或只是更简单的集成(否则我不知道为什么会选择它)。我相信这个帐户需要你的网站将用户重定向到PayPal,在那里他们将得到回应。

  • 在用户提交付款信息
  • 您重定向到贝宝
  • 他们看到的付款状态或一些其他的消息,可以点击一个链接,回到你的(供应商)网站。

我可能是错的,但这是我对使用Paypal API的回忆。我强烈建议你去上面链接的Paypal开发者网站。

0

我有完全相同的问题,试图建立IPN ......我有工作,当我从送它将返回验证了沙箱的“电子支票”,但是当我尝试做一个快递结帐它不会返回验证或无效...它返回的东西完全不同于echeck ...它非常奇怪。

我会试着问技术支​​持与这两项服务有什么不同。

0

IPN确实从C#的工作,我也有同样的问题,因为你(得到的是要让我登录的HTML页面),然后我发现我错过了在我的帖子下面的变量回PayPal

cmd=_notify-validate 

只要我正确添加,PayPal的请求按预期工作。

另一件需要确认的事情是,当IPN请求中收到变量时,将变量传递回来,只需将上述命令附加到回发的开头即可。

我没有使用MVC,但我正在用WCF做这件事,它的作用就像一个魅力。

希望有所帮助。