예제 #1
0
        public override void ProcessNotify()
        {
            WxPayData notifyData = GetNotifyData();

            //检查openid和product_id是否返回
            if (!notifyData.IsSet("openid") || !notifyData.IsSet("product_id"))
            {
                WxPayData res = new WxPayData();
                res.SetValue("return_code", "FAIL");
                res.SetValue("return_msg", "回调数据异常");
                Log.Info(this.GetType().ToString(), "The data WeChat post is error : " + res.ToXml());
                page.Response.Write(res.ToXml());
                page.Response.End();
            }

            //调统一下单接口,获得下单结果
            string openid = notifyData.GetValue("openid").ToString();
            string product_id = notifyData.GetValue("product_id").ToString();
            WxPayData unifiedOrderResult = new WxPayData();
            try
            {
                unifiedOrderResult = UnifiedOrder(openid, product_id);
            }
            catch(Exception ex)//若在调统一下单接口时抛异常,立即返回结果给微信支付后台
            {
                WxPayData res = new WxPayData();
                res.SetValue("return_code", "FAIL");
                res.SetValue("return_msg", "统一下单失败");
                Log.Error(this.GetType().ToString(), "UnifiedOrder failure : " + res.ToXml());
                page.Response.Write(res.ToXml());
                page.Response.End();
            }

            //若下单失败,则立即返回结果给微信支付后台
            if (!unifiedOrderResult.IsSet("appid") || !unifiedOrderResult.IsSet("mch_id") || !unifiedOrderResult.IsSet("prepay_id"))
            {
                WxPayData res = new WxPayData();
                res.SetValue("return_code", "FAIL");
                res.SetValue("return_msg", "统一下单失败");
                Log.Error(this.GetType().ToString(), "UnifiedOrder failure : " + res.ToXml());
                page.Response.Write(res.ToXml());
                page.Response.End();
            }

            //统一下单成功,则返回成功结果给微信支付后台
            WxPayData data = new WxPayData();
            data.SetValue("return_code", "SUCCESS");
            data.SetValue("return_msg", "OK");
            data.SetValue("appid", Config.APPID);
            data.SetValue("mch_id", Config.MCHID);
            data.SetValue("nonce_str", WxPayApi.GenerateNonceStr());
            data.SetValue("prepay_id", unifiedOrderResult.GetValue("prepay_id"));
            data.SetValue("result_code", "SUCCESS");
            data.SetValue("err_code_des", "OK");
            data.SetValue("sign", data.MakeSign());

            Log.Info(this.GetType().ToString(), "UnifiedOrder success , send data to WeChat : " + data.ToXml());
            page.Response.Write(data.ToXml());
            page.Response.End();
        }
예제 #2
0
        public void ProcessRequest(HttpContext context)
        {
            try
            {
                List <string> list = new List <string>();
                foreach (var item in context.Request.Params.AllKeys)
                {
                    list.Add($"{item}={context.Request.Params[item]}");
                }
                Business.Alipay.Log("收到微信通知" + context.Request.RawUrl + "?" + string.Join("&", list));

                HttpRequest Request = context.Request;
                context.Response.ContentType = "text/plain";

                string respcode    = "";
                string respmsg     = "";
                string orderId     = "";
                string CommunityId = "";

                //返回报文中不包含UPOG,表示Server端正确接收交易请求,则需要验证Server端返回报文的签名
                bool      IsValidate = false;
                WxPayData WxPostData = new WxPayData();
                string    Result     = Notify.NotifyDataFromContext(context, ref IsValidate, ref WxPostData);

                respcode    = WxPostData.GetValue("result_code").ToString();
                respmsg     = WxPostData.GetValue("result_code").ToString();
                orderId     = WxPostData.GetValue("out_trade_no").ToString();
                CommunityId = WxPostData.GetValue("attach").ToString();
                string userId = null;
                if (CommunityId.Contains(","))
                {
                    userId      = CommunityId.Split(',')[1];
                    CommunityId = CommunityId.Split(',')[0];
                }

                if (IsValidate == false)
                {
                    Business.WeiXinPay.Log("验签失败:" + CommunityId + "," + orderId.ToString());
                    Result = SetNotifyResult("FAIL", Result);
                    context.Response.Write(Result);
                    return;
                }

                Business.WeiXinPay.Log("微信支付验签成功:" + CommunityId + "," + orderId.ToString());

                if (IsValidate == true)
                {
                    //初始化参数
                    new Business.WeiXinPay().GenerateConfig(CommunityId);
                    //更新订单返回状态
                    Business.WeiXinPay.UpdateProperyOrder(CommunityId, orderId, respcode, respmsg);
                    //已收到应答,无需再通知
                    context.Response.Write(SetNotifyResult("SUCCESS", "OK"));
                    if (respcode == "SUCCESS")
                    {
                        string useHistoryId = null;

                        if (!string.IsNullOrEmpty(userId))
                        {
                            // 查询是否使用了积分
                            UsePoint(orderId, userId, out useHistoryId);
                        }

                        decimal total_fee = AppGlobal.StrToDec(WxPostData.GetValue("total_fee").ToString()) / 100.0m;

                        //下账
                        string ReceResult = Business.WeiXinPay.ReceProperyOrder(total_fee, CommunityId, orderId, useHistoryId);

                        if (!string.IsNullOrEmpty(userId))
                        {
                            // 下账成功,赠送积分
                            PresentedPoint(CommunityId, orderId, userId, useHistoryId, total_fee);
                        }

                        Business.WeiXinPay.Log("微信支付下账:" + CommunityId.ToString() + "," + orderId + "," + ReceResult);
                    }

                    Business.WeiXinPay.Log("微信支付流程:" + CommunityId.ToString() + "," + orderId + ",SUCCESS");
                }
            }
            catch (Exception E)
            {
                Business.WeiXinPay.Log(E.Message.ToString());
                context.Response.ContentType = "text/plain";
                context.Response.Write(SetNotifyResult("FAIL", E.Message.ToString()));
            }
        }
예제 #3
0
        /**
        * 刷卡支付完整业务流程逻辑
        * @param body 商品描述
        * @param total_fee 总金额
        * @param auth_code 支付授权码
        * @throws WxPayException
        * @return 刷卡支付结果
        */
        public static string Run(string body, string total_fee, string auth_code)
        {
            Log.Info("MicroPay", "Micropay is processing...");

            WxPayData data = new WxPayData();
            data.SetValue("auth_code", auth_code);//授权码
            data.SetValue("body", body);//商品描述
            data.SetValue("total_fee", int.Parse(total_fee));//总金额
            data.SetValue("out_trade_no", WxPayApi.GenerateOutTradeNo());//产生随机的商户订单号

            WxPayData result = WxPayApi.Micropay(data, 10); //提交被扫支付,接收返回结果

		    //如果提交被扫支付接口调用失败,则抛异常
            if (!result.IsSet("return_code") || result.GetValue("return_code").ToString() == "FAIL")
		    {
                string returnMsg = result.IsSet("return_msg") ? result.GetValue("return_msg").ToString() : "";
                Log.Error("MicroPay", "Micropay API interface call failure, result : " + result.ToXml());
                throw new WxPayException("Micropay API interface call failure, return_msg : " + returnMsg);
		    }

		    //签名验证
            result.CheckSign();
            Log.Debug("MicroPay", "Micropay response check sign success");

            //刷卡支付直接成功
            if(result.GetValue("return_code").ToString() == "SUCCESS" &&
		        result.GetValue("result_code").ToString() == "SUCCESS")
            {
                Log.Debug("MicroPay", "Micropay business success, result : " + result.ToXml());
                return result.ToPrintStr();
            }

            /******************************************************************
             * 剩下的都是接口调用成功,业务失败的情况
             * ****************************************************************/
		    //1)业务结果明确失败
		    if(result.GetValue("err_code").ToString() != "USERPAYING" && 
		    result.GetValue("err_code").ToString() != "SYSTEMERROR")
		    {
                Log.Error("MicroPay", "micropay API interface call success, business failure, result : " + result.ToXml());
                return result.ToPrintStr();
		    }

            //2)不能确定是否失败,需查单
            //用商户订单号去查单
            string out_trade_no = data.GetValue("out_trade_no").ToString();

		    //确认支付是否成功,每隔一段时间查询一次订单,共查询10次
		    int queryTimes = 10;//查询次数计数器
		    while(queryTimes-- > 0)
		    {
			    int succResult = 0;//查询结果
			    WxPayData queryResult = Query(out_trade_no, out succResult);
			    //如果需要继续查询,则等待2s后继续
			    if(succResult == 2)
                {
				    Thread.Sleep(2000);
				    continue;
			    }
                //查询成功,返回订单查询接口返回的数据
                else if(succResult == 1)
                {
                    Log.Debug("MicroPay", "Mircopay success, return order query result : " + queryResult.ToXml());
                    return queryResult.ToPrintStr();
			    }
                //订单交易失败,直接返回刷卡支付接口返回的结果,失败原因会在err_code中描述
                else
                {
                    Log.Error("MicroPay", "Micropay failure, return micropay result : " + result.ToXml());
                    return result.ToPrintStr();
			    }
		    }

            //确认失败,则撤销订单
            Log.Error("MicroPay", "Micropay failure, Reverse order is processing...");
		    if(!Cancel(out_trade_no))
		    {
                Log.Error("MicroPay", "Reverse order failure");
                throw new WxPayException("Reverse order failure!");
		    }

            return result.ToPrintStr();
        }
예제 #4
0
        /// <summary>
        /// 处理通知
        /// </summary>
        public override void ProcessNotify()
        {
            WxPayData notifyData = GetNotifyData();

            //检查openid和product_id是否返回
            if (!notifyData.IsSet("openid") || !notifyData.IsSet("product_id"))
            {
                WxPayData res = new WxPayData();
                res.SetValue("return_code", "FAIL");
                res.SetValue("return_msg", "回调数据异常");
                LogHelper.Info(this.GetType().ToString(), "The data WeChat post is error : " + res.ToXml());
                page.Response.Write(res.ToXml());
                page.Response.End();
            }

            //调统一下单接口,获得下单结果
            string    openid             = notifyData.GetValue("openid").ToString();
            string    product_id         = notifyData.GetValue("product_id").ToString();
            WxPayData unifiedOrderResult = new WxPayData();

            try
            {
                unifiedOrderResult = UnifiedOrder(openid, product_id);
            }
            catch (Exception ex)//若在调统一下单接口时抛异常,立即返回结果给微信支付后台
            {
                WxPayData res = new WxPayData();
                res.SetValue("return_code", "FAIL");
                res.SetValue("return_msg", "统一下单失败");
                LogHelper.Error(this.GetType().ToString(), "UnifiedOrder failure : " + res.ToXml() + "  异常信息:" + ex.Message);
                page.Response.Write(res.ToXml());
                page.Response.End();
            }

            //若下单失败,则立即返回结果给微信支付后台
            if (!unifiedOrderResult.IsSet("appid") || !unifiedOrderResult.IsSet("mch_id") || !unifiedOrderResult.IsSet("prepay_id"))
            {
                WxPayData res = new WxPayData();
                res.SetValue("return_code", "FAIL");
                res.SetValue("return_msg", "统一下单失败");
                LogHelper.Error(this.GetType().ToString(), "UnifiedOrder failure : " + res.ToXml());
                page.Response.Write(res.ToXml());
                page.Response.End();
            }

            //统一下单成功,则返回成功结果给微信支付后台
            WxPayData data = new WxPayData();

            data.SetValue("return_code", "SUCCESS");
            data.SetValue("return_msg", "OK");
            data.SetValue("appid", WxPayConfig.AppId);
            data.SetValue("mch_id", WxPayConfig.MchId);
            data.SetValue("nonce_str", WxPayApi.GenerateNonceStr());
            data.SetValue("prepay_id", unifiedOrderResult.GetValue("prepay_id"));
            data.SetValue("result_code", "SUCCESS");
            data.SetValue("err_code_des", "OK");
            data.SetValue("sign", data.MakeSign());

            LogHelper.Info(this.GetType().ToString(), "UnifiedOrder success , send data to WeChat : " + data.ToXml());
            page.Response.Write(data.ToXml());
            page.Response.End();
        }
예제 #5
0
파일: OrderBLL.cs 프로젝트: radtek/Aicard
        /// <summary>
        /// 退款申请
        /// </summary>
        /// <param name="orderCode">商户订单号</param>
        /// <param name="UserID">用户ID</param>
        /// <returns></returns>
        public object RefundApply(string orderCode, string UserID)
        {
            if (string.IsNullOrEmpty(orderCode) || string.IsNullOrEmpty(UserID))
            {
                return(new { retCode = "Error", retMsg = "商户订单号和用户ID均不能为空", objectData = "" });
            }
            int       rows             = 0;
            WxPayData refundreturnData = null;

            try
            {
                using (ApplicationDbContext db = new ApplicationDbContext())
                {
                    //1.查询本地订单
                    Order order = db.Orders.FirstOrDefault(p => p.Code == orderCode);
                    if (order != null)
                    {
                        if (order.UserID.Equals(UserID))
                        {
                            if (order.State == Common.Enums.OrderState.Success)
                            {
                                string OrderCode = CreateOrderCode(UserID);//创建退款订单号
                                //退款参数
                                RefundApplyData refundData = new RefundApplyData()
                                {
                                    out_refund_no  = OrderCode,
                                    out_trade_no   = order.Code,
                                    refund_fee     = ((int)(order.Amount * 100)).ToString(),
                                    total_fee      = ((int)(order.Amount * 100)).ToString(),
                                    transaction_id = order.PayCode
                                };
                                //2.创建本地退款订单
                                Order refund = new Order()
                                {
                                    Channel          = Common.Enums.PayChannel.WxPay,
                                    Code             = OrderCode,
                                    CreateDateTime   = DateTime.Now,
                                    PayCode          = string.Empty,
                                    PayInput         = JsonConvert.SerializeObject(refundData),
                                    ReceivableAmount = order.Amount,
                                    State            = Common.Enums.OrderState.UnHandle,
                                    Type             = Common.Enums.OrderType.Refund,
                                    UserID           = UserID
                                };
                                db.Orders.Add(refund);
                                rows = db.SaveChanges();
                                if (rows > 0)
                                {
                                    //3.微信退款申请
                                    RequestResult payResult = payment.RefundApply(refundData);
                                    refundreturnData = payResult.objectData;
                                    if (payResult.retCode != ReqResultCode.success || refundreturnData == null)
                                    {
                                        return(new { retCode = "Error", retMsg = "请求微信退款失败", objectData = "" });
                                    }
                                    //4.更新订单状态
                                    refund.PayCode     = refundreturnData.GetValue("refund_id").ToString();//微信退款单号
                                    refund.State       = Common.Enums.OrderState.Success;
                                    refund.Amount      = Convert.ToDecimal(refundreturnData.GetValue("refund_fee").ToString()) / 100m;
                                    refund.PayDateTime = DateTime.Now;
                                    refund.PayResult   = refundreturnData.ToJson();
                                    rows = db.SaveChanges();
                                }
                            }
                            else
                            {
                                return(new { retCode = "Error", retMsg = "订单未支付成功,不能退款", objectData = "" });
                            }
                        }
                        else
                        {
                            return(new { retCode = "Error", retMsg = "此订单不是当前用户的订单", objectData = "" });
                        }
                    }
                    else
                    {
                        return(new { retCode = "Error", retMsg = "订单不存在", objectData = "" });
                    }
                }
            }
            catch (Exception ex)
            {
                return(new { retCode = "Error", retMsg = $"申请微信退款发生异常:{ex.Message}", objectData = "" });
            }

            return(new { retCode = "Success", retMsg = "成功", objectData = refundreturnData });
        }
예제 #6
0
    /**
     *
     * 统一下单
     * @param WxPaydata inputObj 提交给统一下单API的参数
     * @param int timeOut 超时时间
     * @throws WxPayException
     * @return 成功时返回,其他抛异常
     */
    public static WxPayData UnifiedOrder(WxPayData inputObj, int timeOut = 6)
    {
        string url = "https://api.mch.weixin.qq.com/pay/unifiedorder";

        //检测必填参数
        if (!inputObj.IsSet("out_trade_no"))
        {
            throw new WxPayException("缺少统一支付接口必填参数out_trade_no!");
        }
        else if (!inputObj.IsSet("body"))
        {
            throw new WxPayException("缺少统一支付接口必填参数body!");
        }
        else if (!inputObj.IsSet("total_fee"))
        {
            throw new WxPayException("缺少统一支付接口必填参数total_fee!");
        }
        else if (!inputObj.IsSet("trade_type"))
        {
            throw new WxPayException("缺少统一支付接口必填参数trade_type!");
        }

        //关联参数
        if (inputObj.GetValue("trade_type").ToString() == "JSAPI" && !inputObj.IsSet("openid"))
        {
            throw new WxPayException("统一支付接口中,缺少必填参数openid!trade_type为JSAPI时,openid为必填参数!");
        }
        if (inputObj.GetValue("trade_type").ToString() == "NATIVE" && !inputObj.IsSet("product_id"))
        {
            throw new WxPayException("统一支付接口中,缺少必填参数product_id!trade_type为JSAPI时,product_id为必填参数!");
        }

        //异步通知url未设置,则使用配置文件中的url
        if (!inputObj.IsSet("notify_url"))
        {
            inputObj.SetValue("notify_url", WxPayConfig.NOTIFY_URL);//异步通知url
        }

        inputObj.SetValue("appid", WxPayConfig.APPID);         //公众账号ID
        inputObj.SetValue("mch_id", WxPayConfig.MCHID);        //商户号
        inputObj.SetValue("spbill_create_ip", WxPayConfig.IP); //终端ip
        inputObj.SetValue("nonce_str", GenerateNonceStr());    //随机字符串

        //签名
        inputObj.SetValue("sign", inputObj.MakeSign());
        string xml = inputObj.ToXml();

        var start = DateTime.Now;

        Log.Debug("WxPayApi", "UnfiedOrder request : " + xml);
        string response = HttpService.Post(xml, url, false, timeOut);

        Log.Debug("WxPayApi", "UnfiedOrder response : " + response);

        var end      = DateTime.Now;
        int timeCost = (int)((end - start).TotalMilliseconds);

        WxPayData result = new WxPayData();

        result.FromXml(response);

        ReportCostTime(url, timeCost, result);//测速上报

        return(result);
    }
예제 #7
0
        protected void Page_Load(object sender, EventArgs e)
        {
            WxPayData notifyData = NativePay.GetNotifyData();

            //检查支付结果中transaction_id是否存在
            if (!notifyData.IsSet("transaction_id"))
            {
                //若transaction_id不存在,则立即返回结果给微信支付后台
                WxPayData res = new WxPayData();
                res.SetValue("return_code", "FAIL");
                res.SetValue("return_msg", "支付结果中微信订单号不存在");
                Response.Write(res.ToXml());
                return;
            }

            string transaction_id = notifyData.GetValue("transaction_id").ToString(); //微信支付订单号

            //查询订单,判断订单真实性
            if (!QueryOrder(transaction_id))
            {
                //若订单查询失败,则立即返回结果给微信支付后台
                WxPayData res = new WxPayData();
                res.SetValue("return_code", "FAIL");
                res.SetValue("return_msg", "订单查询失败");
                Response.Write(res.ToXml());
                return;
            }

            //获取订单信息
            string order_no  = notifyData.GetValue("out_trade_no").ToString(); //商户订单号
            string total_fee = notifyData.GetValue("total_fee").ToString();    //获取总金额

            if (order_no.StartsWith("R"))                                      //充值订单
            {
                BLL.user_recharge   bll   = new BLL.user_recharge();
                Model.user_recharge model = bll.GetModel(order_no);
                if (model == null)
                {
                    WxPayData res = new WxPayData();
                    res.SetValue("return_code", "FAIL");
                    res.SetValue("return_msg", "该订单号不存在");
                    Response.Write(res.ToXml());
                    return;
                }
                if (model.status == 1) //已成功
                {
                    WxPayData res = new WxPayData();
                    res.SetValue("return_code", "SUCCESS");
                    res.SetValue("return_msg", "OK");
                    Response.Write(res.ToXml());
                    return;
                }
                if (model.amount != (decimal.Parse(total_fee) / 100))
                {
                    WxPayData res = new WxPayData();
                    res.SetValue("return_code", "FAIL");
                    res.SetValue("return_msg", "订单金额和支付金额不相符");
                    Response.Write(res.ToXml());
                    return;
                }
                bool result = bll.Confirm(order_no);
                if (!result)
                {
                    WxPayData res = new WxPayData();
                    res.SetValue("return_code", "FAIL");
                    res.SetValue("return_msg", "修改订单状态失败");
                    Response.Write(res.ToXml());
                    return;
                }
            }
            else if (order_no.StartsWith("B")) //商品订单
            {
                BLL.orders   bll   = new BLL.orders();
                Model.orders model = bll.GetModel(order_no);
                if (model == null)
                {
                    WxPayData res = new WxPayData();
                    res.SetValue("return_code", "FAIL");
                    res.SetValue("return_msg", "该订单号不存在");
                    Response.Write(res.ToXml());
                    return;
                }
                if (model.payment_status == 2) //已付款
                {
                    WxPayData res = new WxPayData();
                    res.SetValue("return_code", "SUCCESS");
                    res.SetValue("return_msg", "OK");
                    Response.Write(res.ToXml());
                    return;
                }
                if (model.order_amount != (decimal.Parse(total_fee) / 100))
                {
                    WxPayData res = new WxPayData();
                    res.SetValue("return_code", "FAIL");
                    res.SetValue("return_msg", "订单金额和支付金额不相符");
                    Response.Write(res.ToXml());
                    return;
                }
                bool result = bll.UpdateField(order_no, "trade_no='" + transaction_id + "',status=2,payment_status=2,payment_time='" + DateTime.Now + "'");
                if (!result)
                {
                    WxPayData res = new WxPayData();
                    res.SetValue("return_code", "FAIL");
                    res.SetValue("return_msg", "修改订单状态失败");
                    Response.Write(res.ToXml());
                    return;
                }
                //扣除积分
                if (model.point < 0)
                {
                    new BLL.user_point_log().Add(model.user_id, model.user_name, model.point, "换购扣除积分,订单号:" + model.order_no, false);
                }
            }

            //返回成功通知
            WxPayData res1 = new WxPayData();

            res1.SetValue("return_code", "SUCCESS");
            res1.SetValue("return_msg", "OK");
            Response.Write(res1.ToXml());
            return;
        }
예제 #8
0
        public string ChargeByWeixin(string productName, decimal amount, string orderNo, string notifyUrl)
        {
            var config = ConfigInfo;

            WxPayConfig.APPID     = config.WeixinAppId;
            WxPayConfig.MCHID     = config.WeixinMchId;
            WxPayConfig.KEY       = config.WeixinKey;
            WxPayConfig.APPSECRET = config.WeixinAppSecret;

            //=======【支付结果通知url】=====================================

            /* 支付结果通知回调url,用于商户接收支付结果
             */
            WxPayConfig.NOTIFY_URL = notifyUrl;

            //=======【商户系统后台机器IP】=====================================

            /* 此参数可手动配置也可在程序中自动获取
             */
            WxPayConfig.IP = "8.8.8.8";


            //=======【代理服务器设置】===================================

            /* 默认IP和端口号分别为0.0.0.0和0,此时不开启代理(如有需要才设置)
             */
            WxPayConfig.PROXY_URL = "http://10.152.18.220:8080";

            //=======【上报信息配置】===================================

            /* 测速上报等级,0.关闭上报; 1.仅错误时上报; 2.全量上报
             */
            WxPayConfig.REPORT_LEVENL = 1;

            //=======【日志级别】===================================

            /* 日志等级,0.不输出日志;1.只输出错误信息; 2.输出错误和正常信息; 3.输出错误信息、正常信息和调试信息
             */
            WxPayConfig.LOG_LEVENL = 0;

            var data = new WxPayData();

            data.SetValue("body", productName);                                                   //商品描述
            data.SetValue("attach", string.Empty);                                                //附加数据
            data.SetValue("out_trade_no", WxPayApi.GenerateOutTradeNo());                         //随机字符串
            data.SetValue("total_fee", Convert.ToInt32(amount * 100));                            //总金额
            data.SetValue("time_start", DateTime.Now.ToString("yyyyMMddHHmmss"));                 //交易起始时间
            data.SetValue("time_expire", DateTime.Now.AddMinutes(10).ToString("yyyyMMddHHmmss")); //交易结束时间
            data.SetValue("goods_tag", "jjj");                                                    //商品标记
            data.SetValue("trade_type", "NATIVE");                                                //交易类型
            data.SetValue("product_id", "productId");                                             //商品ID

            string url = "https://api.mch.weixin.qq.com/pay/unifiedorder";

            //检测必填参数
            if (!data.IsSet("out_trade_no"))
            {
                throw new WxPayException("缺少统一支付接口必填参数out_trade_no!");
            }
            if (!data.IsSet("body"))
            {
                throw new WxPayException("缺少统一支付接口必填参数body!");
            }
            if (!data.IsSet("total_fee"))
            {
                throw new WxPayException("缺少统一支付接口必填参数total_fee!");
            }
            if (!data.IsSet("trade_type"))
            {
                throw new WxPayException("缺少统一支付接口必填参数trade_type!");
            }

            //关联参数
            if (data.GetValue("trade_type").ToString() == "JSAPI" && !data.IsSet("openid"))
            {
                throw new WxPayException("统一支付接口中,缺少必填参数openid!trade_type为JSAPI时,openid为必填参数!");
            }
            if (data.GetValue("trade_type").ToString() == "NATIVE" && !data.IsSet("product_id"))
            {
                throw new WxPayException("统一支付接口中,缺少必填参数product_id!trade_type为JSAPI时,product_id为必填参数!");
            }

            //异步通知url未设置,则使用配置文件中的url
            if (!data.IsSet("notify_url"))
            {
                data.SetValue("notify_url", WxPayConfig.NOTIFY_URL);//异步通知url
            }

            data.SetValue("appid", WxPayConfig.APPID);                              //公众账号ID
            data.SetValue("mch_id", WxPayConfig.MCHID);                             //商户号
            data.SetValue("spbill_create_ip", WxPayConfig.IP);                      //终端ip
            data.SetValue("nonce_str", Guid.NewGuid().ToString().Replace("-", "")); //随机字符串

            //签名
            data.SetValue("sign", data.MakeSign());
            var xml      = data.ToXml();
            var response = HttpService.Post(xml, url, false, 6);
            var result   = new WxPayData();

            result.FromXml(response);

            Log.Info(GetType().ToString(), "ChargeByWeixin : " + response);
            Log.Info(GetType().ToString(), "notify_url : " + data.GetValue("notify_url"));

            if (!result.IsSet("code_url"))
            {
                throw new Exception($"code: {result.GetValue("return_code")}, msg: {result.GetValue("return_msg")}");
            }
            return(result.GetValue("code_url").ToString()); //获得统一下单接口返回的二维码链接
        }
        /// <summary>
        /// 添加卡
        /// </summary>
        /// <param name="openid"></param>
        /// <param name="city"></param>
        /// <returns></returns>
        public JsonResult addUserCard(string openid, string city)
        {
            var    pay = new JsApiPay(this.Request);
            string appid = string.Empty, appSecret = string.Empty, card_id = string.Empty;

            switch (city)
            {
            case "乐清市":
                appid     = "wx8a8f4c94ea99c3c6";
                appSecret = "d08019f391fc2a7113e5efea6fc4c9dc";
                card_id   = "pszDVt2lJKXxOYA3alLVdbezrLTY";
                break;

            case "常熟市":
                appid     = "wx48a67a2aaf02f77a";
                appSecret = "d788725d971438371f8a0b8c39221b2a";
                card_id   = "p__l8t2MvHkqBTDdGtiazSI_hSR0";
                break;

            case "福州市":
                appid     = "wxc20b289e21d1b606";
                appSecret = "10711737c1c6b58b029f70c624bbb7e2";
                card_id   = "p4erJ0oPLrLMDhWcKZPLwF2Psdr8";
                break;
            }
            //乐清的订阅号appid
            pay.GetAccessToken(appid, appSecret, this.DataSource);
            var    bus         = new Bus(this.DataSource);
            string mch_id      = WxPayConfig.getMCHID(city);
            var    Entrustinfo = bus.GetEntrustinfo(openid, WxPayConfig.APPID(city), mch_id);
            var    card        = bus.GetCard(openid, WxPayConfig.APPID(city), mch_id);
            string result      = string.Empty;
            bool   hasCard     = !string.IsNullOrEmpty(card.CardCode) && card.IsRemove == 0;

            /*
             * if (!string.IsNullOrEmpty(card.CardCode)&&card.OperateTime.AddMinutes(10).CompareTo(DateTime.Now)<0)
             * {
             *  string cardstate= bus.DeCardCode(pay.access_token, card.CardId, card.CardCode);
             *  if (cardstate.ToLower().IndexOf("\"user_card_status\": \"NORMAL\"") == -1)
             *  {
             *      card.DataDriver = this.DataSource;
             *      card.IsRemove = 1;
             *      card.Store();
             *      hasCard = false;
             *  }
             * }
             */
            if (!hasCard)
            {
                if (Entrustinfo != null)
                {
                    WxPayData inputObj = new WxPayData(city);
                    inputObj.SetValue("appid", WxPayConfig.APPID(city));
                    inputObj.SetValue("mch_id", mch_id);
                    inputObj.SetValue("nonce_str", WxPayApi.GenerateNonceStr());
                    inputObj.SetValue("contract_id", Entrustinfo.FldContractId);
                    inputObj.SetValue("sign_type", "MD5");
                    inputObj.SetValue("card_id", card_id);
                    inputObj.SetValue("openid", openid);
                    inputObj.SetValue("sign", inputObj.MakeSign());
                    string url = "https://api.mch.weixin.qq.com/transit/card/addcard";
                    string xml = inputObj.ToXml();
                    result = HttpService.Post(xml, url, false, 10);
                    WxPayData data = new WxPayData();
                    data.FromXml(result);
                    card.Remark     = result;
                    card.DataDriver = this.DataSource;
                    if (data.GetValue("return_code").ToString().iEquals("success") && data.GetValue("result_code").ToString().iEquals("success"))
                    {
                        card.CardId      = data.GetValue("card_id").ToString();
                        card.CardCode    = data.GetValue("card_code").ToString();
                        card.OperateTime = DateTime.Now;
                        card.IsRemove    = 0;
                    }
                    card.Store();
                }
                string    signature = "", timestamp = WxPayApi.GenerateTimeStamp();
                WxPayData exdata = new WxPayData(city);
                exdata.SetValue("code", card.CardCode);
                exdata.SetValue("openid", openid);
                exdata.SetValue("timestamp", timestamp);
                //exdata.SetValue("nonce_str", WxPayApi.GenerateNonceStr());
                string   ticket = bus.getTicket(appid, pay.access_token);
                string   sign   = string.Empty;
                string[] ArrTmp = { card.CardCode, openid, timestamp, appSecret }; //ticket
                Array.Sort(ArrTmp);                                                //字典排序
                string tmpStr = string.Join("", ArrTmp);
                sign = FormsAuthentication.HashPasswordForStoringInConfigFile(tmpStr, "SHA1");
                exdata.SetValue("signature", sign);//exdata.sha1()

                var cardList = new List <Card>();
                var card1    = new Card();
                card1.cardId  = card.CardId;
                card1.cardExt = exdata.ToJson();
                cardList.Add(card1);

                return(Json(new { hasCard = false, ticket = ticket, cardList = cardList, addcardCallback = result }, JsonRequestBehavior.AllowGet));
            }
            else
            {
                //var pay = new JsApiPay(this.Request);
                ////乐清的订阅号appid
                //pay.GetAccessToken("wx8a8f4c94ea99c3c6", "d08019f391fc2a7113e5efea6fc4c9dc");
                //bus.DeCardCode(pay.access_token, card.CardId, card.CardCode);
            }

            var cardList2 = new List <Cardv>();
            var card2     = new Cardv();

            card2.cardId = card.CardId;
            card2.code   = card.CardCode;
            cardList2.Add(card2);
            return(Json(new { hasCard = true, cardList = cardList2 }, JsonRequestBehavior.AllowGet));
        }
        public ContentResult ReceivePubWechat(string echostr, string signature, string timestamp, string nonce)
        {
            Log.Write("ReceivePubWechat", echostr + signature + timestamp + nonce);
            //string path = Server.MapPath("~/business") + "\\delCardxml.xml";
            var       bus     = new Bus(this.DataSource);
            WxPayData res     = new WxPayData(false);
            var       notify  = new Notify(this.Request);
            string    content = notify.GetData();//bus.ReadJson(path);

            if (!string.IsNullOrEmpty(content))
            {
                Log.Write("ReceivePubWechat", content);
                res.FromXml(content);
            }
            if (res.IsSet("CardId") && res.IsSet("UserCardCode") && res.IsSet("Event"))
            {
                string Event        = res.GetValue("Event").ToString();
                string CardId       = res.GetValue("CardId").ToString();
                string UserCardCode = res.GetValue("UserCardCode").ToString();
                Log.Write("Event", Event);
                Log.Write("CardId", CardId);
                Log.Write("UserCardCode", UserCardCode);
                if (Event.iEquals("user_del_card"))
                {
                    var card = bus.GetCard(CardId, UserCardCode);
                    if (card != null)
                    {
                        card.DataDriver = this.DataSource;
                        card.IsRemove   = 1;
                        card.Store();
                    }
                }
            }
            else if (res.IsSet("ToUserName") && res.IsSet("FromUserName") && res.IsSet("MsgType"))
            {
                WxPayData rdata        = new WxPayData();
                string    ToUserName   = res.GetValue("ToUserName").ToString();
                string    FromUserName = res.GetValue("FromUserName").ToString();
                string    MsgType      = res.GetValue("MsgType").ToString();
                rdata.SetValue("ToUserName", FromUserName);
                rdata.SetValue("FromUserName", ToUserName);
                rdata.SetValue("CreateTime", DateTime.Now.Ticks);
                rdata.SetValue("MsgType", "text");
                switch (MsgType)
                {
                case "event":
                    string Event = res.GetValue("Event").ToString();
                    if (Event.iEquals("subscribe"))    //订阅时推送
                    {
                        rdata.SetValue("Content", "欢迎您关注乐清城市公交官方微信平台。\n--------------------------\n1、发送公交线路数字可查询该线路走向:例如查“8路”发送“8”即可。\n2、点击<a href=\"http://www.yqbus.cn/wx/map/index.html\">【线路走向图】</a>查看城市公交全部线路走向。\n3、点击<a href=\"http://m.yqbus.cn/WeixinMP/WMPWeb/MPages/BM.GJ.ShiShiGJ/XianLuQuery.aspx\">【实时公交】</a>菜单,可为您提供公交车到站信息实时查询服务。");
                    }
                    break;

                case "text":
                default:
                    if (res.IsSet("Content"))
                    {
                        string con    = res.GetValue("Content").ToString();
                        string result = bus.getMsgContent(con);
                        Log.Write("ReceivePubWechat-content", con + result);
                        if (!string.IsNullOrEmpty(result))
                        {
                        }
                        else
                        {
                            result = "欢迎关注!";
                        }
                        rdata.SetValue("Content", result);
                        echostr = rdata.ToXml();
                        Log.Write("ReceivePubWechat-back", echostr);
                    }
                    else
                    {
                        echostr = "";
                    }
                    break;
                }
            }
            return(Content(echostr));
        }
예제 #11
0
        /// <summary>
        /// 退款支付
        /// </summary>
        /// <param name="refundPaymentRequest">请求</param>
        /// <returns>Result</returns>
        public RefundPaymentResult Refund(RefundPaymentRequest refundPaymentRequest)
        {
            var result = new RefundPaymentResult();
            //获取供运商ID
            ICollection <OrderItem> list         = refundPaymentRequest.Order.OrderItems;
            ConfigurationModel      wenxinConfig = new ConfigurationModel();
            var modelList = refundPaymentRequest.Order.OrderItems as List <OrderItem>;
            // var totalFee = postProcessPaymentRequest.Order.OrderTotal.ToString("0.00", CultureInfo.InvariantCulture);
            var vendorId = modelList[0].Product.VendorId;
            var wenxin   = _vendorService.GetVendorById(vendorId);

            wenxinConfig.APPID     = wenxin.APPID.Trim();
            wenxinConfig.APPSECRET = wenxin.APPSECRET.Trim();
            wenxinConfig.KEY       = wenxin.KEY.Trim();
            wenxinConfig.MCHID     = wenxin.MCHID.Trim();
            wenxinConfig.IP        = refundPaymentRequest.Order.CustomerIp;
            //wenxinConfig.SSLCERT_PATH = _webHelper.GetStoreLocation(false) + wenxin.SSLCERT_PATH.Trim().Substring(1, wenxin.SSLCERT_PATH.Trim().Length - 1);
            wenxinConfig.SSLCERT_PATH     = wenxin.SSLCERT_PATH.Trim();
            wenxinConfig.SSLCERT_PASSWORD = wenxin.MCHID.Trim();
            OrderDetails orderdetails = new OrderDetails
            {
                Attach    = wenxin.Name,
                OrderId   = refundPaymentRequest.Order.Id,
                Body      = modelList[0].Product.Name,
                Detail    = modelList[0].Product.ShortDescription,
                ProductId = modelList[0].Product.Id.ToString(),
                Total_fee = (Convert.ToDouble(refundPaymentRequest.Order.OrderTotal) * 100).ToString()
            };

            wenxinConfig.orderDetails = orderdetails;
            //退款
            string amountToRefund = Convert.ToInt32(refundPaymentRequest.AmountToRefund * 100).ToString();
            Refund refund         = new Refund(wenxinConfig);

            //调用订单退款接口,如果内部出现异常则在页面上显示异常原因
            if (refundPaymentRequest.Order.WxTransactionId == null)
            {
                result.AddError("没有查询到微信支付订单");
                return(result);
            }
            try
            {
                string    returnMess  = refund.Run(refundPaymentRequest.Order.WxTransactionId, refundPaymentRequest.Order.Id.ToString(), orderdetails.Total_fee, amountToRefund);
                string[]  cpTypeArray = returnMess.Replace("<br>", ",").Split(',');
                WxPayData res         = new WxPayData();
                foreach (var item in cpTypeArray)
                {
                    if (!string.IsNullOrWhiteSpace(item))
                    {
                        res.SetValue(item.Split('=')[0], item.Split('=')[1]);
                    }
                }
                if (res.GetValue("return_code").ToString() != "SUCCESS" || res.GetValue("result_code").ToString() != "SUCCESS")
                {
                    //退款提示
                    result.AddError(res.GetValue("err_code_des").ToString());
                    return(result);
                }
                else
                {
                    //添加退款记录表
                    RefundOrderItem item = new RefundOrderItem();
                    item.OrderId         = refundPaymentRequest.Order.Id;
                    item.CustomNumber    = refundPaymentRequest.Order.Customer.Id;
                    item.VendorId        = vendorId;
                    item.WxTransactionId = res.GetValue("transaction_id").ToString();
                    item.WxRefunId       = res.GetValue("refund_id").ToString();
                    item.WxOutRefunNo    = res.GetValue("out_refund_no").ToString();
                    item.OrderTotal      = refundPaymentRequest.Order.OrderTotal;
                    item.RefundedAmount  = refundPaymentRequest.AmountToRefund;
                    item.CreatedOnUtc    = System.DateTime.Now;
                    item.Deleted         = false;
                    _refundOrderItemService.InsertRefundOrderItem(item);
                }
            }
            catch (WxPayException ex)
            {
                result.AddError(ex.ToString());
            }
            catch (Exception ex)
            {
                result.AddError(ex.ToString());
            }
            return(result);
        }
예제 #12
0
        /**
         * 刷卡支付完整业务流程逻辑
         * @param body 商品描述
         * @param total_fee 总金额
         * @param auth_code 支付授权码
         * @throws WxPayException
         * @return 刷卡支付结果
         */
        public static string Run(string body, string total_fee, string auth_code)
        {
            Log <T> .Info("MicroPay", "Micropay is processing...");

            WxPayData <T> data = new WxPayData <T>();

            data.SetValue("auth_code", auth_code);                             //授权码
            data.SetValue("body", body);                                       //商品描述
            data.SetValue("total_fee", int.Parse(total_fee));                  //总金额
            data.SetValue("out_trade_no", WxPayApi <T> .GenerateOutTradeNo()); //产生随机的商户订单号

            WxPayData <T> result = WxPayApi <T> .Micropay(data, 10);           //提交被扫支付,接收返回结果

            //如果提交被扫支付接口调用失败,则抛异常
            if (!result.IsSet("return_code") || result.GetValue("return_code").ToString() == "FAIL")
            {
                string returnMsg = result.IsSet("return_msg") ? result.GetValue("return_msg").ToString() : "";
                Log <T> .Error("MicroPay", "Micropay API interface call failure, result : " + result.ToXml());

                throw new WxPayException("Micropay API interface call failure, return_msg : " + returnMsg);
            }

            //签名验证
            result.CheckSign();
            Log <T> .Debug("MicroPay", "Micropay response check sign success");

            //刷卡支付直接成功
            if (result.GetValue("return_code").ToString() == "SUCCESS" &&
                result.GetValue("result_code").ToString() == "SUCCESS")
            {
                Log <T> .Debug("MicroPay", "Micropay business success, result : " + result.ToXml());

                return(result.ToPrintStr());
            }

            /******************************************************************
            * 剩下的都是接口调用成功,业务失败的情况
            * ****************************************************************/
            //1)业务结果明确失败
            if (result.GetValue("err_code").ToString() != "USERPAYING" &&
                result.GetValue("err_code").ToString() != "SYSTEMERROR")
            {
                Log <T> .Error("MicroPay", "micropay API interface call success, business failure, result : " + result.ToXml());

                return(result.ToPrintStr());
            }

            //2)不能确定是否失败,需查单
            //用商户订单号去查单
            string out_trade_no = data.GetValue("out_trade_no").ToString();

            //确认支付是否成功,每隔一段时间查询一次订单,共查询10次
            int queryTimes = 10;        //查询次数计数器

            while (queryTimes-- > 0)
            {
                int           succResult  = 0; //查询结果
                WxPayData <T> queryResult = Query(out_trade_no, out succResult);
                //如果需要继续查询,则等待2s后继续
                if (succResult == 2)
                {
                    Thread.Sleep(2000);
                    continue;
                }
                //查询成功,返回订单查询接口返回的数据
                else if (succResult == 1)
                {
                    Log <T> .Debug("MicroPay", "Mircopay success, return order query result : " + queryResult.ToXml());

                    return(queryResult.ToPrintStr());
                }
                //订单交易失败,直接返回刷卡支付接口返回的结果,失败原因会在err_code中描述
                else
                {
                    Log <T> .Error("MicroPay", "Micropay failure, return micropay result : " + result.ToXml());

                    return(result.ToPrintStr());
                }
            }

            //确认失败,则撤销订单
            Log <T> .Error("MicroPay", "Micropay failure, Reverse order is processing...");

            if (!Cancel(out_trade_no))
            {
                Log <T> .Error("MicroPay", "Reverse order failure");

                throw new WxPayException("Reverse order failure!");
            }

            return(result.ToPrintStr());
        }
예제 #13
0
        protected void Page_Load(object sender, EventArgs e)
        {
            //读取站点配置信息
            Model.siteconfig siteConfig = new BLL.siteconfig().loadConfig();

            //=============================获得订单信息================================
            order_no = DTRequest.GetFormString("pay_order_no").ToUpper();
            decimal order_amount = DTRequest.GetFormDecimal("pay_order_amount", 0);
            string  user_name    = DTRequest.GetFormString("pay_user_name");
            string  subject      = DTRequest.GetFormString("pay_subject");

            //检查参数是否正确
            if (string.IsNullOrEmpty(order_no) || order_amount == 0)
            {
                Response.Redirect(new Web.UI.BasePage().linkurl("error", "?msg=" + Utils.UrlEncode("对不起,您提交的参数有误!")));
                return;
            }
            //===============================判断订单=
            if (order_no.StartsWith("R")) //R开头为在线充值订单
            {
                Model.user_recharge model = new BLL.user_recharge().GetModel(order_no);
                if (model == null)
                {
                    Response.Redirect(new Web.UI.BasePage().linkurl("error", "?msg=" + Utils.UrlEncode("对不起,您充值的订单号不存在或已删除!")));
                    return;
                }
                if (model.amount != order_amount)
                {
                    Response.Redirect(new Web.UI.BasePage().linkurl("error", "?msg=" + Utils.UrlEncode("对不起,您充值的订单金额与实际金额不一致!")));
                    return;
                }
                if (model.status == 1)
                {
                    Response.Redirect(new Web.UI.BasePage().linkurl("payment", "?action=succeed&order_no=" + order_no));
                    return;
                }
            }
            else //B开头为商品订单
            {
                Model.orders model = new BLL.orders().GetModel(order_no);
                if (model == null)
                {
                    Response.Redirect(new Web.UI.BasePage().linkurl("error", "?msg=" + Utils.UrlEncode("对不起,您支付的订单号不存在或已删除!")));
                    return;
                }
                if (model.order_amount != order_amount)
                {
                    Response.Redirect(new Web.UI.BasePage().linkurl("error", "?msg=" + Utils.UrlEncode("对不起,您支付的订单金额与实际金额不一致!")));
                    return;
                }
                if (model.payment_status == 2)
                {
                    Response.Redirect(new Web.UI.BasePage().linkurl("payment", "?action=succeed&order_no=" + order_no));
                    return;
                }
            }
            if (user_name != "")
            {
                user_name = "支付会员:" + user_name;
            }
            else
            {
                user_name = "匿名用户";
            }

            //===========================调用统一下单接口==============================
            string       sendUrl      = "https://api.mch.weixin.qq.com/pay/unifiedorder";
            NativeConfig nativeConfig = new NativeConfig();
            WxPayData    data         = new WxPayData();

            data.SetValue("body", user_name);                                              //商品描述
            data.SetValue("detail", siteConfig.webname + "-" + subject);                   //商品详情
            data.SetValue("out_trade_no", order_no);                                       //商户订单号
            data.SetValue("total_fee", (Convert.ToDouble(order_amount) * 100).ToString()); //订单总金额,以分为单位
            data.SetValue("trade_type", "NATIVE");                                         //交易类型
            data.SetValue("product_id", order_no);                                         //商品ID
            data.SetValue("notify_url", nativeConfig.Notify_url);                          //异步通知url
            data.SetValue("spbill_create_ip", DTRequest.GetIP());                          //终端IP
            data.SetValue("appid", nativeConfig.AppId);                                    //公众账号ID
            data.SetValue("mch_id", nativeConfig.Partner);                                 //商户号
            data.SetValue("nonce_str", NativePay.GenerateNonceStr());                      //随机字符串
            data.SetValue("sign", data.MakeSign(nativeConfig.Key));                        //签名
            string    xml       = data.ToXml();                                            //转换成XML
            var       startTime = DateTime.Now;                                            //开始时间
            string    response  = HttpService.Post(xml, sendUrl, false, 6);                //发送请求
            var       endTime   = DateTime.Now;                                            //结束时间
            int       timeCost  = (int)((endTime - startTime).TotalMilliseconds);          //计算所用时间
            WxPayData result    = new WxPayData();

            result.FromXml(response, nativeConfig.Key);
            NativePay.ReportCostTime(sendUrl, timeCost, result);     //测速上报

            string codeUrl = result.GetValue("code_url").ToString(); //获得统一下单接口返回的二维码链接

            imgQRCode.ImageUrl = "qrcode.aspx?data=" + HttpUtility.UrlEncode(codeUrl);
            litText.Text       = order_amount.ToString("#0.00");
        }
예제 #14
0
        public int CompleteServiceOrder(WxPayData queryData)
        {
            string out_trade_no = queryData.GetValue("out_trade_no").ToString().Substring(10);
            //取出提交的数据包,原样返回
            //object attachData = payData.GetValue("attach");
            //交易状态
            string trade_state = queryData.GetValue("trade_state").ToString();
            //微信支付订单号
            string transaction_id = null;

            if (queryData.IsSet("transaction_id"))
            {
                transaction_id = queryData.GetValue("transaction_id").ToString();
            }

            var orderInfo = _userPayOrdeRepository.FirstOrDefault(p => p.Id == out_trade_no);

            if (trade_state == "SUCCESS")//交易成功
            {
                //支付金额
                return(_purchaseServiceRepository.CompleteServiceOrder(new CompleteServiceOrder()
                {
                    OrderID = out_trade_no,
                    Cost = Convert.ToDouble(queryData.GetValue("total_fee")) / 100,
                    NewID = OrderHelper.GenerateNewId(),
                    PayExtendInfo = queryData.ToJson(),
                    PayState = trade_state,
                    PayOrderID = transaction_id,
                    Remarks = "微信公众号支付",
                }));
            }

            else if (trade_state == "USERPAYING")//正在支付
            {
                var result = _purchaseServiceRepository.UpdateServiceOrder(new UpdateServiceOrder()
                {
                    ID            = out_trade_no,
                    PayExtendInfo = queryData.ToJson(),
                    PayState      = trade_state,
                    PayOrderID    = transaction_id,
                    State         = null
                });

                if (result != 0)
                {
                    LogHelper.Logger.Error("更新订单失败");
                }

                return(-4);
            }
            else if (trade_state == "NOTPAY")
            {
                //算作超时关闭订单
                if (orderInfo != null && orderInfo.CreateTime.AddMinutes(20) < DateTime.Now)
                {
                    var result1 = _purchaseServiceRepository.UpdateServiceOrder(new UpdateServiceOrder()
                    {
                        ID            = out_trade_no,
                        PayExtendInfo = queryData.ToJson(),
                        PayState      = trade_state,
                        PayOrderID    = transaction_id,
                        State         = 3
                    });

                    if (result1 != 0)
                    {
                        LogHelper.Logger.Error("更新订单失败");
                    }
                    LogHelper.Logger.Debug("超时关闭订单");
                    return(-4);
                }
                else
                {
                    //继续等待,还不算结束
                    var result1 = _purchaseServiceRepository.UpdateServiceOrder(new UpdateServiceOrder()
                    {
                        ID            = out_trade_no,
                        PayExtendInfo = queryData.ToJson(),
                        PayState      = trade_state,
                        PayOrderID    = transaction_id,
                        State         = null
                    });

                    return(-4);
                }
            }
            else
            {
                var result1 = _purchaseServiceRepository.UpdateServiceOrder(new UpdateServiceOrder()
                {
                    ID            = out_trade_no,
                    PayExtendInfo = queryData.ToJson(),
                    PayState      = trade_state,
                    PayOrderID    = transaction_id,
                    State         = 3
                });

                if (result1 != 0)
                {
                    LogHelper.Logger.Error("更新订单失败");
                }

                LogHelper.Logger.Error("支付失败");

                return(-4);
            }
        }
예제 #15
0
        public ActionResult OrderConfirm()
        {
            string paycode = QueryString.SafeQ("code");

            int success  = QueryString.IntSafeQ("s");  //是否需要订单成功提醒
            int freshnum = QueryString.IntSafeQ("fn"); //循环次数,超过10次自动关闭

            if (freshnum > 10)
            {
                return(null);
            }
            VWPayOrderEntity _payen = PayOrderBLL.Instance.GetVWPayOrderByPayCode(paycode);

            if (_payen.PayMethod == (int)PayType.WeChat)//微信支付
            {
                if (Globals.IsWeiXinDevice())
                {
                    string wechatcode = "";
                    wechatcode = QueryString.SafeQ("wechatcode");

                    //是微信客户端走这边
                    if (string.IsNullOrEmpty(wechatcode))
                    {
                        //没有获取微信授权码
                        string url         = Request.Url.ToString();
                        string redirecturl = string.Format(WeiXinConfig.URL_WeiXin_Redirect, WeiXinConfig.GetAppId(), System.Web.HttpContext.Current.Server.UrlEncode(url), "0");
                        return(Redirect(redirecturl));
                    }
                    else
                    {
                        //有微信授权码
                        JsApiPay jsApiPay = new JsApiPay();
                        try
                        {
                            jsApiPay.GetOpenidAndAccessTokenFromCode(wechatcode);
                        }
                        catch (Exception ex)
                        {
                            //授权码过期
                            string baseurl;
                            Dictionary <string, string> nvc = new Dictionary <string, string>();
                            string oldurl = Request.Url.ToString();
                            StringUtils.ParseUrl(oldurl, out baseurl, out nvc);
                            nvc.Remove("wechatcode");
                            if (nvc.ContainsKey("fn"))
                            {
                                nvc["fn"] = (StringUtils.GetDbInt(nvc["fn"]) + 1).ToString();
                            }
                            else
                            {
                                nvc.Add("fn", "1");
                            }
                            string url = baseurl + "?";
                            foreach (string key in nvc.Keys)
                            {
                                url += "&" + key + "=" + nvc[key];
                            }

                            string redirecturl = string.Format(WeiXinConfig.URL_WeiXin_Redirect, WeiXinConfig.GetAppId(), System.Web.HttpContext.Current.Server.UrlEncode(url), "0");
                            return(Redirect(redirecturl));
                        }
                        WxPayData paydata      = jsApiPay.GetUnifiedOrderResult(_payen);
                        string    wxJsApiParam = jsApiPay.GetJsApiParameters();//获取H5调起JS API参数
                        ViewBag.WeiXinJsApiParam = wxJsApiParam;
                    }
                }
                else
                {
                    //网站类调出微信端支付通道
                    DateTime  dtnow     = DateTime.Now;
                    NativePay nativePay = new NativePay();
                    WxPayData data      = nativePay.GetPayUrl(_payen, "MWEB");//得到调用微信接口的路径
                    string    url       = data.GetValue("mweb_url").ToString();
                    return(Redirect(url));
                }
            }
            ViewBag.PayOrderEntity = _payen;
            ViewBag.Success        = success;
            return(View());
        }
예제 #16
0
        /// <summary>
        /// 重写推送方法
        /// </summary>
        /// <param name="accessTokenModel"></param>
        /// <param name="contentModel"></param>
        /// <returns></returns>
        public override string Push(U_AccessToken accessTokenModel, U_Content contentModel)
        {
            //获取AccessToken
            bool isSuccess = SetCorpAccount(accessTokenModel);

            if (isSuccess)
            {
                var listRedPacket = new List <Business_Redpacket_Push_Information>();
                //List<U_WeChatUser> weChatUserList = SearchWeChatUserList();
                //string pushObject = GetPushObject(contentModel, weChatUserList);//13788907365|15618738991|18301914615
                string   pushObject = GetPushObject(contentModel);
                string[] pushObjs   = pushObject.Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries); //推送的人数
                int[]    redPacket  = new int[pushObjs.Length - 1];
                try
                {
                    //固定金额红包推送 总金额固定,按照人数计算每个红包金额(每个红包金额需一致)
                    // 注:如果无法平均分配,则最后一人多出(例:10元分给3人,则金额为3.3、3.3、3.4)
                    if (contentModel.RedpacketType == 1)
                    {
                        int money = (int)(contentModel.RedpacketMoney * 100);  //总金额(分)
                        redPacket = GetAvgRedPacket(pushObjs.Length, money);
                    }
                    else if (contentModel.RedpacketType == 2)                 //红包总金额(RMB),推送给每人的金额随机。
                    {
                        int money = (int)(contentModel.RedpacketMoney * 100); //总金额(分)
                        redPacket = GetRandomRedPacket(pushObjs.Length, money);
                    }
                    else if (contentModel.RedpacketType == 3)  //输入单个红包随机金额区间(RMB),发给每人红包的金额在此区间内
                    {
                        int moneyFrom = (int)(contentModel.RedpacketMoneyFrom * 100);
                        int moneyTo   = (int)(contentModel.RedpacketMoneyTo * 100);
                        redPacket = GetSingleRandomRedPacket(pushObjs.Length, moneyFrom, moneyTo);
                    }
                    for (int i = 0; i < pushObjs.Length; i++)
                    {
                        WxPayData data = new WxPayData();
                        Business_Redpacket_Push_Information redpacketPushInfo = new Business_Redpacket_Push_Information();
                        redpacketPushInfo.Business_WeChatPushVguid = contentModel.VGUID; //推送主键
                        data.SetValue("nonce_str", WxPayApi.GenerateNonceStr());         //随机字符串
                        var outTradeNo = WxPayApi.GenerateOutTradeNo();
                        redpacketPushInfo.OrderNumber = outTradeNo;
                        data.SetValue("mch_billno", outTradeNo);     //商户订单号
                        data.SetValue("mch_id", WxPayConfig.MCHID);  //商户号
                        data.SetValue("wxappid", WxPayConfig.APPID); //公众账号ID
                        data.SetValue("sender_name", "大众交通出租分公司");   //商户名称
                        //string filePath = AppDomain.CurrentDomain.BaseDirectory + "logo.png";
                        //string mediaid = UploadTempResource(filePath);
                        data.SetValue("sender_header_media_id", "1G6nrLmr5EC3MMb_-zK1dDdzmd0p7cNliYu9V5w7o8K0"); //发送者头像,此id为微信默认的头像
                        string openid   = ConvertToOpenidByUserId(_accessToken, pushObjs[i]);
                        var    openInfo = JsonHelper.JsonToModel <U_OpenInfo>(openid);
                        JsonConvert.DeserializeObject <U_OpenInfo>(openid);
                        data.SetValue("re_openid", openInfo.openid);                                                 //用户openid
                        data.SetValue("total_amount", redPacket[i]);                                                 //付款金额,单位分
                        redpacketPushInfo.RedpacketMoney = (decimal)(redPacket[i] * 1.0 / 100);                      //红包金额
                        data.SetValue("wishing", contentModel.Message);                                              //红包祝福语
                        data.SetValue("act_name", contentModel.Title);                                               //活动名称
                        data.SetValue("remark", "快来抢");                                                              //备注
                        data.SetValue("scene_id", "PRODUCT_4");                                                      //场景(金额大于200元时必填)
                        data.SetValue("workwx_sign", data.MakeWorkWxSign("redPacket"));                              //企业微信签名
                        data.SetValue("sign", data.MakeSign());                                                      //微信支付签名
                        redpacketPushInfo.UserID = pushObjs[i];                                                      //红包接收人的微信号
                        string       xml      = data.ToXml();
                        const string postUrl  = "https://api.mch.weixin.qq.com/mmpaymkttransfers/sendworkwxredpack"; //发送企业红包接口地址
                        string       response = PostWebRequest(postUrl, xml, Encoding.UTF8, true);                   //调用HTTP通信接口提交数据到API
                        WxPayData    result   = new WxPayData();
                        result.FromXml(response);
                        if (result.GetValue("return_code").ToString() == "SUCCESS" && result.GetValue("result_code").ToString() == "SUCCESS")
                        {
                            redpacketPushInfo.RedpacketStatus = 2; //已发送待领取
                        }
                        else
                        {
                            redpacketPushInfo.RedpacketStatus = 3; //发送失败
                            redpacketPushInfo.Reson           = result.GetValue("err_code_des").ToString();
                            LogManager.WriteLog(LogFile.Error, result.GetValue("err_code") + ":" + result.GetValue("err_code_des"));
                        }
                        redpacketPushInfo.VGUID       = Guid.NewGuid();
                        redpacketPushInfo.CreatedDate = DateTime.Now;
                        redpacketPushInfo.CreatedUser = "******";
                        listRedPacket.Add(redpacketPushInfo);
                    }
                }
                catch (Exception ex)
                {
                    LogManager.WriteLog(LogFile.Error, ex.ToString());
                    return("推送失败!");
                }
                UpdatePushStatus(contentModel);
                InsertRedPacketInfo(listRedPacket);
                return("推送成功!");
            }
            return("推送失败!");
        }
예제 #17
0
        /// <summary>
        /// 执行退款请求
        /// </summary>
        /// <param name="out_trade_no">商户系统内部的退款单号,商户系统内部唯一,只能是数字、大小写字母_-|*@ ,同一退款单号多次请求只退一笔。</param>
        /// <param name="out_refund_no">商户系统内部的退款单号,商户系统内部唯一,只能是数字、大小写字母_-|*@ ,同一退款单号多次请求只退一笔。</param>
        /// <param name="total_fee">订单金额,注意,单位为分</param>
        /// <param name="refund_fee">退款金额,注意,单位为分</param>
        /// <param name="refund_desc">退款原因,非必填</param>
        /// <returns></returns>
        public JsonResultObj Excute(string out_trade_no, string out_refund_no, int total_fee, int refund_fee, string refund_desc = "正常退款")
        {
            try {
                WxPayData data = new WxPayData();
                //商户账号appid
                data.SetValue("appid", WxPayConfig.APPID);

                //商户号
                data.SetValue("mch_id", WxPayConfig.MCHID);

                //随机字符串
                data.SetValue("nonce_str", Guid.NewGuid().ToString().Replace("-", ""));

                //商户系统内部订单号,要求32个字符内,只能是数字、大小写字母_-|*@ ,且在同一个商户号下唯一。
                data.SetValue("out_trade_no", out_trade_no);
                //商户系统内部的退款单号,商户系统内部唯一,只能是数字、大小写字母_-|*@ ,同一退款单号多次请求只退一笔。
                data.SetValue("out_refund_no", out_refund_no);
                //订单金额
                data.SetValue("total_fee", total_fee);
                //退款金额
                data.SetValue("refund_fee", refund_fee);
                //退款货币种类
                data.SetValue("refund_fee_type", "CNY");
                data.SetValue("refund_desc", refund_desc);
                data.SetValue("refund_account", "REFUND_SOURCE_UNSETTLED_FUNDS");
                data.SetValue("notify_url", "");

                data.SetValue("sign", data.MakeSign());
                var xml = data.ToXml();//转换xml格式

                int timeOut = 10;
                var start   = DateTime.Now;                                  //请求开始时间

                string response = HttpService.Post(xml, url, true, timeOut); //调用HTTP通信接口以提交数据到API

                var end      = DateTime.Now;
                int timeCost = (int)((end - start).TotalMilliseconds);//获得接口耗时

                WxPayData result = new WxPayData();
                //将xml格式的结果转换为对象以返回
                result.FromXml(response);
                var result_code = result.GetValue("result_code").ToString();
                var return_code = result.GetValue("result_code").ToString();
                if (result_code.Equals("SUCCESS", StringComparison.OrdinalIgnoreCase) && return_code.Equals("SUCCESS", StringComparison.OrdinalIgnoreCase))
                {
                    return(new JsonResultObj {
                        code = 1000,
                        msg = "退款成功!金额" + result.GetValue("refund_fee") + "(单位:分)已经成功原路退款至该用户"
                    });
                }
                else
                {
                    var err_code_des = result.GetValue("err_code_des").ToString();
                    return(new JsonResultObj {
                        msg = err_code_des,
                    });
                }
            }
            catch (Exception ex) {
                //LogFactory.GetLogger().Error("微信退款请求异常", ex);
                return(new JsonResultObj {
                    msg = ex.Message,
                });
            }
        }
예제 #18
0
        /*
         * 仅支持支付单
         */
        protected void Page_Load(object sender, EventArgs e)
        {
            B_User.CheckIsLogged(Request.RawUrl);
            M_UserInfo mu = buser.GetLogin(false);

            if (string.IsNullOrEmpty(SiteConfig.SiteInfo.SiteUrl))
            {
                function.WriteErrMsg("错误,管理员未定义网站地址,SiteUrl");
            }
            string siteurl = (SiteConfig.SiteInfo.SiteUrl.TrimEnd('/') + "/PayOnline/");

            if (string.IsNullOrEmpty(PayNo))
            {
                function.WriteErrMsg("请传入支付单号");
            }
            pinfo = paymentBll.SelModelByPayNo(PayNo);
            if (pinfo == null || pinfo.PaymentID < 1)
            {
                function.WriteErrMsg("支付单不存在");
            }
            M_PayPlat payPlat = payPlatBll.GetPayPlatByid(pinfo.PayPlatID);

            if (!IsPostBack)
            {
                #region 母版页中信息
                logged_div.Visible = true;
                #endregion
                if (pinfo.Status != (int)M_Payment.PayStatus.NoPay)
                {
                    function.WriteErrMsg("支付单不能重复付款");
                }
                Rurl_Href.NavigateUrl = "/User/Order/OrderList";//返回我的订单
                if (pinfo.PaymentNum.Contains("IDC"))
                {
                    Rurl_Href.NavigateUrl = "/Plugins/Domain/ViewHave.aspx";
                }
                string url = Request.CurrentExecutionFilePath;
                urlReq1 = Request.Url.AbsoluteUri.ToString().Substring(0, Request.Url.AbsoluteUri.ToString().LastIndexOf('/'));
                double vmoney   = pinfo.MoneyReal;                //支付金额
                string v_amount = pinfo.MoneyReal.ToString("f2"); //实际支付金额
                if (string.IsNullOrEmpty(PayMethod))
                {
                    #region 现金支付
                    DataTable orderDB1  = orderBll.GetOrderbyOrderNo(pinfo.PaymentNum);//订单表,ZL_OrderInfo
                    int       orderType = 0;
                    if (orderDB1.Rows.Count > 0)
                    {
                        orderType = DataConvert.CLng(orderDB1.Rows[0]["OrderType"]);
                    }
                    if (orderType == 8)//有需要检测库存的订单类型,放此
                    {
                        if (!cartBll.CheckStock(Convert.ToInt32(orderDB1.Rows[0]["OrderType"])))
                        {
                            function.WriteErrMsg("商品库存数量不足,请重新购买");
                        }
                    }
                    DataTable ordertable = orderBll.GetOrderbyOrderNo(pinfo.PaymentNum);
                    int       DeliveryID = 0; //送货方式ID
                    if (ordertable != null && ordertable.Rows.Count > 0)
                    {
                        DeliveryID = DataConverter.CLng(ordertable.Rows[0]["Delivery"]);
                    }
                    if (pinfo.PayPlatID == 0 && !string.IsNullOrEmpty(pinfo.PlatformInfo))//支付宝网银支付
                    {
                        payPlat = payPlatBll.GetPayPlatByClassID("15");
                        alipayBank(pinfo.PlatformInfo);
                    }
                    if (payPlat.PayClass == 99)//线下支付
                    {
                        function.WriteSuccessMsg("信息已记录,请等待商家联系完成线下付款", Rurl_Href.NavigateUrl);
                    }
                    if (payPlat == null || payPlat.PayPlatID < 1)
                    {
                        function.WriteErrMsg("没有找到对应的支付平台信息!");
                    }
                    //StringBuilder v_urlBuilder = new StringBuilder();    //构造返回URL
                    //StringBuilder strHiddenField = new StringBuilder();
                    //string applicationName = paymentBll.GetApplicationName();
                    //if (!applicationName.EndsWith("/"))
                    //{
                    //    applicationName = applicationName + "/";
                    //}
                    //v_urlBuilder.Append("http://");
                    //v_urlBuilder.Append(applicationName);
                    //string v_ShowResultUrl = v_urlBuilder.ToString() + "PayOnline/ShowReturn.aspx?";
                    if (payPlat.PayClass == 100)//货到付款
                    {
                        payinfo_div.Visible = false;
                        AfterPay_Tb.Visible = true;
                        Title = "下单成功!";
                    }
                    else
                    {
                        payinfo_div.Visible = true;
                        AfterPay_Tb.Visible = false;
                    }
                    switch ((M_PayPlat.Plat)payPlat.PayClass)//现仅开通 12:支付宝即时到账和支付宝网银服务,15支付宝网银服务(上方代码中处理),银币与余额服务
                    {
                        #region 各种支付方式
                    case M_PayPlat.Plat.UnionPay:
                        #region 银联在线
                        //gateway = "https://pay3.chinabank.com.cn/PayGate?encoding=UTF-8";
                        //必要的交易信息
                        string wv_amount    = v_amount;                              // 订单金额
                        string wv_moneytype = "CNY";                                 // 币种
                        string wv_md5info;                                           // 对拼凑串MD5私钥加密后的值
                        string wv_mid = payPlat.AccountID;                           // 商户号
                        //v_urlBuilder.Append("http://localhost:86/PayOnline/PayReceive.aspx?PayID=" +payid);
                        string wv_url = urlReq1 + "/PayReceive.aspx?PayNo=" + PayNo; // 返回页地址
                        string wv_oid = pinfo.PayNo;                                 // 推荐订单号构成格式为 年月日-商户号-小时分钟秒
                        //两个备注

                        // wv_mid = "1001";				 商户号,这里为测试商户号20000400,替换为自己的商户号即可
                        // wv_url = "http://localhost/chinabank/Receive.aspx";  商户自定义返回接收支付结果的页面
                        // MD5密钥要跟订单提交页相同,如Send.asp里的 key = "test" ,修改""号内 test 为您的密钥
                        string wkey = payPlat.MD5Key;                                    // 如果您还没有设置MD5密钥请登录我们为您提供商户后台,地址:https://merchant3.chinabank.com.cn/
                        // 登录后在上面的导航栏里可能找到“B2C”,在二级导航栏里有“MD5密钥设置”
                        // 建议您设置一个16位以上的密钥或更高,密钥最多64位,但设置16位已经足够了
                        wv_amount    = v_amount;    // 订单金额
                        wv_moneytype = "CNY";       // 币种
                        //对拼凑串MD5私钥加密后的值
                        wv_mid = payPlat.AccountID; // 商户号
                        wv_oid = pinfo.PayNo;       // 推荐订单号构成格式为 年月日-商户号-小时分钟秒

                        if (wv_oid == null || wv_oid.Equals(""))
                        {
                            DateTime dt       = DateTime.Now;
                            string   wv_ymd   = dt.ToString("yyyyMMdd"); // yyyyMMdd
                            string   wtimeStr = dt.ToString("HHmmss");   // HHmmss
                            wv_oid = wv_ymd + wv_mid + wtimeStr;
                        }
                        string text = wv_amount + wv_moneytype + wv_oid + wv_mid + wv_url + wkey;     // 拼凑加密串
                        wv_md5info = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(text, "md5").ToUpper();
                        //strHiddenField.Append("<input type='hidden' name='v_md5info' value='" + wv_md5info + "'>\n");
                        //strHiddenField.Append("<input type='hidden' name='v_mid' value='" + wv_mid + "'>\n");
                        //strHiddenField.Append("<input type='hidden' name='v_oid' value='" + wv_oid + "'>\n");
                        //strHiddenField.Append("<input type='hidden' name='v_amount' value='" + wv_amount + "' >\n");
                        //strHiddenField.Append("<input type='hidden' name='v_moneytype' value='" + wv_moneytype + "'>\n");
                        //strHiddenField.Append("<input type='hidden' name='v_url' value='" + wv_url + "'>\n");
                        //    //以下几项只是用来记录客户信息,可以不用,不影响支付
                        //    strHiddenField.Append("<input type='hidden' name='v_rcvname' value='" + "" + "'>\n");
                        //    strHiddenField.Append("<input type='hidden' name='v_rcvaddr' value='" + "" + "'>\n");
                        //    strHiddenField.Append("<input type='hidden' name='v_rcvtel' value='" + "" + "'>\n");
                        //    strHiddenField.Append("<input type='hidden' name='v_rcvpost' value='" + "" + "' >\n");
                        //    strHiddenField.Append("<input type='hidden' name='v_rcvemail' value='" + "" + "'>\n");
                        //    strHiddenField.Append("<input type='hidden' name='v_rcvmobile' value='" + "" + "'>\n");
                        //    strHiddenField.Append("<input type='hidden' name='v_ordername' value='" + "" + "' >\n");
                        //    strHiddenField.Append("<input type='hidden' name='v_orderaddr' value='" + "" + "'>\n");
                        //    strHiddenField.Append("<input type='hidden' name='v_ordertel' value='" + "" + "'>\n");
                        //    strHiddenField.Append("<input type='hidden' name='v_orderpost' value='" + "" + "' >\n");
                        //    strHiddenField.Append("<input type='hidden' name='v_orderemail' value='" + "" + "'>\n");
                        //    strHiddenField.Append("<input type='hidden' name='v_ordermobile' value='" + "" + "'>\n");
                        //    strHiddenField.Append("<input type='hidden' name='Package' value='" + Request.QueryString["Package"] + "'>\n");
                        #endregion
                        break;

                    case M_PayPlat.Plat.Alipay_Instant:
                        #region 支付宝[即时到帐]
                        string input_charset1 = "utf-8";
                        string notify_url1    = urlReq1 + "/Return/AlipayNotify.aspx"; //付完款后服务器AJAX通知的页面 要用 http://格式的完整路径,不允许加?id=123这类自定义参数
                        string return_url1    = urlReq1 + "/Return/AlipayReturn.aspx"; //付完款后跳转的页面 要用 http://格式的完整路径,不允许加?id=123这类自定义参数
                        string show_url1      = "";
                        string sign_type1     = "MD5";
                        ///////////////////////以下参数是需要通过下单时的订单数据传入进来获得////////////////////////////////
                        //必填参数
                        string price1             = pinfo.MoneyReal.ToString("f2");  //订单总金额,显示在支付宝收银台里的“商品单价”里
                        string logistics_fee1     = "0.00";                          //物流费用,即运费。
                        string logistics_type1    = "POST";                          //物流类型,三个值可选:EXPRESS(快递)、POST(平邮)、EMS(EMS)
                        string logistics_payment1 = "SELLER_PAY";                    //物流支付方式,两个值可选:SELLER_PAY(卖家承担运费)、BUYER_PAY(买家承担运费)
                        string out_trade_no1      = pinfo.PayNo;                     //请与贵网站订单系统中的唯一订单号匹配
                        string subject1           = pinfo.Remark;                    //订单名称,显示在支付宝收银台里的“商品名称”里,显示在支付宝的交易管理的“商品名称”的列表里。
                        string body1            = pinfo.Remark;                      //订单描述、订单详细、订单备注,显示在支付宝收银台里的“商品描述”里
                        string quantity1        = "1";                               //商品数量,建议默认为1,不改变值,把一次交易看成是一次下订单而非购买一件商品。
                        string receive_name1    = "";                                //收货人姓名,如:张三
                        string receive_address1 = "";                                //收货人地址,如:XX省XXX市XXX区XXX路XXX小区XXX栋XXX单元XXX号
                        string receive_zip1     = "";                                //收货人邮编,如:123456
                        string receive_phone1   = "";                                //收货人电话号码,如:0571-81234567
                        string receive_mobile1  = "";                                //收货人手机号码,如:13312341234
                        //---------------------
                        string receive_name    = orderDB1.Rows[0]["Reuser"] + "";    //收货人姓名,如:张三
                        string receive_address = orderDB1.Rows[0]["Jiedao"] + "";    //收货人地址,如:XX省XXX市XXX区XXX路XXX小区XXX栋XXX单元XXX号
                        string receive_zip     = orderDB1.Rows[0]["ZipCode"] + "";   //收货人邮编,如:123456
                        string receive_phone   = orderDB1.Rows[0]["Phone"] + "";     //收货人电话号码,如:0571-81234567
                        string receive_mobile  = orderDB1.Rows[0]["MobileNum"] + ""; //收货人手机号码,如:13312341234
                        //扩展参数——第二组物流方式
                        //物流方式是三个为一组成组出现。若要使用,三个参数都需要填上数据;若不使用,三个参数都需要为空
                        //有了第一组物流方式,才能有第二组物流方式,且不能与第一个物流方式中的物流类型相同,
                        //即logistics_type="EXPRESS",那么logistics_type_1就必须在剩下的两个值(POST、EMS)中选择
                        string logistics_fee_3     = "";                                                    //物流费用,即运费。
                        string logistics_type_3    = "";                                                    //物流类型,三个值可选:EXPRESS(快递)、POST(平邮)、EMS(EMS)
                        string logistics_payment_3 = "";                                                    //物流支付方式,两个值可选:SELLER_PAY(卖家承担运费)、BUYER_PAY(买家承担运费)

                        //扩展参数——第三组物流方式
                        //物流方式是三个为一组成组出现。若要使用,三个参数都需要填上数据;若不使用,三个参数都需要为空
                        //有了第一组物流方式和第二组物流方式,才能有第三组物流方式,且不能与第一组物流方式和第二组物流方式中的物流类型相同,
                        //即logistics_type="EXPRESS"、logistics_type_1="EMS",那么logistics_type_2就只能选择"POST"
                        string logistics_fee_4     = "";                                                        //物流费用,即运费。
                        string logistics_type_4    = "";                                                        //物流类型,三个值可选:EXPRESS(快递)、POST(平邮)、EMS(EMS)
                        string logistics_payment_4 = "";                                                        //物流支付方式,两个值可选:SELLER_PAY(卖家承担运费)、BUYER_PAY(买家承担运费)
                        //扩展功能参数——其他
                        string buyer_email1 = "";                                                               //默认买家支付宝账号
                        string discount1    = "";                                                               //折扣,是具体的金额,而不是百分比。若要使用打折,请使用负数,并保证小数点最多两位数
                        /////////////////////////////////////////////////////////////////////////////////////////////////////
                        //构造请求函数,无需修改
                        B_AliPay_trades_Services aliService1 = new B_AliPay_trades_Services(
                            payPlat.AccountID,
                            payPlat.SellerEmail,
                            return_url1,
                            notify_url1,
                            show_url1,
                            out_trade_no1,
                            subject1,
                            body1,
                            price1,
                            logistics_fee1,
                            logistics_type1,
                            logistics_payment1,
                            quantity1,
                            receive_name1,
                            receive_address1,
                            receive_zip1,
                            receive_phone1,
                            receive_mobile1,
                            logistics_fee_3,
                            logistics_type_3,
                            logistics_payment_3,
                            logistics_fee_4,
                            logistics_type_4,
                            logistics_payment_4,
                            buyer_email1,
                            discount1,
                            payPlat.MD5Key,
                            input_charset1,
                            sign_type1);
                        Alipay_Btn.Visible       = true;
                        LblHiddenValue.InnerHtml = aliService1.Build_Form();
                        #endregion
                        break;

                    case M_PayPlat.Plat.Alipay_Bank:    //支付宝网银,已上方处理
                        break;

                    case M_PayPlat.Plat.Mobo:
                        #region 成都MO宝支付
                    {
                        string pfxFilePath = Server.MapPath("/muzi.pfx");
                        string cerFilePath = Server.MapPath("/mobaopay.cer");
                        string passwd      = payPlat.MD5Key;
                        if (!File.Exists(pfxFilePath) || !File.Exists(cerFilePath))
                        {
                            function.WriteErrMsg("证书文件不存在");
                        }
                        Mobo360SignUtil.Instance.init(pfxFilePath, cerFilePath, passwd);
                        //--------------------------------------------------------------------
                        Dictionary <string, string> payData = new Dictionary <string, string>();
                        payData.Add("apiName", "WEB_PAY_B2C");
                        payData.Add("apiVersion", "1.0.0.0");
                        payData.Add("platformID", payPlat.PayPlatinfo); //平台ID,商户号
                        payData.Add("merchNo", payPlat.AccountID);
                        payData.Add("orderNo", pinfo.PayNo);            //订单号,
                        payData.Add("tradeDate", DateTime.Now.ToString("yyyyMMdd"));
                        payData.Add("amt", pinfo.MoneyReal.ToString("f2"));
                        payData.Add("merchUrl", urlReq1 + "/Return/MoBaoReturn.aspx");
                        payData.Add("merchParam", "");
                        payData.Add("tradeSummary", pinfo.Remark);
                        payData.Add("signMsg", Mobo360SignUtil.Instance.sign(payData));
                        string payReqUrl = Mobo360Merchant.Instance.generatePayUrl(payData, "https://trade.mobaopay.com/cgi-bin/netpayment/pay_gate.cgi");
                        Response.ContentEncoding = System.Text.Encoding.UTF8;
                        Alipay_Btn.Visible       = true;
                        LblHiddenValue.InnerHtml = new Pay_BaoFa().BuildForm(payReqUrl, null);
                        //Response.Redirect(payReqUrl);// 重定向客户端到收银台
                        //Confirm_VMoney_Btn.Visible = true;
                    }
                        #endregion
                        break;

                    case M_PayPlat.Plat.WXPay:
                        #region 微信扫码支付
                    {
                        pinfo.PlatformInfo = "0";
                        paymentBll.Update(pinfo);
                        WxPayData wxdata = new WxPayData();
                        wxdata.SetValue("out_trade_no", pinfo.PayNo);
                        wxdata.SetValue("body", string.IsNullOrEmpty(pinfo.Remark) ? "微信支付" : pinfo.Remark);
                        wxdata.SetValue("total_fee", Convert.ToInt32(pinfo.MoneyReal * 100));
                        wxdata.SetValue("trade_type", "NATIVE");
                        wxdata.SetValue("notify_url", urlReq1 + "/Return/WxPayReturn.aspx");
                        wxdata.SetValue("product_id", "1");
                        WxPayData result = WxPayApi.UnifiedOrder(wxdata, WxPayApi.Pay_GetByID());
                        if (result.GetValue("return_code").ToString().Equals("FAIL"))
                        {
                            function.WriteErrMsg("商户" + result.GetValue("return_msg"));
                        }
                        Response.Redirect("/PayOnline/WxCodePay.aspx?PayNo=" + pinfo.PayNo + "&wxcode=" + result.GetValue("code_url"));
                    }
                        #endregion
                        break;

                    case M_PayPlat.Plat.BaoFo:
                        #region 宝付
                    {
                        Pay_BaoFa baofaBll = new Pay_BaoFa();
                        //测试使用
                        payPlat.AccountID   = "100000178";
                        payPlat.MD5Key      = "abcdefg";
                        payPlat.PayPlatinfo = "10000001";
                        Dictionary <string, string> dics = new Dictionary <string, string>();
                        dics.Add("MemberID", payPlat.AccountID);        //"100000178",
                        dics.Add("PayID", "");
                        dics.Add("TradeDate", DateTime.Now.ToString("yyyyMMddHHmmss"));
                        dics.Add("TerminalID", payPlat.PayPlatinfo);        //19534
                        dics.Add("InterfaceVersion", "4.0");
                        dics.Add("KeyType", "1");
                        dics.Add("TransID", pinfo.PayNo);
                        dics.Add("OrderMoney", (pinfo.MoneyReal * 100).ToString("f0"));        //金额必须相等,否则会报签名失败
                        dics.Add("ProductName", pinfo.Remark);
                        dics.Add("Amount", pinfo.MoneyReal.ToString("f2"));
                        dics.Add("Username", mu.UserName);
                        dics.Add("AdditionalInfo", "");                               //可填sessionid等
                        dics.Add("PageUrl", siteurl + "/Return/BaoFaoShow.aspx");
                        dics.Add("ReturnUrl", siteurl + "/Return/BaoFaoNotify.aspx"); //是否必须正式才会有回调
                        dics.Add("NoticeType", "1");
                        string signature = baofaBll.GetMd5Sign(dics["MemberID"], dics["PayID"], dics["TradeDate"]
                                                               , dics["TransID"], dics["OrderMoney"]
                                                               , dics["PageUrl"], dics["ReturnUrl"], dics["NoticeType"], payPlat.MD5Key);
                        dics.Add("Signature", signature);
                        Alipay_Btn.Visible       = true;  //测试URL:http://tgw.bfopay.com/payindex   //正式:http://gw.bfopay.com/payindex
                        LblHiddenValue.InnerHtml = baofaBll.BuildForm("http://tgw.bfopay.com/payindex", dics);
                    }
                        #endregion
                        break;

                    case M_PayPlat.Plat.EPay95:
                        #region 双乾
                    {
                        Dictionary <string, string> epay_dics = new Dictionary <string, string>();
                        epay_dics.Add("MerNo", payPlat.AccountID);
                        epay_dics.Add("BillNo", pinfo.PayNo);
                        epay_dics.Add("Amount", pinfo.MoneyReal.ToString("f2"));
                        epay_dics.Add("ReturnURL", siteurl + "Return/EPay95Result.aspx");
                        epay_dics.Add("NotifyURL", siteurl + "Return/EPay95Notify.aspx");
                        string EpayMD5Key = payPlat.MD5Key;
                        string md5md5     = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(EpayMD5Key, "MD5").ToUpper();
                        //注意这里和示例不同,其示例是错误的.
                        string md5src = StringHelper.MD5("Amount=" + pinfo.MoneyReal.ToString("f2") + "&BillNo=" + pinfo.PayNo + "&MerNo=" + payPlat.AccountID + "&ReturnURL=" + siteurl + "EPay95Result.aspx" + "&" + md5md5).ToUpper();
                        epay_dics.Add("MD5info", md5src);
                        epay_dics.Add("PayType", "CSPAY");
                        epay_dics.Add("MerRemark", "双乾支付");
                        epay_dics.Add("products", pinfo.Remark);
                        LblHiddenValue.InnerHtml = new Pay_BaoFa().BuildForm("https://www.95epay.cn/sslpayment", epay_dics);
                        Alipay_Btn.Visible       = true;
                    }
                        #endregion
                        break;

                    case M_PayPlat.Plat.Ebatong:
                        #region Ebatong
                    {
                        Dictionary <string, string> ebatong_dics = new Dictionary <string, string>();
                        ebatong_dics.Add("sign_type", "MD5");
                        ebatong_dics.Add("service", "create_direct_pay_by_user");
                        ebatong_dics.Add("partner", payPlat.AccountID);
                        ebatong_dics.Add("input_charset", "UTF-8");
                        ebatong_dics.Add("notify_url", siteurl + "Return/EbatongNotify.aspx");        //服务器异步通知页面路径
                        ebatong_dics.Add("return_url", siteurl + "Return/EbatongReturn.aspx");        //服务器跳转页面
                        ebatong_dics.Add("out_trade_no", pinfo.PayNo);
                        ebatong_dics.Add("subject", pinfo.Remark);
                        ebatong_dics.Add("exter_invoke_ip", Request.UserHostAddress);
                        ebatong_dics.Add("payment_type", "1");
                        ebatong_dics.Add("seller_id", payPlat.AccountID);
                        ebatong_dics.Add("total_fee", pinfo.MoneyReal.ToString("f2"));
                        ebatong_dics.Add("error_notify_url", "");
                        ebatong_dics.Add("anti_phishing_key", new ZoomLa.BLL.Ebatong.AskForTimestamp().askFor(payPlat.AccountID, payPlat.MD5Key));
                        ebatong_dics.Add("seller_email", "");
                        ebatong_dics.Add("buyer_email", "");
                        ebatong_dics.Add("buyer_id", "");
                        ebatong_dics.Add("price", "");
                        ebatong_dics.Add("quantity", "");
                        ebatong_dics.Add("body", "");
                        ebatong_dics.Add("show_url", "");
                        ebatong_dics.Add("pay_method", "bankPay");
                        ebatong_dics.Add("extra_common_para", "");
                        ebatong_dics.Add("extend_param", "");
                        ebatong_dics.Add("it_b_pay", "");
                        ebatong_dics.Add("royalty_type", "");
                        ebatong_dics.Add("royalty_parameters", "");
                        ebatong_dics.Add("default_bank", "");
                        string[] paramts = new string[ebatong_dics.Keys.Count]; //参数排序数组
                        ebatong_dics.Keys.CopyTo(paramts, 0);
                        Array.Sort(paramts);                                    //参数排序操作
                        string paramstr = "";
                        foreach (string item in paramts)
                        {
                            paramstr += string.Format("{0}={1}&", item, ebatong_dics[item]);
                        }
                        //throw new Exception(paramstr.Trim('&'));
                        string md5md5 = new ZoomLa.BLL.Ebatong.CommonHelper().md5("UTF-8", paramstr.Trim('&') + payPlat.MD5Key).ToLower();
                        ebatong_dics.Add("sign", md5md5);
                        LblHiddenValue.InnerHtml = new Pay_BaoFa().BuildForm("https://www.ebatong.com/direct/gateway.htm", ebatong_dics);
                        Alipay_Btn.Visible       = true;
                    }
                        #endregion
                        break;

                    case M_PayPlat.Plat.CCB:
                        #region 江西建行
                    {
                        Dictionary <string, string> ccb_dics = new Dictionary <string, string>();
                        ccb_dics.Add("MERCHANTID", payPlat.AccountID);    //商户代码
                        ccb_dics.Add("POSID", payPlat.PrivateKey);        //柜台代码
                        ccb_dics.Add("BRANCHID", payPlat.PublicKey);      //分行代码
                        ccb_dics.Add("ORDERID", pinfo.PayNo);
                        ccb_dics.Add("PAYMENT", pinfo.MoneyReal.ToString("f2"));
                        ccb_dics.Add("CURCODE", "01");
                        ccb_dics.Add("REMARK1", "");        //备注信息1(具体信息待测试)
                        ccb_dics.Add("REMARK2", "");        //备注信息2
                        ccb_dics.Add("TXCODE", "520100");
                        string ccb_paramstr = "";
                        foreach (String item in ccb_dics.Keys)
                        {
                            ccb_paramstr += string.Format("{0}={1}&", item, ccb_dics[item]);
                        }
                        string md5str = new ZoomLa.BLL.Ebatong.CommonHelper().md5("UTF-8", ccb_paramstr.Trim('&')).ToLower();
                        ccb_dics.Add("MAC", md5str);
                        LblHiddenValue.InnerHtml = new Pay_BaoFa().BuildForm("https://ibsbjstar.ccb.com.cn/app/ccbMain", ccb_dics);
                        Alipay_Btn.Visible       = true;
                        //Response.Redirect("https://ibsbjstar.ccb.com.cn/app/ccbMain?" + ccb_paramstr + "MAC=" + md5str);
                    }
                        #endregion
                        break;

                    case M_PayPlat.Plat.ECPSS:
                        #region 汇潮支付
                    {
                        Dictionary <string, string> payData = new Dictionary <string, string>();
                        payData.Add("OrderDesc", "test");                              //订单描述
                        payData.Add("Remark", "汇潮支付");                                 //备注
                        payData.Add("AdviceURL", siteurl + "Return/ECPSSNotfy.aspx");  //回调通知地址
                        payData.Add("ReturnURL", siteurl + "Return/ECPSSResult.aspx"); //返回地址
                        payData.Add("BillNo", pinfo.PayNo);                            //订单号
                        payData.Add("MerNo", payPlat.AccountID);                       //商户号
                        payData.Add("Amount", pinfo.MoneyReal.ToString("f2"));         //交易价格
                        string md5key = payPlat.MD5Key;
                        string md5str = payData["MerNo"] + "&" + payData["BillNo"] + "&" + payData["Amount"] + "&" + payData["ReturnURL"] + "&" + md5key;
                        payData.Add("SignInfo", System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(md5str, "MD5")); //签名
                        payData.Add("defaultBankNumber", "");                                                                               //银行代码(选填)
                        payData.Add("orderTime", DateTime.Now.ToString("yyyyMMddHHmmss"));                                                  //交易时间yyyyMMddHHmmss
                        payData.Add("products", pinfo.Remark);                                                                              //物品信息
                        LblHiddenValue.InnerHtml = new Pay_BaoFa().BuildForm("https://pay.ecpss.com/sslpayment", payData);
                        Alipay_Btn.Visible       = true;
                    }
                        #endregion
                        break;

                    case M_PayPlat.Plat.ICBC_NC:
                        #region 南昌工行
                    {
                        function.WriteErrMsg("工行支付组件未注册,请联系管理员");
                        //ICBCHelper icbc = new ICBCHelper();
                        //infosecapiLib.infosecClass obj = new infosecapiLib.infosecClass();
                        //Dictionary<string, string> dics = new Dictionary<string, string>();
                        //string posturl = "https://B2C.icbc.com.cn/servlet/ICBCINBSEBusinessServlet";
                        //---Debug
                        //payPlat.AccountID = "1502EC24392836";
                        //payPlat.SellerEmail = "1502201009004747554";
                        //payPlat.PrivateKey = "/Cert/cs.key";
                        //payPlat.PublicKey = "/Cert/cs.cer";
                        //posturl = "https://myipad.dccnet.com.cn/servlet/NewB2cMerPayReqServlet";
                        //throw new Exception(payPlat.PrivateKey + ":" + payPlat.PublicKey + ":" + payPlat.AccountID + ":" + payPlat.SellerEmail);
                        //Debug End
                        //*.z01.com根据需要更改如*.hx008.com
                        //string data = icbc.SpliceTranData(pinfo, payPlat.AccountID.Trim(), payPlat.SellerEmail.Trim(), "*.z01.com", siteurl + "ICBCNotify.aspx");
                        //string sign = obj.sign(data, Server.MapPath(payPlat.PrivateKey), payPlat.MD5Key.Trim());//私钥虚拟路径与私钥密钥
                        //dics.Add("interfaceName", "ICBC_PERBANK_B2C");
                        //dics.Add("interfaceVersion", "1.0.0.11");
                        //dics.Add("tranData", obj.base64enc(data));
                        //dics.Add("merSignMsg", sign);
                        //dics.Add("merCert", icbc.ReadCertToBase64(payPlat.PublicKey));//公钥路径
                        //LblHiddenValue.InnerHtml = new Pay_BaoFa().BuildForm(posturl, dics);
                        //Alipay_Btn.Visible = true;
                    }
                        #endregion
                        break;

                    case M_PayPlat.Plat.CashOnDelivery:
                        #region 货到付款
                        zfpt.Text      = payPlat.PayPlatName;
                        ddh.Text       = pinfo.PaymentNum;
                        PayNum_L2.Text = Convert.ToDecimal(vmoney).ToString("F2") + " 元";
                        sxf.Text       = payPlat.Rate.ToString() + " %";
                        sjhbje.Text    = v_amount + " 元";
                        #endregion
                        break;

                    default:
                        throw new Exception("错误:支付方式不存在");
                        #endregion
                    }
                    VMoneyPayed_L.Text = payPlat.PayPlatName;
                    OrderNo_L.Text     = pinfo.PaymentNum;
                    LblRate.Text       = payPlat.Rate.ToString() + " %";
                    #endregion
                }
                else//非现金支付,给用户显示确认支付页,实际支付行为在Confirm_Click
                {
                    Confirm_VMoney_Btn.Visible = true;
                    payinfo_div.Visible        = true;
                    AfterPay_Tb.Visible        = false;
                    OrderNo_L.Text             = pinfo.PaymentNum;
                    DataTable ordertable = orderBll.GetOrderbyOrderNo(pinfo.PaymentNum);
                    if (ordertable != null && ordertable.Rows.Count > 0)
                    {
                        switch (PayMethod)
                        {
                        case "Purse":
                            //Titles.Text = "余额支付操作(确认支付款项)";
                            Fee.Text           = "帐户余额:";
                            LblRate.Text       = mu.Purse + " 元";
                            VMoneyPayed_L.Text = "帐户余额";
                            break;

                        case "SilverCoin":
                            //Titles.Text = "银币支付操作(确认支付款项)";
                            Fee.Text           = "帐户银币:";
                            LblRate.Text       = mu.SilverCoin + " 个";
                            VMoneyPayed_L.Text = "账户银币";
                            break;

                        case "Score":
                            //Titles.Text = "积分支付操作(确认支付款项)";
                            Fee.Text           = "帐户积分:";
                            LblRate.Text       = mu.UserExp + " 分";
                            VMoneyPayed_L.Text = "账户积分";
                            break;

                        default:
                            break;
                        }
                    }
                    else
                    {
                        payinfo_div.Visible = false;
                        AfterPay_Tb.Visible = false;
                        function.WriteErrMsg("订单不存在");
                    }
                }
                //显示金额信息
                LblPayMoney.Text = pinfo.MoneyReal.ToString("F2") + " 元";//应付金额
                //string priceJson = orderCom.GetTotalJson(ordertable);//多虚拟币支付,暂取消
                //M_LinPrice priceMod = JsonConvert.DeserializeObject<M_LinPrice>(priceJson);
                //if (orderCom.HasPrice(priceJson))
                //{
                //    if (priceMod.Purse > 0)
                //    {
                //        LblPayMoney.Text += " 余额:" + priceMod.Purse.ToString("f2");
                //    }
                //    if (priceMod.Sicon > 0)
                //    { LblPayMoney.Text += " 银币:" + priceMod.Sicon.ToString("f2"); }
                //    if (priceMod.Point > 0)
                //    {
                //        LblPayMoney.Text += " 积分:" + priceMod.Point.ToString("f2");
                //    }
                //}
            }
            //------------------检测End;
        }
예제 #19
0
        public void NotifyByWeixin(HttpRequest request, out bool isPaied, out string responseXml)
        {
            isPaied = false;
            var config = ConfigInfo;

            WxPayConfig.APPID     = config.WeixinAppId;
            WxPayConfig.MCHID     = config.WeixinMchId;
            WxPayConfig.KEY       = config.WeixinKey;
            WxPayConfig.APPSECRET = config.WeixinAppSecret;

            //=======【商户系统后台机器IP】=====================================

            /* 此参数可手动配置也可在程序中自动获取
             */
            WxPayConfig.IP = "8.8.8.8";


            //=======【代理服务器设置】===================================

            /* 默认IP和端口号分别为0.0.0.0和0,此时不开启代理(如有需要才设置)
             */
            WxPayConfig.PROXY_URL = "http://10.152.18.220:8080";

            //=======【上报信息配置】===================================

            /* 测速上报等级,0.关闭上报; 1.仅错误时上报; 2.全量上报
             */
            WxPayConfig.REPORT_LEVENL = 1;

            //=======【日志级别】===================================

            /* 日志等级,0.不输出日志;1.只输出错误信息; 2.输出错误和正常信息; 3.输出错误信息、正常信息和调试信息
             */
            WxPayConfig.LOG_LEVENL = 0;

            //接收从微信后台POST过来的数据
            System.IO.Stream s = request.InputStream;
            int count;

            byte[]        buffer  = new byte[1024];
            StringBuilder builder = new StringBuilder();

            while ((count = s.Read(buffer, 0, 1024)) > 0)
            {
                builder.Append(Encoding.UTF8.GetString(buffer, 0, count));
            }
            s.Flush();
            s.Close();
            s.Dispose();

            Log.Info(GetType().ToString(), "NotifyByWeixin : " + builder);

            //转换数据格式并验证签名
            WxPayData notifyData = new WxPayData();

            try
            {
                notifyData.FromXml(builder.ToString());
            }
            catch (WxPayException ex)
            {
                //若签名错误,则立即返回结果给微信支付后台
                WxPayData res = new WxPayData();
                res.SetValue("return_code", "FAIL");
                res.SetValue("return_msg", ex.Message);
                Log.Error(GetType().ToString(), "Sign check error : " + res.ToXml());
                responseXml = res.ToXml();
                return;
            }

            if (!notifyData.IsSet("return_code") || notifyData.GetValue("return_code").ToString() != "SUCCESS")
            {
                WxPayData res = new WxPayData();
                res.SetValue("return_code", "FAIL");
                res.SetValue("return_msg", "回调数据异常");
                Log.Info(GetType().ToString(), "The data WeChat post is error : " + res.ToXml());
                responseXml = res.ToXml();
                return;
            }

            //统一下单成功,则返回成功结果给微信支付后台
            WxPayData data = new WxPayData();

            data.SetValue("return_code", "SUCCESS");
            data.SetValue("return_msg", "OK");

            Log.Info(GetType().ToString(), "UnifiedOrder success , send data to WeChat : " + data.ToXml());
            isPaied     = true;
            responseXml = data.ToXml();
        }
예제 #20
0
        public IActionResult PayOnline()
        {
            M_UserInfo mu = buser.GetLogin(false);

            if (string.IsNullOrEmpty(SiteConfig.SiteInfo.SiteUrl))
            {
                return(WriteErr("错误,管理员未定义网站地址,SiteUrl"));
            }
            if (string.IsNullOrEmpty(PayNo))
            {
                return(WriteErr("请传入支付单号"));
            }
            M_Payment pinfo = payBll.SelModelByPayNo(PayNo);

            if (pinfo == null || pinfo.PaymentID < 1)
            {
                return(WriteErr("支付单不存在"));
            }
            M_PayPlat payPlat = platBll.SelReturnModel(pinfo.PayPlatID);

            if (pinfo.Status != (int)M_Payment.PayStatus.NoPay)
            {
                return(WriteErr("支付单不能重复付款"));
            }

            string siteurl = (SiteConfig.SiteInfo.SiteUrl.TrimEnd('/') + "/PayOnline/");
            string urlReq1 = SiteConfig.SiteInfo.SiteUrl + "/PayOnline";

            ViewBag.formHtml = "";
            if (string.IsNullOrEmpty(PayMethod))
            {
                #region 现金支付
                DataTable orderDB1  = orderBll.GetOrderbyOrderNo(pinfo.PaymentNum);//订单表,ZL_OrderInfo
                int       orderType = 0;
                if (orderDB1.Rows.Count > 0)
                {
                    orderType = DataConvert.CLng(orderDB1.Rows[0]["OrderType"]);
                }
                if (orderType == 8)//有需要检测库存的订单类型,放此
                {
                    if (!cpBll.CheckStock(Convert.ToInt32(orderDB1.Rows[0]["OrderType"])))
                    {
                        return(WriteErr("商品库存数量不足,请重新购买"));
                    }
                }
                DataTable ordertable = orderBll.GetOrderbyOrderNo(pinfo.PaymentNum);
                //if (pinfo.PayPlatID == 0 && !string.IsNullOrEmpty(pinfo.PlatformInfo))//支付宝网银支付
                //{
                //    payPlat = platBll.SelModelByClass(M_PayPlat.Plat.Alipay_Bank);
                //    alipayBank(pinfo.PlatformInfo);
                //}
                if (payPlat.PayClass == 99)//线下支付
                {
                    return(WriteErr("信息已记录,请等待商家联系完成线下付款", "/User/Order/OrderList"));
                }
                if (payPlat == null || payPlat.PayPlatID < 1)
                {
                    return(WriteErr("没有找到对应的支付平台信息!"));
                }
                switch ((M_PayPlat.Plat)payPlat.PayClass)//现仅开通 12:支付宝即时到账和支付宝网银服务,15支付宝网银服务(上方代码中处理),银币与余额服务
                {
                    #region 各种支付方式
                case M_PayPlat.Plat.UnionPay:
                    break;

                case M_PayPlat.Plat.ChinaUnionPay:
                    break;

                case M_PayPlat.Plat.Alipay_Instant:
                    #region 支付宝[即时到帐]
                    string input_charset1 = "utf-8";
                    string notify_url1    = urlReq1 + "/Return/AlipayNotify"; //付完款后服务器AJAX通知的页面 要用 http://格式的完整路径,不允许加?id=123这类自定义参数
                    string return_url1    = urlReq1 + "/Return/AlipayReturn"; //付完款后跳转的页面 要用 http://格式的完整路径,不允许加?id=123这类自定义参数
                    string show_url1      = "";
                    string sign_type1     = "MD5";
                    ///////////////////////以下参数是需要通过下单时的订单数据传入进来获得////////////////////////////////
                    //必填参数
                    string price1             = pinfo.MoneyReal.ToString("f2");  //订单总金额,显示在支付宝收银台里的“商品单价”里
                    string logistics_fee1     = "0.00";                          //物流费用,即运费。
                    string logistics_type1    = "POST";                          //物流类型,三个值可选:EXPRESS(快递)、POST(平邮)、EMS(EMS)
                    string logistics_payment1 = "SELLER_PAY";                    //物流支付方式,两个值可选:SELLER_PAY(卖家承担运费)、BUYER_PAY(买家承担运费)
                    string out_trade_no1      = pinfo.PayNo;                     //请与贵网站订单系统中的唯一订单号匹配
                    string subject1           = pinfo.Remark;                    //订单名称,显示在支付宝收银台里的“商品名称”里,显示在支付宝的交易管理的“商品名称”的列表里。
                    string body1            = pinfo.Remark;                      //订单描述、订单详细、订单备注,显示在支付宝收银台里的“商品描述”里
                    string quantity1        = "1";                               //商品数量,建议默认为1,不改变值,把一次交易看成是一次下订单而非购买一件商品。
                    string receive_name1    = "";                                //收货人姓名,如:张三
                    string receive_address1 = "";                                //收货人地址,如:XX省XXX市XXX区XXX路XXX小区XXX栋XXX单元XXX号
                    string receive_zip1     = "";                                //收货人邮编,如:123456
                    string receive_phone1   = "";                                //收货人电话号码,如:0571-81234567
                    string receive_mobile1  = "";                                //收货人手机号码,如:13312341234
                                                                                 //---------------------
                    string receive_name    = orderDB1.Rows[0]["Reuser"] + "";    //收货人姓名,如:张三
                    string receive_address = orderDB1.Rows[0]["Jiedao"] + "";    //收货人地址,如:XX省XXX市XXX区XXX路XXX小区XXX栋XXX单元XXX号
                    string receive_zip     = orderDB1.Rows[0]["ZipCode"] + "";   //收货人邮编,如:123456
                    string receive_phone   = orderDB1.Rows[0]["Phone"] + "";     //收货人电话号码,如:0571-81234567
                    string receive_mobile  = orderDB1.Rows[0]["MobileNum"] + ""; //收货人手机号码,如:13312341234
                                                                                 //扩展参数——第二组物流方式
                                                                                 //物流方式是三个为一组成组出现。若要使用,三个参数都需要填上数据;若不使用,三个参数都需要为空
                                                                                 //有了第一组物流方式,才能有第二组物流方式,且不能与第一个物流方式中的物流类型相同,
                                                                                 //即logistics_type="EXPRESS",那么logistics_type_1就必须在剩下的两个值(POST、EMS)中选择
                    string logistics_fee_3     = "";                             //物流费用,即运费。
                    string logistics_type_3    = "";                             //物流类型,三个值可选:EXPRESS(快递)、POST(平邮)、EMS(EMS)
                    string logistics_payment_3 = "";                             //物流支付方式,两个值可选:SELLER_PAY(卖家承担运费)、BUYER_PAY(买家承担运费)

                    //扩展参数——第三组物流方式
                    //物流方式是三个为一组成组出现。若要使用,三个参数都需要填上数据;若不使用,三个参数都需要为空
                    //有了第一组物流方式和第二组物流方式,才能有第三组物流方式,且不能与第一组物流方式和第二组物流方式中的物流类型相同,
                    //即logistics_type="EXPRESS"、logistics_type_1="EMS",那么logistics_type_2就只能选择"POST"
                    string logistics_fee_4     = "";                                    //物流费用,即运费。
                    string logistics_type_4    = "";                                    //物流类型,三个值可选:EXPRESS(快递)、POST(平邮)、EMS(EMS)
                    string logistics_payment_4 = "";                                    //物流支付方式,两个值可选:SELLER_PAY(卖家承担运费)、BUYER_PAY(买家承担运费)
                                                                                        //扩展功能参数——其他
                    string buyer_email1 = "";                                           //默认买家支付宝账号
                    string discount1    = "";                                           //折扣,是具体的金额,而不是百分比。若要使用打折,请使用负数,并保证小数点最多两位数
                    /////////////////////////////////////////////////////////////////////////////////////////////////////
                    //构造请求函数,无需修改
                    B_AliPay_trades_Services aliService1 = new B_AliPay_trades_Services(
                        payPlat.AccountID,
                        payPlat.SellerEmail,
                        return_url1,
                        notify_url1,
                        show_url1,
                        out_trade_no1,
                        subject1,
                        body1,
                        price1,
                        logistics_fee1,
                        logistics_type1,
                        logistics_payment1,
                        quantity1,
                        receive_name1,
                        receive_address1,
                        receive_zip1,
                        receive_phone1,
                        receive_mobile1,
                        logistics_fee_3,
                        logistics_type_3,
                        logistics_payment_3,
                        logistics_fee_4,
                        logistics_type_4,
                        logistics_payment_4,
                        buyer_email1,
                        discount1,
                        payPlat.MD5Key,
                        input_charset1,
                        sign_type1);
                    ViewBag.formHtml = aliService1.Build_Form();
                    //LblHiddenValue.InnerHtml = aliService1.Build_Form();
                    #endregion
                    break;

                case M_PayPlat.Plat.Alipay_H5:
                {
                    Response.Redirect("/API/Pay/Alipay_H5?Payno=" + PayNo);
                }
                break;

                case M_PayPlat.Plat.Alipay_Bank:    //支付宝网银,已上方处理
                    break;

                case M_PayPlat.Plat.Bill:
                    break;

                case M_PayPlat.Plat.WXPay:
                    #region 微信扫码支付
                {
                    //if (DeviceHelper.GetBrower() == DeviceHelper.Brower.Micro)
                    //{
                    //    Response.Redirect("/PayOnline/wxpay_mp?payno=" + pinfo.PayNo);
                    //    return;
                    //}
                    pinfo.PlatformInfo = "0";
                    payBll.Update(pinfo);
                    WxPayData wxdata = new WxPayData();
                    wxdata.SetValue("out_trade_no", pinfo.PayNo);
                    wxdata.SetValue("body", string.IsNullOrEmpty(pinfo.Remark) ? "微信支付" : pinfo.Remark);
                    wxdata.SetValue("total_fee", Convert.ToInt32(pinfo.MoneyReal * 100));
                    wxdata.SetValue("trade_type", "NATIVE");
                    wxdata.SetValue("notify_url", urlReq1 + "/Return/WxPayReturn");
                    wxdata.SetValue("product_id", "1");
                    WxPayData result = WxPayApi.UnifiedOrder(wxdata, WxPayApi.Pay_GetByID());
                    if (result.GetValue("return_code").ToString().Equals("FAIL"))
                    {
                        return(WriteErr("商户" + result.GetValue("return_msg")));
                    }
                    Response.Redirect("/PayOnline/WxCodePay?PayNo=" + pinfo.PayNo + "&wxcode=" + result.GetValue("code_url"));
                }
                    #endregion
                    break;

                case M_PayPlat.Plat.Ebatong:
                    break;

                case M_PayPlat.Plat.CCB:
                    break;

                case M_PayPlat.Plat.ECPSS:
                    break;

                case M_PayPlat.Plat.ICBC_NC:
                    break;

                case M_PayPlat.Plat.PayPal:
                {
                    Response.Redirect("PP/Pay?Payno=" + pinfo.PayNo);
                }
                break;

                default:
                    throw new Exception("错误:支付方式不存在:" + payPlat.PayClass);
                    #endregion
                }
                ViewBag.vname = payPlat.PayPlatName;
                #endregion
            }
            else//非现金支付,给用户显示确认支付页,实际支付行为在Confirm_Click
            {
                switch (PayMethod)
                {
                case "Purse":
                    ViewBag.vname  = "帐户余额";
                    ViewBag.vmoney = mu.Purse.ToString("F2");
                    break;

                case "SilverCoin":
                    ViewBag.vname  = "帐户银币";
                    ViewBag.vmoney = mu.SilverCoin.ToString("F2");
                    break;

                case "Score":
                    ViewBag.vname  = "帐户积分";
                    ViewBag.vmoney = mu.UserExp.ToString("F2");
                    //Fee.Text = "帐户积分:";
                    //LblRate.Text = mu.UserExp + " 分";
                    //VMoneyPayed_L.Text = "账户积分";
                    break;

                default:
                    throw new Exception("支付类型错误");
                }
            }
            ViewBag.mu      = mu;
            ViewBag.platMod = payPlat;
            return(View(pinfo));
        }
예제 #21
0
        }                                            //支付成功跳转的地址
        protected void Page_Load(object sender, EventArgs e)
        {
            string  openid       = DTRequest.GetQueryString("openid");
            string  order_no     = DTRequest.GetQueryString("order_no");
            decimal order_amount = 0;            //订单金额
            string  subject1     = string.Empty; //订单备注1
            string  subject2     = string.Empty; //订单备注2

            //检查参数是否正确
            if (string.IsNullOrEmpty(openid) || string.IsNullOrEmpty(order_no))
            {
                Response.Redirect(new Web.UI.BasePage().linkurl("error", "?msg=" + Utils.UrlEncode("对不起,获取OPENID参数有误!")));
                return;
            }
            if (order_no.StartsWith("R")) //R开头为在线充值订单
            {
                Model.user_recharge model = new BLL.user_recharge().GetModel(order_no);
                if (model == null)
                {
                    Response.Redirect(new Web.UI.BasePage().linkurl("error", "?msg=" + Utils.UrlEncode("对不起,您充值的订单号不存在或已删除!")));
                    return;
                }
                order_amount = model.amount; //订单金额
                subject1     = "充值订单";
                subject2     = "用户名:" + model.user_name;
            }
            else //B开头为商品订单
            {
                Model.orders model = new BLL.orders().GetModel(order_no);
                if (model == null)
                {
                    Response.Redirect(new Web.UI.BasePage().linkurl("error", "?msg=" + Utils.UrlEncode("对不起,您支付的订单号不存在或已删除!")));
                    return;
                }
                order_amount = model.order_amount; //订单金额
                subject1     = "商品订单";
                if (model.user_id > 0)
                {
                    subject2 = "用户名:" + model.user_name;
                }
                else
                {
                    subject2 = "匿名用户";
                }
            }

            //JSAPI支付预处理
            try
            {
                //统一下单
                string      sendUrl     = "https://api.mch.weixin.qq.com/pay/unifiedorder";
                JsApiConfig jsApiConfig = new JsApiConfig();
                WxPayData   data        = new WxPayData();
                data.SetValue("body", subject1);                                               //商品描述
                data.SetValue("detail", subject2);                                             //商品详情
                data.SetValue("out_trade_no", order_no);                                       //商户订单号
                data.SetValue("total_fee", (Convert.ToDouble(order_amount) * 100).ToString()); //订单总金额,以分为单位
                data.SetValue("trade_type", "JSAPI");                                          //交易类型
                data.SetValue("openid", openid);                                               //公众账号ID
                data.SetValue("appid", jsApiConfig.AppId);                                     //公众账号ID
                data.SetValue("mch_id", jsApiConfig.Partner);                                  //商户号
                data.SetValue("nonce_str", JsApiPay.GenerateNonceStr());                       //随机字符串
                data.SetValue("notify_url", jsApiConfig.Notify_url);                           //异步通知url
                data.SetValue("spbill_create_ip", DTRequest.GetIP());                          //终端IP
                data.SetValue("sign", data.MakeSign(jsApiConfig.Key));                         //签名
                string    xml       = data.ToXml();                                            //转换成XML
                var       startTime = DateTime.Now;                                            //开始时间
                string    response  = HttpService.Post(xml, sendUrl, false, 6);                //发送请求
                var       endTime   = DateTime.Now;                                            //结束时间
                int       timeCost  = (int)((endTime - startTime).TotalMilliseconds);          //计算所用时间
                WxPayData result    = new WxPayData();
                result.FromXml(response, jsApiConfig.Key);
                JsApiPay.ReportCostTime(sendUrl, timeCost, result);//测速上报

                //获取H5调起JS API参数
                WxPayData jsApiParam = new WxPayData();
                jsApiParam.SetValue("appId", result.GetValue("appid"));
                jsApiParam.SetValue("timeStamp", JsApiPay.GenerateTimeStamp());
                jsApiParam.SetValue("nonceStr", JsApiPay.GenerateNonceStr());
                jsApiParam.SetValue("package", "prepay_id=" + result.GetValue("prepay_id"));
                jsApiParam.SetValue("signType", "MD5");
                jsApiParam.SetValue("paySign", jsApiParam.MakeSign(jsApiConfig.Key));
                wxJsApiParam = jsApiParam.ToJson();

                //支付成功后跳转的URL
                returnUrl = new Web.UI.BasePage().linkurl("payment", "?action=succeed&order_no=" + order_no);
            }
            catch (Exception ex)
            {
                Response.Redirect(new Web.UI.BasePage().linkurl("error", "?msg=" + Utils.UrlEncode("调用JSAPI下单失败,请检查微信授权目录是否已注册!")));
                return;
            }
        }
예제 #22
0
        public override void ProcessNotify()
        {
            WxPayData notifyData = GetNotifyData();

            //检查支付结果中transaction_id是否存在
            if (!notifyData.IsSet("transaction_id"))
            {
                //若transaction_id不存在,则立即返回结果给微信支付后台
                WxPayData res = new WxPayData();
                res.SetValue("return_code", "FAIL");
                res.SetValue("return_msg", "支付结果中微信订单号不存在");
                Log.Error(this.GetType().ToString(), "The Pay result is error : " + res.ToXml());
                page.Response.Write(res.ToXml());
                page.Response.End();
            }

            string transaction_id = notifyData.GetValue("transaction_id").ToString();
            string out_trade_no   = notifyData.GetValue("out_trade_no").ToString();

            MySqlHelp.ExecuteNonQuery("update t_order set transaction_id=" + UtilityFn.formatstring(transaction_id)
                                      + " where outtradeno=" + UtilityFn.formatstring(out_trade_no));
            Log.Info(this.GetType().ToString(), "update transaction_id success  : " + transaction_id + "/" + out_trade_no);
            //查询订单,判断订单真实性
            if (!QueryOrder(transaction_id))
            {
                //若订单查询失败,则立即返回结果给微信支付后台
                WxPayData res = new WxPayData();
                res.SetValue("return_code", "FAIL");
                res.SetValue("return_msg", "订单查询失败");
                Log.Error(this.GetType().ToString(), "Order query failure : " + res.ToXml());
                try
                {
                    MySqlHelp.ExecuteNonQuery(@"update t_order set status='PaidQueryFailed',statusid='6'"
                                              + " where outtradeno=" + UtilityFn.formatstring(out_trade_no)
                                              + " and transaction_id=" + UtilityFn.formatstring(transaction_id));
                }
                catch (Exception ex)
                {
                    Log.Error(this.GetType().ToString(), "status update failure:" + ex.Message);
                }
                page.Response.Write(res.ToXml());
                page.Response.End();
            }
            //查询订单成功
            else
            {
                WxPayData res = new WxPayData();
                res.SetValue("return_code", "SUCCESS");
                res.SetValue("return_msg", "OK");
                Log.Info(this.GetType().ToString(), "order query success : " + res.ToXml());
                try
                {
                    MySqlHelp.ExecuteNonQuery(@"update t_order set status='PaidSuccessed',statusid='2'"
                                              + " where outtradeno=" + UtilityFn.formatstring(out_trade_no)
                                              + " and transaction_id=" + UtilityFn.formatstring(transaction_id));

                    DataTable dt = MySqlHelp.ExecuteDataTable(@"select * from  t_order"
                                                              + " where outtradeno=" + UtilityFn.formatstring(out_trade_no)
                                                              + " and transaction_id=" + UtilityFn.formatstring(transaction_id));
                    EmailHelper eh = new EmailHelper();
                    eh.SendMail("Squirel New Order Payment", UtilityFn.JsonToHTMLTable(JsonUtility.ToJson(dt)));
                    Log.Info(this.GetType().ToString(), "update status success  : " + transaction_id + "/" + out_trade_no);
                }
                catch (Exception ex)
                {
                    Log.Error(this.GetType().ToString(), "status update failure:" + ex.Message);
                }
                page.Response.Write(res.ToXml());
                page.Response.End();
            }
        }
예제 #23
0
    /**
     *
     * 测速上报
     * @param string interface_url 接口URL
     * @param int timeCost 接口耗时
     * @param WxPayData inputObj参数数组
     */
    private static void ReportCostTime(string interface_url, int timeCost, WxPayData inputObj)
    {
        //如果不需要进行上报
        if (WxPayConfig.REPORT_LEVENL == 0)
        {
            return;
        }

        //如果仅失败上报
        if (WxPayConfig.REPORT_LEVENL == 1 && inputObj.IsSet("return_code") && inputObj.GetValue("return_code").ToString() == "SUCCESS" &&
            inputObj.IsSet("result_code") && inputObj.GetValue("result_code").ToString() == "SUCCESS")
        {
            return;
        }

        //上报逻辑
        WxPayData data = new WxPayData();

        data.SetValue("interface_url", interface_url);
        data.SetValue("execute_time_", timeCost);
        //返回状态码
        if (inputObj.IsSet("return_code"))
        {
            data.SetValue("return_code", inputObj.GetValue("return_code"));
        }
        //返回信息
        if (inputObj.IsSet("return_msg"))
        {
            data.SetValue("return_msg", inputObj.GetValue("return_msg"));
        }
        //业务结果
        if (inputObj.IsSet("result_code"))
        {
            data.SetValue("result_code", inputObj.GetValue("result_code"));
        }
        //错误代码
        if (inputObj.IsSet("err_code"))
        {
            data.SetValue("err_code", inputObj.GetValue("err_code"));
        }
        //错误代码描述
        if (inputObj.IsSet("err_code_des"))
        {
            data.SetValue("err_code_des", inputObj.GetValue("err_code_des"));
        }
        //商户订单号
        if (inputObj.IsSet("out_trade_no"))
        {
            data.SetValue("out_trade_no", inputObj.GetValue("out_trade_no"));
        }
        //设备号
        if (inputObj.IsSet("device_info"))
        {
            data.SetValue("device_info", inputObj.GetValue("device_info"));
        }

        try
        {
            Report(data);
        }
        catch (WxPayException ex)
        {
            //不做任何处理
        }
    }
예제 #24
0
        public static object ChargeByWeixin(string productName, decimal amount, string guid, string notifyUrl)
        {
            WxPayConfig.APPID = "wx7d306eb1fef3c5eb";
            WxPayConfig.MCHID = "1512892151";
            WxPayConfig.KEY   = "qUpaKcqjU5IeMJCF0q1A3AN5DKOaFMyG";

            //=======【支付结果通知url】=====================================

            /* 支付结果通知回调url,用于商户接收支付结果
             */
            WxPayConfig.NOTIFY_URL = notifyUrl;

            //=======【商户系统后台机器IP】=====================================

            /* 此参数可手动配置也可在程序中自动获取
             */
            WxPayConfig.IP = "8.8.8.8";


            //=======【代理服务器设置】===================================

            /* 默认IP和端口号分别为0.0.0.0和0,此时不开启代理(如有需要才设置)
             */
            WxPayConfig.PROXY_URL = "http://10.152.18.220:8080";

            //=======【上报信息配置】===================================

            /* 测速上报等级,0.关闭上报; 1.仅错误时上报; 2.全量上报
             */
            WxPayConfig.REPORT_LEVENL = 1;

            //=======【日志级别】===================================

            /* 日志等级,0.不输出日志;1.只输出错误信息; 2.输出错误和正常信息; 3.输出错误信息、正常信息和调试信息
             */
            WxPayConfig.LOG_LEVENL = 0;

            var data = new WxPayData();

            data.SetValue("body", productName);                                                   //商品描述
            data.SetValue("attach", string.Empty);                                                //附加数据
            data.SetValue("out_trade_no", WxPayApi.GenerateOutTradeNo());                         //随机字符串
            data.SetValue("total_fee", Convert.ToInt32(amount * 100));                            //总金额
            data.SetValue("time_start", DateTime.Now.ToString("yyyyMMddHHmmss"));                 //交易起始时间
            data.SetValue("time_expire", DateTime.Now.AddMinutes(10).ToString("yyyyMMddHHmmss")); //交易结束时间
            data.SetValue("goods_tag", "jjj");                                                    //商品标记
            data.SetValue("trade_type", "APP");                                                   //交易类型
            data.SetValue("product_id", "productId");                                             //商品ID

            string url = "https://api.mch.weixin.qq.com/pay/unifiedorder";

            //检测必填参数
            if (!data.IsSet("out_trade_no"))
            {
                throw new WxPayException("缺少统一支付接口必填参数out_trade_no!");
            }
            if (!data.IsSet("body"))
            {
                throw new WxPayException("缺少统一支付接口必填参数body!");
            }
            if (!data.IsSet("total_fee"))
            {
                throw new WxPayException("缺少统一支付接口必填参数total_fee!");
            }
            if (!data.IsSet("trade_type"))
            {
                throw new WxPayException("缺少统一支付接口必填参数trade_type!");
            }

            //关联参数
            if (data.GetValue("trade_type").ToString() == "JSAPI" && !data.IsSet("openid"))
            {
                throw new WxPayException("统一支付接口中,缺少必填参数openid!trade_type为JSAPI时,openid为必填参数!");
            }
            if (data.GetValue("trade_type").ToString() == "NATIVE" && !data.IsSet("product_id"))
            {
                throw new WxPayException("统一支付接口中,缺少必填参数product_id!trade_type为JSAPI时,product_id为必填参数!");
            }

            //异步通知url未设置,则使用配置文件中的url
            if (!data.IsSet("notify_url"))
            {
                data.SetValue("notify_url", WxPayConfig.NOTIFY_URL);//异步通知url
            }

            data.SetValue("appid", WxPayConfig.APPID);                              //公众账号ID
            data.SetValue("mch_id", WxPayConfig.MCHID);                             //商户号
            data.SetValue("spbill_create_ip", WxPayConfig.IP);                      //终端ip
            data.SetValue("nonce_str", Guid.NewGuid().ToString().Replace("-", "")); //随机字符串

            //签名
            data.SetValue("sign", data.MakeSign());
            var xml      = data.ToXml();
            var response = HttpService.Post(xml, url, false, 6);
            var result   = new WxPayData();

            result.FromXml(response);

            //"request": "<xml><appid><![CDATA[wx7d306eb1fef3c5eb]]></appid><attach><![CDATA[]]></attach><body><![CDATA[producta]]></body><goods_tag><![CDATA[jjj]]></goods_tag><mch_id><![CDATA[1512892151]]></mch_id><nonce_str><![CDATA[152b6698c8f44b9b9aa16f471c3e27b2]]></nonce_str><notify_url><![CDATA[http://cms.chinacampus.org/api/plugins/SS.Magazine/WeiXinNotify]]></notify_url><out_trade_no><![CDATA[151289215120180830085619872]]></out_trade_no><product_id><![CDATA[productId]]></product_id><sign><![CDATA[A4BF095E298130577E98F8CAAEBB496D]]></sign><spbill_create_ip><![CDATA[8.8.8.8]]></spbill_create_ip><time_expire><![CDATA[20180830090619]]></time_expire><time_start><![CDATA[20180830085619]]></time_start><total_fee>100</total_fee><trade_type><![CDATA[APP]]></trade_type></xml>",
            //"response": "<xml><return_code><![CDATA[SUCCESS]]></return_code>\n<return_msg><![CDATA[OK]]></return_msg>\n<appid><![CDATA[wx7d306eb1fef3c5eb]]></appid>\n<mch_id><![CDATA[1512892151]]></mch_id>\n<nonce_str><![CDATA[JL38tGchjgYcDECR]]></nonce_str>\n<sign><![CDATA[BD9DD927EDF0020E519B94FF0ABCD100]]></sign>\n<result_code><![CDATA[SUCCESS]]></result_code>\n<prepay_id><![CDATA[wx300856189223833b9ee467051757080666]]></prepay_id>\n<trade_type><![CDATA[APP]]></trade_type>\n</xml>"

            //Log.Info(GetType().ToString(), "ChargeByWeixin : " + response);
            //Log.Info(GetType().ToString(), "notify_url : " + data.GetValue("notify_url"));

            var appid     = result.GetValue("appid");
            var mch_id    = result.GetValue("mch_id");
            var nonce_str = result.GetValue("nonce_str");
            var sign      = result.GetValue("sign");
            var prepay_id = result.GetValue("prepay_id");

            return(new
            {
                appid,
                mch_id,
                nonce_str,
                sign,
                prepay_id,
                guid
            });
        }
예제 #25
0
파일: OrderBLL.cs 프로젝트: radtek/Aicard
        /// <summary>
        /// 创建升级支付订单
        /// </summary>
        /// <param name="code"></param>
        /// <param name="userID"></param>
        /// <returns></returns>
        public object CreateUpGradeOrder(string code, string userID)
        {
            //1.调用小程序登录API,获取openID
            IConfig              config       = new ConfigMiniPersonal();
            WeChatMinApi         miniApi      = new WeChatMinApi(config);
            Jscode2sessionResult openIDResule = miniApi.Jscode2session(code);

            if (openIDResule == null || string.IsNullOrWhiteSpace(openIDResule.OpenID))
            {
                return(new { retCode = "Error", retMsg = "无法获取openID,请确认code是否正确", objectData = "" });
            }
            //using (ApplicationDbContext db = new ApplicationDbContext())
            //{
            //    //防止用户重复提交订单,把Vip状态设为升级中
            //    var vip = db.Vips.FirstOrDefault(s => s.UserID == userID);
            //    vip.State = Common.Enums.VipState.Uploading;
            //    db.SaveChanges();
            //}
            string  OrderCode = CreateOrderCode(userID); //创建订单号
            decimal Amount    = Comm.UpGradeAmount();    //升级费用

            if (string.IsNullOrEmpty(OrderCode))
            {
                return(new { retCode = "Error", retMsg = "订单号生成失败", objectData = "" });
            }
            //2.调用支付统一下单API
            #region 调用支付统一下单API
            UnifiedPayData payData = new UnifiedPayData()
            {
                attach       = string.Empty,
                body         = "个人升级成为VIP,提交支付费用",
                goods_tag    = string.Empty,
                openid       = openIDResule.OpenID,
                out_trade_no = OrderCode,
                total_fee    = (int)Amount * 100,
                //total_fee = 1,//测试10分订单
                trade_type = "JSAPI"
            };

            RequestResult payResult     = payment.GetUnifiedOrderResult(payData);
            WxPayData     payreturnData = payResult.objectData;
            if (payResult.retCode != ReqResultCode.success || payreturnData == null)
            {
                return(new { retCode = "Error", retMsg = "请求微信支付统一下单失败", objectData = "" });
            }
            #endregion

            //3.生成商户订单
            #region 生成商户订单
            int rows = 0;
            using (ApplicationDbContext db = new ApplicationDbContext())
            {
                //2.生成商户订单
                Order order = new Order()
                {
                    Amount           = 0,
                    Code             = OrderCode,
                    ReceivableAmount = Amount,
                    State            = Common.Enums.OrderState.UnHandle,
                    Channel          = Common.Enums.PayChannel.WxPay,
                    Type             = Common.Enums.OrderType.Receivable,
                    UserID           = userID,
                    CreateDateTime   = DateTime.Now,
                    PayCode          = string.Empty,
                    PayInput         = JsonConvert.SerializeObject(payData)
                };
                db.Orders.Add(order);
                rows = db.SaveChanges();
            }
            if (rows <= 0)
            {
                return(new { retCode = "Error", retMsg = "保存订单数据失败", objectData = "" });
            }
            #endregion
            //4.返回支付参数:5个参数,生成签名再返回
            System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1)); // 当地时区
            long            ts        = (long)(DateTime.Now - startTime).TotalSeconds;                         // 相差秒数

            System.Text.StringBuilder paySignpar = new System.Text.StringBuilder();
            paySignpar.Append($"appId={payreturnData.GetValue("appid")?.ToString()}");
            paySignpar.Append($"&nonceStr={payreturnData.GetValue("nonce_str")?.ToString()}");
            paySignpar.Append($"&package=prepay_id={payreturnData.GetValue("prepay_id")?.ToString()}");
            paySignpar.Append($"&signType=MD5");
            paySignpar.Append($"&timeStamp={ts.ToString()}");
            paySignpar.Append($"&key={ConfigurationManager.AppSettings["wxPayKey"] ?? string.Empty}");
            string strPaySignpar = paySignpar.ToString();

            var     sign     = GetMd5Hash(strPaySignpar).ToUpper();
            dynamic retModel = new
            {
                timeStamp = ts.ToString(),
                nonceStr  = payreturnData.GetValue("nonce_str")?.ToString(),
                package   = "prepay_id=" + payreturnData.GetValue("prepay_id")?.ToString(),
                signType  = "MD5",
                paySign   = sign,
                total_fee = payData.total_fee / 100m,
            };
            return(new { retCode = "Success", retMsg = "成功", objectData = retModel });
        }
예제 #26
0
        /// <summary>
        /// 支付回调
        /// </summary>
        /// <returns></returns>
        public ContentResult WxNotify()
        {
            //接收从微信后台POST过来的数据
            System.IO.Stream s = Request.InputStream;
            int count          = 0;

            byte[]        buffer  = new byte[1024];
            StringBuilder builder = new StringBuilder();

            while ((count = s.Read(buffer, 0, 1024)) > 0)
            {
                builder.Append(Encoding.UTF8.GetString(buffer, 0, count));
            }
            s.Flush();
            s.Close();
            s.Dispose();

            //转换数据格式并验证签名
            WxPayData notifyData = new WxPayData();
            WxPayData res        = new WxPayData();

            try
            {
                notifyData.FromXml(builder.ToString());
            }
            catch (WxPayException ex)
            {
                //若签名错误,则立即返回结果给微信支付后台
                res.SetValue("return_code", "FAIL");
                res.SetValue("return_msg", ex.Message);
                return(Content(res.ToXml()));
            }

            //检查支付结果中transaction_id是否存在
            if (!notifyData.IsSet("transaction_id"))
            {
                //若transaction_id不存在,则立即返回结果给微信支付后台
                res.SetValue("return_code", "FAIL");
                res.SetValue("return_msg", "支付结果中微信订单号不存在");
                return(Content(res.ToXml()));
            }

            string transaction_id = notifyData.GetValue("transaction_id").ToString();
            string out_trade_no   = notifyData.GetValue("out_trade_no").ToString();


            //查询订单,判断订单真实性
            if (!QueryOrder(transaction_id))
            {
                //若订单查询失败,则立即返回结果给微信支付后台
                res.SetValue("return_code", "FAIL");
                res.SetValue("return_msg", "订单查询失败");
            }
            //查询订单成功
            else
            {
                var orderService = new OrderService();
                var result       = orderService.Complete(out_trade_no);
                if (result.Code == ResultCode.Error)
                {
                    res.SetValue("return_code", "FAIL");
                    res.SetValue("return_msg", "订单查询失败");
                }
                else
                {
                    res.SetValue("return_code", "SUCCESS");
                    res.SetValue("return_msg", "OK");
                }
            }
            return(Content(res.ToXml()));
        }
예제 #27
0
        /**
	    * 
	    * 获取收货地址js函数入口参数,详情请参考收货地址共享接口:http://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_9
	    * @return string 共享收货地址js函数需要的参数,json格式可以直接做参数使用
	    */
        public string GetEditAddressParameters()
	    {
            string parameter = "";
            try
            {
                string host = page.Request.Url.Host;
                string path = page.Request.Path;
                string queryString = page.Request.Url.Query;
                //这个地方要注意,参与签名的是网页授权获取用户信息时微信后台回传的完整url
                string url = "http://" + host + path + queryString;

                //构造需要用SHA1算法加密的数据
                WxPayData signData = new WxPayData();
                signData.SetValue("appid",Config.APPID);
                signData.SetValue("url", url);
                signData.SetValue("timestamp",WxPayApi.GenerateTimeStamp());
                signData.SetValue("noncestr",WxPayApi.GenerateNonceStr());
                signData.SetValue("accesstoken",access_token);
                string param = signData.ToUrl();

                Log.Debug(this.GetType().ToString(), "SHA1 encrypt param : " + param);
                //SHA1加密
                string addrSign = FormsAuthentication.HashPasswordForStoringInConfigFile(param, "SHA1");
                Log.Debug(this.GetType().ToString(), "SHA1 encrypt result : " + addrSign);

                //获取收货地址js函数入口参数
                WxPayData afterData = new WxPayData();
                afterData.SetValue("appId",Config.APPID);
                afterData.SetValue("scope","jsapi_address");
                afterData.SetValue("signType","sha1");
                afterData.SetValue("addrSign",addrSign);
                afterData.SetValue("timeStamp",signData.GetValue("timestamp"));
                afterData.SetValue("nonceStr",signData.GetValue("noncestr"));

                //转为json格式
                parameter = afterData.ToJson();
                Log.Debug(this.GetType().ToString(), "Get EditAddressParam : " + parameter);
            }
            catch (Exception ex)
            {
                Log.Error(this.GetType().ToString(), ex.ToString());
                throw new WxPayException(ex.ToString());
            }

            return parameter;
	    }
예제 #28
0
        public override void ProcessNotify(UpdateOrderStateHandler UpdateOrderState, string appId)
        {
            var WxPayConfig = Configuration.GetAppPayConfig <Config.Sections.Pay.WXPay>(appId);


            WxPayData notifyData = GetNotifyData(WxPayConfig.KEY);

            //检查openid和product_id是否返回
            if (!notifyData.IsSet("openid") || !notifyData.IsSet("product_id"))
            {
                WxPayData res = new WxPayData();
                res.SetValue("return_code", "FAIL");
                res.SetValue("return_msg", "回调数据异常");
                Log.Info(this.GetType().ToString(), "The data WeChat post is error : " + res.ToXml());
                HttpContext.Current.Response.Write(res.ToXml());
                HttpContext.Current.Response.End();
            }

            //调统一下单接口,获得下单结果
            string    openid             = notifyData.GetValue("openid").ToString();
            string    product_id         = notifyData.GetValue("product_id").ToString();
            WxPayData unifiedOrderResult = new WxPayData();

            try
            {
                unifiedOrderResult = UnifiedOrder(openid, product_id, appId);
            }
            catch (Exception ex)//若在调统一下单接口时抛异常,立即返回结果给微信支付后台
            {
                WxPayData res = new WxPayData();
                res.SetValue("return_code", "FAIL");
                res.SetValue("return_msg", "统一下单失败");
                Log.Error(this.GetType().ToString(), "UnifiedOrder failure : " + res.ToXml());
                HttpContext.Current.Response.Write(res.ToXml());
                HttpContext.Current.Response.End();
            }

            //若下单失败,则立即返回结果给微信支付后台
            if (!unifiedOrderResult.IsSet("appid") || !unifiedOrderResult.IsSet("mch_id") || !unifiedOrderResult.IsSet("prepay_id"))
            {
                WxPayData res = new WxPayData();
                res.SetValue("return_code", "FAIL");
                res.SetValue("return_msg", "统一下单失败");
                Log.Error(this.GetType().ToString(), "UnifiedOrder failure : " + res.ToXml());
                HttpContext.Current.Response.Write(res.ToXml());
                HttpContext.Current.Response.End();
            }

            //统一下单成功,则返回成功结果给微信支付后台
            WxPayData data = new WxPayData();

            data.SetValue("return_code", "SUCCESS");
            data.SetValue("return_msg", "OK");
            data.SetValue("appid", WxPayConfig.APPID);
            data.SetValue("mch_id", WxPayConfig.MCHID);
            data.SetValue("nonce_str", WxPayApi.GenerateNonceStr());
            data.SetValue("prepay_id", unifiedOrderResult.GetValue("prepay_id"));
            data.SetValue("result_code", "SUCCESS");
            data.SetValue("err_code_des", "OK");
            data.SetValue("sign", data.MakeSign(WxPayConfig.KEY));

            Log.Info(this.GetType().ToString(), "UnifiedOrder success , send data to WeChat : " + data.ToXml());
            HttpContext.Current.Response.Write(data.ToXml());
            HttpContext.Current.Response.End();
        }
예제 #29
0
        public static string SendRequest(PayInfo pay, PayConfig config)
        {
            IDictionary <string, string> dictionary = new Dictionary <string, string>();
            WxPayData wxPayData = new WxPayData();

            wxPayData.SetValue("auth_code", pay.Attach);
            wxPayData.SetValue("body", pay.OutTradeNo);
            WxPayData wxPayData2 = wxPayData;
            decimal   totalFee   = pay.TotalFee;

            wxPayData2.SetValue("total_fee", int.Parse(totalFee.ToString()));
            wxPayData.SetValue("out_trade_no", pay.OutTradeNo);
            dictionary.Add("auth_code", pay.AuthCode);
            dictionary.Add("body", pay.OutTradeNo);
            IDictionary <string, string> dictionary2 = dictionary;

            totalFee = pay.TotalFee;
            dictionary2.Add("total_fee", totalFee.ToString());
            dictionary.Add("out_trade_no", pay.OutTradeNo);
            dictionary.Add("AppId", config.AppId);
            dictionary.Add("AppSecret", config.AppSecret);
            dictionary.Add("MchID", config.MchID);
            dictionary.Add("Key", config.Key);
            dictionary.Add("NOTIFY_URL", config.NOTIFY_URL);
            WxPayData wxPayData3 = WxPayApi.Micropay(wxPayData, config, 10);

            if (!wxPayData3.IsSet("return_code") || wxPayData3.GetValue("return_code").ToString() == "FAIL")
            {
                string msg = wxPayData3.IsSet("return_msg") ? wxPayData3.GetValue("return_msg").ToString() : "";
                WxPayLog.writeLog(dictionary, "", HttpContext.Current.Request.Url.ToString(), msg, LogType.MicroPay);
            }
            wxPayData3.CheckSign(config.Key);
            if (wxPayData3.GetValue("return_code").ToString() == "SUCCESS" && wxPayData3.GetValue("result_code").ToString() == "SUCCESS")
            {
                return(wxPayData3.ToPrintStr());
            }
            if (wxPayData3.GetValue("err_code").ToString() != "USERPAYING" && wxPayData3.GetValue("err_code").ToString() != "SYSTEMERROR")
            {
                return(wxPayData3.ToPrintStr());
            }
            string out_trade_no = wxPayData.GetValue("out_trade_no").ToString();
            int    num          = 10;

            while (num-- > 0)
            {
                int       num3       = 0;
                WxPayData wxPayData4 = MicroPay.Query(out_trade_no, config, out num3);
                switch (num3)
                {
                case 2:
                    break;

                case 1:
                    return(wxPayData4.ToPrintStr());

                default:
                    return(wxPayData3.ToPrintStr());
                }
                Thread.Sleep(2000);
            }
            if (!MicroPay.Cancel(out_trade_no, config, 0))
            {
                WxPayLog.writeLog(dictionary, "", HttpContext.Current.Request.Url.ToString(), "支付失败并且撤销订单失败", LogType.MicroPay);
                throw new WxPayException("Reverse order failure!");
            }
            return(wxPayData3.ToPrintStr());
        }
예제 #30
0
        public ActionResult ToOrder(Enums.Enums.OrderType body, RechargeType type, string userID)
        {
            if (!db.tb_userinfos.Any(s => s.UserID == userID))
            {
                return(Json(Comm.ToJsonResult("Error", "用户不存在"), JsonRequestBehavior.AllowGet));
            }
            if (body != Enums.Enums.OrderType.Recharge && body != Enums.Enums.OrderType.OrderPay)
            {
                return(Json(Comm.ToJsonResult("Error", "请求参数错误"), JsonRequestBehavior.AllowGet));
            }
            if (type != Enums.Enums.RechargeType.Fifty && type != Enums.Enums.RechargeType.FiveHundred && type != Enums.Enums.RechargeType.Hundred && type != Enums.Enums.RechargeType.Ten && type != Enums.Enums.RechargeType.Thirty && type != Enums.Enums.RechargeType.TwoHundred)
            {
                return(Json(Comm.ToJsonResult("Error", "请求参数错误"), JsonRequestBehavior.AllowGet));
            }
            WxPayData parmdata     = new WxPayData();
            string    out_trade_no = WxPayApi.GenerateOutTradeNo();

            parmdata.SetValue("body", ((Enums.Enums.OrderType)body).GetDisplayName());                //商品描述
            parmdata.SetValue("attach", "逸趣网络科技有限公司");                                                //附加数据
            parmdata.SetValue("out_trade_no", out_trade_no);                                          //商户订单号
            parmdata.SetValue("total_fee", Convert.ToInt32(type.GetDisplayName()));                   //总金额 * 100
            parmdata.SetValue("time_start", DateTime.Now.ToString("yyyyMMddHHmmss"));                 //交易起始时间
            parmdata.SetValue("time_expire", DateTime.Now.AddMinutes(10).ToString("yyyyMMddHHmmss")); //交易结束时间
            parmdata.SetValue("goods_tag", "");                                                       //商品标记
            parmdata.SetValue("trade_type", "APP");                                                   //交易类型
            //parmdata.SetValue("product_id", productid);//商品ID

            WxPayData resultdata = WxPayApi.UnifiedOrder(parmdata);
            string    resultcode = resultdata.GetValue("return_code").ToString();

            if (resultcode.Equals("SUCCESS"))
            {
                string signstr     = resultdata.GetValue("sign").ToString();
                string noncestr    = WxPayApi.GenerateNonceStr();
                string result_code = resultdata.GetValue("result_code").ToString();
                string prepay_id   = string.Empty;
                if (result_code.Equals("SUCCESS"))
                {
                    prepay_id = resultdata.GetValue("prepay_id").ToString();
                    //var stringA = $"appid={WxPayConfig.APPID}&noncestr={noncestr}&package=Sign=WXPay&partnerid={WxPayConfig.MCHID}&prepayid={prepay_id}&timestamp={Unite.GenerateTimeStamp(DateTime.Now)}&key={WxPayConfig.KEY}";
                    //var sign = Unite.ToMD5New(stringA).ToUpper();

                    //保存下单信息到数据库
                    PayOrder model = new PayOrder();
                    model.OrderState           = Enums.Enums.OrderState.UnHandle;
                    model.out_trade_no         = out_trade_no;
                    model.Paynoncestr          = noncestr;
                    model.PayPrepay_id         = prepay_id;
                    model.settlement_total_fee = Convert.ToInt32(type.GetDisplayName());
                    model.CreateTime           = DateTime.Now;
                    model.Sign      = signstr;
                    model.total_fee = Convert.ToInt32(type.GetDisplayName());
                    model.User_ID   = userID;
                    model.OrderType = body;
                    db.PayOrders.Add(model);
                    int resultrow = db.SaveChanges();
                    //保存订单数据结果
                    if (resultrow > 0)
                    {
                        System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1)); // 当地时区
                        long            ts        = (long)(DateTime.Now - startTime).TotalSeconds;                         // 相差秒数

                        System.Text.StringBuilder paySignpar = new System.Text.StringBuilder();
                        paySignpar.Append($"appid={resultdata.GetValue("appid")?.ToString()}");
                        paySignpar.Append($"&noncestr={noncestr}");
                        paySignpar.Append($"&package=Sign=WXPay&partnerid={WxPayConfig.MCHID}");
                        paySignpar.Append($"&prepayid={resultdata.GetValue("prepay_id")?.ToString()}");
                        //paySignpar.Append($"&signType=MD5");
                        paySignpar.Append($"&timestamp={ts.ToString()}");
                        paySignpar.Append($"&key={WxPayConfig.KEY ?? string.Empty}");
                        string strPaySignpar = paySignpar.ToString();

                        var sign = Unite.GetMd5Hash(strPaySignpar).ToUpper();
                        //dynamic retModel = new
                        //{
                        //    timeStamp = ts.ToString(),
                        //    nonceStr = resultdata.GetValue("nonce_str")?.ToString(),
                        //    package = "prepay_id=" + resultdata.GetValue("prepay_id")?.ToString(),
                        //    signType = "MD5",
                        //    paySign = sign,
                        //    total_fee = model.total_fee / 100m,
                        //};

                        var returndata = new
                        {
                            result    = resultcode,
                            timestamp = ts.ToString(),
                            prepay_id = prepay_id,
                            noncestr  = noncestr,
                            sign      = sign
                        };
                        return(Json(Comm.ToJsonResult("Success", "成功", returndata), JsonRequestBehavior.AllowGet));
                    }
                    else
                    {
                        return(Json(Comm.ToJsonResult("Error", "下单失败"), JsonRequestBehavior.AllowGet));
                    }
                }
                else
                {
                    return(Json(Comm.ToJsonResult("Error", "下单失败"), JsonRequestBehavior.AllowGet));
                }
            }
            else
            {
                return(Json(Comm.ToJsonResult("Error", "下单失败"), JsonRequestBehavior.AllowGet));
            }
        }