Внедрение ASP.NET Core Paypal - PullRequest
0 голосов
/ 29 мая 2018

Я пытаюсь осуществить оплату через PayPal через корзину в ASP.NET Core.У меня есть рабочий пример в ASP.NET MVC 5, и я пытаюсь преобразовать его в ASP.NET Core, но у меня ничего не получилось.Вопрос, который я не могу решить, заключается в том, как получить значения, которые я должен получить для идентификатора транзакции, уплаченной суммы и идентификатора заказа.В ASP.NET MVC 5 действие IPN выглядит следующим образом:

public ActionResult IPN()
{
    System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

    var formVals = new Dictionary<string, string>();
    formVals.Add("cmd", "_notify-validate");

    string response = GetPayPalResponse(formVals, true);

    if (response == "VERIFIED")
    {
        string transactionID = Request["txn_id"];
        string sAmountPaid = Request["mc_gross"];
        string orderID = Request["custom"];
        :
        :

В моем приложении ASP.NET Core действие IPN выполняется PayPal, и у меня есть ПРОВЕРЕННЫЙ ответ, но я не могу получить следующие триценности.Я пробовал различные способы получить эти значения без успеха.

Мой первоначальный подход был следующим:

string transactionID = Request.Query["txn_id"];
string sAmountPaid = Request.Query["mc_gross"];
string orderID = Request.Query["custom"];

Может кто-нибудь предложить мне способ получить эти значения?

1 Ответ

0 голосов
/ 30 мая 2018

Я нашел решение своей проблемы и опубликую его на тот случай, если кто-то захочет сделать что-то подобное.

[Route("PayPal/IPN")]
[HttpPost]
public ActionResult IPN()
{
    System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

    PayPalRespond response = GetPayPalResponse();

    if (response.RespondType == RespondTypeEnum.Verified)
    {
        System.IO.File.AppendAllText(_env.WebRootPath + Path.DirectorySeparatorChar.ToString() + "data.txt", $"{DateTime.Now.ToString()} {response.JsonData}." + Environment.NewLine);

        Order order = GetOrder(154);

        //check the amount paid
        if (order.Total  <= response.AmountPaid)
        {
            // IPN Order successfully transacted. Save changes to database

            return Ok();
        }
        else
        {
            // Amount Paid is incorrect
        }
    }
    else
    {
        // Not verified
    }

    return Content("");
}

PayPalRespond GetPayPalResponse()
{
    PayPalRespond output = new PayPalRespond();

    var formVals = new Dictionary<string, string>();
    formVals.Add("cmd", "_notify-validate");

    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; 
    using (var ms = new MemoryStream(2048))
    {
        Request.Body.CopyTo(ms);
        param = ms.ToArray();
    }

    string strRequest = Encoding.ASCII.GetString(param);

    var QueryValues = System.Web.HttpUtility.ParseQueryString(strRequest);

    output.Data = new List<QueryValue>();
    foreach (var item in QueryValues.AllKeys)
    {
        if (item.Equals("txn_id"))
            output.TransactionID = QueryValues[item];
        else if (item.Equals("mc_gross"))
        {
            CultureInfo culture = CultureInfo.CreateSpecificCulture("en-US");
            NumberStyles style = NumberStyles.Number;

            Decimal amountPaid = 0;
            Decimal.TryParse(QueryValues[item], style, culture, out amountPaid);
            output.AmountPaid = amountPaid;
        }
        else if (item.Equals("custom"))
            output.OrderID = QueryValues[item];

        output.Data.Add(new QueryValue { Name = item, Value = QueryValues[item] });
    }
    output.JsonData = Newtonsoft.Json.JsonConvert.SerializeObject(output.Data);

    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;

    //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();
        }
    }

    output.RespondType = response.Equals("VERIFIED") ? RespondTypeEnum.Verified : RespondTypeEnum.Invalid;

    return output;
}

Перечислитель и классы, которые вам понадобятся, следующие:

public enum RespondTypeEnum { Verified, Invalid }

public class PayPalRespond
{
    public RespondTypeEnum RespondType { get; set; }
    public List<QueryValue> Data { get; set; }
    public string JsonData { get; set; }
    public string TransactionID { get; set; }
    public string OrderID { get; set; }
    public Decimal AmountPaid { get; set; }
}

public class QueryValue
{
    public string Name { get; set; }
    public string Value { get; set; }
}
...