//GET : PayPal/PaymentSuccess public async Task <ActionResult> PaymentSuccess(Guid invoiceId) { GetExpressCheckoutDetailsRequestType request = new GetExpressCheckoutDetailsRequestType(); request.Version = "104.0"; request.Token = Request["token"]; GetExpressCheckoutDetailsReq wrapper = new GetExpressCheckoutDetailsReq(); wrapper.GetExpressCheckoutDetailsRequest = request; //define sdk configuration Dictionary <string, string> sdkConfig = new Dictionary <string, string>(); sdkConfig.Add("mode", ConfigurationManager.AppSettings["paypal.mode"]); sdkConfig.Add("account1.apiUsername", ConfigurationManager.AppSettings["paypal.apiUsername"]); sdkConfig.Add("account1.apiPassword", ConfigurationManager.AppSettings["paypal.apiPassword"]); sdkConfig.Add("account1.apiSignature", ConfigurationManager.AppSettings["paypal.apiSignature"]); // sdkConfig.Add("acct1.UserName", ConfigurationManager.AppSettings["paypal.apiUsername"]); // sdkConfig.Add("acct1.Password", ConfigurationManager.AppSettings["paypal.apiPassword"]); // sdkConfig.Add("acct1.Signature", ConfigurationManager.AppSettings["paypal.apiSignature"]); PayPalAPIInterfaceServiceService s = new PayPalAPIInterfaceServiceService(sdkConfig); GetExpressCheckoutDetailsResponseType ecResponse = s.GetExpressCheckoutDetails(wrapper); if (ecResponse.Ack.HasValue && ecResponse.Ack.Value.ToString() != "FAILURE" && ecResponse.Errors.Count == 0) { double paymentAmount = 0.0; double.TryParse(ecResponse.GetExpressCheckoutDetailsResponseDetails.PaymentDetails.FirstOrDefault().OrderTotal.value, out paymentAmount); PaymentDetailsType paymentDetail = new PaymentDetailsType(); paymentDetail.NotifyURL = "http://replaceIpnUrl.com"; paymentDetail.PaymentAction = (PaymentActionCodeType)EnumUtils.GetValue("Sale", typeof(PaymentActionCodeType)); paymentDetail.OrderTotal = new BasicAmountType((CurrencyCodeType)EnumUtils.GetValue("USD", typeof(CurrencyCodeType)), paymentAmount + ""); List <PaymentDetailsType> paymentDetails = new List <PaymentDetailsType>(); paymentDetails.Add(paymentDetail); DoExpressCheckoutPaymentRequestType doExpressCheckoutPaymentRequestType = new DoExpressCheckoutPaymentRequestType(); request.Version = "104.0"; DoExpressCheckoutPaymentRequestDetailsType requestDetails = new DoExpressCheckoutPaymentRequestDetailsType(); requestDetails.PaymentDetails = paymentDetails; requestDetails.Token = Request["token"]; requestDetails.PayerID = Request["PayerID"]; doExpressCheckoutPaymentRequestType.DoExpressCheckoutPaymentRequestDetails = requestDetails; DoExpressCheckoutPaymentReq doExpressCheckoutPaymentReq = new DoExpressCheckoutPaymentReq(); doExpressCheckoutPaymentReq.DoExpressCheckoutPaymentRequest = doExpressCheckoutPaymentRequestType; s = new PayPalAPIInterfaceServiceService(sdkConfig); DoExpressCheckoutPaymentResponseType doECResponse = s.DoExpressCheckoutPayment(doExpressCheckoutPaymentReq); if (doECResponse.Ack.HasValue && doECResponse.Ack.Value.ToString() != "FAILURE" && doECResponse.Errors.Count == 0) { //create payment object for invoice PaymentService paymentService = new PaymentService(this.db); PaymentMethodService paymentMethodService = new PaymentMethodService(this.db); var ccPymtMethod = paymentMethodService.GetCreditCardPaymentMethod(UserContact); if (ccPymtMethod == null) { try { PaymentMethodTypeService paymentMethodTypeService = new PaymentMethodTypeService(this.db); string ccTypeCode = GNPaymentMethodType.Types.CREDIT_CARD.GetCode(); var ccType = this.db.GNPaymentMethodTypes .Where(pt => pt.Name == ccTypeCode).FirstOrDefault(); await paymentMethodService.Insert(UserContact, new GNPaymentMethod { GNAccountId = UserContact.GNOrganization.Account.Id, GNPaymentMethodTypeId = ccType.Id, Description = "PAYPAL", IsDefault = true, IsActive = true, UsedForRecurrentPayments = false, PCITokenId = "X", LastFourDigits = "X", ExpirationDate = DateTime.MaxValue, CreateDateTime = DateTime.Now, CreatedBy = UserContact.Id }); } catch (Exception e) { LogUtil.Error(logger, "Error adding PayPal Credit Card payment method!!", e); } ccPymtMethod = paymentMethodService.GetCreditCardPaymentMethod(UserContact); if (ccPymtMethod == null) { throw new Exception("Credit Card Payment Method Not Found!!"); } } var ecPaymentInfo = doECResponse.DoExpressCheckoutPaymentResponseDetails.PaymentInfo.FirstOrDefault(); double grossAmount = 0.0; double.TryParse(ecPaymentInfo.GrossAmount.value, out grossAmount); if (grossAmount != 0.0) { try { var payment = new GNPayment { Id = Guid.NewGuid(), GNInvoiceId = invoiceId, GNPaymentMethodId = ccPymtMethod.Id, PaymentDate = DateTime.Now, TotalAmount = grossAmount, Status = ecPaymentInfo.PaymentStatus.Value.ToString(), ExternalTxnId = ecPaymentInfo.TransactionID, CreateDateTime = DateTime.Now, CreatedBy = UserContact.Id }; this.AddInvoiceToPayment(payment); await paymentService.Insert(UserContact, payment); } catch (Exception e) { LogUtil.Error(logger, "Error inserting payment!!", e); } } else { throw new Exception("Payment Amount of 0.0 Not Allowed!!"); } } } return(RedirectToAction("MyBillingPayments", "Account")); }