PayPal 支付标准从移动设备返回 GET 而不是 POST,因此无法验证记录支付
Posted
技术标签:
【中文标题】PayPal 支付标准从移动设备返回 GET 而不是 POST,因此无法验证记录支付【英文标题】:PayPal payment standard returns GET instead of POST from mobile devices, hence not able to validate-record payment 【发布时间】:2017-05-09 19:21:59 【问题描述】:几年前我已经集成了 PayPal Payment Standard 以获取付款。
我的应用程序在 Asp.Net 中。目前处于沙盒模式。
我的网站上有一个“立即付款”按钮,该按钮具有指向 PayPal 网站的 PostBackURL 以及所有必需的参数。当用户点击按钮时,它会重定向到 PayPal,他们的用户可以通过他的帐户或借记卡/信用卡付款。并在成功的交易用户被发送回我的应用程序。当用户回到我的应用程序时,我会在 Request.Form 集合中获得各种参数,例如“payment_status”。我验证响应并相应地显示成功/失败消息。
当用户在桌面浏览器上时,上述流程运行良好。
但是当用户使用移动设备并使用移动浏览器时。用户登陆 PayPal 移动友好页面。那里的用户用他的帐户付款。然后显示成功消息。但是当用户被重定向到我的应用程序时,我在 Request.Form 集合中没有得到任何值。因此,我无法验证来自 PayPal 的响应。
我进一步了解到,在桌面浏览器上,PayPal 通过 POST 方法向我的网站返回响应,因此 Request.Form 包含数据。
然而,如果是移动浏览器,PayPal 通过 GET 方法返回响应,因此 Request.Form 不包含任何数据。
为什么 PayPal 通过 GET 返回响应?在这种情况下,即使在查询字符串中也没有数据,那么我如何验证响应,支付是否成功?
我已阅读文档,它说移动 PayPal 支付标准没有其他特定设置。
我不想迁移到快速结帐或任何其他配置。
此外,我搜索了许多与 SO 相关的主题,但没有找到任何合适的解决方案来满足我的需求,因此提出了一个新问题。
【问题讨论】:
尝试使用paypal IPN 【参考方案1】:我在我的 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));
还有我的映射器和类 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
;
【讨论】:
您好,您在使用移动浏览器上网时检查过此代码吗?因为在移动浏览器上,PayPal 执行的是 GET 而不是 POST。我想知道这个 api 方法 PayPalIPN() 怎么会在 GET 中被击中。请告诉我,当 PayPal 在他们的网站上付款后重定向到您的应用程序时,您收到的响应是 GET 还是 POST?以上是关于PayPal 支付标准从移动设备返回 GET 而不是 POST,因此无法验证记录支付的主要内容,如果未能解决你的问题,请参考以下文章