/// <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)); }
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); }
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); }
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); }
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); }
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); }
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); }
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); } }
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)); }