/// <summary>
        ///     生成支付链接
        /// </summary>
        /// <param name="unifiedOrderInfo"></param>
        /// <returns></returns>
        public string GeneratePayUrl(UnifiedOrderInfo unifiedOrderInfo)
        {
            var ticket = EncryptionManager.CreateIV();
            var payData = EncryptionManager.AESEncrypt(JSONHelper.Serialize(unifiedOrderInfo, "yyyy-MM-dd"), ticket);

            return PayHelper.GetPayUrl(payData, ticket);
        }
        /// <summary>
        /// Js-API支付
        /// </summary>
        /// <param name="info"></param>
        /// <param name="signType"></param>
        /// <returns></returns>
        public ChooseWxPayConfig JsApiPay(UnifiedOrderInfo info)
        {
            var unifiedOrder = new UnifiedOrder()
            {
                nonce_str        = info.NonceStr,
                appid            = _baseSettings.AppId,
                mch_id           = _baseSettings.MchId,
                out_trade_no     = info.TradeNo,
                sign_type        = info.SignType.GetDescription(),
                total_fee        = (int)(info.TotalFee * 100),
                openid           = info.OpenId,
                notify_url       = info.NotifyUrl,
                fee_type         = info.FeeType,
                spbill_create_ip = info.DeviceIp,
                time_start       = info.StartTime.ToString("yyyyMMddHHmmss"),
                time_expire      = info.EndTime.ToString("yyyyMMddHHmmss"),
                attach           = info.Attach,
                body             = info.Body,
                detail           = info.Detail,
                goods_tag        = info.GoodTags,
                limit_pay        = info.UseLimitPay ? "no_credit" : null,
                trade_type       = info.TradeType,
                scene_info       = info.SceneInfo
            };
            //转换字典
            var dic = UtilityHelper.Obj2Dictionary(unifiedOrder);

            //生成签名
            unifiedOrder.sign = SignatureGenerater.GenerateWxPaySignature(dic, _baseSettings.ApiKey, info.SignType);
            //统一下单
            var unifiedOrderResult = _wxPayInterfaceCaller.UnifiedOrder(unifiedOrder);

            var chooseWxPayConfig = new ChooseWxPayConfig()
            {
                nonceStr  = info.NonceStr,
                timestamp = info.TimeStamp,
                package   = unifiedOrderResult.prepay_id,
                signType  = info.SignType.GetDescription()
            };
            var paySign = SignatureGenerater.GenerateWxPaySignature(new Dictionary <string, string>()
            {
                { "appId", _baseSettings.AppId },
                { "timeStamp", chooseWxPayConfig.timestamp.ToString() },
                { "nonceStr", chooseWxPayConfig.nonceStr },
                { "package", chooseWxPayConfig.package },
                { "signType", chooseWxPayConfig.signType }
            }, _baseSettings.ApiKey, info.SignType);

            chooseWxPayConfig.paySign = paySign;

            return(chooseWxPayConfig);
        }
        /// <summary>
        /// H5支付
        /// </summary>
        /// <param name="info"></param>
        /// <returns></returns>
        public string H5Pay(UnifiedOrderInfo info)
        {
            var unifiedOrder = new UnifiedOrder()
            {
                nonce_str        = info.NonceStr,
                appid            = _baseSettings.AppId,
                mch_id           = _baseSettings.MchId,
                out_trade_no     = info.TradeNo,
                sign_type        = info.SignType.GetDescription(),
                total_fee        = (int)(info.TotalFee * 100),
                openid           = info.OpenId,
                notify_url       = info.NotifyUrl,
                fee_type         = info.FeeType,
                spbill_create_ip = info.DeviceIp,
                time_start       = info.StartTime.ToString("yyyyMMddHHmmss"),
                time_expire      = info.EndTime.ToString("yyyyMMddHHmmss"),
                attach           = info.Attach,
                body             = info.Body,
                detail           = info.Detail,
                goods_tag        = info.GoodTags,
                limit_pay        = info.UseLimitPay ? "no_credit" : null,
                trade_type       = info.TradeType,
                scene_info       = info.SceneInfo
            };
            //转换字典
            var dic = UtilityHelper.Obj2Dictionary(unifiedOrder);

            //生成签名
            unifiedOrder.sign = SignatureGenerater.GenerateWxPaySignature(dic, _baseSettings.ApiKey, info.SignType);
            //统一下单
            var unifiedOrderResult = _wxPayInterfaceCaller.UnifiedOrder(unifiedOrder);

            var mWebUrl = unifiedOrderResult.mweb_url;

            if (!string.IsNullOrEmpty(info.RedirectUrl))
            {
                mWebUrl += $"&redirect_url={HttpUtility.UrlEncode(info.RedirectUrl)}";
            }

            return(mWebUrl);
        }
        public void UnifiedOrderTest()
        {
            var unifiedOrderInfo = new UnifiedOrderInfo();

            unifiedOrderInfo.AppId         = 1;
            unifiedOrderInfo.Openid        = "obzTsw5qxlbwGYYZJC9b-91J-X1Y";
            unifiedOrderInfo.OutTradeNo    = "outcode1234567890";
            unifiedOrderInfo.PayModuleName = "test";
            unifiedOrderInfo.TotalFee      = 1;
            unifiedOrderInfo.Body          = "测试支付";
            unifiedOrderInfo.OrderId       = Guid.NewGuid().ToString();
            unifiedOrderInfo.PayComplete   = "http://www.baidu.com";

            string unifiedErrorMessage;

            if (unifiedOrderInfo.CheckRequired(out unifiedErrorMessage))
            {
                var result = _unifiedOrderService.UnifiedOrder(unifiedOrderInfo, out unifiedErrorMessage);
            }


            Assert.IsFalse(true);
        }
Beispiel #5
0
        /// <summary>
        /// 获取支付url
        /// </summary>
        /// <param name="orderRequest"></param>
        /// <returns></returns>
        public string GetPayUrl([FromUri] GetOrderRequest orderRequest)
        {
            try
            {
                var order = Global.Bus.Send <GetOrderResponse>(Constants.HotelServiceAddress, orderRequest);
                if (!order.IsSuccess)
                {
                    throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.InternalServerError,
                                                                                "获取订单信息失败。"));
                }
                var orderDto = order.Data.Order;
                if (orderDto != null)
                {
                    var unifiedOrderService = new UnifiedOrderService();
                    int wid = orderRequest.Wid;
                    //总花费
                    var dateSpan   = orderDto.LeaveTime - orderDto.ArriveTime;
                    var totalPrice = orderDto.OrderPrice * orderDto.OrderNum * dateSpan.Days * 100;//单位分

                    var port = WebHelper.GetHostPort();
                    var url  = string.Format("{0}/Functoin/BackPage/hotel_order_paycallback.aspx", port);

                    var entity = new UnifiedOrderInfo()
                    {
                        PayModuleName = "hotel",
                        AppId         = wid,
                        TotalFee      = totalPrice == null ? 0 : (int)totalPrice,
                        OutTradeNo    = orderDto.OrderNumber,
                        Openid        = orderRequest.OpenId,
                        OrderId       = orderRequest.OrderId.ToString(),
                        Body          = string.Format("订单编号{2} {3}{1}{0}间", orderDto.OrderNum, orderDto.RoomType
                                                      , orderDto.OrderNumber, orderDto.HotelName),
                        PayComplete = url
                    };
                    entity.Extra.Add("OrderId", orderRequest.OrderId.ToString());
                    entity.Extra.Add("openid", orderRequest.OpenId);
                    entity.Extra.Add("hotelid", orderDto.HotelId.ToString());
                    entity.Extra.Add("roomid", orderDto.RoomId.ToString());
                    entity.Extra.Add("wid", wid.ToString());


                    var strResult = unifiedOrderService.GeneratePayUrl(entity);
                    if (string.IsNullOrEmpty(strResult))
                    {
                        throw new Exception("生成下单链接失败");
                    }
                    return(strResult);
                }
                else
                {
                    throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.NotFound,
                                                                                "订单不存在"));
                }
            }
            catch (HttpResponseException)
            {
                throw;
            }
            catch
            {
                throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.InternalServerError,
                                                                            "获取支付信息失败"));
            }
        }
        /// <summary>
        ///     统一下单
        /// </summary>
        /// <param name="unifiedOrderInfo"></param>
        /// <param name="errMessage"></param>
        /// <returns></returns>
        public JsAPIParameter UnifiedOrder(UnifiedOrderInfo unifiedOrderInfo, out string errMessage)
        {
            if (unifiedOrderInfo == null)
            {
                errMessage = "下单数据为空";
                return null;
            }

            if (!unifiedOrderInfo.CheckRequired(out errMessage))
            {
                return null;
            }

            var paymentInfoRepository = DependencyManager.Resolve<IPaymentInfoRepository>();

            //判断当前订单号是否存在
            var orderInfo = paymentInfoRepository.GetPaymentInfoBySysOrderNo(unifiedOrderInfo.PayModuleName,
                unifiedOrderInfo.OutTradeNo);
            if (orderInfo != null && orderInfo.Status != 0 && orderInfo.OpenId.Equals(unifiedOrderInfo.Openid))
            //0表示尚未支付
            {
                errMessage = "系统异常,请重新下单操作";
                return null;
            }

            //调用微信统一下单接口
            var appInfo = DependencyManager.Resolve<IAppInfoRepository>().GetAppInfo(unifiedOrderInfo.AppId);
            var payment =
                DependencyManager.Resolve<Weixin.Repository.IPaymentInfoRepository>()
                    .GetModelByAppId(unifiedOrderInfo.AppId);
            if (string.IsNullOrEmpty(appInfo.AppId) || string.IsNullOrEmpty(payment.MchId) ||
                string.IsNullOrEmpty(payment.Paykey))
            {
                errMessage = "当前公众号支付配置不完整";
                return null;
            }


            var packageReqHandler = new RequestHandler(default(HttpContext));
            //初始化
            packageReqHandler.Init();

            var nonceStr = TenPayV3Util.GetNoncestr();

            //设置package订单参数
            packageReqHandler.SetParameter("appid", appInfo.AppId); //公众账号ID
            packageReqHandler.SetParameter("mch_id", payment.MchId); //商户号
            packageReqHandler.SetParameter("nonce_str", nonceStr); //随机字符串
            packageReqHandler.SetParameter("body", unifiedOrderInfo.Body); //商品描述
            packageReqHandler.SetParameter("attach", unifiedOrderInfo.PayModuleName); //向微信传递系统支付模块ID
            packageReqHandler.SetParameter("out_trade_no", unifiedOrderInfo.OutTradeNo); //商家订单号

            //debug模式下,单位为
            packageReqHandler.SetParameter("total_fee", PayHelper.IsDebug
                ? (unifiedOrderInfo.TotalFee / 100).ToString()
                : (unifiedOrderInfo.TotalFee * 100).ToString());

            packageReqHandler.SetParameter("spbill_create_ip", "1.1.1.1"); //用户的公网ip,不是商户服务器IP

            packageReqHandler.SetParameter("notify_url", PayHelper.GetPayNotifyUrl()); //接收财付通通知的URL
            packageReqHandler.SetParameter("trade_type", TenPayV3Type.JSAPI.ToString()); //交易类型
            packageReqHandler.SetParameter("openid", unifiedOrderInfo.Openid); //用户的openId

            var sign = packageReqHandler.CreateMd5Sign("key", payment.Paykey);
            packageReqHandler.SetParameter("sign", sign); //签名

            var data = packageReqHandler.ParseXML();

            //同意下单,获取到预付订单号
            var unifiedOrderResult = TenPayV3Helper.Unifiedorder(data);
            var rtnUnifiedOrderResult = new UnifiedOrderResponse(unifiedOrderResult);

            //下单成功,保存下单对象
            if (rtnUnifiedOrderResult.IsSuccess)
            {
                var paymentInfo = new PaymentInfo
                {
                    PaymentId = Guid.NewGuid(),
                    AppId = unifiedOrderInfo.AppId,
                    CreateTime = DateTime.Now,
                    Description = "无",
                    Body = unifiedOrderInfo.Body,
                    ModuleName = unifiedOrderInfo.PayModuleName,
                    OrderCode = unifiedOrderInfo.OutTradeNo,
                    OrderId = unifiedOrderInfo.OrderId,
                    OpenId = unifiedOrderInfo.Openid,
                    PayAmount = unifiedOrderInfo.TotalFee,
                    WxOrderCode = rtnUnifiedOrderResult.prepay_id,
                    ModifyTime = DateTime.Now,
                    Status = 0
                };

                paymentInfoRepository.Add(paymentInfo);

                var jsApiParameters = rtnUnifiedOrderResult.GetJsApiParameters(payment.Paykey);

                return jsApiParameters;
            }

            errMessage = "下单失败";
            return null;
        }