/// <summary>
 /// 统一下单信息
 /// </summary>
 /// <param name="tradeNo">订单号</param>
 /// <param name="totalFee">订单金额</param>
 /// <param name="title">标题</param>
 /// <param name="notifyUrl">回调Url</param>
 /// <param name="openId">OpenId</param>
 /// <param name="deviceIp">设备Ip</param>
 /// <param name="tradeType">交易类型</param>
 /// <param name="signType">签名类型</param>
 public UnifiedOrderInfo(string tradeNo, decimal totalFee, string title, string notifyUrl, string openId, string deviceIp, TradeType tradeType = TradeType.JSAPI, WxPaySignType signType = WxPaySignType.MD5)
 {
     TradeNo   = tradeNo;
     TotalFee  = totalFee;
     Body      = title;
     NotifyUrl = notifyUrl;
     OpenId    = openId;
     DeviceIp  = deviceIp;
     TradeType = tradeType;
     SignType  = signType;
 }
        /// <summary>
        /// 创建微信支付签名
        /// </summary>
        /// <param name="dic"></param>
        /// <param name="apiKey"></param>
        /// <param name="signType"></param>
        /// <returns></returns>
        public static string GenerateWxPaySignature(Dictionary <string, string> dic, string apiKey, WxPaySignType signType)
        {
            var    arr        = dic.OrderBy(z => z.Key).ToArray();
            string stringSign = string.Empty;

            foreach (var item in arr)
            {
                if (!string.IsNullOrEmpty(item.Value))
                {
                    stringSign += $"{item.Key}={item.Value}&";
                }
            }
            stringSign += $"key={apiKey}";

            string sign = string.Empty;

            switch (signType)
            {
            case WxPaySignType.MD5:
                sign = UtilityHelper.MD5Encrypt(stringSign).ToUpper();
                break;

            case WxPaySignType.SHA256:
                sign = UtilityHelper.SHA256Encrypt(stringSign, apiKey).ToUpper();
                break;

            default:
                throw new SignTypeNotSupportException($"{signType.ToString()}不受支持");
            }

            return(sign);
        }
        /// <summary>
        /// 创建chooseWxPay配置
        /// </summary>
        /// <param name="unifiedOrder"></param>
        /// <param name="signType"></param>
        /// <returns></returns>
        public ChooseWxPayConfig GenerateChooseWxPayConfig(UnifiedOrder unifiedOrder, WxPaySignType signType = WxPaySignType.MD5)
        {
            //转换字典
            var dic = UtilityHelper.Obj2Dictionary(unifiedOrder);

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

            var nonceStr          = UtilityHelper.GenerateNonce();
            var timeStamp         = UtilityHelper.GetTimeStamp();
            var chooseWxPayConfig = new ChooseWxPayConfig()
            {
                nonceStr  = nonceStr,
                timestamp = timeStamp,
                package   = unifiedOrderResult.prepay_id,
                signType  = 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, signType);

            chooseWxPayConfig.paySign = paySign;

            return(chooseWxPayConfig);
        }