PayPal支付标准从移动设备返回GET而不是POST,因此无法验证记录付款

Din*_*ati 6 c# asp.net paypal payment-gateway

几年前我已经整合了PayPal支付标准以获得付款.

我的申请是在Asp.Net.目前处于沙盒模式.

我的网站上有一个Pay Now按钮,PostBackURL到PayPal网站,提供所有必需的参数.当用户点击按钮时,它会重定向到PayPal,用户可以通过他的帐户或借记卡/信用卡付款.成功交易后,用户将被发送回我的应用程序.当用户回到我的应用程序时,我在Request.Form集合中获得了诸如"payment_status"之类的各种参数.我验证响应并相应地显示成功/失败消息.

当用户在桌面上的浏览器上时,上述流程正常工作.

但是,当用户使用移动设备并使用移动浏览器时.用户登陆PayPal移动友好页面.用户使用他的帐户付款.然后显示成功消息.但是当用户被重定向到我的应用程序时,我在Request.Form集合中没有获得任何值.由于这个原因,我无法验证PayPal的响应.

此外,我了解到,在桌面浏览器上,PayPal通过POST方法将响应返回到我的网站,因此Request.Form包含数据.

然而,在移动浏览器的情况下,PayPal通过GET方法返回响应,因此Request.Form不包含任何数据.

为什么PayPal通过GET返回响应?在这种情况下,即使在查询字符串中数据也不可用,那么如何验证响应,付款是否成功?

我已阅读文档,并说它没有针对移动PayPal支付标准的其他特定设置.

我不想迁移到快速结账或任何其他配置.

此外,我搜索了许多与SO相关的线程,并没有找到任何适合我需要的解决方案因此作为一个新问题.

fed*_*zzi 2

我在我的 WebAPI Asp.NET 项目中为 PayPal 做了这样的事情..希望它能帮助你:

[AllowAnonymous]
        [HttpPost]
        [Route("api/PayPal/IPN")]
        [ResponseType(typeof(OrderPayPalDTO))]
        public async Task<IHttpActionResult> PayPalIPN()
        {
            try
            {
                decimal tot;

                var data = this.Request.Content.ReadAsStringAsync().Result;
                if (data == null) return BadRequest();

                // Parse the query string variables into a NameValueCollection.
                NameValueCollection qscoll = HttpUtility.ParseQueryString(data);
                PayPalViewModel payPalModel = new PayPalViewModel();

                var payPal = payPalModel.ToPayPalVM(qscoll); //HRE IS A EXTENSION METHOD TO MAP to a CLASS

                if (payPal == null) return InternalServerError(new Exception());

                //Try cast total from paypal
                if (!decimal.TryParse(payPal.mc_gross, out tot)) return InternalServerError(new Exception(Constant.Error.PAYMENT_ERROR_TOTAL_CAST));




                // If status is Ok /or Completed
                if (payPal.payment_status.Equals(Constant.PaymentStatus.PAYED) || payPal.payment_status.Equals(Constant.PaymentStatus.COMPLETED))
                {
                    // update payment
                    bool ok = await this.UpdatePayment(order, user);
                    if (!ok) return InternalServerError(new Exception(Constant.Error.PAYMENT_ERROR_UPDATE));
                }

                return Ok(order);
            }
            catch (Exception ex)
            {
                _logger.LogException(ex);
                return (Constant.CONFIGURATION_GLOBALS.IS_DEVELOPMENT_MODE)
                  ? InternalServerError(ex)
                  : InternalServerError(new Exception(Constant.Error.ERROR_GENERIC_500));
            }
        }
Run Code Online (Sandbox Code Playgroud)

我的映射器和 PayPalViewModel 类

  public class PayPalViewModel
    {
        public string mc_gross { get; set; }
        public string custom { get; set; }
        public string payment_status { get; set; }

        public string payment_type { get; set; }
        public string mc_currency { get; set; }

        public string payer_id { get; set; }
        public DateTime payment_date { get; set; }
        public string payment_gross { get; set; }

        /// <summary>
        /// ToPayPalVM From NameValueCollection
        /// </summary>
        /// <returns></returns>
        public PayPalViewModel ToPayPalVM(NameValueCollection qscoll)
        {
            if (qscoll == null) return null;
            DateTime date = DateTime.Now;
            string mcGross = qscoll["mc_gross"];
            string paymentType = qscoll["payment_type"];
            string mcCurrency = qscoll["mc_currency"];
            string paymentStatus = qscoll["payment_status"];
            string payerId = qscoll["payer_id"];
            string paymentDate = qscoll["payment_date"];
            string paymentGross = qscoll["payment_gross"];
            string cust = qscoll["custom"];

            var datePay = DateTime.TryParse(paymentDate, out date);

            return new PayPalViewModel
            {
                mc_gross = mcGross,
                custom = cust,
                payment_status = paymentStatus,
                payment_type = paymentType,
                mc_currency = mcCurrency,
                payer_id = payerId,
                payment_gross = paymentGross,
                payment_date = (datePay) ? date : DateTime.Now
            };
        }
    }
Run Code Online (Sandbox Code Playgroud)