/// <summary>
        /// 获取订单
        /// </summary>
        /// <param name="parameter">参数</param>
        /// <returns></returns>
        /// <exception cref="ArgumentNullException">传入的参数是null</exception>
        /// <exception cref="WeChatPayException">调用微信接口失败时返回的错误信息</exception>
        public async Task <QueryOrderResponse> GetOrderAsync(QueryOrderRequest parameter)
        {
            if (parameter == null)
            {
                throw new ArgumentNullException(nameof(parameter));
            }
            parameter.AppId = _appId;
            parameter.MchId = _mchId;
            parameter.Sign  = WeChatSignHelper.CreateMd5Sign(parameter, _secretKey);
            string url    = "https://api.mch.weixin.qq.com/pay/orderquery";
            string body   = XmlSerializeHelper.ObjectToXmlString(parameter);
            string result = await _client.ExecutePostRequest(url, new Dictionary <string, string>(),
                                                             body, "xml/text");

            XmlDocument xml = new XmlDocument();

            xml.LoadXml(result);

            var response = XmlSerializeHelper.StringToObject <QueryOrderResponse>(result);

            Check(response);
            response.CouponType         = Helper.FormatXmlField("coupon_type", xml);
            response.CouponId           = Helper.FormatXmlField("coupon_refund_id", xml);
            response.SingleCouponAmount = Helper.FormatXmlField("coupon_refund_fee", xml)
                                          .Select(x => Convert.ToInt32(x)).ToArray();


            return(response);
        }
        /// <summary>
        /// 统一下单
        /// </summary>
        /// <param name="parameter">参数</param>
        /// <returns></returns>
        /// <exception cref="ArgumentNullException">传入的参数是null</exception>
        /// <exception cref="WeChatPayException">调用微信接口失败时返回的错误信息</exception>
        public async Task <UnifiedOrderResponse> UnifiedOrderAsync(UnifiedOrderRequest parameter)
        {
            parameter.AppId = _appId;
            parameter.MchId = _mchId;
            if (parameter == null)
            {
                throw new ArgumentNullException(nameof(parameter));
            }
            if (parameter.TradeType == WeChatConstant.JsPay && string.IsNullOrEmpty(parameter.OpenId))
            {
                throw new WeChatPayException("支付方式JsPay OpenId 必须传入");
            }
            if (parameter.TradeType == WeChatConstant.NativePay && string.IsNullOrEmpty(parameter.ProductId))
            {
                throw new WeChatPayException("支付方式NativePay ProductId 必须传入");
            }
            parameter.Sign = WeChatSignHelper.CreateMd5Sign(parameter, _secretKey);
            string url    = "https://api.mch.weixin.qq.com/pay/unifiedorder";
            string body   = XmlSerializeHelper.ObjectToXmlString(parameter);
            string result = await _client.ExecutePostRequest(url, new Dictionary <string, string>(),
                                                             body, "xml/text");

            var response = XmlSerializeHelper.StringToObject <UnifiedOrderResponse>(result);

            Check(response);
            return(response);
        }
        /// <summary>
        /// 企业付款到零钱
        /// </summary>
        /// <param name="parameter"></param>
        /// <returns></returns>
        /// <exception cref="ArgumentNullException"></exception>
        public async Task <PayToWalletResponse> PayToWalletAsync(PayToWalletRequest parameter)
        {
            if (parameter == null)
            {
                throw new ArgumentNullException(nameof(parameter));
            }
            if (string.IsNullOrEmpty(_password) || string.IsNullOrEmpty(_path))
            {
                throw new InvalidOperationException("证书的路径和密码没有填写");
            }
            parameter.AppId = _appId;
            parameter.MchId = _mchId;
            string url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers";

            parameter.Sign = WeChatSignHelper.CreateMd5Sign(parameter, _secretKey);
            string body = XmlSerializeHelper.ObjectToXmlString(parameter);

            string result = await _client.ExecutePostRequest(url, new Dictionary <string, string>(),
                                                             body, _path, _password, "xml/text");

            var response = XmlSerializeHelper.StringToObject <PayToWalletResponse>(result);

            Check(response);
            return(response);
        }
        /// <summary>
        /// 获取资金对账单
        /// </summary>
        /// <param name="parameter"></param>
        /// <returns></returns>
        /// <exception cref="ArgumentNullException">传入的参数是null</exception>
        /// <exception cref="WeChatPayException">调用微信接口失败时返回的错误信息</exception>
        public async Task <OrderTable> GetFundBillAsync(QueryFundBillRequest parameter)
        {
            if (parameter == null)
            {
                throw new ArgumentNullException(nameof(parameter));
            }
            parameter.AppId = _appId;
            parameter.MchId = _mchId;
            parameter.Sign  = WeChatSignHelper.CreateMd5Sign(parameter, _secretKey);
            string url    = "https://api.mch.weixin.qq.com/pay/downloadfundflow";
            string body   = XmlSerializeHelper.ObjectToXmlString(parameter);
            string result = await _client.ExecutePostRequest(url, new Dictionary <string, string>(),
                                                             body, "xml/text");

            if (result.Contains("error_code"))
            {
                var xml = new XmlDocument();
                xml.Load(result);
                var nodes = xml.FirstChild;
                throw new WeChatApiException(nodes["error_code"].InnerText,
                                             nodes["return_msg"].InnerText, "下载对账单");
            }

            return(new OrderTable(result));
        }
Exemple #5
0
        private bool ValidateMessageSign()
        {
            if (_openSignValidate)
            {
                return(WeChatSignHelper.CreateMessageSign(_nonce, _timestamp, _messageConfig.ValidateToken) ==
                       _signature);
            }

            return(false);
        }
        /// <summary>
        /// 查询退款订单
        /// </summary>
        /// <param name="parameter">参数</param>
        /// <exception cref="ArgumentNullException">传入的参数是null</exception>
        /// <exception cref="WeChatPayException">调用微信接口失败时返回的错误信息</exception>
        public async Task <QueryRefundOrderResponse> GetRefundOrders(QueryRefundOrderRequest parameter)
        {
            if (parameter == null)
            {
                throw new ArgumentNullException(nameof(parameter));
            }
            parameter.AppId = _appId;
            parameter.MchId = _mchId;
            parameter.Sign  = WeChatSignHelper.CreateMd5Sign(parameter, _secretKey);
            string url    = "https://api.mch.weixin.qq.com/pay/refundquery";
            string body   = XmlSerializeHelper.ObjectToXmlString(parameter);
            string result = await _client.ExecutePostRequest(url, new Dictionary <string, string>(),
                                                             body, "xml/text");

            XmlDocument xml = new XmlDocument();

            xml.Load(result);
            var response = XmlSerializeHelper.StringToObject <QueryRefundOrderResponse>(result);

            Check(response);
            response.WeChatRefundOrderCode = Helper.FormatXmlField("refund_id", xml);
            response.RefundOrderCode       = Helper.FormatXmlField("out_refund_no", xml);
            response.RefundChannel         = Helper.FormatXmlField("refund_channel", xml);
            response.RefundAmount          = Helper.FormatXmlField("	refund_fee", xml)
                                             .Select(x => Convert.ToInt32(x))
                                             .ToArray();
            response.SettlementRefundAmount = Helper.FormatXmlField("settlement_refund_fee", xml)
                                              .Select(x => Convert.ToInt32(x))
                                              .ToArray();
            response.CouponType   = Helper.FormatXmlField("coupon_type", xml);
            response.CouponAmount = Helper.FormatXmlField("coupon_refund_fee", xml)
                                    .Select(x => Convert.ToInt32(x))
                                    .ToArray();
            response.CouponCount = Helper.FormatXmlField("coupon_refund_count", xml)
                                   .Select(x => Convert.ToInt32(x))
                                   .ToArray();
            response.CouponId           = Helper.FormatXmlField("coupon_refund_id", xml);
            response.SingleCouponAmount = Helper.FormatXmlField("coupon_refund_fee", xml)
                                          .Select(x => Convert.ToInt32(x))
                                          .ToArray();
            response.State         = Helper.FormatXmlField("refund_status", xml);
            response.Source        = Helper.FormatXmlField("refund_account", xml);
            response.RefundAccount = Helper.FormatXmlField("refund_recv_accout", xml);
            response.RefundDate    = Helper.FormatXmlField("refund_success_time", xml)
                                     .Select(Convert.ToDateTime)
                                     .ToArray();
            return(response);
        }
Exemple #7
0
        public CreateOrderResult CreateOrderAsync(CreateOrderParameter createOrderParameter)
        {
            string str;

            if (!this.ValidateParameter <CreateOrderParameter>(createOrderParameter, out str))
            {
                CreateOrderResult result1 = new CreateOrderResult();
                result1.ErrorMessage = str;
                return(result1);
            }
            UnifiedOrderRequest request = new UnifiedOrderRequest
            {
                AppId         = this.m_AppId,
                MerchantId    = createOrderParameter.MerchantId,
                DeviceInfo    = _DeviceInfo,
                NonceString   = WeChatSignHelper.CreateRandomString(),
                Body          = createOrderParameter.Body,
                Detail        = createOrderParameter.Detail,
                Attach        = createOrderParameter.Attach,
                OutTradeNo    = createOrderParameter.OutTradeNo,
                FeeType       = _OrderFeeType,
                TotalFee      = (int)(createOrderParameter.TotalFee * 100.0),
                SpbllCreateIP = createOrderParameter.IP,
                TimeStart     = DateTime.Now.ToString("yyyyMMddHHmmss"),
                TimeExpire    = DateTime.Now.AddHours((double)_OrderExpireHour).ToString("yyyyMMddHHmmss"),
                NotifyUrl     = createOrderParameter.NotifyUrl,
                TradeType     = createOrderParameter.TradeType,
                ProductId     = createOrderParameter.ProductId,
                OpenId        = createOrderParameter.OpenId
            };
            UnifiedOrderResponse response = this.InvokeApiAsync <UnifiedOrderRequest, UnifiedOrderResponse>(_UnifiedorderUrl, request);

            if (!response.IsSuccess)
            {
                CreateOrderResult result3 = new CreateOrderResult();
                result3.ErrorCode    = response.ErrCode;
                result3.ErrorMessage = response.ReturnMsg;
                return(result3);
            }
            CreateOrderResult result2 = new CreateOrderResult();

            result2.IsSuccess = true;
            result2.CodeUrl   = response.CodeUrl;
            result2.PrepayId  = response.PrepayId;
            return(result2);
        }
        /// <summary>
        /// 发送裂变红包
        /// </summary>
        /// <param name="parameter"></param>
        /// <returns></returns>
        /// <exception cref="ArgumentNullException"></exception>
        public async Task <SendRedPackResponse> SendFissionRedPack(SendFissionRedPackRequest parameter)
        {
            if (parameter == null)
            {
                throw new ArgumentNullException(nameof(parameter));
            }
            parameter.Sign = WeChatSignHelper.CreateMd5Sign(parameter, _secretKey);
            string url    = "https://api.mch.weixin.qq.com/mmpaymkttransfers/sendgroupredpack";
            string body   = XmlSerializeHelper.ObjectToXmlString(parameter);
            string result = await _client.ExecutePostRequest(url, new Dictionary <string, string>(),
                                                             body, "xml/text");

            var response = XmlSerializeHelper.StringToObject <SendRedPackResponse>(result);

            Check(response);

            return(response);
        }
Exemple #9
0
        public CreateWxPayToUserResult CreateWxPayToUser(CreateWxPayToUserParameter createOrderParameter)
        {
            string str;

            if (!this.ValidateParameter <CreateWxPayToUserParameter>(createOrderParameter, out str))
            {
                CreateWxPayToUserResult result1 = new CreateWxPayToUserResult();
                result1.ErrorMessage = str;
                return(result1);
            }
            WxPayToUserRequest request = new WxPayToUserRequest
            {
                AppId         = this.m_AppId,
                MerchantId    = createOrderParameter.MerchantId,
                DeviceInfo    = _DeviceInfo,
                NonceString   = WeChatSignHelper.CreateRandomString(),
                OutTradeNo    = createOrderParameter.OutTradeNo,
                Amount        = (int)(createOrderParameter.Amount * 100.0),
                SpbllCreateIP = createOrderParameter.IP,
                Desc          = createOrderParameter.Desc,
                CheckName     = "NO_CHECK",
                ReUserName    = createOrderParameter.ReUserName,
                OpenId        = createOrderParameter.OpenId
            };

            if (!string.IsNullOrEmpty(request.ReUserName))
            {
                request.CheckName = "FORCE_CHECK";
            }
            WxPayToUserResponse response = this.InvokeApiWithCertificateAsync <WxPayToUserRequest, WxPayToUserResponse>(_WxPayToUser, request);

            if (response.IsSuccess)
            {
                CreateWxPayToUserResult result2 = new CreateWxPayToUserResult();
                result2.IsSuccess = true;
                return(result2);
            }
            CreateWxPayToUserResult result3 = new CreateWxPayToUserResult();

            result3.ErrorCode    = response.ErrCode;
            result3.ErrorMessage = response.ReturnMsg;
            return(result3);
        }
Exemple #10
0
        public async void PaySuccessNotificationTest()
        {
            var         config      = new Helper.WeChatConfig();
            string      xml         = @"<xml>
                <appid><![CDATA[wx2421b1c4370ec43b]]></appid>
                <attach><![CDATA[支付测试]]></attach>
                <bank_type><![CDATA[CFT]]></bank_type>
                <fee_type><![CDATA[CNY]]></fee_type>
                <is_subscribe><![CDATA[Y]]></is_subscribe>
                <mch_id><![CDATA[10000100]]></mch_id>
                <nonce_str><![CDATA[5d2b6c2a8db53831f7eda20af46e531c]]></nonce_str>
                <openid><![CDATA[oUpF8uMEb4qRXf22hE3X68TekukE]]></openid>
                <out_trade_no><![CDATA[1409811653]]></out_trade_no>
                <result_code><![CDATA[SUCCESS]]></result_code>
                <return_code><![CDATA[SUCCESS]]></return_code>
                <err_code><![CDATA[SUCCESS]]></err_code>
                <err_code_des><![CDATA[SUCCESS]]></err_code_des>
                <sign><![CDATA[B552ED6B279343CB493C5DD0D78AB241]]></sign>
                <time_end><![CDATA[20140903131540]]></time_end>
                <total_fee>1</total_fee>
                <coupon_fee><![CDATA[10]]></coupon_fee>
                <coupon_count><![CDATA[1]]></coupon_count>
                <coupon_type><![CDATA[CASH]]></coupon_type>
                <coupon_id><![CDATA[10000]]></coupon_id>
                <trade_type><![CDATA[JSAPI]]></trade_type>
                <transaction_id><![CDATA[1004400740201409030005092168]]></transaction_id>
                </xml>";
            XmlDocument xmlDocument = new XmlDocument();

            xmlDocument.LoadXml(xml);
            var signNode = xmlDocument.FirstChild.SelectSingleNode("sign");

            xmlDocument.FirstChild.RemoveChild(signNode);
            string sign = WeChatSignHelper.CreateMd5SignByXml(xmlDocument, config.Value.MerchantSecret);

            xml = xml.Replace("B552ED6B279343CB493C5DD0D78AB241", sign);
            byte[] buffer = Encoding.UTF8.GetBytes(xml);
            Stream stream = new MemoryStream(buffer);

            await new PayNotificationHandler(config.Value.MerchantId, config.Value.MerchantSecret)
            .AddHandler(new UnifiedOrderNotificationHandlerMock())
            .ExecutedAsync(stream);
        }
Exemple #11
0
 private TResponse InvokeApiAsync <TRequest, TResponse>(string url, TRequest request) where TRequest : OBaseRequest where TResponse : OBaseResponse
 {
     using (HttpClient client = new HttpClient())
     {
         request.Sign = WeChatSignHelper.CreateSign <TRequest>(this.m_ApiKey, request);
         StringContent content  = new StringContent(XmlSerializerHelper.GetXmlString <TRequest>(request));
         TResponse     response = XmlSerializerHelper.FromXmlString <TResponse>(client.PostAsync(url, content).Result.Content.ReadAsStringAsync().Result);
         if (!response.IsSuccess)
         {
             response.ReturnMsg = this.GetErrorMessage(response, url);
         }
         else if (!this.ValidateResponse <TResponse>(response))
         {
             response.ResultCode = string.Empty;
             response.ReturnMsg  = "返回结果响应结果不正确";
         }
         return(response);
     }
 }
        /// <summary>
        /// 企业付款到银行卡
        /// </summary>
        /// <param name="parameter"></param>
        /// <returns></returns>
        /// <exception cref="ArgumentNullException"></exception>
        public async Task <PayToBankResponse> PayToBankAsync(PayToBankRequest parameter)
        {
            if (parameter == null)
            {
                throw new ArgumentNullException(nameof(parameter));
            }

            string url = "https://api.mch.weixin.qq.com/mmpaysptrans/pay_bank";

            parameter.MchId = _mchId;
            parameter.Sign  = WeChatSignHelper.CreateMd5Sign(parameter, _secretKey);
            string body   = XmlSerializeHelper.ObjectToXmlString(parameter);
            string result = await _client.ExecutePostRequest(url, new Dictionary <string, string>(),
                                                             body, _path, _password, "xml/text");

            var response = XmlSerializeHelper.StringToObject <PayToBankResponse>(result);

            Check(response);
            return(response);
        }
        public async Task <CancelScanOrderResponse> CancelScanOrderAsync(CancelScanOrderRequest parameter)
        {
            parameter.AppId = _appId;
            parameter.MchId = _mchId;
            if (parameter == null)
            {
                throw new ArgumentNullException(nameof(parameter));
            }
            parameter.Sign = WeChatSignHelper.CreateMd5Sign(parameter, _secretKey);
            string url    = "https://api.mch.weixin.qq.com/secapi/pay/reverse";
            string body   = XmlSerializeHelper.ObjectToXmlString(parameter);
            string result = await _client.ExecutePostRequest(url, new Dictionary <string, string>(),
                                                             body, "xml/text");

            var response = XmlSerializeHelper.StringToObject <CancelScanOrderResponse>(result);

            Check(response);

            return(response);
        }
        /// <summary>
        /// 获取红包发送记录
        /// </summary>
        /// <param name="parameter"></param>
        /// <returns></returns>
        /// <exception cref="ArgumentNullException"></exception>
        public async Task <QuerySendRedPackResponse> GetSendRedPackHistory(
            QuerySendRedPackRequest parameter)
        {
            if (parameter == null)
            {
                throw new ArgumentNullException(nameof(parameter));
            }
            parameter.Sign = WeChatSignHelper.CreateMd5Sign(parameter, _secretKey);

            string url    = "https://api.mch.weixin.qq.com/pay/closeorder";
            string body   = XmlSerializeHelper.ObjectToXmlString(parameter);
            string result = await _client.ExecutePostRequest(url, new Dictionary <string, string>(),
                                                             body, "xml/text");

            var response = XmlSerializeHelper.StringToObject <QuerySendRedPackResponse>(result);

            Check(response);

            return(response);
        }
        public async Task <string> GetPublicKeyAsync()
        {
            string      url         = "https://fraud.mch.weixin.qq.com/risk/getpublickey";
            XmlDocument xmlDocument = new XmlDocument();

            var root      = xmlDocument.CreateElement("xml");
            var idElement = xmlDocument.CreateElement("mch_id");

            idElement.InnerText = _mchId;
            var nonceElement = xmlDocument.CreateElement("nonce_str");

            nonceElement.InnerText = Helper.GetNonceStr(32);
            var signTypeElement = xmlDocument.CreateElement("sign_type");

            signTypeElement.InnerText = "MD5";
            root.AppendChild(idElement);
            root.AppendChild(nonceElement);
            root.AppendChild(signTypeElement);
            xmlDocument.AppendChild(root);

            string sign = WeChatSignHelper.CreateMd5SignByXml(xmlDocument, _secretKey);

            var signElement = xmlDocument.CreateElement("sign");

            signElement.InnerText = sign;
            root.AppendChild(signElement);
            string body = XmlSerializeHelper.XmlToString(xmlDocument);

            var result =
                await _client.ExecutePostRequest(url, new Dictionary <string, string>(), body, _path, _password,
                                                 "xml/text");

            Check(XmlSerializeHelper.StringToObject <PayResponse>(result));

            XmlDocument res = new XmlDocument();

            res.LoadXml(result);


            return(res.FirstChild.SelectSingleNode("pub_key").InnerText);
        }
        /// <summary>
        /// 申请退款
        /// </summary>
        /// <param name="parameter">参数</param>
        /// <returns></returns>
        /// <exception cref="ArgumentNullException">传入的参数是null</exception>
        /// <exception cref="WeChatPayException">调用微信接口失败时返回的错误信息</exception>
        public async Task <RefundOrderResponse> RefundOrder(RefundOrderRequest parameter)
        {
            if (parameter == null)
            {
                throw new ArgumentNullException(nameof(parameter));
            }
            parameter.AppId = _appId;
            parameter.MchId = _mchId;
            parameter.Nonce = Helper.GetNonceStr(32);
            parameter.Sign  = WeChatSignHelper.CreateMd5Sign(parameter, _secretKey);
            string url    = "https://api.mch.weixin.qq.com/pay/closeorder";
            string body   = XmlSerializeHelper.ObjectToXmlString(parameter);
            string result = await _client.ExecutePostRequest(url, new Dictionary <string, string>(),
                                                             body, _path, _password, "xml/text");

            var response = XmlSerializeHelper.StringToObject <RefundOrderResponse>(result);

            Check(response);

            return(response);
        }
Exemple #17
0
        public QueryOrderResult QueryOrderAsync(QueryOrderParameter queryOrderParameter)
        {
            string str;

            if (!this.ValidateParameter <QueryOrderParameter>(queryOrderParameter, out str))
            {
                QueryOrderResult result1 = new QueryOrderResult();
                result1.ErrorMessage = str;
                return(result1);
            }
            OrderQueryRequest request = new OrderQueryRequest
            {
                AppId       = this.m_AppId,
                MerchantId  = queryOrderParameter.MerchantId,
                NonceString = WeChatSignHelper.CreateRandomString(),
                OutTradeNo  = queryOrderParameter.OutTradeNo
            };
            OrderQueryResponse response = this.InvokeApiAsync <OrderQueryRequest, OrderQueryResponse>(_OrderQueryUrl, request);

            if (!response.IsSuccess)
            {
                QueryOrderResult result3 = new QueryOrderResult();
                result3.ErrorCode    = response.ErrCode;
                result3.ErrorMessage = response.ReturnMsg;
                return(result3);
            }
            QueryOrderResult result2 = new QueryOrderResult();

            result2.IsSuccess             = true;
            result2.EndTime               = response.TimeEnd;
            result2.OutTradeNo            = response.OutTradeNo;
            result2.TotalFee              = ((double)response.TotalFee.GetValueOrDefault()) / 100.0;
            result2.TradeState            = (TradeState)Enum.Parse(typeof(TradeState), response.TradeState, true);
            result2.TradeStateDescription = response.TradeStateDesc;
            result2.TransactionId         = response.TransactionId;
            result2.Bank = WeChatBankTypes.GetBank(response.BankType);
            return(result2);
        }
Exemple #18
0
        private TResponse InvokeApiWithCertificateAsync <TRequest, TResponse>(string url, TRequest request) where TRequest : OBaseRequest where TResponse : OBaseResponse
        {
            X509Certificate2 certificate = new X509Certificate2(this.m_CertificatePath, this.m_CertificatePassword, X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.MachineKeySet);
            var handler = new HttpClientHandler
            {
                ClientCertificateOptions = ClientCertificateOption.Manual,
                SslProtocols             = SslProtocols.Tls12,
                ServerCertificateCustomValidationCallback = (x, y, z, m) => true,
            };

            handler.ClientCertificates.Add(certificate);
            using (HttpClient client = new HttpClient(handler))
            {
                request.Sign = WeChatSignHelper.CreateSign <TRequest>(this.m_ApiKey, request);
                StringContent content  = new StringContent(XmlSerializerHelper.GetXmlString <TRequest>(request));
                TResponse     response = XmlSerializerHelper.FromXmlString <TResponse>(client.PostAsync(url, content).Result.Content.ReadAsStringAsync().Result);
                if (!response.IsSuccess)
                {
                    response.ReturnMsg = this.GetErrorMessage(response, url);
                }
                return(response);
            }
        }
Exemple #19
0
        private bool ValidateResponse <T>(T response) where T : OBaseResponse
        {
            string str = WeChatSignHelper.CreateSign <T>(this.m_ApiKey, response);

            return(response.Sign.Equals(str, StringComparison.OrdinalIgnoreCase));
        }