protected void Page_Load(object sender, EventArgs e) { CommonHelper.SetResponseNoCache(Response); if (!Page.IsPostBack) { byte[] param = Request.BinaryRead(Request.ContentLength); string strRequest = Encoding.ASCII.GetString(param); Dictionary<string, string> values; PayPalStandardPaymentProcessor processor = new PayPalStandardPaymentProcessor(); if (processor.VerifyIPN(strRequest, out values)) { #region values decimal total = decimal.Zero; try { total = decimal.Parse(values["mc_gross"], new CultureInfo("en-US")); } catch { } string payer_status = string.Empty; values.TryGetValue("payer_status", out payer_status); string payment_status = string.Empty; values.TryGetValue("payment_status", out payment_status); string pending_reason = string.Empty; values.TryGetValue("pending_reason", out pending_reason); string mc_currency = string.Empty; values.TryGetValue("mc_currency", out mc_currency); string txn_id = string.Empty; values.TryGetValue("txn_id", out txn_id); string txn_type = string.Empty; values.TryGetValue("txn_type", out txn_type); string rp_invoice_id = string.Empty; values.TryGetValue("rp_invoice_id", out rp_invoice_id); string payment_type = string.Empty; values.TryGetValue("payment_type", out payment_type); string payer_id = string.Empty; values.TryGetValue("payer_id", out payer_id); string receiver_id = string.Empty; values.TryGetValue("receiver_id", out receiver_id); string invoice = string.Empty; values.TryGetValue("invoice", out invoice); string payment_fee = string.Empty; values.TryGetValue("payment_fee", out payment_fee); #endregion StringBuilder sb = new StringBuilder(); sb.AppendLine("Paypal IPN:"); foreach (KeyValuePair<string, string> kvp in values) { sb.AppendLine(kvp.Key + ": " + kvp.Value); } PaymentStatusEnum newPaymentStatus = PaypalHelper.GetPaymentStatus(payment_status, pending_reason); sb.AppendLine("New payment status: " + PaymentStatusManager.GetPaymentStatusName((int)newPaymentStatus)); switch (txn_type) { case "recurring_payment_profile_created": //do nothing here break; case "recurring_payment": #region Recurring payment { Guid orderNumberGuid = Guid.Empty; try { orderNumberGuid = new Guid(rp_invoice_id); } catch { } Order initialOrder = OrderManager.GetOrderByGuid(orderNumberGuid); if (initialOrder != null) { var recurringPayments = OrderManager.SearchRecurringPayments(0, initialOrder.OrderId, null); foreach (var rp in recurringPayments) { switch (newPaymentStatus) { case PaymentStatusEnum.Authorized: case PaymentStatusEnum.Paid: { var recurringPaymentHistory = rp.RecurringPaymentHistory; if (recurringPaymentHistory.Count == 0) { //first payment OrderManager.InsertRecurringPaymentHistory(rp.RecurringPaymentId, initialOrder.OrderId, DateTime.UtcNow); } else { //next payments OrderManager.ProcessNextRecurringPayment(rp.RecurringPaymentId); //UNDONE change new order status according to newPaymentStatus //UNDONE refund/void is not supported } } break; } } //OrderManager.InsertOrderNote(newOrder.OrderId, sb.ToString(), DateTime.UtcNow); LogManager.InsertLog(LogTypeEnum.Unknown, "PayPal IPN. Recurring info", new NopException(sb.ToString())); } else { LogManager.InsertLog(LogTypeEnum.OrderError, "PayPal IPN. Order is not found", new NopException(sb.ToString())); } } #endregion break; default: #region Standard payment { string orderNumber = string.Empty; values.TryGetValue("custom", out orderNumber); Guid orderNumberGuid = Guid.Empty; try { orderNumberGuid = new Guid(orderNumber); } catch { } Order order = OrderManager.GetOrderByGuid(orderNumberGuid); if (order != null) { OrderManager.InsertOrderNote(order.OrderId, sb.ToString(), false, DateTime.UtcNow); switch (newPaymentStatus) { case PaymentStatusEnum.Pending: { } break; case PaymentStatusEnum.Authorized: { if (OrderManager.CanMarkOrderAsAuthorized(order)) { OrderManager.MarkAsAuthorized(order.OrderId); } } break; case PaymentStatusEnum.Paid: { if (OrderManager.CanMarkOrderAsPaid(order)) { OrderManager.MarkOrderAsPaid(order.OrderId); } } break; case PaymentStatusEnum.Refunded: { if (OrderManager.CanRefundOffline(order)) { OrderManager.RefundOffline(order.OrderId); } } break; case PaymentStatusEnum.Voided: { if (OrderManager.CanVoidOffline(order)) { OrderManager.VoidOffline(order.OrderId); } } break; default: break; } } else { LogManager.InsertLog(LogTypeEnum.OrderError, "PayPal IPN. Order is not found", new NopException(sb.ToString())); } } #endregion break; } } else { LogManager.InsertLog(LogTypeEnum.OrderError, "PayPal IPN failed.", strRequest); } } }
protected void Page_Load(object sender, EventArgs e) { CommonHelper.SetResponseNoCache(Response); if (!Page.IsPostBack) { string tx = CommonHelper.QueryString("tx"); Dictionary<string, string> values; string response; PayPalStandardPaymentProcessor processor = new PayPalStandardPaymentProcessor(); if (processor.GetPDTDetails(tx, out values, out response)) { string orderNumber = string.Empty; values.TryGetValue("custom", out orderNumber); Guid orderNumberGuid = Guid.Empty; try { orderNumberGuid = new Guid(orderNumber); } catch { } Order order = this.OrderService.GetOrderByGuid(orderNumberGuid); if (order != null) { decimal total = decimal.Zero; try { total = decimal.Parse(values["mc_gross"], new CultureInfo("en-US")); } catch (Exception exc) { this.LogService.InsertLog(LogTypeEnum.OrderError, "PayPal PDT. Error getting mc_gross", exc); } string payer_status = string.Empty; values.TryGetValue("payer_status", out payer_status); string payment_status = string.Empty; values.TryGetValue("payment_status", out payment_status); string pending_reason = string.Empty; values.TryGetValue("pending_reason", out pending_reason); string mc_currency = string.Empty; values.TryGetValue("mc_currency", out mc_currency); string txn_id = string.Empty; values.TryGetValue("txn_id", out txn_id); string payment_type = string.Empty; values.TryGetValue("payment_type", out payment_type); string payer_id = string.Empty; values.TryGetValue("payer_id", out payer_id); string receiver_id = string.Empty; values.TryGetValue("receiver_id", out receiver_id); string invoice = string.Empty; values.TryGetValue("invoice", out invoice); string payment_fee = string.Empty; values.TryGetValue("payment_fee", out payment_fee); StringBuilder sb = new StringBuilder(); sb.AppendLine("Paypal PDT:"); sb.AppendLine("total: " + total); sb.AppendLine("Payer status: " + payer_status); sb.AppendLine("Payment status: " + payment_status); sb.AppendLine("Pending reason: " + pending_reason); sb.AppendLine("mc_currency: " + mc_currency); sb.AppendLine("txn_id: " + txn_id); sb.AppendLine("payment_type: " + payment_type); sb.AppendLine("payer_id: " + payer_id); sb.AppendLine("receiver_id: " + receiver_id); sb.AppendLine("invoice: " + invoice); sb.AppendLine("payment_fee: " + payment_fee); this.OrderService.InsertOrderNote(order.OrderId, sb.ToString(), false, DateTime.UtcNow); //validate order total bool validateOrderTotal = this.SettingManager.GetSettingValueBoolean("PaymentMethod.PaypalStandard.ValidateOrderTotal", true); if (validateOrderTotal && !total.Equals(order.OrderTotal)) { string errorStr = string.Format("PayPal PDT. Returned order total {0} doesn't equal order total {1}", total, order.OrderTotal); this.LogService.InsertLog(LogTypeEnum.OrderError, errorStr, errorStr); Response.Redirect(CommonHelper.GetStoreLocation()); } //mark order as paid if (this.OrderService.CanMarkOrderAsPaid(order)) { this.OrderService.MarkOrderAsPaid(order.OrderId); } } Response.Redirect("~/checkoutcompleted.aspx"); } else { string orderNumber = string.Empty; values.TryGetValue("custom", out orderNumber); Guid orderNumberGuid = Guid.Empty; try { orderNumberGuid = new Guid(orderNumber); } catch { } Order order = this.OrderService.GetOrderByGuid(orderNumberGuid); if (order != null) { this.OrderService.InsertOrderNote(order.OrderId, "PayPal PDT failed. " + response, false, DateTime.UtcNow); } Response.Redirect(CommonHelper.GetStoreLocation()); } } }