/// <summary> /// 处理支付平台通知 /// 支付宝是用POST方式发送通知信息 /// </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); OnTraced("支付宝支付 通知数据", input); var isValid = VerifySign(param); if (isValid) { result.Data.PayId = param.GetString("out_trade_no"); //商户订单号 result.Data.PayNo = param.GetString("trade_no"); //支付宝交易号 result.Data.Amount = param.GetDecimal("total_fee"); //支付金额 result.Data.PaidOn = param.GetDateTime("gmt_payment", now); //支付时间 result.Data.State = param.GetString("extra_common_param"); //扩展字段 支付平台原样返回 var tradeStatus = param.GetString("trade_status"); //交易状态 if (tradeStatus == "TRADE_FINISHED" || tradeStatus == "TRADE_SUCCESS") { var status = OnNotified(notification); if (status) { result.Status = true; result.Data.SetOutput("success"); OnTraced("支付宝支付 处理通知成功", result.Data.PayId); } else { result.Message = "支付宝支付 处理通知失败 OnNotified 返回 false"; OnTraced("支付宝支付 处理通知失败", "OnNotified 返回 false"); } } else { result.Message = "支付宝支付 处理通知失败 交易状态错误 " + tradeStatus; OnTraced("支付宝支付 处理通知失败 交易状态错误", tradeStatus); } } else { result.Message = "支付宝支付 处理通知失败 签名或通知验证失败"; OnTraced("支付宝支付 处理通知失败 处理通知失败 签名或通知验证失败", string.Empty); } 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); }