Beispiel #1
0
        public static Boolean VerifySign(PayNotifyResult value)
        {
            if (value == null)
            {
                return(false);
            }

            String signContent = String.Empty;

            signContent += value.LoanJsonList;
            signContent += value.PlatformMoneymoremore;
            signContent += value.BatchNo;
            signContent += value.Remark;
            signContent += value.ResultCode;

            //_logger.Trace(TraceType.BLL.ToString(), CallResultStatus.OK.ToString(), $"{nameof(EPay95Util)}.VerifySign(...)", "LoanJsonList", LogPhase.ACTION, "LoanJsonList", value.LoanJsonList);
            //_logger.Trace(TraceType.BLL.ToString(), CallResultStatus.OK.ToString(), $"{nameof(EPay95Util)}.VerifySign(...)", "PlatformMoneymoremore", LogPhase.ACTION, "PlatformMoneymoremore", value.PlatformMoneymoremore);
            //_logger.Trace(TraceType.BLL.ToString(), CallResultStatus.OK.ToString(), $"{nameof(EPay95Util)}.VerifySign(...)", "BatchNo", LogPhase.ACTION, "BatchNo", value.BatchNo);
            //_logger.Trace(TraceType.BLL.ToString(), CallResultStatus.OK.ToString(), $"{nameof(EPay95Util)}.VerifySign(...)", "Remark", LogPhase.ACTION, "Remark", value.Remark);
            //_logger.Trace(TraceType.BLL.ToString(), CallResultStatus.OK.ToString(), $"{nameof(EPay95Util)}.VerifySign(...)", "ResultCode", LogPhase.ACTION, "ResultCode", value.ResultCode);
            //_logger.Trace(TraceType.BLL.ToString(), CallResultStatus.OK.ToString(), $"{nameof(EPay95Util)}.VerifySign(...)", "signContent", LogPhase.ACTION, "SignContent", signContent);

            var verifyResult = CryptoHelper.VerifySign(value.SignInfo, signContent, KeyConfig.EPay95_FundOut_PublicKey, HashAlgorithmName.SHA1);

            return(verifyResult.Success && verifyResult.Value);
        }
Beispiel #2
0
        public IActionResult EPay95([FromForm] PayNotifyResult request)
        {
            String service = $"{this.GetType().FullName}.EPay95()";

            if (request == null)
            {
                _logger.Trace(TraceType.API.ToString(), CallResultStatus.ERROR.ToString(), service, "request", LogPhase.ACTION, "通知参数为null");
                return(DefaultPostbackFailureResult);
            }

            String requestHost = $"{Request.HttpContext.Connection.RemoteIpAddress}:{Request.HttpContext.Connection.RemotePort}";

            _logger.Trace(TraceType.API.ToString(), CallResultStatus.OK.ToString(), service, "双乾代付通知", LogPhase.ACTION, "收到通知", new Object[] { requestHost, request });

            if (!request.IsValid)
            {
                _logger.Error(TraceType.API.ToString(), CallResultStatus.ERROR.ToString(), service, $"{nameof(request)}.IsValid", $"通知参数验证失败:{request.ErrorMessage}");
                return(DefaultPostbackFailureResult);
            }

            //将LoanJsonList参数解码
            request.LoanJsonList = HttpUtility.UrlDecode(request.LoanJsonList);
            if (!EPay95Util.VerifySign(request))
            {
                _logger.Error(TraceType.API.ToString(), CallResultStatus.ERROR.ToString(), service, "EPay95Util.VerifySign(...)", "通知参数验签失败", null, request);
                return(DefaultPostbackFailureResult);
            }

            String traceMethod = $"{nameof(_epay95FundOutPaymentService)}.UpdatePayStatus(...)";

            _logger.Trace(TraceType.API.ToString(), CallResultStatus.OK.ToString(), service, traceMethod, LogPhase.BEGIN);

            var updateResult = _epay95FundOutPaymentService.UpdatePayStatus(request);

            _logger.Trace(TraceType.API.ToString(), (updateResult.Success ? CallResultStatus.OK : CallResultStatus.ERROR).ToString(), service, traceMethod, LogPhase.END);

            if (!updateResult.Success)
            {
                _logger.Error(TraceType.API.ToString(), CallResultStatus.ERROR.ToString(), service, "双乾代付通知", "处理双乾代付通知失败", updateResult.FirstException, request);
                return(DefaultPostbackFailureResult);
            }

            return(DefaultPostbackSuccessResult);
        }
Beispiel #3
0
        /// <summary>
        /// 支付通知
        /// </summary>
        /// <param name="xml">xml</param>
        /// <returns>结果</returns>
        public static PayNotifyResponse ConvertToPayNotifyRresult(string xml)
        {
            PayNotifyResponse payNotifyResponse = new PayNotifyResponse();
            PayNotifyResult   payNotifyRresult  = new PayNotifyResult();
            SortedDictionary <string, string> signParanmeters = new SortedDictionary <string, string>();

            xml = xml.Replace("coupon_id_$n", "coupon_id_xmln").Replace("coupon_fee_$n", "coupon_fee_xmln");
            XElement doc = XElement.Parse(xml);

            if (doc.Element("return_code").GetString() == "SUCCESS")
            {
                if (doc.Element("result_code").GetString() == "SUCCESS")
                {
                    payNotifyRresult.IsSuccess     = true;
                    payNotifyRresult.Appid         = doc.Element("appid").GetString();
                    payNotifyRresult.MchId         = doc.Element("mch_id").GetString();
                    payNotifyRresult.DeviceInfo    = doc.Element("device_info").GetString();
                    payNotifyRresult.NonceStr      = doc.Element("nonce_str").GetString();
                    payNotifyRresult.Sign          = doc.Element("sign").GetString();
                    payNotifyRresult.TradeType     = doc.Element("trade_type").GetString();
                    payNotifyRresult.BankType      = doc.Element("bank_type").GetString();
                    payNotifyRresult.TotalFee      = doc.Element("total_fee").GetInt();
                    payNotifyRresult.TransactionId = doc.Element("transaction_id").GetString();
                    payNotifyRresult.OutTradeNo    = doc.Element("out_trade_no").GetString();
                    payNotifyRresult.TimeEnd       = doc.Element("time_end").GetString();

                    signParanmeters.Add("return_code", doc.Element("result_code").GetString());
                    signParanmeters.Add("appid", doc.Element("appid").GetString());
                    signParanmeters.Add("mch_id", doc.Element("mch_id").GetString());
                    if (!string.IsNullOrEmpty(doc.Element("device_info").GetString()))
                    {
                        signParanmeters.Add("device_info", doc.Element("device_info").GetString());
                    }
                    signParanmeters.Add("nonce_str", doc.Element("nonce_str").GetString());
                    signParanmeters.Add("sign", doc.Element("sign").GetString());
                    signParanmeters.Add("result_code", doc.Element("result_code").GetString());
                    signParanmeters.Add("openid", doc.Element("openid").GetString());
                    if (!string.IsNullOrEmpty(doc.Element("is_subscribe").GetString()))
                    {
                        signParanmeters.Add("is_subscribe", doc.Element("is_subscribe").GetString());
                    }
                    signParanmeters.Add("trade_type", doc.Element("trade_type").GetString());
                    signParanmeters.Add("bank_type", doc.Element("bank_type").GetString());
                    signParanmeters.Add("total_fee", doc.Element("total_fee").GetString());
                    if (!string.IsNullOrEmpty(doc.Element("fee_type").GetString()))
                    {
                        signParanmeters.Add("fee_type", doc.Element("fee_type").GetString());
                    }
                    signParanmeters.Add("cash_fee", doc.Element("cash_fee").GetString());
                    if (!string.IsNullOrEmpty(doc.Element("coupon_fee").GetString()))
                    {
                        signParanmeters.Add("coupon_fee", doc.Element("coupon_fee").GetString());
                    }
                    if (!string.IsNullOrEmpty(doc.Element("coupon_count").GetString()))
                    {
                        signParanmeters.Add("coupon_count", doc.Element("coupon_count").GetString());
                    }
                    if (!string.IsNullOrEmpty(doc.Element("coupon_id_xmln").GetString()))
                    {
                        signParanmeters.Add("coupon_id_$n", doc.Element("coupon_id_xmln").GetString());
                    }
                    if (!string.IsNullOrEmpty(doc.Element("coupon_fee_xmln").GetString()))
                    {
                        signParanmeters.Add("coupon_fee_$n", doc.Element("coupon_fee_xmln").GetString());
                    }
                    signParanmeters.Add("transaction_id", doc.Element("transaction_id").GetString());
                    signParanmeters.Add("out_trade_no", doc.Element("out_trade_no").GetString());
                    if (!string.IsNullOrEmpty(doc.Element("attach").GetString()))
                    {
                        signParanmeters.Add("attach", doc.Element("attach").GetString());
                    }
                    signParanmeters.Add("time_end", doc.Element("time_end").GetString());
                }
                else
                {
                    payNotifyRresult.IsSuccess = false;
                    payNotifyRresult.Message   = doc.Element("err_code_des").GetString();
                }
            }
            else
            {
                payNotifyRresult.IsSuccess = false;
                payNotifyRresult.Message   = doc.Element("return_msg").GetString();
            }
            payNotifyResponse.PayNotifyRresult = payNotifyRresult;
            payNotifyResponse.SignParanmeters  = signParanmeters;
            return(payNotifyResponse);
        }
Beispiel #4
0
        public XResult <Boolean> UpdatePayStatus(PayNotifyResult result)
        {
            if (result == null)
            {
                return(new XResult <Boolean>(false, ErrorCode.INVALID_ARGUMENT, new ArgumentNullException(nameof(result))));
            }

            String service = $"{this.GetType().FullName}.UpdatePayStatus(...)";

            _logger.Trace(TraceType.BLL.ToString(), CallResultStatus.OK.ToString(), service, ":", LogPhase.BEGIN, "开始更新支付通知结果", result);

            if (!result.IsValid)
            {
                _logger.Error(TraceType.BLL.ToString(), CallResultStatus.ERROR.ToString(), service, $"{nameof(result)}.IsValid", $"支付结果对象验证失败:{result.ErrorMessage}", null, result);
                return(new XResult <Boolean>(false, ErrorCode.INVALID_ARGUMENT, new ArgumentException(result.ErrorMessage)));
            }

            var requestHash = $"UpdatePayStatus:{result.BatchNo}".GetHashCode();

            if (_lockProvider.Exists(requestHash))
            {
                return(new XResult <Boolean>(false, ErrorCode.SUBMIT_REPEAT));
            }

            try
            {
                if (!_lockProvider.Lock(requestHash))
                {
                    return(new XResult <Boolean>(false, ErrorCode.SUBMIT_REPEAT));
                }

                var existedOrder = _fundOutOrderRepository.QueryProvider.Where(x => x.OutTradeNo == result.BatchNo).FirstOrDefault();
                if (existedOrder == null)
                {
                    _logger.Trace(TraceType.BLL.ToString(), CallResultStatus.OK.ToString(), service, "existedOrder", LogPhase.ACTION, $"更新的订单不存在,订单编号:{result.BatchNo}");
                    return(new XResult <Boolean>(false, ErrorCode.OUT_TRADE_NO_NOT_EXIST));
                }

                if (existedOrder.PayStatus != PayStatus.FAILURE.ToString() &&
                    existedOrder.PayStatus != PayStatus.SUCCESS.ToString())
                {
                    Boolean statusHasChanged = false;
                    switch (result.ResultCode)
                    {
                    case "88":
                        existedOrder.PayStatus  = PayStatus.SUCCESS.ToString();
                        existedOrder.UpdateTime = DateTime.Now;
                        statusHasChanged        = true;
                        break;

                    case "15":
                    case "90":
                        break;

                    default:
                        existedOrder.PayStatus  = PayStatus.FAILURE.ToString();
                        existedOrder.UpdateTime = DateTime.Now;
                        statusHasChanged        = true;
                        break;
                    }

                    if (statusHasChanged)
                    {
                        _fundOutOrderRepository.Update(existedOrder);
                        var updateResult = _fundOutOrderRepository.SaveChanges();
                        if (!updateResult.Success)
                        {
                            _logger.Error(TraceType.BLL.ToString(), CallResultStatus.ERROR.ToString(), service, $"{nameof(_fundOutOrderRepository)}.SaveChanges()", "更新代付结果状态失败", updateResult.FirstException, existedOrder);
                            return(new XResult <Boolean>(false, updateResult.FirstException));
                        }
                    }
                }

                _logger.Trace(TraceType.BLL.ToString(), CallResultStatus.OK.ToString(), service, ":", LogPhase.END, "结束更新支付通知结果");

                return(new XResult <Boolean>(true));
            }
            finally
            {
                _lockProvider.UnLock(requestHash);
            }
        }