Exemple #1
0
        /// <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);
        }
Exemple #3
0
        /// <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));
        }
Exemple #5
0
        /// <summary>
        /// Refunds a payment
        /// </summary>
        /// <param name="refundPaymentRequest">Request</param>
        /// <returns>Result</returns>
        public RefundPaymentResult Refund(RefundPaymentRequest refundPaymentRequest)
        {
            var result = new RefundPaymentResult();

            return(result);
        }
Exemple #6
0
        /// <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);
        }
Exemple #8
0
        /// <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);
        }
Exemple #9
0
        /// <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);
        }