/// <summary>
 /// 初始化微信支付参数生成器
 /// </summary>
 /// <param name="config">配置</param>
 public WechatpayParameterBuilder(WechatpayConfig config)
 {
     config.CheckNull(nameof(config));
     Config          = config;
     _builder        = new ParameterBuilder();
     _jsonSerializer = IocManager.GetContainer().Resolve <IJsonSerializer>();
 }
Exemple #2
0
 /// <summary>
 /// 初始化微信支付服务
 /// </summary>
 /// <param name="configProvider">微信支付配置提供器</param>
 protected WechatpayServiceBase(IWechatpayConfigProvider configProvider, IHttpClientFactory httpClientFactory, ILoggerFactory loggerFactory)
 {
     configProvider.CheckNull(nameof(configProvider));
     HttpClientFactory = httpClientFactory;
     Config            = configProvider.GetConfig();
     Logger            = loggerFactory.CreateLogger <WechatpayServiceBase>();
 }
Exemple #3
0
 /// <summary>
 /// 初始化微信支付参数生成器
 /// </summary>
 /// <param name="config">配置</param>
 public WechatpayParameterBuilder(WechatpayConfig config, HttpRequest httpRequest = null)
 {
     config.CheckNull(nameof(config));
     Config  = config;
     Builder = new ParameterBuilder();
     Request = httpRequest;
 }
Exemple #4
0
 /// <summary>
 /// 创建签名服务
 /// </summary>
 /// <param name="config">微信支付配置</param>
 /// <param name="builder">参数生成器</param>
 public static ISignManager Create(WechatpayConfig config, HttpRequest httpRequest, ParameterBuilder builder, WechatpaySignType?signType = null)
 {
     if (signType != null && signType == WechatpaySignType.Md5)
     {
         return(new Md5SignManager(new SignKey(config.PrivateKey), httpRequest, builder));
     }
     if (signType != null && signType == WechatpaySignType.HmacSha256)
     {
         return(new HmacSha256SignManager(new SignKey(config.PrivateKey), httpRequest, builder));
     }
     if (builder.GetValue(WechatpayConst.SignType)?.ToString() == WechatpaySignType.Md5.Description())
     {
         return(new Md5SignManager(new SignKey(config.PrivateKey), httpRequest, builder));
     }
     if (builder.GetValue(WechatpayConst.SignType)?.ToString() == WechatpaySignType.HmacSha256.Description())
     {
         return(new HmacSha256SignManager(new SignKey(config.PrivateKey), httpRequest, builder));
     }
     if (config.SignType == WechatpaySignType.Md5)
     {
         return(new Md5SignManager(new SignKey(config.PrivateKey), httpRequest, builder));
     }
     if (config.SignType == WechatpaySignType.HmacSha256)
     {
         return(new HmacSha256SignManager(new SignKey(config.PrivateKey), httpRequest, builder));
     }
     throw new NotImplementedException($"未实现签名算法:{config.SignType.Description()}");
 }
Exemple #5
0
 /// <summary>
 /// 验证配置
 /// </summary>
 /// <param name="config">配置参数</param>
 protected void ValidateConfig(WechatpayConfig config)
 {
     if (config.Certificate.IsEmpty())
     {
         throw new Warning("必须设置证书");
     }
 }
        /// <summary>
        /// 请求结果
        /// </summary>
        /// <param name="config">微信支付配置</param>
        /// <param name="builder">微信支付参数生成器</param>
        /// <returns></returns>
        protected virtual async Task <PayResult> RequestResult(WechatpayConfig config, WechatpayParameterBuilder builder)
        {
            var result = new WechatpayResult(ConfigProvider, await Request(config, builder));

            WriteLog(config, builder, result);
            return(await CreateResult(config, builder, result));
        }
Exemple #7
0
        public async Task Test1()
        {
            var config = new WechatpayConfig();

            var request = new WechatTradeAppPayRequest
            {
                TotalFee   = 100,
                OutTradeNo = "202007297777",
                Body       = "产品",
                Detail     = "产品",
                TimeExpire = DateTime.Now.AddDays(15).ToString("yyyyMMddHHmmss"),
                TradeType  = WechatConstants.APP,
                TimeStart  = DateTime.Now.ToString("yyyyMMddHHmmss"),
                NotifyUrl  = ""
            };

            var response = await WechatpayClient.CreateOrderAsync(request, config);

            if (string.IsNullOrEmpty(response.Body))
            {
                Assert.Fail();
            }
            else
            {
                Assert.Pass();
            }
        }
        public async Task <IActionResult> Wechatpay()
        {
            var config = new WechatpayConfig
            {
                AppId   = "wxefd7e95dd1ec11ae",
                SignKey = "I2lgA4cnK75mHULNqAaoZ3o4SSHMAY48",
                MchId   = "1495057202"
            };

            var request = new WechatTradeAppPayRequest
            {
                TotalFee   = 100,
                OutTradeNo = $"test_{DateTime.Now.ToString("yyyyMMddHHmmss")}",
                ProductId  = $"test_{DateTime.Now.ToString("yyyyMMddHHmmss")}",
                Body       = "产品",
                Detail     = "产品",
                TimeExpire = DateTime.Now.AddHours(2).ToString("yyyyMMddHHmmss"),
                TradeType  = WechatConstants.MWEB,
                TimeStart  = DateTime.Now.ToString("yyyyMMddHHmmss"),
                NotifyUrl  = "http://mobiletest.emoney.cn/mdata/payment/api/wechat/wechatnotity"
            };

            var response = await WechatpayClient.CreateOrderAsync(request, config);

            var ms = Convert.FromBase64String((await GetImage(response.CodeUrl)).Replace("data:image/jpeg;base64,", ""));

            return(File(ms, "image/png"));
        }
 /// <summary>
 /// 验证
 /// </summary>
 /// <param name="config">微信支付配置</param>
 /// <param name="param">支付参数</param>
 protected void Validate(WechatpayConfig config, PayParam param)
 {
     config.CheckNotNull(nameof(config));
     param.CheckNotNull(nameof(param));
     config.Validate();
     param.Validate();
     ValidateParam(param);
 }
        /// <summary>
        /// 注册微信支付
        /// </summary>
        /// <param name="services"></param>
        /// <param name="setupAction"></param>
        public static void AddWechatPay(this IServiceCollection services, Action <WechatpayConfig> setupAction = null)
        {
            var wechatpayConfig = new WechatpayConfig();

            setupAction?.Invoke(wechatpayConfig);
            services.TryAddSingleton <IWechatpayConfigProvider>(new WechatpayConfigProvider(wechatpayConfig));
            services.TryAddScoped <IWechatpayNotifyService, WechatpayNotifyService>();
        }
Exemple #11
0
 /// <summary>
 /// 初始化微信支付结果
 /// </summary>
 /// <param name="configProvider">配置提供器</param>
 /// <param name="response">xml响应消息</param>
 public WechatpayResult(WechatpayConfig wechatpayConfig, string response, HttpRequest httpRequest = null)
 {
     wechatpayConfig.CheckNull(nameof(wechatpayConfig));
     _wechatpayConfig = wechatpayConfig;
     Raw = response;
     Resolve(response);
     Request = httpRequest;
 }
        /// <summary>
        /// 获取配置
        /// </summary>
        public Task <WechatpayConfig> GetConfigAsync()
        {
            var config = new WechatpayConfig {
                SignType   = WechatpaySignType.Md5,
                PrivateKey = "VVHZOaJEj44WbX0f3Lj7DHkfwEqvlURA",
            };

            return(Task.FromResult(config));
        }
Exemple #13
0
        /// <summary>
        /// 请求失败
        /// </summary>
        private async Task <WechatpayDownloadBillResult> Fail(string response, WechatpayConfig config, WechatpayParameterBuilder builder)
        {
            var result = new WechatpayResult(ConfigProvider, response, config, builder);

            WriteLog(config, builder, result);
            var success = (await result.ValidateAsync()).IsValid;

            return(new WechatpayDownloadBillResult(success, result));
        }
        /// <summary>
        /// 请求结果
        /// </summary>
        protected virtual async Task <WechatpayResult> RequstResult(WechatpayConfig config, WechatpayParameterBuilder builder)
        {
            var response = await SendRequest(config, builder);

            var result = new WechatpayResult(ConfigProvider, response, config, builder);

            WriteLog(config, builder, result);
            return(result);
        }
Exemple #15
0
 /// <summary>
 /// 验证
 /// </summary>
 protected void Validate(WechatpayConfig config, WechatRefundRequest param)
 {
     config.CheckNull(nameof(config));
     param.CheckNull(nameof(param));
     config.Validate();
     param.Validate();
     ValidateConfig(config);
     ValidateParam(param);
 }
Exemple #16
0
        /// <summary>
        /// 请求结果
        /// </summary>
        protected async Task <WechatpayResult <TResponse> > RequstResult <TResponse>(WechatpayConfig config, WechatpayParameterBuilder builder) where TResponse : WechatpayResponse
        {
            var result = new WechatpayResult <TResponse>(Config, await Request(config, builder));

            WriteLog(config, builder, result);
            await ValidateResult(result);

            return(result);
        }
Exemple #17
0
 /// <summary>
 /// 获取结果
 /// </summary>
 /// <param name="config">支付配置</param>
 /// <param name="builder">参数生成器</param>
 /// <param name="result">支付结果</param>
 protected string GetResult(WechatpayConfig config, WechatpayRefundParameterBuilder builder, WechatpayResult result)
 {
     return(new WechatpayParameterBuilder(config)
            .Add("appId", config.AppId)
            .Add("timeStamp", Time.GetUnixTimestamp().SafeString())
            .Add("nonceStr", Id.Guid())
            .Add("signType", config.SignType.Description())
            .SignParamName("paySign")
            .ToJson());
 }
 /// <summary>
 /// 初始化微信支付结果
 /// </summary>
 /// <param name="configProvider">配置提供器</param>
 /// <param name="response">xml响应消息</param>
 /// <param name="config">配置</param>
 /// <param name="parameterBuilder">参数生成器</param>
 public WechatpayResult(IWechatpayConfigProvider configProvider, string response, WechatpayConfig config = null, WechatpayParameterBuilder parameterBuilder = null)
 {
     configProvider.CheckNull(nameof(configProvider));
     ConfigProvider = configProvider;
     Raw            = response;
     Config         = config;
     Builder        = parameterBuilder;
     _builder       = new ParameterBuilder();
     Resolve(response);
 }
Exemple #19
0
        /// <summary>
        /// 请求结果
        /// </summary>
        protected async Task <WechatpayDownloadBillResult> Requst(WechatpayConfig config, WechatpayParameterBuilder builder, WechatpayDownloadBillRequest request)
        {
            var response = await SendRequest(config, builder);

            if (response.StartsWith("交易时间"))
            {
                return(Success(response, builder, request));
            }
            return(await Fail(response, config, builder));
        }
Exemple #20
0
        /// <summary>
        /// 发送请求
        /// </summary>
        protected async Task <string> Request(WechatpayConfig config, WechatpayParameterBuilder builder)
        {
            var client  = HttpClientFactory.CreateClient("wechat");
            var resonse = await Web.Client(client)
                          .Post(GetRequestUrl(config))
                          .XmlData(builder.ToXml(true, builder.Get(WechatpayConst.SignType).ToWechatpaySignType()))
                          .ResultAsync();

            return(await resonse.Content.ReadAsStringAsync());
        }
 /// <summary>
 /// 创建签名服务
 /// </summary>
 /// <param name="config">微信支付配置</param>
 /// <param name="builder">参数生成器</param>
 public static ISignManager Create(WechatpayConfig config, ParameterBuilder builder)
 {
     if (config.SignType == WechatpaySignType.Md5)
     {
         return(new Md5SignManager(new SignKey(config.PrivateKey), builder));
     }
     // if( config.SignType == WechatpaySignType.HmacSha256 )
     //     return new HmacSha256SignManager( new SignKey( config.PrivateKey ), builder );
     throw new NotImplementedException($"未实现签名算法:{EnumUtil.GetEnumDescription( config.SignType)}");
 }
Exemple #22
0
 /// <summary>
 /// 获取结果
 /// </summary>
 /// <param name="config">支付配置</param>
 /// <param name="builder">参数生成器</param>
 /// <param name="result">支付结果</param>
 protected override string GetResult(WechatpayConfig config, WechatpayParameterBuilder builder, WechatpayResult result)
 {
     return(new WechatpayParameterBuilder(config)
            .Add("appId", config.AppId)
            .Add("timeStamp", Time.GetUnixTimestamp().SafeString())
            .Add("nonceStr", Id.Guid())
            .Package($"prepay_id={result.GetPrepayId()}")
            .Add("signType", config.SignType.Description())
            .ToJson());
 }
        /// <summary>
        /// 注册阿里支付
        /// </summary>
        /// <param name="services"></param>
        /// <param name="setupAction"></param>
        //public static void AddAliPay(this IServiceCollection services, Action<AlipayConfig> setupAction = null)
        //{
        //    var alipayConfig = new AlipayConfig();
        //    setupAction?.Invoke(alipayConfig);
        //    services.TryAddSingleton<IAlipayConfigProvider>(new AlipayConfigProvider(alipayConfig));
        //    services.TryAddScoped<IAlipayNotifyService, AlipayNotifyService>();
        //    services.TryAddScoped<IAlipayReturnService, AlipayReturnService>();
        //    services.AddPayService(PayOriginType.AliPay);
        //}

        /// <summary>
        /// 注册阿里支付
        /// </summary>
        /// <typeparam name="TAlipayConfigProvider"></typeparam>
        /// <param name="services"></param>
        //public static void AddAliPay<TAlipayConfigProvider>(this IServiceCollection services) where TAlipayConfigProvider : class, IAlipayConfigProvider
        //{
        //    services.TryAddSingleton<IAlipayConfigProvider, TAlipayConfigProvider>();
        //    services.TryAddScoped<IAlipayNotifyService, AlipayNotifyService>();
        //    services.TryAddScoped<IAlipayReturnService, AlipayReturnService>();
        //    services.AddPayService(PayOriginType.AliPay);
        //}
        /// <summary>
        /// 注册微信支付
        /// </summary>
        /// <param name="services"></param>
        /// <param name="setupAction"></param>
        public static IServiceCollection AddWechatPay(this IServiceCollection services, Action <WechatpayConfig> setupAction = null)
        {
            var wechatpayConfig = new WechatpayConfig();

            setupAction?.Invoke(wechatpayConfig);
            services.AddHttpClient("wechat", wechatpayConfig);
            services.TryAddSingleton <IWechatpayConfigProvider>(new WechatpayConfigProvider(wechatpayConfig));
            services.TryAddScoped <IWechatpayNotifyService, WechatpayNotifyService>();
            services.AddPayService(PayOriginType.WechatPay);
            return(services);
        }
Exemple #24
0
 /// <summary>
 /// 获取结果
 /// </summary>
 /// <param name="config">微信支付配置</param>
 /// <param name="builder">微信支付参数生成器</param>
 /// <param name="result">微信支付结果</param>
 /// <returns></returns>
 protected override string GetResult(WechatpayConfig config, WechatpayParameterBuilder builder, WechatpayResult result)
 {
     return(new WechatpayParameterBuilder(config)
            .AppId(config.AppId)
            .PartnerId(config.MerchantId)
            .Add("prepayid", result.GetPrepayId())
            .Add("noncestr", Id.Guid())
            .Timestamp()
            .Package()
            .ToJson());
 }
 /// <summary>
 /// 发送请求
 /// </summary>
 /// <param name="config">微信支付配置</param>
 /// <param name="builder">微信支付参数生辰器</param>
 protected virtual async Task <string> Request(WechatpayConfig config, WechatpayParameterBuilder builder)
 {
     if (IsSend == false)
     {
         return(string.Empty);
     }
     return(await Web.Client()
            .Post(string.IsNullOrWhiteSpace(GetOrderUrl()) ? config.GetOrderUrl() : GetOrderUrl())
            .XmlData(builder.ToXml())
            .ResultAsync());
 }
Exemple #26
0
        /// <summary>
        /// 写日志
        /// </summary>
        protected virtual void WriteLog <TResponse>(WechatpayConfig config, WechatpayParameterBuilder builder, WechatpayResult <TResponse> result) where TResponse : WechatpayResponse
        {
            var logContent = LogContentBuilder.CreateLogContentBuilder()
                             .SetEventId(Guid.NewGuid()).SetMoudle(GetType().FullName).SetTitle("微信支付")
                             .AddContent($"支付方式 : {GetType()}")
                             .AddContent($"支付网关 : {config.GetOrderUrl()}")
                             .AddContent($"原始响应:{result?.Raw}")
                             .Build();

            Logger.LogInfo(logContent);
        }
Exemple #27
0
        /// <summary>
        /// 创建支付结果
        /// </summary>
        /// <param name="config">支付配置</param>
        /// <param name="builder">参数生成器</param>
        /// <param name="result">支付结果</param>
        protected virtual async Task <PayResult> CreateResult(WechatpayConfig config, WechatpayParameterBuilder builder, WechatpayResult result)
        {
            var success = (await result.ValidateAsync()).IsValid;

            return(new PayResult(success, result.GetPrepayId(), result.Raw)
            {
                Parameter = builder.ToString(),
                Message = result.GetReturnMessage(),
                Result = success ? GetResult(config, builder, result) : null
            });
        }
Exemple #28
0
 /// <summary>
 /// 发送请求
 /// </summary>
 protected virtual async Task <string> Request(WechatpayConfig config, WechatpayParameterBuilder builder)
 {
     if (IsSend == false)
     {
         return(string.Empty);
     }
     return(await Web.Client()
            .Post(GetRequestUrl(config))
            .XmlData(builder.ToXml())
            .ResultAsync());
 }
Exemple #29
0
        /// <summary>
        /// 请填写正确的微信支付配置
        /// </summary>
        public Task <WechatpayConfig> GetConfigAsync(object parameter = null)
        {
            var config = new WechatpayConfig {
                AppId      = "",
                MerchantId = "",
                PrivateKey = "",
                NotifyUrl  = ""
            };

            return(Task.FromResult(config));
        }
Exemple #30
0
 /// <summary>
 /// 写日志
 /// </summary>
 protected void WriteLog(WechatpayConfig config, WechatpayParameterBuilder builder, WechatpayResult result)
 {
     Logger.Error(GetType().FullName + " 微信支付:"
                  + $"支付方式 : {EnumUtil.GetEnumDescription(GetPayWay())}"
                  + $"支付网关 : {config.GetOrderUrl()}"
                  + "请求参数:" + builder.ToXml()
                  + "返回结果:" + result.GetParams()
                  + "原始请求:" + builder.ToString()
                  + "原始响应: " + result.Raw
                  );
 }