예제 #1
0
        /// <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);
        }
예제 #2
0
        /// <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);
        }