Интеграция PayPal с сайтом на основе WebMatrix (Razor / C #) - PullRequest
1 голос
/ 21 октября 2011

Я потратил бесчисленные часы, читая документы на сайте PayPal, а также на их сайте x.com, и искал это во всем Интернете, но, к сожалению, мне нужна некоторая помощь.

У меня есть услуга, которую я предлагаю на своем сайте, и все, что я пытаюсь сделать, это отправить клиента на сайт PayPal (что я могу сделать), и позволить ему оплатить (что они могут сделать), а затем иметьони будут перенаправлены обратно на мой сайт после того, как платеж будет одобрен / сделан (что и происходит), но на этом все и заканчивается ...

Я перепробовал так много учебников и примеров, и этостановится довольно сложно здесь.Я должен быть в состоянии сделать простые проверки на моем сайте (вещь IPN).Чтобы я знал, заплатил ли кто-то за услугу в PayPal или нет, поэтому я знаю, стоит ли мне активировать услугу на моем сайте для этого конкретного клиента.

Я знаю, что есть помощник PayPal, ноэто не поможет мне в этой ситуации, так как оно не имеет отношения к материалам IPN.

Примечание. Эта услуга не является услугой подписки, а является разовым платежом.

IБуду очень признателен за вашу помощь в этом, я действительно застрял и не знаю, что делать дальше.

ОБНОВЛЕНИЕ

Итак, я протестировал скрипт, который @Bobbyв его ответе, и я получаю сообщение об ошибке:

Server Error in '/' Application.
--------------------------------------------------------------------------------

Runtime Error 
Description: An application error occurred on the server. The current custom error settings for this application prevent the details of the application error from being viewed remotely (for security reasons). It could, however, be viewed by browsers running on the local server machine. 

Details: To enable the details of this specific error message to be viewable on remote machines, please create a <customErrors> tag within a "web.config" configuration file located in the root directory of the current web application. This <customErrors> tag should then have its "mode" attribute set to "Off".


<!-- Web.Config Configuration File -->

<configuration>
    <system.web>
        <customErrors mode="Off"/>
    </system.web>
</configuration>


Notes: The current error page you are seeing can be replaced by a custom error page by modifying the "defaultRedirect" attribute of the application's <customErrors> configuration tag to point to a custom error page URL.


<!-- Web.Config Configuration File -->

<configuration>
    <system.web>
        <customErrors mode="RemoteOnly" defaultRedirect="mycustompage.htm"/>
    </system.web>
</configuration>

ПРИМЕЧАНИЕ. После отключения пользовательских ошибок все равно получаю это сообщение.

ОБНОВЛЕНИЕ # 2

КогдаЯ пытаюсь вывести результат строки ipnPost = strRequest;отображается сообщение «статус недействителен - form_charset = UTF8»

Это все, что он говорит.Я не знаю, почему ..

ПОСЛЕДНИЕ ОБНОВЛЕНИЯ -

Теперь я получаю следующую ошибку, используя следующий код:

Ошибка сервера в '/'Приложение.

Вы должны записать байты ContentLength в поток запроса перед вызовом [Begin] GetResponse.Описание: во время выполнения текущего веб-запроса произошло необработанное исключение.Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде.

Сведения об исключении: System.Net.ProtocolViolationException: Вы должны записать байты ContentLength в поток запроса перед вызовом [Begin] GetResponse.

Ошибка источника:

Строка 34: Строка35: строка 36: StreamReader streamIn = new StreamReader (req.GetResponse (). GetResponseStream ());Строка 37:
string strResponse = streamIn.ReadToEnd (); streamOut.Close ();Строка 38: streamIn.Close ();

Исходный файл: c: \ HostingSpaces \ sssssssss \ sssssss.com \ wwwroot \ Checkout \ Status.cshtml Строка: 36

Трассировка стека:

[ProtocolViolationException: вы должнызаписать байты ContentLength в поток запросов перед вызовом [Begin] GetResponse.]
System.Net.HttpWebRequest.GetResponse () + 7769822
ASP._Page_Checkout_Status_cshtml.Execute () в c: \ HostingSpaces \ ssssss \ sssss\ wwwroot \ Checkout \ Status.cshtml: 36 System.Web.WebPages.WebPageBase.ExecutePageHierarchy () + 280
System.Web.WebPages.WebPage.ExecutePageHierarchy () + 369
System.Web.WebPages.WebPage.ExecutePageHierarchy (WebPageContext pageContext, писатель TextWriter, WebPageRenderingBase startPage) + 157
System.Web.WebPages.WebPageHttpHandler.ProcessRequestInternal (контекст HttpContext) + 294

------------------------------------------------------------------------------- Информация о версии: Microsoft .NET Framework Версия: 4.0.30319;ASP.NET версия: 4.0.30319.1

@using System.Collections.Generic
@using System.Text
@using System.Web
@using System.Web.UI
@using System.Web.UI.HtmlControls
@using System.Web.UI.WebControls
@using System.ComponentModel

@{
    Layout = "~/_SiteLayout.cshtml";
    Page.Title = "Checkout | sssss";

    string postUrl = "https://www.paypal.com/cgi-bin/webscr";
    HttpWebRequest req = (HttpWebRequest)WebRequest.Create(postUrl);

    //Set values for the request back
    req.Method = "POST";
    req.ContentType = "application/x-www-form-urlencoded";
    byte[] param = Request.BinaryRead(HttpContext.Current.Request.ContentLength);
    string strRequest = System.Text.Encoding.UTF8.GetString(param);
    string ipnPost = strRequest;
    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.UTF8);
    streamOut.Write(strRequest);

    streamOut.Close();

    StreamReader streamIn = new StreamReader(req.GetResponse().GetResponseStream());
    string strResponse = streamIn.ReadToEnd();
    streamIn.Close();

    /*/ logging ipn messages... be sure that you give write
    // permission to process executing this code
    string logPathDir = ResolveUrl("Messages");
    string logPath = string.Format("{0}\\{1}.txt", 
                     Server.MapPath(logPathDir), DateTime.Now.Ticks);
    File.WriteAllText(logPath, ipnPost);
    /*/

}
@if (strResponse == "VERIFIED")
{
    /*---------------- WILL DO OTHER CHECKS LATER    ------------------*/
    //check the payment_status is Completed
    <p>status is verified</p>
    //check that txn_id has not been previously processed
    //check that receiver_email is your Primary PayPal email
    //check that payment_amount/payment_currency are correct
    //process payment
}
else if (strResponse == "INVALID")
{
    //log for manual investigation
    <p>status is invalid.</p>

<p>@ipnPost</p>
}
else
{
    //log response/ipn data for manual investigation
    <p>status is invalid.</p>
<p>@ipnPost</p>
}
...