/// <summary> /// 处理支付平台通知 /// </summary> /// <param name="param">支付平台通知参数</param> /// <returns></returns> public override Result <Notification> HandleNotify(PaymentParam param) { var now = DateTime.Now; var input = param.ToXml(); var output = GetOutputXml("FAIL", "FAIL"); var notification = new Notification(Platform.Id, input, output); var result = new Result <Notification>(false, notification); OnTraced("微信支付 通知数据", input); if (param.GetString("return_code") == "SUCCESS" && param.GetString("result_code") != "SUCCESS") { if (VerifySign(param)) { result.Data.PayId = param.GetString("out_trade_no"); //商户订单号 result.Data.PayNo = param.GetString("transaction_id"); //微信支付订单号 result.Data.Amount = param.GetInt("total_fee") / 100m; //订单总金额,单位为分 result.Data.PaidOn = now; //支付完成时间 微信返回的格式不好处理 time_end 格式为yyyyMMddHHmmss 如2009年12月25日9点10分10秒表示为20091225091010 result.Data.State = param.GetString("attach"); //支付平台原样返回 var status = OnNotified(notification); if (status) { result.Status = true; result.Data.SetOutput(GetOutputXml("SUCCESS", "OK")); OnTraced("微信支付 处理通知成功", result.Data.PayId); } else { result.Message = "微信支付 处理通知失败 OnNotified 返回 false"; OnTraced("微信支付 处理通知失败", "OnNotified 返回 false"); } } else { var err = param.GetString("err_code_des"); var msg = string.IsNullOrEmpty(err) ? param.GetString("return_msg") : err; result.Message = "微信支付 处理通知失败 验证返回数据签名失败 " + msg; OnTraced("微信支付 处理通知失败 验证返回数据签名失败", msg); } } else { var msg = param.GetString("return_msg"); result.Message = "微信支付 处理通知失败 接口返回数据信息 " + msg; OnTraced("微信支付 处理通知失败 接口返回数据信息", msg); } return(result); }
/// <summary> /// 处理支付平台通知 /// </summary> /// <param name="param">第三方支付平台通知参数</param> /// <returns></returns> public override Result <Notification> HandleNotify(PaymentParam param) { var now = DateTime.Now; var input = param.ToXml(); var notification = new Notification(Platform.Id, input, "fail"); var result = new Result <Notification>(false, notification); var isValid = VerifySign(param); if (isValid) { var reqParam = new PaymentParam(); var notifyId = param.GetString("notify_id"); // 通知id reqParam.Add("notify_id", notifyId); reqParam.Add("partner", Platform.MerchantId); reqParam.Add("sign", CreateSign(reqParam)); //系统可选参数 reqParam.Add("sign_type", "MD5"); reqParam.Add("service_version", "1.0"); reqParam.Add("input_charset", "UTF-8"); reqParam.Add("sign_key_index", "1"); var url = "https://gw.tenpay.com/gateway/verifynotifyid.xml" + reqParam.ToQueryString(true); var xml = XElement.Load(url); var notifyParam = new PaymentParam(xml); result.Data.PayId = notifyParam.GetString("out_trade_no"); //系统支付单号 result.Data.PayNo = notifyParam.GetString("transaction_id"); // 财付通交易号,28位长的数值,其中前10位为商户号,之后8位为订单产生的日期; result.Data.Amount = notifyParam.GetInt("total_fee") / 100M; // 转换为元为单位; result.Data.PaidOn = notifyParam.GetDateTime("time_end", now); result.Data.State = param.GetString("attach"); //扩展字段 支付平台原样返回 var bankOrderNo = notifyParam.GetString("bank_billno"); // 银行订单号,若为财付通余额支付则为空 if (VerifySign(notifyParam) && notifyParam["retcode"] == "0" && notifyParam["trade_state"] == "0" && notifyParam["trade_mode"] == "1") { var status = OnNotified(notification); if (status) { result.Status = true; result.Data.SetOutput("success"); } else { result.Message = "TenPay OnNotified 返回false"; } } else { result.Message = "TenPay 通知验证失败"; } } else { result.Message = "TenPay 签名验证失败"; } return(result); }