private ViewResult PaymentResponseSuccess(DoExpressCheckoutPaymentResponseType response, Checkout checkout, List<CartItem> cart) { var failure = new List<string>(); var paymentStatus = response.DoExpressCheckoutPaymentResponseDetails.PaymentInfo[0].PaymentStatus; if (paymentStatus == PaymentStatusCodeType.DENIED) { //change failure.Add("Unsuccessful."); return PaymentFailed(failure); } if (paymentStatus == PaymentStatusCodeType.VOIDED || paymentStatus == PaymentStatusCodeType.EXPIRED) { //changes failure.Add("Expired"); return PaymentFailed(failure); } if (paymentStatus == PaymentStatusCodeType.COMPLETED || paymentStatus == PaymentStatusCodeType.PENDING || paymentStatus == PaymentStatusCodeType.COMPLETEDFUNDSHELD) { return PaymentSuccess(response, checkout, cart); } if (paymentStatus == PaymentStatusCodeType.FAILED) { failure.Add("Failed"); return PaymentFailed(failure); } throw new InvalidOperationException("Invalid payment operation."); }
// A helper method used by APIResponse.aspx that returns select response parameters // of interest. You must process API response objects as applicable to your application private void setKeyResponseObjects(PayPalAPIInterfaceServiceService service, DoExpressCheckoutPaymentResponseType doECResponse) { Dictionary<string, string> responseParams = new Dictionary<string, string>(); responseParams.Add("Correlation Id", doECResponse.CorrelationID); responseParams.Add("API Result", doECResponse.Ack.ToString()); HttpContext CurrContext = HttpContext.Current; if (doECResponse.Ack.Equals(AckCodeType.FAILURE) || (doECResponse.Errors != null && doECResponse.Errors.Count > 0)) { CurrContext.Items.Add("Response_error", doECResponse.Errors); } else { CurrContext.Items.Add("Response_error", null); responseParams.Add("EC Token", doECResponse.DoExpressCheckoutPaymentResponseDetails.Token); responseParams.Add("Transaction Id", doECResponse.DoExpressCheckoutPaymentResponseDetails.PaymentInfo[0].TransactionID); responseParams.Add("Payment status", doECResponse.DoExpressCheckoutPaymentResponseDetails.PaymentInfo[0].PaymentStatus.ToString()); if (doECResponse.DoExpressCheckoutPaymentResponseDetails.PaymentInfo[0].PendingReason != null) { responseParams.Add("Pending reason", doECResponse.DoExpressCheckoutPaymentResponseDetails.PaymentInfo[0].PendingReason.ToString()); } if (doECResponse.DoExpressCheckoutPaymentResponseDetails.BillingAgreementID != null) responseParams.Add("Billing Agreement Id", doECResponse.DoExpressCheckoutPaymentResponseDetails.BillingAgreementID); } CurrContext.Items.Add("Response_keyResponseObject", responseParams); CurrContext.Items.Add("Response_apiName", "DoExpressChecoutPayment"); CurrContext.Items.Add("Response_redirectURL", null); CurrContext.Items.Add("Response_requestPayload", service.getLastRequest()); CurrContext.Items.Add("Response_responsePayload", service.getLastResponse()); Server.Transfer("../APIResponse.aspx"); }
// # DoExpressCheckoutPayment API Operation // The DoExpressCheckoutPayment API operation completes an Express Checkout transaction. // If you set up a billing agreement in your SetExpressCheckout API call, // the billing agreement is created when you call the DoExpressCheckoutPayment API operation. public DoExpressCheckoutPaymentResponseType DoExpressCheckoutPayment(string token, string payerId, string payment) { // Create the DoExpressCheckoutPaymentResponseType object DoExpressCheckoutPaymentResponseType responseDoExpressCheckoutPaymentResponseType = new DoExpressCheckoutPaymentResponseType(); try { // Create the DoExpressCheckoutPaymentReq object DoExpressCheckoutPaymentReq doExpressCheckoutPayment = new DoExpressCheckoutPaymentReq(); DoExpressCheckoutPaymentRequestDetailsType doExpressCheckoutPaymentRequestDetails = new DoExpressCheckoutPaymentRequestDetailsType(); // The timestamped token value that was returned in the // `SetExpressCheckout` response and passed in the // `GetExpressCheckoutDetails` request. doExpressCheckoutPaymentRequestDetails.Token = token; // Unique paypal buyer account identification number as returned in // `GetExpressCheckoutDetails` Response doExpressCheckoutPaymentRequestDetails.PayerID = payerId; // # Payment Information // list of information about the payment List<PaymentDetailsType> paymentDetailsList = new List<PaymentDetailsType>(); // information about the first payment PaymentDetailsType paymentDetails1 = new PaymentDetailsType(); // Total cost of the transaction to the buyer. If shipping cost and tax // charges are known, include them in this value. If not, this value // should be the current sub-total of the order. // // If the transaction includes one or more one-time purchases, this field must be equal to // the sum of the purchases. Set this field to 0 if the transaction does // not include a one-time purchase such as when you set up a billing // agreement for a recurring payment that is not immediately charged. // When the field is set to 0, purchase-specific fields are ignored. // // * `Currency Code` - You must set the currencyID attribute to one of the // 3-character currency codes for any of the supported PayPal // currencies. // * `Amount` BasicAmountType orderTotal1 = new BasicAmountType(CurrencyCodeType.USD, payment); paymentDetails1.OrderTotal = orderTotal1; paymentDetails1.OrderDescription = System.Web.Configuration.WebConfigurationManager.AppSettings["PaypalDescription"]; // How you want to obtain payment. When implementing parallel payments, // this field is required and must be set to `Order`. When implementing // digital goods, this field is required and must be set to `Sale`. If the // transaction does not include a one-time purchase, this field is // ignored. It is one of the following values: // // * `Sale` - This is a final sale for which you are requesting payment // (default). // * `Authorization` - This payment is a basic authorization subject to // settlement with PayPal Authorization and Capture. // * `Order` - This payment is an order authorization subject to // settlement with PayPal Authorization and Capture. // Note: // You cannot set this field to Sale in SetExpressCheckout request and // then change the value to Authorization or Order in the // DoExpressCheckoutPayment request. If you set the field to // Authorization or Order in SetExpressCheckout, you may set the field // to Sale. paymentDetails1.PaymentAction = PaymentActionCodeType.SALE; // Unique identifier for the merchant. For parallel payments, this field // is required and must contain the Payer Id or the email address of the // merchant. SellerDetailsType sellerDetails1 = new SellerDetailsType(); sellerDetails1.PayPalAccountID = System.Web.Configuration.WebConfigurationManager.AppSettings["PayPalAccountID"]; paymentDetails1.SellerDetails = sellerDetails1; // A unique identifier of the specific payment request, which is // required for parallel payments. paymentDetails1.PaymentRequestID = "PaymentRequest1"; // A unique identifier of the specific payment request, which is // required for parallel payments. paymentDetailsList.Add(paymentDetails1); doExpressCheckoutPaymentRequestDetails.PaymentDetails = paymentDetailsList; DoExpressCheckoutPaymentRequestType doExpressCheckoutPaymentRequest = new DoExpressCheckoutPaymentRequestType(doExpressCheckoutPaymentRequestDetails); doExpressCheckoutPayment.DoExpressCheckoutPaymentRequest = doExpressCheckoutPaymentRequest; // Create the service wrapper object to make the API call PayPalAPIInterfaceServiceService service = new PayPalAPIInterfaceServiceService(); // # API call // Invoke the DoExpressCheckoutPayment method in service wrapper object responseDoExpressCheckoutPaymentResponseType = service.DoExpressCheckoutPayment(doExpressCheckoutPayment); return responseDoExpressCheckoutPaymentResponseType; } // # Exception log catch (System.Exception ex) { // Log the exception message levent.Level = LogLevel.Error; levent.Message = "Logon failed for PaypalExpressCheckout: " + ex.Message; log.Log(levent); } return responseDoExpressCheckoutPaymentResponseType; }
// # DoExpressCheckoutPayment API Operation // The DoExpressCheckoutPayment API operation completes an Express Checkout transaction. // If you set up a billing agreement in your SetExpressCheckout API call, // the billing agreement is created when you call the DoExpressCheckoutPayment API operation. public DoExpressCheckoutPaymentResponseType DoExpressCheckoutPaymentAPIOperation() { // Create the DoExpressCheckoutPaymentResponseType object DoExpressCheckoutPaymentResponseType responseDoExpressCheckoutPaymentResponseType = new DoExpressCheckoutPaymentResponseType(); try { // Create the DoExpressCheckoutPaymentReq object DoExpressCheckoutPaymentReq doExpressCheckoutPayment = new DoExpressCheckoutPaymentReq(); DoExpressCheckoutPaymentRequestDetailsType doExpressCheckoutPaymentRequestDetails = new DoExpressCheckoutPaymentRequestDetailsType(); // The timestamped token value that was returned in the // `SetExpressCheckout` response and passed in the // `GetExpressCheckoutDetails` request. doExpressCheckoutPaymentRequestDetails.Token = "EC-2XW434901C650622T"; // Unique paypal buyer account identification number as returned in // `GetExpressCheckoutDetails` Response doExpressCheckoutPaymentRequestDetails.PayerID = "A9BVYX8XCR9ZQ"; // # Payment Information // list of information about the payment List<PaymentDetailsType> paymentDetailsList = new List<PaymentDetailsType>(); // information about the first payment PaymentDetailsType paymentDetails1 = new PaymentDetailsType(); // Total cost of the transaction to the buyer. If shipping cost and tax // charges are known, include them in this value. If not, this value // should be the current sub-total of the order. // // If the transaction includes one or more one-time purchases, this field must be equal to // the sum of the purchases. Set this field to 0 if the transaction does // not include a one-time purchase such as when you set up a billing // agreement for a recurring payment that is not immediately charged. // When the field is set to 0, purchase-specific fields are ignored. // // * `Currency Code` - You must set the currencyID attribute to one of the // 3-character currency codes for any of the supported PayPal // currencies. // * `Amount` BasicAmountType orderTotal1 = new BasicAmountType(CurrencyCodeType.USD, "2.00"); paymentDetails1.OrderTotal = orderTotal1; // How you want to obtain payment. When implementing parallel payments, // this field is required and must be set to `Order`. When implementing // digital goods, this field is required and must be set to `Sale`. If the // transaction does not include a one-time purchase, this field is // ignored. It is one of the following values: // // * `Sale` - This is a final sale for which you are requesting payment // (default). // * `Authorization` - This payment is a basic authorization subject to // settlement with PayPal Authorization and Capture. // * `Order` - This payment is an order authorization subject to // settlement with PayPal Authorization and Capture. // Note: // You cannot set this field to Sale in SetExpressCheckout request and // then change the value to Authorization or Order in the // DoExpressCheckoutPayment request. If you set the field to // Authorization or Order in SetExpressCheckout, you may set the field // to Sale. paymentDetails1.PaymentAction = PaymentActionCodeType.ORDER; // Unique identifier for the merchant. For parallel payments, this field // is required and must contain the Payer Id or the email address of the // merchant. SellerDetailsType sellerDetails1 = new SellerDetailsType(); sellerDetails1.PayPalAccountID = "*****@*****.**"; paymentDetails1.SellerDetails = sellerDetails1; // A unique identifier of the specific payment request, which is // required for parallel payments. paymentDetails1.PaymentRequestID = "PaymentRequest1"; // information about the second payment PaymentDetailsType paymentDetails2 = new PaymentDetailsType(); // Total cost of the transaction to the buyer. If shipping cost and tax // charges are known, include them in this value. If not, this value // should be the current sub-total of the order. // // If the transaction includes one or more one-time purchases, this field must be equal to // the sum of the purchases. Set this field to 0 if the transaction does // not include a one-time purchase such as when you set up a billing // agreement for a recurring payment that is not immediately charged. // When the field is set to 0, purchase-specific fields are ignored. // // * `Currency Code` - You must set the currencyID attribute to one of the // 3-character currency codes for any of the supported PayPal // currencies. // * `Amount` BasicAmountType orderTotal2 = new BasicAmountType(CurrencyCodeType.USD, "4.00"); paymentDetails2.OrderTotal = orderTotal2; // How you want to obtain payment. When implementing parallel payments, // this field is required and must be set to `Order`. When implementing // digital goods, this field is required and must be set to `Sale`. If the // transaction does not include a one-time purchase, this field is // ignored. It is one of the following values: // // * `Sale` - This is a final sale for which you are requesting payment // (default). // * `Authorization` - This payment is a basic authorization subject to // settlement with PayPal Authorization and Capture. // * `Order` - This payment is an order authorization subject to // settlement with PayPal Authorization and Capture. // `Note: // You cannot set this field to Sale in SetExpressCheckout request and // then change the value to Authorization or Order in the // DoExpressCheckoutPayment request. If you set the field to // Authorization or Order in SetExpressCheckout, you may set the field // to Sale.` paymentDetails2.PaymentAction = PaymentActionCodeType.ORDER; // Unique identifier for the merchant. For parallel payments, this field // is required and must contain the Payer Id or the email address of the // merchant. SellerDetailsType sellerDetails2 = new SellerDetailsType(); sellerDetails2.PayPalAccountID = "*****@*****.**"; paymentDetails2.SellerDetails = sellerDetails2; // A unique identifier of the specific payment request, which is // required for parallel payments. paymentDetails2.PaymentRequestID = "PaymentRequest2"; paymentDetailsList.Add(paymentDetails1); paymentDetailsList.Add(paymentDetails2); doExpressCheckoutPaymentRequestDetails.PaymentDetails = paymentDetailsList; DoExpressCheckoutPaymentRequestType doExpressCheckoutPaymentRequest = new DoExpressCheckoutPaymentRequestType(doExpressCheckoutPaymentRequestDetails); doExpressCheckoutPayment.DoExpressCheckoutPaymentRequest = doExpressCheckoutPaymentRequest; // Create the service wrapper object to make the API call PayPalAPIInterfaceServiceService service = new PayPalAPIInterfaceServiceService(); // # API call // Invoke the DoExpressCheckoutPayment method in service wrapper object responseDoExpressCheckoutPaymentResponseType = service.DoExpressCheckoutPayment(doExpressCheckoutPayment); if (responseDoExpressCheckoutPaymentResponseType != null) { // Response envelope acknowledgement string acknowledgement = "DoExpressCheckoutPayment API Operation - "; acknowledgement += responseDoExpressCheckoutPaymentResponseType.Ack.ToString(); logger.Info(acknowledgement + "\n"); Console.WriteLine(acknowledgement + "\n"); // # Success values if (responseDoExpressCheckoutPaymentResponseType.Ack.ToString().Trim().ToUpper().Equals("SUCCESS")) { // Transaction identification number of the transaction that was // created. // This field is only returned after a successful transaction // for DoExpressCheckout has occurred. if (responseDoExpressCheckoutPaymentResponseType.DoExpressCheckoutPaymentResponseDetails.PaymentInfo != null) { IEnumerator<PaymentInfoType> paymentInfoIterator = responseDoExpressCheckoutPaymentResponseType.DoExpressCheckoutPaymentResponseDetails.PaymentInfo.GetEnumerator(); while (paymentInfoIterator.MoveNext()) { PaymentInfoType paymentInfo = paymentInfoIterator.Current; logger.Info("Transaction ID : " + paymentInfo.TransactionID + "\n"); Console.WriteLine("Transaction ID : " + paymentInfo.TransactionID + "\n"); } } } // # Error Values else { List<ErrorType> errorMessages = responseDoExpressCheckoutPaymentResponseType.Errors; foreach (ErrorType error in errorMessages) { logger.Debug("API Error Message : " + error.LongMessage); Console.WriteLine("API Error Message : " + error.LongMessage + "\n"); } } } return responseDoExpressCheckoutPaymentResponseType; } // # Exception log catch (System.Exception ex) { // Log the exception message logger.Debug("Error Message : " + ex.Message); Console.WriteLine("Error Message : " + ex.Message); } return responseDoExpressCheckoutPaymentResponseType; }
private ViewResult PaymentSuccess(DoExpressCheckoutPaymentResponseType response, Checkout checkout, List<CartItem> cart) { var details = response.DoExpressCheckoutPaymentResponseDetails; var transaction = new TransacDetails { TransId = details.PaymentInfo[0].TransactionID }; var user = Session["User"] as UserLoginDto; OrderManagement.RecordPayPalTransaction(checkout, cart, details.PaymentInfo[0].TransactionID, user.Id); return View("PaymentSuccess", transaction); }