Я пытался заставить эту штуку работать с прошлой пятницы.
Я работаю с проектом на C # asp.net 4.5, и в кодах примеров Paypal есть только примеры MVC и .net CORE, оба из которых мне не очень знакомы.
Я очень мало занимался программированием MVC. Поэтому я решил прикусить пулю и создал отдельный проект MVC и добавил контроллер со следующим кодом:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Collections.Specialized;
using System.IO;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Web;
using System.Web.Mvc;
namespace paypal_ipn.Controllers
{
public class IPNlistenerController : Controller
{
// GET: IPNlistener
public ActionResult Index()
{
return Receive();
}
[HttpPost]
public HttpStatusCodeResult Receive()
{
//Store the IPN received from PayPal
LogRequest(Request);
//Fire and forget verification task
Task.Run(() => VerifyTask(Request));
//Reply back a 200 code
return new HttpStatusCodeResult(HttpStatusCode.OK);
}
private void VerifyTask(HttpRequestBase ipnRequest)
{
ShantMailer.SendEmail("my@email.com", "IPN MVC called", "yup");
var verificationResponse = string.Empty;
//Post back to either sandbox or live
string strSandbox = "https://ipnpb.sandbox.paypal.com/cgi-bin/webscr";
string strLive = "https://ipnpb.paypal.com/cgi-bin/webscr";
string strRequest= string.Empty;
try
{
var verificationRequest = (HttpWebRequest)WebRequest.Create(strSandbox);
//Set values for the verification request
verificationRequest.Method = "POST";
verificationRequest.ContentType = "application/x-www-form-urlencoded";
var param = Request.BinaryRead(ipnRequest.ContentLength);
strRequest = Encoding.ASCII.GetString(param);
//Add cmd=_notify-validate to the payload
strRequest = "cmd=_notify-validate&" + strRequest;
verificationRequest.ContentLength = strRequest.Length;
//Attach payload to the verification request
var streamOut = new StreamWriter(verificationRequest.GetRequestStream(), Encoding.ASCII);
streamOut.Write(strRequest);
streamOut.Close();
//Send the request to PayPal and get the response
var streamIn = new StreamReader(verificationRequest.GetResponse().GetResponseStream());
verificationResponse = streamIn.ReadToEnd();
streamIn.Close();
}
catch (Exception ex)
{
string nvcs = "Name Value Pairs: <br/>";
try
{
NameValueCollection these_argies = HttpUtility.ParseQueryString(strRequest);
foreach (string s in these_argies)
foreach (string v in these_argies.GetValues(s))
nvcs += s + ": " + v + "<br/>";
}
catch { }
ShantMailer.SendError(ex.Message + "<br/><br/>" + ex.InnerException + "<br/><br/>" + ex.StackTrace + "<br/><br/>" + nvcs + "<br/><br/>Request: " + strRequest + "<br/><br/>Response: " + verificationResponse);
//Capture exception for manual investigation
}
ProcessVerificationResponse(verificationResponse, strRequest);
}
private void LogRequest(HttpRequestBase request)
{
// Persist the request values into a database or temporary data store
}
private void ProcessVerificationResponse(string verificationResponse, string strRequest)
{
if (verificationResponse.Equals("VERIFIED"))
{
ShantMailer.SendEmail("my@email.com", "IPN", strRequest + " <br><br><br> " + verificationResponse);
// check that Payment_status=Completed
// 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 (verificationResponse.Equals("INVALID"))
{
ShantMailer.SendEmail("my@email.com", "IPN", strRequest + " <br><br><br> " + verificationResponse);
//Log for manual investigation
}
else
{
//Log error
}
}
}
}
Мой обозреватель решений выглядит следующим образом
Теперь, когда я вызываю страницу из браузера, я вижу HttpResponse 200 в консоли разработчика Chrome (вкладка «Сеть»)
И, как вы видите, я даже включил в свой код контрольные точки, которые отправляют мне уведомления по электронной почте для целей отладки. Я получаю сообщение «IPN MVC Called», когда сам загружаю страницу в браузере. Но когда я передаю его симулятору IPN, Paypal продолжает повторять: «IPN не был отправлен, а рукопожатие не было проверено. Просмотрите вашу информацию».
Paypal не соответствует в своей документации, на некоторых страницах написано "https://ipnpb.paypal.com/cgi-bin/webscr", а в примерах кода это" https://www.paypal.com/cgi-bin/webscr"
Или для песочного шара "https://ipnpb.sandbox.paypal.com/cgi-bin/webscr" против их примера кода" https://www.sandbox.paypal.com/cgi-bin/webscr"
В любом случае, я перепробовал все возможные комбинации и до сих пор не уверен, что не так.
Здесь находится мой слушатель: https://www.shantwebdesign.com/paypal_ipn/IPNlistener/Index/
Любая помощь или руководство с этим очень ценится.
Спасибо