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相关的线程,并没有找到任何适合我需要的解决方案因此作为一个新问题.
我在我的 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)
| 归档时间: |
|
| 查看次数: |
231 次 |
| 最近记录: |