/// <summary> /// Refunds a payment /// </summary> /// <param name="refundPaymentRequest">Request</param> /// <returns>Result</returns> public RefundPaymentResult Refund(RefundPaymentRequest refundPaymentRequest) { var result = new RefundPaymentResult(); //primary currency var currency = _currencyService.GetCurrencyById(_currencySettings.PrimaryStoreCurrencyId); if (currency == null) { throw new NopException("Currency could not be loaded"); } //settings var g2apayPaymentSettings = _settingService.LoadSetting <G2APayPaymentSettings>(refundPaymentRequest.Order.StoreId); //hash var stringToHash = string.Format("{0}{1}{2}{3}{4}", refundPaymentRequest.Order.CaptureTransactionId, refundPaymentRequest.Order.OrderGuid, refundPaymentRequest.Order.OrderTotal.ToString("0.00", CultureInfo.InvariantCulture), refundPaymentRequest.AmountToRefund.ToString("0.00", CultureInfo.InvariantCulture), g2apayPaymentSettings.SecretKey); //post parameters var parameters = HttpUtility.ParseQueryString(string.Empty); parameters.Add("action", "refund"); parameters.Add("order_id", refundPaymentRequest.Order.OrderGuid.ToString()); parameters.Add("amount", refundPaymentRequest.AmountToRefund.ToString("0.00", CultureInfo.InvariantCulture)); parameters.Add("currency", currency.CurrencyCode); parameters.Add("hash", GetSHA256Hash(stringToHash)); var postData = Encoding.Default.GetBytes(parameters.ToString()); //post var request = (HttpWebRequest)WebRequest.Create(string.Format("{0}/rest/transactions/{1}", GetG2APayRestUrl(g2apayPaymentSettings), refundPaymentRequest.Order.CaptureTransactionId)); request.Method = "PUT"; request.ContentType = "application/x-www-form-urlencoded"; request.ContentLength = postData.Length; request.Headers.Add(HttpRequestHeader.Authorization, GetAuthHeader(g2apayPaymentSettings)); try { using (var stream = request.GetRequestStream()) { stream.Write(postData, 0, postData.Length); } var httpResponse = (HttpWebResponse)request.GetResponse(); using (var streamReader = new StreamReader(httpResponse.GetResponseStream())) { var response = JsonConvert.DeserializeObject <G2APayPaymentResponse>(streamReader.ReadToEnd()); if (!response.Status.Equals("ok", StringComparison.InvariantCultureIgnoreCase)) { throw new NopException(string.Format("G2A Pay refund error: transaction status is {0}", response.Status)); } //leaving payment status, we will change it later, upon receiving IPN result.NewPaymentStatus = refundPaymentRequest.Order.PaymentStatus; result.AddError(_localizationService.GetResource("Plugins.Payments.G2APay.Refund")); //change error notification to warning one _pageHeadBuilder.AddCssFileParts(ResourceLocation.Head, @"~/Plugins/Payments.G2APay/Content/styles.css"); } } catch (WebException ex) { var error = "G2A Pay refund error. "; using (var streamReader = new StreamReader(ex.Response.GetResponseStream())) { error += streamReader.ReadToEnd(); } _logger.Error(error, ex); result.AddError(string.Format("{1}. {0}", error, ex.Message)); } return(result); }
public override RefundPaymentResult Refund(RefundPaymentRequest request) { // "Transaction refused (10009). You can not refund this type of transaction.": // merchant must accept the payment in his PayPal account var result = new RefundPaymentResult { NewPaymentStatus = request.Order.PaymentStatus }; var settings = Services.Settings.LoadSetting <TSetting>(request.Order.StoreId); var transactionId = request.Order.CaptureTransactionId; var req = new RefundTransactionReq(); req.RefundTransactionRequest = new RefundTransactionRequestType(); if (request.IsPartialRefund) { var store = Services.StoreService.GetStoreById(request.Order.StoreId); var currencyCode = store.PrimaryStoreCurrency.CurrencyCode; req.RefundTransactionRequest.RefundType = RefundType.Partial; req.RefundTransactionRequest.Amount = new BasicAmountType(); req.RefundTransactionRequest.Amount.Value = Math.Round(request.AmountToRefund, 2).ToString("N", new CultureInfo("en-us")); req.RefundTransactionRequest.Amount.currencyID = (CurrencyCodeType)Enum.Parse(typeof(CurrencyCodeType), currencyCode, true); // see https://developer.paypal.com/docs/classic/express-checkout/digital-goods/ECDGIssuingRefunds/ // https://developer.paypal.com/docs/classic/api/merchant/RefundTransaction_API_Operation_NVP/ var memo = Services.Localization.GetResource("Plugins.SmartStore.PayPal.PartialRefundMemo", 0, false, "", true); if (memo.HasValue()) { req.RefundTransactionRequest.Memo = memo.FormatInvariant(req.RefundTransactionRequest.Amount.Value); } } else { req.RefundTransactionRequest.RefundType = RefundType.Full; } req.RefundTransactionRequest.RefundTypeSpecified = true; req.RefundTransactionRequest.Version = ApiVersion; req.RefundTransactionRequest.TransactionID = transactionId; using (var service = GetApiService(settings)) { var response = service.RefundTransaction(req); var error = ""; var Success = IsSuccess(response, out error); if (Success) { if (request.IsPartialRefund) { result.NewPaymentStatus = PaymentStatus.PartiallyRefunded; } else { result.NewPaymentStatus = PaymentStatus.Refunded; } //cancelPaymentResult.RefundTransactionID = response.RefundTransactionID; } else { result.AddError(error); } } return(result); }
/// <summary> /// Refunds a payment /// </summary> /// <param name="refundPaymentRequest">Request</param> /// <returns>Result</returns> public RefundPaymentResult Refund(RefundPaymentRequest refundPaymentRequest) { var result = new RefundPaymentResult(); PrepareAuthorizeNet(); var maskedCreditCardNumberDecrypted = _encryptionService.DecryptText(refundPaymentRequest.Order.MaskedCreditCardNumber); if (String.IsNullOrEmpty(maskedCreditCardNumberDecrypted) || maskedCreditCardNumberDecrypted.Length < 4) { result.AddError("Last four digits of Credit Card Not Available"); return(result); } var lastFourDigitsCardNumber = maskedCreditCardNumberDecrypted.Substring(maskedCreditCardNumberDecrypted.Length - 4); var creditCard = new creditCardType { cardNumber = lastFourDigitsCardNumber, expirationDate = "XXXX" }; var codes = (string.IsNullOrEmpty(refundPaymentRequest.Order.CaptureTransactionId) ? refundPaymentRequest.Order.AuthorizationTransactionCode : refundPaymentRequest.Order.CaptureTransactionId).Split(','); var transactionRequest = new transactionRequestType { transactionType = transactionTypeEnum.refundTransaction.ToString(), amount = Math.Round(refundPaymentRequest.AmountToRefund, 2), refTransId = codes[0], currencyCode = _currencyService.GetCurrencyById(_currencySettings.PrimaryStoreCurrencyId).CurrencyCode, order = new orderType { //x_invoice_num is 20 chars maximum. hece we also pass x_description invoiceNumber = refundPaymentRequest.Order.OrderGuid.ToString().Substring(0, 20), description = string.Format("Full order #{0}", refundPaymentRequest.Order.OrderGuid) }, payment = new paymentType { Item = creditCard } }; var request = new createTransactionRequest { transactionRequest = transactionRequest }; // instantiate the contoller that will call the service var controller = new createTransactionController(request); controller.Execute(); // get the response from the service (errors contained if any) var response = controller.GetApiResponse(); //validate if (GetErrors(response, result.Errors)) { return(result); } var isOrderFullyRefunded = refundPaymentRequest.AmountToRefund + refundPaymentRequest.Order.RefundedAmount == refundPaymentRequest.Order.OrderTotal; result.NewPaymentStatus = isOrderFullyRefunded ? PaymentStatus.Refunded : PaymentStatus.PartiallyRefunded; return(result); }
public async Task <RefundPaymentResult> RefundRequest(RefundPaymentRequest request) { string terminalUserId = request.BankParameters["terminalUserId"]; string terminalId = request.BankParameters["terminalId"]; string terminalMerchantId = request.BankParameters["terminalMerchantId"]; string terminalProvUserId = request.BankParameters["terminalProvUserId"]; string terminalProvPassword = request.BankParameters["terminalProvPassword"]; string mode = request.BankParameters["mode"];//PROD | TEST //garanti terminal numarasını 9 haneye tamamlamak için başına sıfır eklenmesini istiyor. string _terminalid = string.Format("{0:000000000}", int.Parse(terminalId)); //garanti tutar bilgisinde nokta, virgül gibi değerler istenmiyor. 1.10 TL'lik işlem 110 olarak gönderilmeli. Yani tutarı 100 ile çarpabiliriz. string amount = (request.TotalAmount * 100m).ToString("N");//virgülden sonraki sıfırlara gerek yok //provizyon şifresi ve 9 haneli terminal numarasının birleşimi ile bir hash oluşturuluyor string securityData = GetSHA1($"{terminalProvPassword}{_terminalid}"); //ilgili veriler birleştirilip hash oluşturuluyor string hashstr = GetSHA1($"{request.OrderNumber}{terminalId}{amount}{securityData}"); string requestXml = $@"<?xml version=""1.0"" encoding=""utf-8""?> <GVPSRequest> <Mode>{mode}</Mode> <Version>v0.01</Version> <ChannelCode></ChannelCode> <Terminal> <ProvUserID>{terminalProvUserId}</ProvUserID> <HashData>{hashstr}</HashData> <UserID>{terminalUserId}</UserID> <ID>{terminalId}</ID> <MerchantID>{terminalMerchantId}</MerchantID> </Terminal> <Customer> <IPAddress>{_httpContextAccessor.HttpContext.Connection.RemoteIpAddress}</IPAddress> <EmailAddress></EmailAddress> </Customer> <Order> <OrderID>{request.OrderNumber}</OrderID> <GroupID></GroupID> </Order> <Transaction> <Type>refund</Type> <InstallmentCnt>{request.Installment}</InstallmentCnt> <Amount>{amount}</Amount> <CurrencyCode>{request.CurrencyIsoCode}</CurrencyCode> <CardholderPresentCode>0</CardholderPresentCode> <MotoInd>N</MotoInd> <OriginalRetrefNum>{request.ReferenceNumber}</OriginalRetrefNum> </Transaction> </GVPSRequest>"; var response = await client.PostAsync(request.BankParameters["verifyUrl"], new StringContent(requestXml, Encoding.UTF8, "text/xml")); string responseContent = await response.Content.ReadAsStringAsync(); var xmlDocument = new XmlDocument(); xmlDocument.LoadXml(responseContent); if (xmlDocument.SelectSingleNode("GVPSResponse/Transaction/Response/ReasonCode") == null || xmlDocument.SelectSingleNode("GVPSResponse/Transaction/Response/ReasonCode").InnerText != "00" || xmlDocument.SelectSingleNode("GVPSResponse/Transaction/Response/ReasonCode").InnerText != "0000") { string errorMessage = xmlDocument.SelectSingleNode("GVPSResponse/Transaction/Response/ErrorMsg")?.InnerText ?? string.Empty; if (string.IsNullOrEmpty(errorMessage)) { errorMessage = "Bankadan hata mesajı alınamadı."; } return(RefundPaymentResult.Failed(errorMessage)); } string transactionId = xmlDocument.SelectSingleNode("GVPSResponse/Transaction/RetrefNum")?.InnerText; return(RefundPaymentResult.Successed(transactionId)); }
/// <summary> /// Refunds a payment /// </summary> /// <param name="refundPaymentRequest">Request</param> /// <returns>Result</returns> public RefundPaymentResult Refund(RefundPaymentRequest refundPaymentRequest) { var result = new RefundPaymentResult(); return(result); }
/// <summary> /// 退款 /// </summary> /// <param name="refundPaymentRequest">Request</param> /// <returns>Result</returns> public RefundPaymentResult Refund(RefundPaymentRequest refundPaymentRequest) { var result = new RefundPaymentResult(); Order order = refundPaymentRequest.Order; if (order == null) { result.AddError("订单为空"); return(result); } PaymentInfo paymentInfo = _paymentInfoService.GetByOrderId(order.Id); if (!(paymentInfo != null && !string.IsNullOrEmpty(paymentInfo.Out_Trade_No))) { result.AddError("交易号为空"); return(result); } if (_aliPayPaymentSettings.Partner != paymentInfo.Seller_id) { result.AddError("退款合作身份者ID错误"); return(result); } if (refundPaymentRequest.AmountToRefund <= 0) { result.AddError("退款金额大于0"); return(result); } if (refundPaymentRequest.AmountToRefund + refundPaymentRequest.Order.RefundedAmount > paymentInfo.Total) { result.AddError("退款金额错误"); return(result); } //卖家账号,退款账号 string seller_emailToRefund = paymentInfo.Seller_email; // 卖家退款账号邮箱 string seller_user_id = paymentInfo.Seller_id; //卖家退款账号ID //批次号,必填,格式:当天日期[8位]+序列号[3至24位],如:201603081000001 string batch_no = DateTime.Now.ToString("yyyyMMdd") + GuidToLongID();//退款编号 //退款笔数,必填,参数detail_data的值中,“#”字符出现的数量加1,最大支持1000笔(即“#”字符出现的数量999个) string batch_num = "1"; //退款详细数据,必填,格式(支付宝交易号^退款金额^备注),多笔请用#隔开 string out_trade_no = paymentInfo.Out_Trade_No; //支付宝交易号交易号 string amountToRefund = refundPaymentRequest.AmountToRefund.ToString().TrimEnd('0'); //退款金额 string refundResult = "协商退款"; //备注 string detail_data = string.Format("{0}^{1}^{2}", out_trade_no, amountToRefund, refundResult ); //退款通知 string notify_url = _webHelper.GetStoreLocation(false) + "Plugins/AliPay/RefundNotify"; //新增退款记录 var refundInfo = new RefundInfo() { OrderId = refundPaymentRequest.Order.Id, Batch_no = batch_no, AmountToRefund = refundPaymentRequest.AmountToRefund, RefundStatusId = (int)RefundStatus.refunding, CreateOnUtc = DateTime.Now, Seller_Email = seller_emailToRefund, Seller_Id = seller_user_id, Out_Trade_No = out_trade_no, }; _refundInfoService.Insert(refundInfo); //////////////////////////////////////////////////////////////////////////////////////////////// var alipayReturnConfig = new AlipayReturnConfig() { partner = _aliPayPaymentSettings.Partner, key = _aliPayPaymentSettings.Key, sign_type = "MD5", input_charset = "utf-8" }; //把请求参数打包成数组 SortedDictionary <string, string> sParaTemp = new SortedDictionary <string, string>(); sParaTemp.Add("service", alipayReturnConfig.service); sParaTemp.Add("partner", alipayReturnConfig.partner); sParaTemp.Add("_input_charset", alipayReturnConfig.input_charset.ToLower()); sParaTemp.Add("refund_date", alipayReturnConfig.refund_date); sParaTemp.Add("seller_user_id", seller_user_id); sParaTemp.Add("batch_no", batch_no); sParaTemp.Add("batch_num", batch_num); sParaTemp.Add("detail_data", detail_data); sParaTemp.Add("notify_url", notify_url); var post = AlipaySubmit.BuildRequest(sParaTemp, alipayReturnConfig, "POST"); post.Post(); result.AddError("退款请求已提交,请到支付宝网站中进行退款确认");//必须有,否则影响退款金额 return(result); }
public async Task <IList <string> > Handle(PartiallyRefundCommand command, CancellationToken cancellationToken) { var paymentTransaction = command.PaymentTransaction; if (paymentTransaction == null) { throw new ArgumentNullException(nameof(command.PaymentTransaction)); } var amountToRefund = command.AmountToRefund; var canPartiallyRefund = await _mediator.Send(new CanPartiallyRefundQuery() { AmountToRefund = amountToRefund, PaymentTransaction = paymentTransaction }); if (!canPartiallyRefund) { throw new GrandException("Cannot do partial refund for order."); } var request = new RefundPaymentRequest(); RefundPaymentResult result = null; try { request.PaymentTransaction = paymentTransaction; request.AmountToRefund = amountToRefund; request.IsPartialRefund = true; result = await _paymentService.Refund(request); if (result.Success) { paymentTransaction = await _paymentTransactionService.GetById(paymentTransaction.Id); paymentTransaction.TransactionStatus = result.NewTransactionStatus; paymentTransaction.RefundedAmount += amountToRefund; await _paymentTransactionService.UpdatePaymentTransaction(paymentTransaction); var order = await _orderService.GetOrderByGuid(paymentTransaction.OrderGuid); if (order == null) { throw new ArgumentNullException(nameof(order)); } //total amount refunded if (paymentTransaction.TransactionStatus == Domain.Payments.TransactionStatus.Refunded) { decimal totalAmountRefunded = order.RefundedAmount + amountToRefund; order.RefundedAmount = totalAmountRefunded; order.PaymentStatusId = order.RefundedAmount == order.OrderTotal ? Domain.Payments.PaymentStatus.Refunded : Domain.Payments.PaymentStatus.PartiallyRefunded; await _orderService.UpdateOrder(order); //check order status await _mediator.Send(new CheckOrderStatusCommand() { Order = order }); //notifications var orderRefundedStoreOwnerNotificationQueuedEmailId = await _messageProviderService.SendOrderRefundedStoreOwnerMessage(order, amountToRefund, _languageSettings.DefaultAdminLanguageId); if (orderRefundedStoreOwnerNotificationQueuedEmailId > 0) { await _orderService.InsertOrderNote(new OrderNote { Note = "Order refunded email (to store owner) has been queued.", DisplayToCustomer = false, CreatedOnUtc = DateTime.UtcNow, OrderId = order.Id, }); } var orderRefundedCustomerNotificationQueuedEmailId = await _messageProviderService.SendOrderRefundedCustomerMessage(order, amountToRefund, order.CustomerLanguageId); if (orderRefundedCustomerNotificationQueuedEmailId > 0) { await _orderService.InsertOrderNote(new OrderNote { Note = "Order refunded email (to customer) has been queued.", DisplayToCustomer = false, CreatedOnUtc = DateTime.UtcNow, OrderId = order.Id, }); } } //raise event await _mediator.Publish(new PaymentTransactionRefundedEvent(paymentTransaction, amountToRefund)); } } catch (Exception exc) { if (result == null) { result = new RefundPaymentResult(); } result.AddError(string.Format("Error: {0}. Full exception: {1}", exc.Message, exc.ToString())); } //process errors string error = ""; for (int i = 0; i < result.Errors.Count; i++) { error += string.Format("Error {0}: {1}", i, result.Errors[i]); if (i != result.Errors.Count - 1) { error += ". "; } } if (!String.IsNullOrEmpty(error)) { string logError = string.Format("Error refunding order #{0}. Error: {1}", paymentTransaction.OrderCode, error); await _logger.InsertLog(LogLevel.Error, logError, logError); } return(result.Errors); }
/// <summary> /// Refunds a payment /// </summary> /// <param name="refundPaymentRequest">Request</param> /// <returns>Result</returns> public RefundPaymentResult Refund(RefundPaymentRequest refundPaymentRequest) { var result = new RefundPaymentResult(); var webClient = new WebClient(); var form = new NameValueCollection(); form.Add("x_login", _authorizeNetPaymentSettings.LoginId); form.Add("x_tran_key", _authorizeNetPaymentSettings.TransactionKey); form.Add("x_delim_data", "TRUE"); form.Add("x_delim_char", "|"); form.Add("x_encap_char", ""); form.Add("x_version", GetApiVersion()); form.Add("x_relay_response", "FALSE"); form.Add("x_method", "CC"); form.Add("x_currency_code", _currencyService.GetCurrencyById(_currencySettings.PrimaryStoreCurrencyId).CurrencyCode); string[] codes = refundPaymentRequest.Order.CaptureTransactionId == null? refundPaymentRequest.Order.AuthorizationTransactionCode.Split(',') : refundPaymentRequest.Order.CaptureTransactionId.Split(','); //x_trans_id. When x_test_request (sandbox) is set to a positive response, //or when Test mode is enabled on the payment gateway, this value will be "0". form.Add("x_trans_id", codes[0]); string maskedCreditCardNumberDecrypted = _encryptionService.DecryptText(refundPaymentRequest.Order.MaskedCreditCardNumber); if (String.IsNullOrEmpty(maskedCreditCardNumberDecrypted) || maskedCreditCardNumberDecrypted.Length < 4) { result.AddError("Last four digits of Credit Card Not Available"); return(result); } var lastFourDigitsCardNumber = maskedCreditCardNumberDecrypted.Substring(maskedCreditCardNumberDecrypted.Length - 4); form.Add("x_card_num", lastFourDigitsCardNumber); // only last four digits are required for doing a credit form.Add("x_amount", refundPaymentRequest.AmountToRefund.ToString("0.00", CultureInfo.InvariantCulture)); //x_invoice_num is 20 chars maximum. hece we also pass x_description form.Add("x_invoice_num", refundPaymentRequest.Order.OrderGuid.ToString().Substring(0, 20)); form.Add("x_description", string.Format("Full order #{0}", refundPaymentRequest.Order.OrderGuid)); form.Add("x_type", "CREDIT"); // Send Request to Authorize and Get Response var responseData = webClient.UploadValues(GetAuthorizeNetUrl(), form); var reply = Encoding.ASCII.GetString(responseData); if (!String.IsNullOrEmpty(reply)) { string[] responseFields = reply.Split('|'); switch (responseFields[0]) { case "1": var isOrderFullyRefunded = (refundPaymentRequest.AmountToRefund + refundPaymentRequest.Order.RefundedAmount == refundPaymentRequest.Order.OrderTotal); result.NewPaymentStatus = isOrderFullyRefunded ? PaymentStatus.Refunded : PaymentStatus.PartiallyRefunded; break; case "2": result.AddError(string.Format("Declined ({0}: {1})", responseFields[2], responseFields[3])); break; case "3": result.AddError(string.Format("Error: {0}", reply)); break; } } else { result.AddError("Authorize.NET unknown error"); } return(result); }
/// <summary> /// 退款支付 /// </summary> /// <param name="refundPaymentRequest">请求</param> /// <returns>Result</returns> public RefundPaymentResult Refund(RefundPaymentRequest refundPaymentRequest) { var result = new RefundPaymentResult(); //获取供运商ID ICollection <OrderItem> list = refundPaymentRequest.Order.OrderItems; ConfigurationModel wenxinConfig = new ConfigurationModel(); var modelList = refundPaymentRequest.Order.OrderItems as List <OrderItem>; // var totalFee = postProcessPaymentRequest.Order.OrderTotal.ToString("0.00", CultureInfo.InvariantCulture); var vendorId = modelList[0].Product.VendorId; var wenxin = _vendorService.GetVendorById(vendorId); wenxinConfig.APPID = wenxin.APPID.Trim(); wenxinConfig.APPSECRET = wenxin.APPSECRET.Trim(); wenxinConfig.KEY = wenxin.KEY.Trim(); wenxinConfig.MCHID = wenxin.MCHID.Trim(); wenxinConfig.IP = refundPaymentRequest.Order.CustomerIp; //wenxinConfig.SSLCERT_PATH = _webHelper.GetStoreLocation(false) + wenxin.SSLCERT_PATH.Trim().Substring(1, wenxin.SSLCERT_PATH.Trim().Length - 1); wenxinConfig.SSLCERT_PATH = wenxin.SSLCERT_PATH.Trim(); wenxinConfig.SSLCERT_PASSWORD = wenxin.MCHID.Trim(); OrderDetails orderdetails = new OrderDetails { Attach = wenxin.Name, OrderId = refundPaymentRequest.Order.Id, Body = modelList[0].Product.Name, Detail = modelList[0].Product.ShortDescription, ProductId = modelList[0].Product.Id.ToString(), Total_fee = (Convert.ToDouble(refundPaymentRequest.Order.OrderTotal) * 100).ToString() }; wenxinConfig.orderDetails = orderdetails; //退款 string amountToRefund = Convert.ToInt32(refundPaymentRequest.AmountToRefund * 100).ToString(); Refund refund = new Refund(wenxinConfig); //调用订单退款接口,如果内部出现异常则在页面上显示异常原因 if (refundPaymentRequest.Order.WxTransactionId == null) { result.AddError("没有查询到微信支付订单"); return(result); } try { string returnMess = refund.Run(refundPaymentRequest.Order.WxTransactionId, refundPaymentRequest.Order.Id.ToString(), orderdetails.Total_fee, amountToRefund); string[] cpTypeArray = returnMess.Replace("<br>", ",").Split(','); WxPayData res = new WxPayData(); foreach (var item in cpTypeArray) { if (!string.IsNullOrWhiteSpace(item)) { res.SetValue(item.Split('=')[0], item.Split('=')[1]); } } if (res.GetValue("return_code").ToString() != "SUCCESS" || res.GetValue("result_code").ToString() != "SUCCESS") { //退款提示 result.AddError(res.GetValue("err_code_des").ToString()); return(result); } else { //添加退款记录表 RefundOrderItem item = new RefundOrderItem(); item.OrderId = refundPaymentRequest.Order.Id; item.CustomNumber = refundPaymentRequest.Order.Customer.Id; item.VendorId = vendorId; item.WxTransactionId = res.GetValue("transaction_id").ToString(); item.WxRefunId = res.GetValue("refund_id").ToString(); item.WxOutRefunNo = res.GetValue("out_refund_no").ToString(); item.OrderTotal = refundPaymentRequest.Order.OrderTotal; item.RefundedAmount = refundPaymentRequest.AmountToRefund; item.CreatedOnUtc = System.DateTime.Now; item.Deleted = false; _refundOrderItemService.InsertRefundOrderItem(item); } } catch (WxPayException ex) { result.AddError(ex.ToString()); } catch (Exception ex) { result.AddError(ex.ToString()); } return(result); }