Exemple #1
0
        public static JObject createUrl(string from, string fromNo, string fee, string subject, string currentHost)
        {
            var now          = DateTime.Now.ToString("yyyyMMddHHmmssfff");
            var out_trade_no = now + CommonBusiness.CreateRandom();
            //付款金额,必填
            var total_fee = (double.Parse(fee)).ToString();

            //订单名称,必填
            if (string.IsNullOrEmpty(subject))
            {
                subject = "微信支付";
            }

            var content = GetUnifiedOrderResult(out_trade_no, total_fee, subject);

            // 本地数据维护 微信单位为分
            var result = TradeBusiness.AddTrade(out_trade_no, from, fromNo, PaymentType.WechatPay, fee, subject, null, "0");

            if (!(bool)result["Flg"])
            {
                throw new Exception("本地数据维护失败");
            }

            return(new JObject(
                       new JProperty("Trade", ((JObject)result["Object"])["result"]),
                       new JProperty("Content", content)));
        }
Exemple #2
0
        public void ProcessRequest(HttpContext context)
        {
            var from    = context.Request.QueryString["from"] ?? "73D589ED1";
            var tradeNo = context.Request.QueryString["tradeNo"] ?? "20171025103417195232829";
            var fee     = context.Request.QueryString["fee"] ?? "10";
            var result  = TradeBusiness.GetTrade(tradeNo, from);

            ICBC.Refund.execute(from, tradeNo, string.Empty, fee, result);

            context.Response.ContentType = "text/plain";
            context.Response.Write("Hello World");
        }
Exemple #3
0
        private void btnGetCategories_Click(object sender, EventArgs e)
        {
            try
            {
                //This model implements the ITrade mandatory interface
                List <TradeModel> tradeList = new List <TradeModel>();

                this.categoriesList.Items.Clear();

                if (this.dataGridViewTrades.Rows.Count == 0)
                {
                    MessageBox.Show("Please save at least one value!");
                }
                else
                {
                    for (int i = 0; i < dataGridViewTrades.Rows.Count; i++)
                    {
                        var value        = dataGridViewTrades.Rows[i].Cells[0].Value.ToString();
                        var clientSector = dataGridViewTrades.Rows[i].Cells[1].Value.ToString();

                        tradeList.Add(new TradeModel()
                        {
                            Value        = Double.Parse(value),
                            ClientSector = clientSector
                        });
                    }

                    if (tradeList.Count > 0)
                    {
                        List <String> resultCat = new TradeBusiness().SeeCategories(tradeList);

                        foreach (var cat in resultCat)
                        {
                            categoriesList.Items.Add(cat);
                            this.t = new List <TradeModel>();
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
Exemple #4
0
        public void ProcessRequest(HttpContext context)
        {
            var result = false;

            try
            {
                var xdocument   = XDocument.Load(context.Request.InputStream);
                var return_code = xdocument.Descendants("return_code").FirstOrDefault();
                if (return_code != null && return_code.Value == "SUCCESS")
                {
                    var result_code    = xdocument.Descendants("result_code").First().Value;
                    var out_trade_no   = xdocument.Descendants("out_trade_no").First().Value;
                    var transaction_id = xdocument.Descendants("transaction_id").First().Value;
                    var status         = (result_code == "SUCCESS" ? TradeStatus.NOTIFYSUCCESS : TradeStatus.NOTIFYISSUE);
                    WebApiConfig.log.Info("微信通知 " + out_trade_no + "-" + transaction_id + ":" + result_code);
                    JObject localResult;
                    if (!TradeBusiness.UpdateTradeStatusSeveralTimes(out_trade_no, transaction_id, PaymentType.WechatPay, result_code, status, out localResult))
                    {
                        WebApiConfig.log.Error(out_trade_no + "-" + transaction_id + "微信通知支付成功,本地数据库状态维护失败");
                    }
                    else
                    {
                        result = true;
                    }

                    // 通知患者端
                    PatientCustomerBusiness.NotifyPatient(localResult);
                }
            } catch
            {
            }

            if (result)
            {
                context.Response.ContentType = "text/xml";
                context.Response.Write("<xml><return_code><![CDATA[SUCCESS]]></return_code></xml>");
            }
            else
            {
                context.Response.ContentType = "text/xml";
                context.Response.Write("<xml><return_code><![CDATA[FAIL]]></return_code></xml>");
            }
        }
Exemple #5
0
        public static JObject execute(string from, string out_trade_no, string trade_no, string refund_amount, JObject result)
        {
            // 标识一次退款请求,同一笔交易多次退款需要保证唯一,如需部分退款,则此参数必传。
            var        now                   = DateTime.Now.ToString("yyyyMMddHHmmssfff");
            var        out_request_no        = now + CommonBusiness.CreateRandom();
            var        amount                = (double.Parse(refund_amount) / 100).ToString();
            IAopClient client                = new DefaultAopClient(ConfigurationManager.AppSettings["alipay.port"], ConfigurationManager.AppSettings["alipay.appId"], ConfigurationManager.AppSettings["alipay.privateKey"]);
            AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();

            request.BizContent = "{" + string.Format(
                "    \"out_trade_no\":\"{0}\"," +
                "    \"trade_no\":\"{1}\"," +
                "    \"refund_amount\":{2}," +
                "    \"refund_reason\":\"正常退款\"," +
                "    \"out_request_no\":{3}", out_trade_no, trade_no, amount, out_request_no) + "  }";
            AlipayTradeRefundResponse response = client.Execute(request);

            if (!response.IsError)
            {
                WebApiConfig.log.Error("支付宝退款成功:" + out_trade_no + "," + out_request_no + "," + amount);
                JObject localResult;
                if (!TradeBusiness.UpdateTradeStatusSeveralTimes(out_trade_no, response.TradeNo, PaymentType.Alipay, string.Empty, TradeStatus.REFUND, out localResult))
                {
                    WebApiConfig.log.Error(out_trade_no + "-" + trade_no + "支付宝退款成功,本地数据库状态维护失败:" + out_trade_no);
                    return(new JObject(new JProperty("Trade", result)));
                }
                else
                {
                    return(new JObject(new JProperty("Trade", localResult)));
                }
            }
            else
            {
                WebApiConfig.log.Error("支付宝退款失败:" + out_trade_no + "," + out_request_no + "," + amount + "-" + response.SubMsg);
                throw new Exception("支付宝退款失败:" + response.SubMsg);
            }
        }
Exemple #6
0
        public HttpResponseMessage Get(string no, string from, string type)
        {
            var     response      = new RetDTO();
            JObject requestHeader = new JObject();

            try
            {
                if (string.IsNullOrEmpty(no) || string.IsNullOrEmpty(from) || string.IsNullOrEmpty(type))
                {
                    response.Header = CommonBusiness.SetHeader(requestHeader, CustomizeStatus.ParamError, "参数不正确");
                    return(Request.CreateResponse(HttpStatusCode.OK, response, "application/json"));
                }

                JObject result;
                if (type == "1")
                {
                    result = TradeBusiness.GetTrade(no, from);
                }
                else if (type == "2")
                {
                    result = TradeBusiness.GetByActualTradeNo(no, from);
                }
                else
                {
                    result = TradeBusiness.GetByTradeFromNo(no, from);
                }

                response.Header = CommonBusiness.SetHeader(requestHeader, CustomizeStatus.Success, string.Empty);
                response.Body   = result;
                return(Request.CreateResponse(HttpStatusCode.OK, response, "application/json"));
            }
            catch (Exception ex)
            {
                response.Header = CommonBusiness.SetHeader(requestHeader, CustomizeStatus.CatchError, ex.Message);
                return(Request.CreateResponse(HttpStatusCode.OK, response, "application/json"));
            }
        }
Exemple #7
0
        public static JObject execute(string from, string out_trade_no, string trade_no, string refund_amount, JObject result)
        {
            var content = RefundRequest(out_trade_no, refund_amount);

            if (content.IsSet("refund_id") && content.IsSet("transaction_id"))
            {
                WebApiConfig.log.Error("微信退款成功:" + out_trade_no);
                JObject localResult;
                if (!TradeBusiness.UpdateTradeStatusSeveralTimes(out_trade_no, content.GetValue("transaction_id").ToString(), PaymentType.WechatPay, content.GetValue("refund_id").ToString(), TradeStatus.REFUND, out localResult))
                {
                    WebApiConfig.log.Error(out_trade_no + "-" + trade_no + "微信退款成功,本地数据库状态维护失败:" + out_trade_no);
                    return(new JObject(new JProperty("Trade", result)));
                }
                else
                {
                    return(new JObject(new JProperty("Trade", localResult)));
                }
            }
            else
            {
                WebApiConfig.log.Error("微信退款成功, 返回值不对:" + out_trade_no);
                throw new Exception("微信退款成功, 返回值不对:" + out_trade_no);
            }
        }
Exemple #8
0
        public HttpResponseMessage Get(string startTime, string endTime)
        {
            var     response      = new RetDTO();
            JObject requestHeader = new JObject();

            try
            {
                if (string.IsNullOrEmpty(startTime) || string.IsNullOrEmpty(endTime))
                {
                    response.Header = CommonBusiness.SetHeader(requestHeader, CustomizeStatus.ParamError, "参数不正确");
                    return(Request.CreateResponse(HttpStatusCode.OK, response, "application/json"));
                }

                var result = TradeBusiness.GetTradeList(startTime, endTime);
                response.Header = CommonBusiness.SetHeader(requestHeader, CustomizeStatus.Success, string.Empty);
                response.Body   = result;
                return(Request.CreateResponse(HttpStatusCode.OK, response, "application/json"));
            }
            catch (Exception ex)
            {
                response.Header = CommonBusiness.SetHeader(requestHeader, CustomizeStatus.CatchError, ex.Message);
                return(Request.CreateResponse(HttpStatusCode.OK, response, "application/json"));
            }
        }
Exemple #9
0
        protected void Page_Load(object sender, EventArgs e)
        {
            WebApiConfig.log.Info(Request.RawUrl);
            SortedDictionary <string, string> sPara = GetRequestGet();

            if (sPara.Count > 0)//判断是否有带返回参数
            {
                Notify aliNotify = new Notify();
                //bool verifyResult = aliNotify.Verify(sPara, Request.QueryString["notify_id"], Request.QueryString["sign"]);

                string sign = sPara["sign"];

                sPara.Remove("sign");
                sPara.Remove("sign_type");
                string signContent  = AlipaySignature.GetSignContent(sPara);
                var    verifyResult = AlipaySignature.RSACheckContent(signContent, sign, ConfigurationManager.AppSettings["alipay.publicKey"], Request.QueryString["charset"], "RSA", false);
                if (verifyResult)//验证成功
                {
                    /////////////////////////////////////////////////////////////////////////////////////////////////////////////
                    //请在这里加上商户的业务逻辑程序代码


                    //——请根据您的业务逻辑来编写程序(以下代码仅作参考)——
                    //获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表

                    //商户订单号

                    string out_trade_no = Request.QueryString["out_trade_no"];

                    //支付宝交易号

                    string trade_no = Request.QueryString["trade_no"];

                    //交易状态
                    string  trade_status = Request.QueryString["trade_status"] ?? string.Empty;
                    JObject localResult;
                    int     resultCode;
                    if (Request.QueryString["trade_status"] == "TRADE_FINISHED")
                    {
                        //判断该笔订单是否在商户网站中已经做过处理
                        //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
                        //如果有做过处理,不执行商户的业务程序
                        WebApiConfig.log.Info(out_trade_no + "-" + trade_no + "支付宝返回订单完成");
                        if (!TradeBusiness.UpdateTradeStatusSeveralTimes(out_trade_no, trade_no, PaymentType.Alipay, trade_status, TradeStatus.RETURNFINISHED, out localResult))
                        {
                            WebApiConfig.log.Error(out_trade_no + "-" + trade_no + "支付宝返回订单完成,本地数据库状态维护失败");
                        }

                        resultCode = (int)TradeStatus.RETURNFINISHED;
                    }
                    else if (Request.QueryString["trade_status"] == "TRADE_SUCCESS")
                    {
                        WebApiConfig.log.Info(out_trade_no + "-" + trade_no + "支付宝返回订单支付成功");
                        if (!TradeBusiness.UpdateTradeStatusSeveralTimes(out_trade_no, trade_no, PaymentType.Alipay, trade_status, TradeStatus.RETURNSUCCESS, out localResult))
                        {
                            WebApiConfig.log.Error(out_trade_no + "-" + trade_no + "支付宝返回订单支付成功,本地数据库状态维护失败");
                        }

                        resultCode = (int)TradeStatus.RETURNSUCCESS;
                    }
                    else
                    {
                        WebApiConfig.log.Error(out_trade_no + "-" + trade_no + "支付宝沒有返回订单支付結果");
                        // ? 新接口return 沒有trade_status
                        //TradeBusiness.UpdateTradeStatusSeveralTimes(out_trade_no, trade_no, PaymentType.Alipay, trade_status, TradeStatus.RETURNISSUE, out localResult);
                        //resultCode = (int)TradeStatus.RETURNISSUE;
                        TradeBusiness.UpdateTradeStatusSeveralTimes(out_trade_no, trade_no, PaymentType.Alipay, trade_status, TradeStatus.RETURNISSUE, out localResult);
                        resultCode = (int)TradeStatus.RETURNSUCCESS;
                    }

                    var returnUrl = localResult.GetValue("ReturnUrl") == null ? string.Empty : localResult.GetValue("ReturnUrl").ToString();
                    if (string.IsNullOrEmpty(returnUrl))
                    {
                        //打印页面
                        Response.Write(out_trade_no + "订单处理完毕");
                    }
                    else
                    {
                        var fee = localResult.GetValue("Fee").ToString();
                        Response.Clear();
                        Response.Write("<script>top.postMessage('{\"url\":\"" + string.Format("{0}?result={1}&tradeNo={2}&fee={3}\"", returnUrl, resultCode, out_trade_no, fee) + "}', '*');</script>");
                        Response.End();
                    }

                    //——请根据您的业务逻辑来编写程序(以上代码仅作参考)——
                    /////////////////////////////////////////////////////////////////////////////////////////////////////////////
                }
                else//验证失败
                {
                    WebApiConfig.log.Error("支付宝返回结果验证失败");
                    Response.Write("支付宝返回结果验证失败");
                }
            }
            else
            {
                WebApiConfig.log.Error("支付宝返回结果无返回参数");
                Response.Write("支付宝返回结果无返回参数");
            }
        }
Exemple #10
0
        public static JObject createForm(PaymentType paymentType, string from, string fromNo, string fee, string subject, string installmentTimes, bool isPC = false)
        {
            ////////////////////////////////////////////请求参数////////////////////////////////////////////
            //商户订单号,商户网站订单系统中唯一订单号,必填
            var now          = DateTime.Now;
            var out_trade_no = now.ToString("yyyyMMddHHmmssfff") + CommonBusiness.CreateRandom();
            var orderDate    = now.ToString("yyyyMMddHHmmss");

            //订单名称,必填
            if (string.IsNullOrEmpty(subject))
            {
                subject = "工行支付";
            }

            //付款金额,必填
            var total_fee = (double.Parse(fee)).ToString();

            if (!isPC)
            {
                var tranData = CreateTranData(orderDate, out_trade_no, total_fee, installmentTimes);

                // 本地数据维护 支付宝单位为元 支付宝类型统一为alipay 不好区分
                var result = TradeBusiness.AddTrade(out_trade_no, from, fromNo, PaymentType.ICBC, total_fee, subject, string.Empty, "0");
                if (!(bool)result["Flg"])
                {
                    throw new Exception("本地数据维护失败");
                }

                var bytes           = Encoding.GetEncoding("gbk").GetBytes(tranData);
                var translateString = Convert.ToBase64String(bytes);
                var form            = new StringBuilder();
                var signs           = CBCPayOnline.GetCheckInfo(tranData);
                form.Append("<h3>页面跳转中。。。</h3>");
                //form.Append("<form style=\"display:none;\" id=\"payForm\" action=\"http://wap2.icbc.com.cn/servlet/ICBCWAPEBizServlet\" > ");
                form.Append("<form style=\"display:none;\" id=\"payForm\" action=\"https://mywap2.icbc.com.cn/ICBCWAPBank/servlet/ICBCWAPEBizServlet\" > ");
                form.Append("<INPUT NAME=\"interfaceName\" TYPE=\"text\" value=\"ICBC_WAPB_B2C\">");
                form.Append("<INPUT NAME=\"interfaceVersion\" TYPE=\"text\" value=\"1.0.0.6\">");
                form.Append("<INPUT NAME=\"tranData\" TYPE=\"text\" value=\"" + translateString + "\">");
                form.Append("<INPUT NAME=\"merSignMsg\" TYPE=\"text\" value=\"" + signs[0] + "\">");
                form.Append("<INPUT NAME=\"merCert\" TYPE=\"text\" value=\"" + signs[1] + "\">");
                form.Append("<INPUT NAME=\"clientType\" TYPE=\"text\" value=\"0\">");
                form.Append("</form>");
                form.Append("<script>document.forms['payForm'].submit();</script>");

                return(new JObject(
                           new JProperty("Trade", ((JObject)result["Object"])["result"]),
                           new JProperty("Content", form.ToString())));
            }
            else
            {
                var tranData = CreateTranData_PC(orderDate, out_trade_no, total_fee, installmentTimes);

                // 本地数据维护 支付宝单位为元 支付宝类型统一为alipay 不好区分
                var result = TradeBusiness.AddTrade(out_trade_no, from, fromNo, PaymentType.ICBC, total_fee, subject, string.Empty, "0");
                if (!(bool)result["Flg"])
                {
                    throw new Exception("本地数据维护失败");
                }

                var bytes           = Encoding.GetEncoding("gbk").GetBytes(tranData);
                var translateString = Convert.ToBase64String(bytes);
                var form            = new StringBuilder();
                var signs           = CBCPayOnline.GetCheckInfo(tranData);
                form.Append("<h3>页面跳转中。。。</h3>");
                //form.Append("<form style=\"display:none;\" id=\"payForm\" action=\"http://wap2.icbc.com.cn/servlet/ICBCWAPEBizServlet\" > ");
                form.Append("<form style=\"display:none;\" id=\"payForm\" action=\"https://B2C.icbc.com.cn/servlet/ICBCINBSEBusinessServlet\" > ");
                form.Append("<INPUT NAME=\"interfaceName\" TYPE=\"text\" value=\"ICBC_PERBANK_B2C\">");
                form.Append("<INPUT NAME=\"interfaceVersion\" TYPE=\"text\" value=\"1.0.0.11\">");
                form.Append("<INPUT NAME=\"tranData\" TYPE=\"text\" value=\"" + translateString + "\">");
                form.Append("<INPUT NAME=\"merSignMsg\" TYPE=\"text\" value=\"" + signs[0] + "\">");
                form.Append("<INPUT NAME=\"merCert\" TYPE=\"text\" value=\"" + signs[1] + "\">");
                //form.Append("<INPUT NAME=\"clientType\" TYPE=\"text\" value=\"0\">");
                form.Append("</form>");
                form.Append("<script>document.forms['payForm'].submit();</script>");

                return(new JObject(
                           new JProperty("Trade", ((JObject)result["Object"])["result"]),
                           new JProperty("Content", form.ToString())));
            }
        }
Exemple #11
0
        public static JObject createForm(string from, string fromNo, string fee, string subject, string returnUrl)
        {
            ////////////////////////////////////////////请求参数////////////////////////////////////////////
            //商户订单号,商户网站订单系统中唯一订单号,必填
            var now          = DateTime.Now.ToString("yyyyMMddHHmmssfff");
            var txnTime      = DateTime.Now.ToString("yyyyMMddHHmmss");
            var out_trade_no = now + CommonBusiness.CreateRandom();

            //订单名称,必填
            if (string.IsNullOrEmpty(subject))
            {
                subject = "银联付款";
            }

            //付款金额,必填
            var total_fee = fee;

            //商品描述,可空
            var body = string.Empty;
            ////////////////////////////////////////////////////////////////////////////////////////////////

            /**
             * 重要:联调测试时请仔细阅读注释!
             *
             * 产品:跳转网关支付产品<br>
             * 交易:消费:前台跳转,有前台通知应答和后台通知应答<br>
             * 日期: 2015-09<br>
             * 版本: 1.0.0
             * 版权: 中国银联<br>
             * 说明:以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己需要,按照技术文档编写。该代码仅供参考,不提供编码性能规范性等方面的保障<br>
             * 提示:该接口参考文档位置:open.unionpay.com帮助中心 下载  产品接口规范  《网关支付产品接口规范》,<br>
             *              《平台接入接口规范-第5部分-附录》(内包含应答码接口规范,全渠道平台银行名称-简码对照表)<br>
             *              《全渠道平台接入接口规范 第3部分 文件接口》(对账文件格式说明)<br>
             * 测试过程中的如果遇到疑问或问题您可以:1)优先在open平台中查找答案:
             *                                  调试过程中的问题或其他问题请在 https://open.unionpay.com/ajweb/help/faq/list 帮助中心 FAQ 搜索解决方案
             *                             测试过程中产生的6位应答码问题疑问请在https://open.unionpay.com/ajweb/help/respCode/respCodeList 输入应答码搜索解决方案
             *                          2) 咨询在线人工支持: open.unionpay.com注册一个用户并登陆在右上角点击“在线客服”,咨询人工QQ测试支持。
             * 交易说明:1)以后台通知或交易状态查询交易确定交易成功,前台通知不能作为判断成功的标准.
             *       2)交易状态查询交易(Form_6_5_Query)建议调用机制:前台类交易建议间隔(5分、10分、30分、60分、120分)发起交易查询,如果查询到结果成功,则不用再查询。(失败,处理中,查询不到订单均可能为中间状态)。也可以建议商户使用payTimeout(支付超时时间),过了这个时间点查询,得到的结果为最终结果。
             */

            Dictionary <string, string> param = new Dictionary <string, string>();

            //以下信息非特殊情况不需要改动
            param["version"]      = "5.0.0";            //版本号
            param["encoding"]     = "UTF-8";            //编码方式
            param["txnType"]      = "01";               //交易类型
            param["txnSubType"]   = "01";               //交易子类
            param["bizType"]      = "000201";           //业务类型
            param["signMethod"]   = "01";               //签名方法
            param["channelType"]  = "08";               //渠道类型
            param["accessType"]   = "0";                //接入类型
            param["frontUrl"]     = SDKConfig.FrontUrl; //前台通知地址
            param["backUrl"]      = SDKConfig.BackUrl;  //后台通知地址
            param["currencyCode"] = "156";              //交易币种

            //TODO 以下信息需要填写
            param["merId"]   = "777290058110048"; //商户号,请改自己的测试商户号,此处默认取demo演示页面传递的参数
            param["orderId"] = out_trade_no;      //商户订单号,8-32位数字字母,不能含“-”或“_”,此处默认取demo演示页面传递的参数,可以自行定制规则
            param["txnTime"] = txnTime;           //订单发送时间,格式为YYYYMMDDhhmmss,取北京时间,此处默认取demo演示页面传递的参数,参考取法: DateTime.Now.ToString("yyyyMMddHHmmss")
            param["txnAmt"]  = total_fee;         //交易金额,单位分,此处默认取demo演示页面传递的参数
            //param["reqReserved"] = "透传信息";//请求方保留域,透传字段,查询、通知、对账文件中均会原样出现,如有需要请启用并修改自己希望透传的数据

            //TODO 其他特殊用法请查看 pages/api_01_gateway/special_use_purchase.htm

            AcpService.Sign(param, System.Text.Encoding.UTF8);

            // 本地数据维护 银联单位为分
            var result = TradeBusiness.AddTrade(out_trade_no, from, fromNo, PaymentType.Alipay, fee, subject, returnUrl, "0");

            if (!(bool)result["Flg"])
            {
                throw new Exception("本地数据维护失败");
            }

            var content = AcpService.CreateAutoFormHtml(SDKConfig.FrontTransUrl, param, System.Text.Encoding.UTF8);// 将SDKUtil产生的Html文档写入页面,从而引导用户浏览器重定向

            return(new JObject(
                       new JProperty("Trade", ((JObject)result["Object"])["result"]),
                       new JProperty("Content", content)));
        }
Exemple #12
0
        public void ProcessRequest(HttpContext context)
        {
            var result = false;

            try
            {
                var str = "工行通知:";
                foreach (var item in context.Request.Form.AllKeys)
                {
                    str += string.Format("{0}:{1},", item, context.Request.Form[item]);
                }

                WebApiConfig.log.Info(str);
                var notifyData = Encoding.GetEncoding("gbk").GetString(Convert.FromBase64String(context.Request.Form["notifyData"]));
                WebApiConfig.log.Info("notifyData:" + notifyData);
                var xdocument        = XDocument.Parse(notifyData);
                var return_code      = xdocument.Descendants("tranStat").First().Value;
                var out_trade_no     = xdocument.Descendants("orderid").First().Value;
                var orderDate        = xdocument.Descendants("orderDate").First().Value;
                var amount           = xdocument.Descendants("amount").First().Value;
                var installmentTimes = xdocument.Descendants("installmentTimes").First().Value;
                var tranSerialNoNode = xdocument.Descendants("TranSerialNo").FirstOrDefault();
                if (tranSerialNoNode == null)
                {
                    tranSerialNoNode = xdocument.Descendants("tranSerialNo").FirstOrDefault();
                }

                var tranSerialNo = tranSerialNoNode.Value; // 银行端指令流水号
                var comment      = xdocument.Descendants("comment").First().Value;

                WebApiConfig.log.Info("工行通知(" + out_trade_no + "-" + orderDate + "-" + amount + "-" + installmentTimes + "):" + return_code);

                TradeStatus status;
                if (return_code == "1")
                {
                    status = TradeStatus.NOTIFYSUCCESS;
                }
                else if (return_code == "2")
                {
                    status = TradeStatus.NOTIFYISSUE;
                }
                else if (return_code == "3")
                {
                    status = TradeStatus.NOTIFYSUSPECT;
                }
                else
                {
                    status = TradeStatus.NOTIFYUNKNOWN;
                }

                JObject localResult;
                if (!TradeBusiness.UpdateTradeStatusSeveralTimes(out_trade_no, tranSerialNo, PaymentType.ICBC, return_code, status, out localResult))
                {
                    WebApiConfig.log.Error(out_trade_no + "-" + tranSerialNo + ":接受到工行通知,本地数据库状态维护失败");
                }
                else
                {
                    result = true;
                }

                if (return_code == "1")
                {
                    // 通知患者端
                    PatientCustomerBusiness.NotifyPatient(localResult);
                }
            }
            catch (Exception e)
            {
                WebApiConfig.log.Error(e.ToString());
            }

            // todo
            if (result)
            {
                context.Response.ContentType = "text/html";
                context.Response.Write("success");
            }
            else
            {
                context.Response.ContentType = "text/html";
                context.Response.Write("failure");
            }
        }
Exemple #13
0
        /// <summary>
        /// 检查未提交订单
        /// </summary>
        public static void CheckOrder()
        {
            while (true)
            {
                var now     = DateTime.Now;
                var start   = now.AddHours(-24);
                var list    = TradeBusiness.GetTradeList(start.ToString(), now.ToString());
                var outMess = string.Empty;
                foreach (var item in list)
                {
                    var jObject = item as JObject;
                    var tradeNo = jObject.GetValue("TradeNo").ToString();
                    var status  = jObject.GetValue("Status").ToString();
                    if (status == "4" || status == "7")
                    {
                        break;
                    }

                    try
                    {
                        var mess = CheckOrder(tradeNo, tradeNo.Substring(0, 8), ConfigurationManager.AppSettings["icbc.merID"], ConfigurationManager.AppSettings["icbc.merAcct"], out outMess);
                        if (mess.Length > 5)//缴费成功,未返回错误编码,返回xml数据
                        {
                            DataSet      myds      = new DataSet();
                            StringReader strReader = new StringReader(mess);
                            myds.ReadXml(strReader);
                            string stat = myds.Tables["out"].Rows[0]["tranStat"].ToString();
                            if (stat == "1" || stat == "0")
                            {
                                var     actualTradeNo = myds.Tables["out"].Rows[0]["tranSerialNum"].ToString();
                                JObject localResult;
                                if (!TradeBusiness.UpdateTradeStatusSeveralTimes(tradeNo, actualTradeNo, PaymentType.ICBC, stat, TradeStatus.NOTIFYSUCCESS, out localResult))
                                {
                                    WebApiConfig.log.Info(tradeNo + ":工行查询支付成功,本地数据库状态维护失败");
                                }

                                // 通知患者端
                                PatientCustomerBusiness.NotifyPatient(localResult);
                            }
                            else//支付失败
                            {
                                WebApiConfig.log.Error(tradeNo + ":工行查询支付失败");
                            }
                        }
                        else
                        {
                            string pays = "";
                            switch (mess)
                            {
                            case "40972": pays = "API查询的订单不存在"; break;

                            case "40973": pays = "API查询过程中系统异常"; break;

                            case "40976": pays = "API查询系统异常"; break;

                            case "40977": pays = "商户证书信息错"; break;

                            case "40978": pays = "解包商户请求数据报错"; break;

                            case "40979": pays = "查询的订单不存在"; break;

                            case "40980": pays = "API查询过程中系统异常"; break;

                            case "40981": pays = "给商户打包返回数据错"; break;

                            case "40982": pays = "系统错误"; break;

                            case "40983": pays = "查询的订单不唯一"; break;

                            case "40987": pays = "商户代码或者商城账号有误"; break;

                            case "40947": pays = "给商户打包返回数据错"; break;

                            case "40948": pays = "商城状态非法"; break;

                            case "40949": pays = "商城类别非法"; break;

                            case "40950": pays = "商城应用类别非法"; break;

                            case "40951": pays = "商户证书id状态非法"; break;

                            case "40952": pays = "商户证书id未绑定"; break;

                            case "40953": pays = "商户id权限非法"; break;

                            case "40954": pays = "检查商户状态时数据库异常"; break;
                            }

                            WebApiConfig.log.Error(tradeNo + ":工行查询支付发生错误, 错误编码:" + mess + "-" + pays);
                        }
                    }
                    catch (Exception e)
                    {
                        WebApiConfig.log.Error(tradeNo + ":工行查询支付发生错误:" + e.ToString());
                    }
                }

                System.Threading.Thread.Sleep(1000 * 60 * 60);
            }
        }
Exemple #14
0
        //public static JObject execute(string from, string out_trade_no, string trade_no, string refund_amount, JObject result)
        //{
        //    // 标识一次退款请求,同一笔交易多次退款需要保证唯一,如需部分退款,则此参数必传。
        //    var amount = (double.Parse(refund_amount)).ToString();
        //    var now = DateTime.Now;
        //    var seqno = now.ToString("yyyyMMddHHmmssfff") + CommonBusiness.CreateRandom();
        //    var signTime = now.ToString("yyyyMMddHHmmssfff");
        //    var tranDate = now.ToString("yyyyMMdd");
        //    var tranTime = now.ToString("HHmmssfff");
        //    var sb = new StringBuilder();
        //    sb.Append("<?xml version=\"1.0\" encoding=\"GBK\"?>");
        //    sb.Append("<CMS>");
        //    sb.Append("<eb>");
        //    sb.Append("<pub>");
        //    sb.Append("<TransCode>EBUSCOM</TransCode>"); //交易代码
        //    sb.Append("<CIS>100190013673155</CIS>"); // 客户注册时的归属编码,集团CIS号
        //    sb.Append("<BankCode>102</BankCode>"); // 客户注册时的归属单位,归属银行编号
        //    sb.Append("<ID>Niuluo.y.1001</ID>	"); // 无证书客户可上送空
        //    sb.Append("<TranDate>" + tranDate + "</TranDate>"); // ERP系统产生的交易日期,格式是yyyyMMdd
        //    sb.Append("<TranTime>" + tranTime + "</TranTime>"); // ERP系统产生的交易时间,格式如HHmmssSSS,精确到毫秒
        //    sb.Append("<fSeqno>" + seqno + "</fSeqno>"); // ERP系统产生的指令包序列号,一个集团永远不能重复
        //    sb.Append("</pub>");
        //    sb.Append("<in>");
        //    sb.Append("<TranType>0</TranType>"); // 0:退货 1:返还  2:转付
        //    sb.Append("<ShopType>2</ShopType>"); // 1:B2B商城  2:B2C商城
        //    sb.Append("<ShopCode>" + ConfigurationManager.AppSettings["icbc.merID"] + "</ShopCode>"); // 商城代码
        //    sb.Append("<ShopAcct>" + ConfigurationManager.AppSettings["icbc.merAcct"] + "</ShopAcct>"); // 商城账号 银联订单不可以上送
        //    sb.Append("<OrderNum>" + out_trade_no + "</OrderNum>");
        //    sb.Append("<PayType></PayType>"); // 0:普通 1:加急(B2C交易可为空)
        //    sb.Append("<PayDate>" + out_trade_no.Substring(0, 8) + "</PayDate>"); // yyyyMMdd(支持14位日期,前8位生效)
        //    sb.Append("<TransferName></TransferName>"); // B2C转付操作时必输,其他情况为空
        //    sb.Append("<TransferAccNo></TransferAccNo>"); // B2C转付操作时必输,其他情况为空
        //    sb.Append("<PayAmt>" + amount + "</PayAmt>"); // 以分为单位,B2C转付交易时需控制单笔金额(<=5万元), 融e购订单复用为现金支付金额
        //    sb.Append("<SignTime>" + signTime + "</SignTime>"); // 格式是yyyyMMddHHmmssSSS
        //    sb.Append("<ReqReserved1></ReqReserved1>"); // 退货时,可输入退货原因
        //    sb.Append("<ReqReserved2></ReqReserved2>	"); // 融e购订单复用为退货积分值|退货积分等值金额|退货积分对应商户金额
        //    sb.Append("<AcctSeq></AcctSeq>	");
        //    sb.Append("</in>");
        //    sb.Append("</eb>");
        //    sb.Append("</CMS>");

        //    var queryParams = new StringBuilder();
        //    queryParams.Append("Version=0.0.1.0");
        //    queryParams.Append("&TransCode=EBUSCOM");
        //    queryParams.Append("&BankCode=102");
        //    queryParams.Append("&GroupCIS=100190013673155");
        //    queryParams.Append("&ID=Niuluo.y.1001"); // 客户的证书ID(无证书客户可空)
        //    queryParams.Append("&PackageID=" + seqno); // 客户的指令包序列号(由客户ERP系统产生,不可重复)
        //    queryParams.Append("&Cert=客户的证书公钥信息(进行BASE64编码)");
        //    queryParams.Append("&reqData=" + CBCPayOnline.Encode(sb.ToString())); // 客户的xml请求数据

        //    var errorInfo = string.Empty;
        //    CBCPayOnline.PostDataBySSL(queryParams.ToString(), "https://银行通讯前置的地址和加密端口号?请求数据", string.Empty, string.Empty, out errorInfo);
        //    WebApiConfig.log.Info("工行退费返回结果:" + errorInfo);
        //    if (errorInfo.IndexOf("errorCode=") > -1)
        //    {
        //        WebApiConfig.log.Error("工行退费失败:" + errorInfo);
        //        throw new Exception("工行退费失败");
        //    }
        //    else if (errorInfo.IndexOf("reqData=") > -1)
        //    {
        //        var returnStr = CBCPayOnline.Decode(errorInfo.Replace("reqData=", string.Empty), "gbk");
        //        WebApiConfig.log.Info("工行退费返回xml:" + returnStr);
        //        var doc = XDocument.Parse(returnStr);
        //        var orderNum = doc.Descendants("OrderNum").FirstOrDefault().Value;
        //        var resultCode = doc.Descendants("Result").FirstOrDefault().Value;
        //        var fee = doc.Descendants("PayAmt").FirstOrDefault().Value;
        //        var retCode = doc.Descendants("RetCode").FirstOrDefault().Value;
        //        if (orderNum != out_trade_no)
        //        {
        //            WebApiConfig.log.Error("工行退费订单号不匹配:" + orderNum + "&" + out_trade_no);
        //            throw new Exception("工行退费交易不成功");
        //        }
        //        else if (resultCode != "1")
        //        {
        //            WebApiConfig.log.Error("工行退费交易不成功:" + orderNum + "&" + resultCode);
        //            throw new Exception("工行退费交易不成功");
        //        }
        //        else
        //        {
        //            WebApiConfig.log.Error("工行退费成功:" + orderNum + "&" + fee);
        //            JObject localResult;
        //            if (!TradeBusiness.UpdateTradeStatusSeveralTimes(out_trade_no, retCode, PaymentType.ICBC, string.Empty, TradeStatus.REFUND, out localResult))
        //            {
        //                WebApiConfig.log.Error("工行退费成功,本地数据库状态维护失败:" + orderNum);
        //                return new JObject(new JProperty("Trade", result));
        //            }
        //            else
        //            {
        //                return new JObject(new JProperty("Trade", localResult));
        //            }
        //        }
        //    }
        //    else
        //    {
        //        WebApiConfig.log.Error("工行退费结果未知:" + errorInfo);
        //        throw new Exception("工行退费失败");
        //    }
        //}

        public static JObject execute(string from, string out_trade_no, string trade_no, string refund_amount, JObject result)
        {
            //return new JObject(new JProperty("Trade", result));

            // 标识一次退款请求,同一笔交易多次退款需要保证唯一,如需部分退款,则此参数必传。
            var amount   = (double.Parse(refund_amount)).ToString();
            var now      = DateTime.Now;
            var seqno    = now.ToString("yyyyMMddHHmmssfff") + CommonBusiness.CreateRandom();
            var signTime = now.ToString("yyyyMMddHHmmssfff");
            var tranDate = now.ToString("yyyyMMdd");
            var tranTime = now.ToString("HHmmssfff");
            var sb       = new StringBuilder();

            sb.Append("<?xml version=\"1.0\" encoding=\"GBK\"?>");
            sb.Append("<CMS>");
            sb.Append("<eb>");
            sb.Append("<pub>");
            sb.Append("<TransCode>EBUSCOM</TransCode>");        //交易代码
            sb.Append("<CIS>100190013673155</CIS>");            // 客户注册时的归属编码,集团CIS号
            sb.Append("<BankCode>102</BankCode>");              // 客户注册时的归属单位,归属银行编号
            sb.Append("<ID>Niuluo.y.1001</ID>	"); // 无证书客户可上送空
            sb.Append("<TranDate>" + tranDate + "</TranDate>"); // ERP系统产生的交易日期,格式是yyyyMMdd
            sb.Append("<TranTime>" + tranTime + "</TranTime>"); // ERP系统产生的交易时间,格式如HHmmssSSS,精确到毫秒
            sb.Append("<fSeqno>" + seqno + "</fSeqno>");        // ERP系统产生的指令包序列号,一个集团永远不能重复
            sb.Append("</pub>");
            sb.Append("<in>");
            sb.Append("<TranType>0</TranType>");                                                        // 0:退货 1:返还  2:转付
            sb.Append("<ShopType>2</ShopType>");                                                        // 1:B2B商城  2:B2C商城
            sb.Append("<ShopCode>" + ConfigurationManager.AppSettings["icbc.merID"] + "</ShopCode>");   // 商城代码
            sb.Append("<ShopAcct>" + ConfigurationManager.AppSettings["icbc.merAcct"] + "</ShopAcct>"); // 商城账号 银联订单不可以上送
            sb.Append("<OrderNum>" + out_trade_no + "</OrderNum>");
            sb.Append("<PayType></PayType>");                                                           // 0:普通 1:加急(B2C交易可为空)
            sb.Append("<PayDate>" + out_trade_no.Substring(0, 8) + "</PayDate>");                       // yyyyMMdd(支持14位日期,前8位生效)
            sb.Append("<TransferName></TransferName>");                                                 // B2C转付操作时必输,其他情况为空
            sb.Append("<TransferAccNo></TransferAccNo>");                                               // B2C转付操作时必输,其他情况为空
            sb.Append("<PayAmt>" + amount + "</PayAmt>");                                               // 以分为单位,B2C转付交易时需控制单笔金额(<=5万元), 融e购订单复用为现金支付金额
            sb.Append("<SignTime>" + signTime + "</SignTime>");                                         // 格式是yyyyMMddHHmmssSSS
            sb.Append("<ReqReserved1></ReqReserved1>");                                                 // 退货时,可输入退货原因
            sb.Append("<ReqReserved2></ReqReserved2>	"); // 融e购订单复用为退货积分值|退货积分等值金额|退货积分对应商户金额
            sb.Append("<AcctSeq></AcctSeq>	");
            sb.Append("</in>");
            sb.Append("</eb>");
            sb.Append("</CMS>");

            try
            {
                // NC签名数据处理
                ASCIIEncoding encoding = new ASCIIEncoding();
                byte[]        data     = encoding.GetBytes(sb.ToString());

                WebRequest     webRequest  = WebRequest.Create("http://www.niuluo-tech.cn:95");
                HttpWebRequest httpRequest = webRequest as HttpWebRequest;
                httpRequest.KeepAlive     = true;
                httpRequest.UserAgent     = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)";
                httpRequest.ContentType   = "INFOSEC_SIGN/1.0";
                httpRequest.Method        = "POST";
                httpRequest.ContentLength = data.Length;
                Stream requestStream = httpRequest.GetRequestStream();
                requestStream.Write(data, 0, data.Length);
                requestStream.Close();
                Stream responseStream = null;
                responseStream = httpRequest.GetResponse().GetResponseStream();

                string stringResponse = string.Empty;
                if (responseStream != null)
                {
                    using (StreamReader responseReader =
                               new StreamReader(responseStream, Encoding.GetEncoding("GBK")))
                    {
                        stringResponse = responseReader.ReadToEnd();
                    }

                    responseStream.Close();
                }

                WebApiConfig.log.Info("NC签名数据:" + stringResponse);
                var beginSign = 0;
                var endSign   = 0;
                try
                {
                    beginSign = stringResponse.IndexOf("<sign>") + 6;
                    endSign   = stringResponse.IndexOf("</sign>");
                    WebApiConfig.log.Info("NC签名结果:" + beginSign + "&" + endSign);
                }
                catch (Exception e)
                {
                    WebApiConfig.log.Error("!!!!!!!!!!接收签名数据失败,请检查nc设置!!!!!!!!!!");
                }

                // NC工行退款
                var repSignContent = stringResponse.Substring(beginSign, endSign - beginSign);
                var queryParams    = new StringBuilder();
                queryParams.Append("Version=0.0.1.0");
                queryParams.Append("&TransCode=EBUSCOM");
                queryParams.Append("&BankCode=102");
                queryParams.Append("&GroupCIS=100190013673155");
                queryParams.Append("&ID=Niuluo.y.1001");          // 客户的证书ID(无证书客户可空)
                queryParams.Append("&PackageID=" + seqno);        // 客户的指令包序列号(由客户ERP系统产生,不可重复)
                queryParams.Append("&Cert=");
                queryParams.Append("&reqData=" + repSignContent); // 客户的xml请求数据
                ASCIIEncoding  encoding2    = new ASCIIEncoding();
                byte[]         data2        = encoding.GetBytes(queryParams.ToString());
                WebRequest     webRequest2  = WebRequest.Create("http://www.niuluo-tech.cn:94/servlet/ICBCCMPAPIReqServlet?PackageID=" + seqno + "&SendTime=" + now.ToString("yyyyMMddHHmmss"));
                HttpWebRequest httpRequest2 = webRequest2 as HttpWebRequest;
                httpRequest2.KeepAlive     = true;
                httpRequest2.UserAgent     = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)";
                httpRequest2.ContentType   = "application/x-www-form-urlencoded";
                httpRequest2.Method        = "POST";
                httpRequest2.ContentLength = data2.Length;
                Stream requestStream2 = httpRequest2.GetRequestStream();
                requestStream2.Write(data2, 0, data2.Length);
                requestStream2.Close();
                Stream responseStream2 = null;
                responseStream2 = httpRequest2.GetResponse().GetResponseStream();
                string stringResponse2 = string.Empty;
                if (responseStream2 != null)
                {
                    using (StreamReader responseReader =
                               new StreamReader(responseStream2, Encoding.GetEncoding("GBK")))
                    {
                        stringResponse2 = responseReader.ReadToEnd();
                    }

                    responseStream2.Close();
                }

                WebApiConfig.log.Info("工行退费返回结果:" + stringResponse2);
                if (stringResponse2.IndexOf("errorCode=") > -1)
                {
                    WebApiConfig.log.Error("工行退费失败:" + stringResponse2);
                    throw new Exception("工行退费失败");
                }
                else if (stringResponse2.IndexOf("reqData=") > -1)
                {
                    var returnStr = CBCPayOnline.Decode(stringResponse2.Replace("reqData=", string.Empty), "gbk");
                    WebApiConfig.log.Info("工行退费返回xml:" + returnStr);
                    var doc        = XDocument.Parse(returnStr);
                    var orderNum   = doc.Descendants("OrderNum").FirstOrDefault().Value;
                    var resultCode = doc.Descendants("Result").FirstOrDefault().Value;
                    var fee        = doc.Descendants("PayAmt").FirstOrDefault().Value;
                    var retCode    = doc.Descendants("fSeqno").FirstOrDefault().Value;
                    if (orderNum != out_trade_no)
                    {
                        WebApiConfig.log.Error("工行退费订单号不匹配:" + orderNum + "&" + out_trade_no);
                        throw new Exception("工行退费交易不成功");
                    }
                    else if (resultCode != "1")
                    {
                        var retMsg = doc.Descendants("RetMsg").FirstOrDefault().Value;
                        WebApiConfig.log.Error("工行退费交易不成功:" + orderNum + "&" + resultCode + ":" + retMsg);
                        throw new Exception("工行退费交易不成功");
                    }
                    else
                    {
                        WebApiConfig.log.Info("工行退费成功:" + orderNum + "&" + fee + ":" + retCode);
                        JObject localResult;
                        if (!TradeBusiness.UpdateTradeStatusSeveralTimes(out_trade_no, result.GetValue("ActualTradeNo").ToString(), PaymentType.ICBC, string.Empty, TradeStatus.REFUND, out localResult))
                        {
                            WebApiConfig.log.Error("工行退费成功,本地数据库状态维护失败:" + orderNum);
                            return(new JObject(new JProperty("Trade", result)));
                        }
                        else
                        {
                            return(new JObject(new JProperty("Trade", localResult)));
                        }
                    }
                }
                else
                {
                    WebApiConfig.log.Error("工行退费结果未知:" + stringResponse2);
                    throw new Exception("工行退费失败");
                }
            }
            catch (Exception e)
            {
                WebApiConfig.log.Error(e.Message);
                WebApiConfig.log.Error("退费出错:" + e.ToString());
            }

            return(null);
        }
Exemple #15
0
        protected void Page_Load(object sender, EventArgs e)
        {
            SortedDictionary <string, string> sPara = GetRequestPost();

            if (sPara.Count > 0)//判断是否有带返回参数
            {
                var str = string.Empty;
                foreach (var item in sPara)
                {
                    str += string.Format("{0}:{1},", item.Key, item.Value);
                }

                WebApiConfig.log.Info(str);

                Notify aliNotify = new Notify();
                //bool verifyResult = aliNotify.Verify(sPara, Request.Form["notify_id"], Request.Form["sign"]);
                string sign = sPara["sign"];
                sPara.Remove("sign");
                sPara.Remove("sign_type");
                string signContent  = AlipaySignature.GetSignContent(sPara);
                var    verifyResult = AlipaySignature.RSACheckContent(signContent, sign, ConfigurationManager.AppSettings["alipay.publicKey"], Request.QueryString["charset"], "RSA", false);
                if (verifyResult)//验证成功
                {
                    /////////////////////////////////////////////////////////////////////////////////////////////////////////////
                    //请在这里加上商户的业务逻辑程序代码


                    //——请根据您的业务逻辑来编写程序(以下代码仅作参考)——
                    //获取支付宝的通知返回参数,可参考技术文档中服务器异步通知参数列表

                    //商户订单号

                    string out_trade_no = Request.Form["out_trade_no"];

                    //支付宝交易号

                    string trade_no = Request.Form["trade_no"];

                    //交易状态
                    string  trade_status = Request.Form["trade_status"];
                    JObject localResult;
                    int     resultCode;
                    if (Request.Form["trade_status"] == "TRADE_FINISHED")
                    {
                        //判断该笔订单是否在商户网站中已经做过处理
                        //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
                        //请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的
                        //如果有做过处理,不执行商户的业务程序

                        //注意:
                        //退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知
                        WebApiConfig.log.Info(out_trade_no + "-" + trade_no + "支付宝通知订单完成");
                        if (!TradeBusiness.UpdateTradeStatusSeveralTimes(out_trade_no, trade_no, PaymentType.Alipay, trade_status, TradeStatus.NOTIFYFINISHED, out localResult))
                        {
                            WebApiConfig.log.Error(out_trade_no + "-" + trade_no + "支付宝通知订单完成,本地数据库状态维护失败");
                        }

                        resultCode = (int)TradeStatus.NOTIFYFINISHED;
                    }
                    else if (Request.Form["trade_status"] == "TRADE_SUCCESS")
                    {
                        //判断该笔订单是否在商户网站中已经做过处理
                        //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
                        //请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的
                        //如果有做过处理,不执行商户的业务程序

                        //注意:
                        //付款完成后,支付宝系统发送该交易状态通知
                        WebApiConfig.log.Info(out_trade_no + "-" + trade_no + "支付宝通知订单支付成功");
                        if (!TradeBusiness.UpdateTradeStatusSeveralTimes(out_trade_no, trade_no, PaymentType.Alipay, trade_status, TradeStatus.NOTIFYSUCCESS, out localResult))
                        {
                            WebApiConfig.log.Error(out_trade_no + "-" + trade_no + "支付宝通知订单支付成功,本地数据库状态维护失败");
                        }

                        resultCode = (int)TradeStatus.NOTIFYSUCCESS;
                    }
                    else
                    {
                        TradeBusiness.UpdateTradeStatusSeveralTimes(out_trade_no, trade_no, PaymentType.Alipay, trade_status, TradeStatus.NOTIFYISSUE, out localResult);
                        WebApiConfig.log.Error(out_trade_no + "-" + trade_no + "支付宝通知失败");
                        resultCode = (int)TradeStatus.NOTIFYISSUE;
                    }

                    // 通知患者端
                    PatientCustomerBusiness.NotifyPatient(localResult);
                    Response.Clear();
                    Response.Write("success");
                    Response.End();
                    /////////////////////////////////////////////////////////////////////////////////////////////////////////////
                }
                else//验证失败
                {
                    WebApiConfig.log.Error("支付宝通知验证失败");
                    Response.Write("支付宝通知验证失败");
                }
            }
            else
            {
                WebApiConfig.log.Error("支付宝无通知参数");
                Response.Write("支付宝无通知参数");
            }
        }
Exemple #16
0
        protected void Page_Load(object sender, EventArgs e)
        {
            // **************演示后台接收银联返回报文交易结果展示***********************

            if (Request.HttpMethod == "POST")
            {
                // 使用Dictionary保存参数
                Dictionary <string, string> resData = new Dictionary <string, string>();
                var      coll        = Request.Form;
                string[] requestItem = coll.AllKeys;
                for (int i = 0; i < requestItem.Length; i++)
                {
                    resData.Add(requestItem[i], Request.Form[requestItem[i]]);
                }

                // 返回报文中不包含UPOG,表示Server端正确接收交易请求,则需要验证Server端返回报文的签名
                if (AcpService.Validate(resData, System.Text.Encoding.UTF8))
                {
                    //Response.Write("商户端验证返回报文签名成功\n");

                    string respcode     = resData["respCode"]; //00、A6为成功,其余为失败。其他字段也可按此方式获取。
                    var    out_trade_no = resData["orderId"];
                    var    trade_no     = resData["queryId"];

                    //如果卡号我们业务配了会返回且配了需要加密的话,请按此方法解密
                    //if(resData.ContainsKey("accNo"))
                    //{
                    //    string accNo = SecurityUtil.DecryptData(resData["accNo"], System.Text.Encoding.UTF8);
                    //}

                    JObject localResult;
                    int     resultCode;
                    if (respcode == "00" || respcode == "A6")
                    {
                        //判断该笔订单是否在商户网站中已经做过处理
                        //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
                        //如果有做过处理,不执行商户的业务程序
                        WebApiConfig.log.Info(out_trade_no + "-" + trade_no + "银联通知完成");
                        if (!TradeBusiness.UpdateTradeStatusSeveralTimes(out_trade_no, trade_no, PaymentType.UnionPay, respcode, TradeStatus.NOTIFYSUCCESS, out localResult))
                        {
                            WebApiConfig.log.Error(out_trade_no + "-" + trade_no + "银联通知完成,本地数据库状态维护失败");
                        }

                        resultCode = (int)TradeStatus.NOTIFYSUCCESS;
                    }
                    else
                    {
                        WebApiConfig.log.Error(out_trade_no + "-" + trade_no + "银联通知错误");
                        TradeBusiness.UpdateTradeStatusSeveralTimes(out_trade_no, trade_no, PaymentType.UnionPay, respcode, TradeStatus.NOTIFYISSUE, out localResult);
                        resultCode = (int)TradeStatus.NOTIFYISSUE;
                    }

                    //如果卡号我们业务配了会返回且配了需要加密的话,请按此方法解密
                    //if(resData.ContainsKey("accNo"))
                    //{
                    //    string accNo = SecurityUtil.DecryptData(resData["accNo"], System.Text.Encoding.UTF8);
                    //}

                    var returnUrl = localResult.GetValue("ReturnUrl") == null ? string.Empty : localResult.GetValue("ReturnUrl").ToString();
                    if (string.IsNullOrEmpty(returnUrl))
                    {
                        //商户端根据返回报文内容处理自己的业务逻辑 ,DEMO此处只输出报文结果
                        StringBuilder builder = new StringBuilder();

                        builder.Append("<tr><td align=\"center\" colspan=\"2\"><b>商户端接收银联返回报文并按照表格形式输出结果</b></td></tr>");

                        for (int i = 0; i < requestItem.Length; i++)
                        {
                            builder.Append("<tr><td width=\"30%\" align=\"right\">" + requestItem[i] + "</td><td style='word-break:break-all'>" + Request.Form[requestItem[i]] + "</td></tr>");
                        }

                        builder.Append("<tr><td width=\"30%\" align=\"right\">商户端验证银联返回报文结果</td><td>验证签名成功.</td></tr>");
                        Response.Write(builder.ToString());
                    }
                    else
                    {
                        var fee = localResult.GetValue("Fee").ToString();
                        Response.Clear();
                        Response.Write("<script>top.postMessage('{\"url\":\"" + string.Format("{0}?result={1}&tradeNo={2}&fee={3}\"", returnUrl, resultCode, out_trade_no, fee) + "}', '*');</script>");
                        Response.End();
                    }
                }
                else
                {
                    WebApiConfig.log.Error("银联验证签名失败");
                    Response.Write("<tr><td width=\"30%\" align=\"right\">商户端验证银联返回报文结果</td><td>验证签名失败.</td></tr>");
                }
            }
        }
Exemple #17
0
        // POST api/<controller>
        public HttpResponseMessage Post()
        {
            var     response      = new RetDTO();
            JObject requestHeader = null;
            JObject requestBody   = null;
            var     token         = string.Empty;
            var     timeStamp     = string.Empty;
            var     tradeNo       = string.Empty;
            var     fee           = string.Empty;
            var     from          = string.Empty;
            var     sign          = string.Empty;

            try
            {
                var httpCurrent = HttpContext.Current;
                var request     = HttpHelper.GetRequestJObjectFromStream(HttpContext.Current);
                requestHeader = (JObject)request.GetValue("Header");
                token         = requestHeader.GetValue("Token").ToString();
                timeStamp     = requestHeader.GetValue("TimeStamp").ToString();

                requestBody = (JObject)request.GetValue("Body");
                tradeNo     = requestBody.GetValue("TradeNo").ToString();
                fee         = requestBody.GetValue("Fee").ToString();
                from        = requestBody.GetValue("From").ToString();
                sign        = requestBody.GetValue("sign").ToString();
                WebApiConfig.log.Info("Refund controller:" + request.ToString());
            }
            catch (Exception ex)
            {
                WebApiConfig.log.Error("参数错误");
                response.Header = CommonBusiness.SetHeader(requestHeader, CustomizeStatus.CatchError, "参数错误:" + ex.Message);
                return(Request.CreateResponse(HttpStatusCode.BadRequest, response));
            }

            try
            {
                if (string.IsNullOrEmpty(token))
                {
                    WebApiConfig.log.Error("令牌为空");
                    response.Header = CommonBusiness.SetHeader(requestHeader, CustomizeStatus.NoLogin, "令牌为空");
                    return(Request.CreateResponse(HttpStatusCode.BadRequest, response));
                }

                double temp;
                if (string.IsNullOrEmpty(tradeNo) || !double.TryParse(fee, out temp) || string.IsNullOrEmpty(from) || string.IsNullOrEmpty(sign))
                {
                    WebApiConfig.log.Error("参数不正确");
                    response.Header = CommonBusiness.SetHeader(requestHeader, CustomizeStatus.ParamError, "参数不正确");
                    return(Request.CreateResponse(HttpStatusCode.BadRequest, response));
                }

                //sign = EncryptDES(tradeNo + "," + from);
                var signValue = Decode(sign);
                var splits    = signValue.Split(',');
                if (splits.Length != 2 || splits[0] != tradeNo || splits[1] != from)
                {
                    WebApiConfig.log.Error("验证签名不过");
                    response.Header = CommonBusiness.SetHeader(requestHeader, CustomizeStatus.ParamError, "验证签名不过");
                    return(Request.CreateResponse(HttpStatusCode.BadRequest, response));
                }

                var result = TradeBusiness.GetByActualTradeNo(tradeNo, from);
                if (result == null)
                {
                    WebApiConfig.log.Error("传入的订单号不存在");
                    throw new Exception("传入的订单号不存在");
                }

                object responseForm;
                var    paymentType = result.GetValue("Type").ToString();
                //if (paymentType == ((int)PaymentType.Alipay).ToString() || paymentType == ((int)PaymentType.AlipayWap).ToString())
                //{
                //    responseForm = Alipay.Refund.execute(from, tradeNo, string.Empty, fee, result);
                //}
                //else if (paymentType == ((int)PaymentType.WechatPay).ToString())
                //{
                //    responseForm = WxPay.Refund.execute(from, tradeNo, string.Empty, fee, result);
                //}
                if (paymentType == ((int)PaymentType.ICBC).ToString())
                {
                    WebApiConfig.log.Info("开始退款流程");
                    responseForm = ICBC.Refund.execute(from, result.GetValue("TradeNo").ToString(), string.Empty, fee, result);
                }
                else
                {
                    WebApiConfig.log.Error("该模式不支持退款");
                    throw new Exception("该模式不支持退款");
                }

                response.Header = CommonBusiness.SetHeader(requestHeader, CustomizeStatus.Success, string.Empty);
                response.Body   = responseForm;
                return(Request.CreateResponse(HttpStatusCode.OK, response));
            }
            catch (Exception ex)
            {
                response.Header = CommonBusiness.SetHeader(requestHeader, CustomizeStatus.CatchError, ex.Message);
                return(Request.CreateResponse(HttpStatusCode.InternalServerError, response));
            }
        }
Exemple #18
0
        // POST api/<controller>
        public HttpResponseMessage Post()
        {
            var     response      = new RetDTO();
            JObject requestHeader = null;
            JObject requestBody   = null;
            var     token         = string.Empty;
            var     timeStamp     = string.Empty;
            var     no            = string.Empty;
            var     from          = string.Empty;
            var     type          = string.Empty;

            try
            {
                var httpCurrent = HttpContext.Current;
                var request     = HttpHelper.GetRequestJObjectFromStream(HttpContext.Current);
                requestHeader = (JObject)request.GetValue("Header");
                token         = requestHeader.GetValue("Token").ToString();
                timeStamp     = requestHeader.GetValue("TimeStamp").ToString();

                requestBody = (JObject)request.GetValue("Body");
                no          = requestBody.GetValue("No").ToString();
                from        = requestBody.GetValue("From").ToString();
                type        = requestBody.GetValue("Type").ToString();
            }
            catch (Exception ex)
            {
                response.Header = CommonBusiness.SetHeader(requestHeader, CustomizeStatus.CatchError, "参数错误:" + ex.Message);
                return(Request.CreateResponse(HttpStatusCode.OK, response));
            }

            try
            {
                if (string.IsNullOrEmpty(token))
                {
                    response.Header = CommonBusiness.SetHeader(requestHeader, CustomizeStatus.NoLogin, "令牌为空");
                    return(Request.CreateResponse(HttpStatusCode.OK, response));
                }

                double temp;
                if (string.IsNullOrEmpty(no) || string.IsNullOrEmpty(from) || string.IsNullOrEmpty(type))
                {
                    response.Header = CommonBusiness.SetHeader(requestHeader, CustomizeStatus.ParamError, "参数不正确");
                    return(Request.CreateResponse(HttpStatusCode.OK, response));
                }

                JObject result;
                if (type == "1")
                {
                    result = TradeBusiness.GetTrade(no, from);
                }
                else if (type == "2")
                {
                    result = TradeBusiness.GetByActualTradeNo(no, from);
                }
                else
                {
                    result = TradeBusiness.GetByTradeFromNo(no, from);
                }

                response.Header = CommonBusiness.SetHeader(requestHeader, CustomizeStatus.Success, string.Empty);
                response.Body   = result;
                return(Request.CreateResponse(HttpStatusCode.OK, response));
            }
            catch (Exception ex)
            {
                response.Header = CommonBusiness.SetHeader(requestHeader, CustomizeStatus.CatchError, ex.Message);
                return(Request.CreateResponse(HttpStatusCode.OK, response));
            }
        }
Exemple #19
0
        public static JObject createForm(PaymentType paymentType, string from, string fromNo, string fee, string subject, string returnUrl, string showUrl)
        {
            ////////////////////////////////////////////请求参数////////////////////////////////////////////
            //商户订单号,商户网站订单系统中唯一订单号,必填
            var now          = DateTime.Now.ToString("yyyyMMddHHmmssfff");
            var out_trade_no = now + CommonBusiness.CreateRandom();

            //订单名称,必填
            if (string.IsNullOrEmpty(subject))
            {
                subject = "alipay";
            }

            //付款金额,必填
            var total_fee = (double.Parse(fee) / 100).ToString();

            //商品描述,可空
            var body = string.Empty;
            ////////////////////////////////////////////////////////////////////////////////////////////////

            //把请求参数打包成数组
            var sParaTemp = new SortedDictionary <string, string>();

            if (paymentType == PaymentType.Alipay)
            {
                sParaTemp.Add("service", Config.directService);
                sParaTemp.Add("anti_phishing_key", Config.anti_phishing_key);
                sParaTemp.Add("exter_invoke_ip", Config.exter_invoke_ip);
            }
            else
            {
                sParaTemp.Add("service", Config.service);
                sParaTemp.Add("show_url", showUrl);
            }

            sParaTemp.Add("partner", Config.partner);
            sParaTemp.Add("seller_id", Config.seller_id);
            sParaTemp.Add("_input_charset", Config.input_charset.ToLower());
            sParaTemp.Add("payment_type", Config.payment_type);
            sParaTemp.Add("notify_url", Config.notify_url);
            sParaTemp.Add("return_url", Config.return_url);
            sParaTemp.Add("out_trade_no", out_trade_no);
            sParaTemp.Add("subject", subject);
            sParaTemp.Add("total_fee", total_fee);
            sParaTemp.Add("body", body);
            //其他业务参数根据在线开发文档,添加参数.文档地址:https://doc.open.alipay.com/doc2/detail.htm?spm=a219a.7629140.0.0.O9yorI&treeId=62&articleId=103740&docType=1
            //如sParaTemp.Add("参数名","参数值");

            // 本地数据维护 支付宝单位为元 支付宝类型统一为alipay 不好区分
            var result = TradeBusiness.AddTrade(out_trade_no, from, fromNo, PaymentType.Alipay, fee, subject, returnUrl, "0");

            if (!(bool)result["Flg"])
            {
                throw new Exception("本地数据维护失败");
            }

            //建立请求
            //var content = Submit.BuildRequest(sParaTemp, "get", "确认");
            //return new JObject(
            //        new JProperty("Trade", ((JObject)result["Object"])["result"]),
            //        new JProperty("Content", content));


            DefaultAopClient client = new DefaultAopClient(ConfigurationManager.AppSettings["alipay.port"], ConfigurationManager.AppSettings["alipay.appId"], ConfigurationManager.AppSettings["alipay.privateKey"]);

            client.return_url = Config.return_url;
            AlipayTradeWapPayRequest alipayRequest = new AlipayTradeWapPayRequest();//创建API对应的request

            // alipayRequest.setReturnUrl("http://domain.com/CallBack/return_url.jsp");
            alipayRequest.SetNotifyUrl(Config.notify_url);//在公共参数中设置回跳和通知地址
            alipayRequest.BizContent = "{" + string.Format("    \"out_trade_no\":\"{0}\"," +
                                                           "    \"total_amount\":{1}," +
                                                           "    \"subject\":\"{2}\"," +
                                                           "    \"seller_id\":\"{3}\"," +
                                                           "    \"product_code\":\"QUICK_WAP_PAY\"", out_trade_no, total_fee, subject, Config.seller_id)
                                       +
                                       "  }";                  //填充业务参数
            var form = client.pageExecute(alipayRequest).Body; //调用SDK生成表单

            if (form.IndexOf("<form id='alipaysubmit'") > -1)
            {
                form = form.Replace("<form id='alipaysubmit'", "<form style='display:none;' id='alipaysubmit'");
            }

            form = "<h3>页面跳转中。。。</h3>" + form;

            return(new JObject(
                       new JProperty("Trade", ((JObject)result["Object"])["result"]),
                       new JProperty("Content", form)));
        }