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); }
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); }
/// <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); }
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); } }