/// <summary> /// Refunds or partially refunds a payment. /// </summary> /// <param name="invoice"> /// The invoice. /// </param> /// <param name="payment"> /// The payment. /// </param> /// <param name="amount"> /// The amount of the refund. /// </param> /// <returns> /// The <see cref="PayPalExpressTransactionRecord"/>. /// </returns> public ExpressCheckoutResponse Refund(IInvoice invoice, IPayment payment, decimal amount) { var record = payment.GetPayPalTransactionRecord(); // Ensure the currency code if (record.Data.CurrencyCode.IsNullOrWhiteSpace()) { var ex = new PayPalApiException("CurrencyCode was not found in payment extended data PayPal transaction data record. Cannot perform refund."); return(_responseFactory.Build(ex)); } // Ensure the transaction id if (record.Data.CaptureTransactionId.IsNullOrWhiteSpace()) { var ex = new PayPalApiException("CaptureTransactionId was not found in payment extended data PayPal transaction data record. Cannot perform refund."); return(_responseFactory.Build(ex)); } // Get the decimal configuration for the current currency var currencyCodeType = PayPalApiHelper.GetPayPalCurrencyCode(record.Data.CurrencyCode); var basicAmountFactory = new PayPalBasicAmountTypeFactory(currencyCodeType); ExpressCheckoutResponse result = null; if (amount > payment.Amount) { amount = payment.Amount; } try { var request = new RefundTransactionRequestType { InvoiceID = invoice.PrefixedInvoiceNumber(), PayerID = record.Data.PayerId, RefundSource = RefundSourceCodeType.DEFAULT, Version = record.DoCapture.Version, TransactionID = record.Data.CaptureTransactionId, Amount = basicAmountFactory.Build(amount) }; var wrapper = new RefundTransactionReq { RefundTransactionRequest = request }; var refundTransactionResponse = GetPayPalService().RefundTransaction(wrapper); result = _responseFactory.Build(refundTransactionResponse, record.Data.Token); } catch (Exception ex) { result = _responseFactory.Build(ex); } return(result); }
/// <summary> /// The capture success. /// </summary> /// <param name="invoice"> /// The invoice. /// </param> /// <param name="payment"> /// The payment. /// </param> /// <param name="amount"> /// The amount. /// </param> /// <param name="isPartialPayment"> /// The is partial payment. /// </param> /// <returns> /// The <see cref="ExpressCheckoutResponse"/>. /// </returns> public PayPalExpressTransactionRecord Capture(IInvoice invoice, IPayment payment, decimal amount, bool isPartialPayment) { // Get the transaction record var record = payment.GetPayPalTransactionRecord(); ExpressCheckoutResponse result = null; try { var amountFactory = new PayPalBasicAmountTypeFactory(PayPalApiHelper.GetPayPalCurrencyCode(invoice.CurrencyCode)); var authorizationId = record.Data.AuthorizationTransactionId; // do express checkout var request = new DoCaptureRequestType() { AuthorizationID = authorizationId, Amount = amountFactory.Build(amount), CompleteType = isPartialPayment ? CompleteCodeType.NOTCOMPLETE : CompleteCodeType.COMPLETE }; var doCaptureReq = new DoCaptureReq() { DoCaptureRequest = request }; var service = GetPayPalService(); var doCaptureResponse = service.DoCapture(doCaptureReq); result = _responseFactory.Build(doCaptureResponse, record.Data.Token); if (result.Success()) { var transactionId = doCaptureResponse.DoCaptureResponseDetails.PaymentInfo.TransactionID; record.Data.CaptureTransactionId = transactionId; } } catch (Exception ex) { result = _responseFactory.Build(ex); } record.DoCapture = result; record.Success = result.Success(); return(record); }