799 lines
34 KiB
C#
799 lines
34 KiB
C#
using APT.Infrastructure.Core;
|
||
using Newtonsoft.Json;
|
||
using System;
|
||
using System.Collections.Generic;
|
||
using System.Diagnostics;
|
||
using System.Diagnostics.Contracts;
|
||
using System.IO;
|
||
using System.Linq;
|
||
using System.Net;
|
||
using System.Net.Http;
|
||
using System.Net.Http.Headers;
|
||
using System.Net.Security;
|
||
using System.Security.Cryptography.X509Certificates;
|
||
using System.Text;
|
||
using System.Text.Json;
|
||
using System.Text.Json.Serialization;
|
||
using System.Threading.Tasks;
|
||
using System.Xml.Linq;
|
||
using APT.Infrastructure.Api;
|
||
|
||
namespace APT.Utility
|
||
{
|
||
public class WeChatPayHelper
|
||
{
|
||
// private static readonly Logger _logger = LogManager.GetCurrentClassLogger();
|
||
|
||
public static WeixinToken GetToken()
|
||
{
|
||
var appId = LibUtils.ToString(ConfigurationManager.WexinSettings["AppId"]).ToString();
|
||
var secret = LibUtils.ToString(ConfigurationManager.WexinSettings["AppSecret"]).ToString();
|
||
var toenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appId + "&secret=" + secret;
|
||
var res = HttpMethods.Get(toenUrl);
|
||
WeixinToken token = JsonConvert.DeserializeObject<WeixinToken>(res);
|
||
if (token == null || !string.IsNullOrEmpty(token.errcode))
|
||
throw new Exception("获取token失败");
|
||
APT.Infrastructure.Api.AppContext.WxToken = token;
|
||
return token;
|
||
}
|
||
public class WxMessageModel
|
||
{
|
||
public string touser { get; set; }
|
||
public string template_id { get; set; }
|
||
public dynamic data { get; set; }
|
||
|
||
}
|
||
|
||
public class WxMessageReturnModel
|
||
{
|
||
public int errcode { get; set; }
|
||
public string errmsg { get; set; }
|
||
|
||
}
|
||
public static int SendWxMessage(string openid, string token, string tmpId, dynamic data)
|
||
{
|
||
var msgUrl = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=" + token;
|
||
var sendObj = new WxMessageModel
|
||
{
|
||
template_id = tmpId,
|
||
touser = openid,
|
||
data = data,
|
||
};
|
||
var sendStr = JsonConvert.SerializeObject(sendObj);
|
||
var returnStr = HttpMethods.Post(msgUrl, sendStr);
|
||
var retObj = JsonConvert.DeserializeObject<WxMessageReturnModel>(returnStr);
|
||
return retObj.errcode;
|
||
}
|
||
|
||
public static PayRequesEntity Unifiedorder(string openid, int totalfee, string orderNo,string orderType, string macId, string wxPaykey)
|
||
{
|
||
//var PayUrl = AppSetting.Load().WechatPayStrings.FirstOrDefault().UnifiedorderURL;
|
||
//获取统一下单参数
|
||
var param = GetUnifiedOrderParam(openid, orderNo, totalfee, orderType, macId, wxPaykey);
|
||
//_logger.Info(() => "微信支付统一下单 发送参数为 " + param + "");
|
||
//统一下单后拿到的xml结果
|
||
|
||
var payResXML = HttpMethods.Post(LibUtils.ToString(ConfigurationManager.WexinSettings["UnifiedorderURL"]).ToString(), param);
|
||
//_logger.Info(() => "微信支付统一下单 返回参数为 " + payResXML + "");
|
||
var payRes = XDocument.Parse(payResXML);
|
||
var root = payRes.Element("xml");
|
||
var res = GetPayRequestParam(root, wxPaykey);
|
||
//_logger.Info(() => "微信支付统一下单 参数实体为 " + JsonConvert.SerializeObject(res) + "");
|
||
return res;
|
||
}
|
||
/// <summary>
|
||
/// 取消订单退款接口
|
||
/// </summary>
|
||
/// <param name="totalfee"></param>
|
||
/// <param name="refundfee"></param>
|
||
/// <param name="orderNo"></param>
|
||
/// <param name="code"></param>
|
||
/// <returns></returns>
|
||
public static bool Cancelorder(int totalfee, int refundfee, string orderNo, string code)
|
||
{
|
||
//var PayUrl = AppSetting.Load().WechatPayStrings.FirstOrDefault().UnifiedorderURL;
|
||
//获取统一下单参数
|
||
var param = GetCancelOrderParam(orderNo, code, totalfee, refundfee);
|
||
//_logger.Info(() => "微信支付统一下单 发送参数为 " + param + "");
|
||
//统一下单后拿到的xml结果
|
||
|
||
var payResXML = HttpMethods.PostByCert(param, LibUtils.ToString(ConfigurationManager.WexinSettings["CancelorderURL"]).ToString(), true, 5);
|
||
//_logger.Info(() => "微信支付统一下单 返回参数为 " + payResXML + "");
|
||
var payRes = XDocument.Parse(payResXML);
|
||
var root = payRes.Element("xml");
|
||
return GetCancelOrderParam(root);
|
||
//_logger.Info(() => "微信支付统一下单 参数实体为 " + JsonConvert.SerializeObject(res) + "");
|
||
}
|
||
/// <summary>
|
||
/// 取消订单退款接口
|
||
/// </summary>
|
||
/// <param name="totalfee"></param>
|
||
/// <param name="refundfee"></param>
|
||
/// <param name="orderNo"></param>
|
||
/// <param name="code"></param>
|
||
/// <returns></returns>
|
||
public static bool CancelorderByTenant(int totalfee, int refundfee, string orderNo, string code, string orderType, string macId, string wxPaykey,string certpath,string certpassword)
|
||
{
|
||
//var PayUrl = AppSetting.Load().WechatPayStrings.FirstOrDefault().UnifiedorderURL;
|
||
//获取统一下单参数
|
||
var param = GetCancelOrderParamByTenant(orderNo, code, totalfee, refundfee ,orderType, macId, wxPaykey);
|
||
//_logger.Info(() => "微信支付统一下单 发送参数为 " + param + "");
|
||
//统一下单后拿到的xml结果
|
||
|
||
var payResXML = HttpMethods.PostByCertByTenant(param,
|
||
LibUtils.ToString(ConfigurationManager.WexinSettings["CancelorderURL"]).ToString(), true, 5, certpath, certpassword);
|
||
//_logger.Info(() => "微信支付统一下单 返回参数为 " + payResXML + "");
|
||
var payRes = XDocument.Parse(payResXML);
|
||
var root = payRes.Element("xml");
|
||
return GetCancelOrderParam(root);
|
||
//_logger.Info(() => "微信支付统一下单 参数实体为 " + JsonConvert.SerializeObject(res) + "");
|
||
}
|
||
/// <summary>
|
||
/// 微信转账到零钱接口
|
||
/// </summary>
|
||
/// <param name="orderNo">单号</param>
|
||
/// <param name="openid">openId</param>
|
||
/// <param name="username">用户名</param>
|
||
/// <param name="fee">金额</param>
|
||
/// <param name="desc">备注</param>
|
||
/// <returns></returns>
|
||
public static bool PayforChange(string orderNo, string openid, string username, int fee, string desc)
|
||
{
|
||
//var PayUrl = AppSetting.Load().WechatPayStrings.FirstOrDefault().UnifiedorderURL;
|
||
//获取统一下单参数
|
||
var param = GetPayforChangeParam(orderNo, openid, username, fee, desc);
|
||
//_logger.Info(() => "微信支付统一下单 发送参数为 " + param + "");
|
||
//统一下单后拿到的xml结果
|
||
|
||
var payResXML = HttpMethods.PostByCert(param, LibUtils.ToString(ConfigurationManager.WexinSettings["PayForChangeUrl"]).ToString(), true, 5);
|
||
//_logger.Info(() => "微信支付统一下单 返回参数为 " + payResXML + "");
|
||
var payRes = XDocument.Parse(payResXML);
|
||
var root = payRes.Element("xml");
|
||
return GetCancelOrderParam(root);
|
||
//_logger.Info(() => "微信支付统一下单 参数实体为 " + JsonConvert.SerializeObject(res) + "");
|
||
}
|
||
|
||
|
||
|
||
/// <summary>
|
||
/// 取统一下单的请求参数
|
||
/// </summary>
|
||
/// <param name="openid"></param>
|
||
/// <returns></returns>
|
||
private static string GetUnifiedOrderParam(string openid, string orderNo, int totalfee, string orderType, string mch_id, string wxPaykey)
|
||
{
|
||
string appid = LibUtils.ToString(ConfigurationManager.WexinSettings["AppId"]);
|
||
string secret = LibUtils.ToString(ConfigurationManager.WexinSettings["AppSecret"]);
|
||
//string mch_id = LibUtils.ToString(ConfigurationManager.WexinSettings["Mch_ID"]);
|
||
|
||
string ip = LibUtils.ToString(ConfigurationManager.WexinSettings["IP"]);
|
||
string PayResulturl = LibUtils.ToString(ConfigurationManager.WexinSettings["WxPayResultUrl"]);
|
||
|
||
string strcode = "充电-下单";////商品描述交易字段格式根据不同的应用场景按照以下格式:APP——需传入应用市场上的APP名字-实际商品名称,天天爱消除-游戏充值。
|
||
byte[] buffer = Encoding.UTF8.GetBytes(strcode);
|
||
string body = Encoding.UTF8.GetString(buffer, 0, buffer.Length);
|
||
System.Random Random = new System.Random();
|
||
var dic = new Dictionary<string, string>
|
||
{
|
||
{"appid", appid},
|
||
{"mch_id", mch_id},
|
||
{"nonce_str", GetRandomString(20)/*Random.Next().ToString()*/},
|
||
{"body",body},
|
||
{"out_trade_no",orderNo+"_"+totalfee+"_" +orderType},//商户自己的订单号码
|
||
{"total_fee",totalfee.ToString()},
|
||
{"spbill_create_ip",ip},//服务器的IP地址
|
||
{"notify_url",PayResulturl},//异步通知的地址,不能带参数
|
||
{"trade_type","JSAPI" },
|
||
{"openid",openid}
|
||
};
|
||
//加入签名
|
||
dic.Add("sign", GetSignStringByTenant(dic,wxPaykey));
|
||
|
||
var sb = new StringBuilder();
|
||
sb.Append("<xml>");
|
||
foreach (var d in dic)
|
||
{
|
||
sb.Append("<" + d.Key + ">" + d.Value + "</" + d.Key + ">");
|
||
}
|
||
sb.Append("</xml>");
|
||
return sb.ToString();
|
||
}
|
||
/// <summary>
|
||
/// 取统一下单的请求参数
|
||
/// </summary>
|
||
/// <param name="openid"></param>
|
||
/// <returns></returns>
|
||
private static string GetCancelOrderParam(string orderNo, string code, int totalfee, int refundfee)
|
||
{
|
||
string appid = LibUtils.ToString(ConfigurationManager.WexinSettings["AppId"]);
|
||
//string secret = LibUtils.ToString(ConfigurationManager.WexinSettings["AppSecret"]);
|
||
string mch_id = LibUtils.ToString(ConfigurationManager.WexinSettings["Mch_ID"]);
|
||
string ip = LibUtils.ToString(ConfigurationManager.WexinSettings["IP"]);
|
||
string WxPayCancelUrl = LibUtils.ToString(ConfigurationManager.WexinSettings["WxPayCancelUrl"]);
|
||
|
||
string strcode = "充电-支付";////商品描述交易字段格式根据不同的应用场景按照以下格式:APP——需传入应用市场上的APP名字-实际商品名称,天天爱消除-游戏充值。
|
||
byte[] buffer = Encoding.UTF8.GetBytes(strcode);
|
||
string body = Encoding.UTF8.GetString(buffer, 0, buffer.Length);
|
||
System.Random Random = new System.Random();
|
||
var dic = new Dictionary<string, string>
|
||
{
|
||
{"appid", appid},
|
||
{"mch_id", mch_id},
|
||
{"nonce_str", GetRandomString(20)/*Random.Next().ToString()*/},
|
||
{"out_trade_no",orderNo+"_"+totalfee},//商户自己的订单号码
|
||
{"out_refund_no",code+"@"+totalfee},//退款单号
|
||
{"total_fee",totalfee.ToString()},
|
||
{"refund_fee", refundfee.ToString()},//退款金额
|
||
{ "notify_url",WxPayCancelUrl},//异步通知的地址,不能带参数
|
||
};
|
||
//加入签名
|
||
dic.Add("sign", GetSignString(dic));
|
||
|
||
var sb = new StringBuilder();
|
||
sb.Append("<xml>");
|
||
foreach (var d in dic)
|
||
{
|
||
sb.Append("<" + d.Key + ">" + d.Value + "</" + d.Key + ">");
|
||
}
|
||
sb.Append("</xml>");
|
||
return sb.ToString();
|
||
}
|
||
private static string GetCancelOrderParamByTenant(string orderNo, string code, int totalfee, int refundfee , string orderType, string mch_id, string wxPaykey)
|
||
{
|
||
string appid = LibUtils.ToString(ConfigurationManager.WexinSettings["AppId"]);
|
||
//string secret = LibUtils.ToString(ConfigurationManager.WexinSettings["AppSecret"]);
|
||
//string mch_id = LibUtils.ToString(ConfigurationManager.WexinSettings["Mch_ID"]);
|
||
string ip = LibUtils.ToString(ConfigurationManager.WexinSettings["IP"]);
|
||
string WxPayCancelUrl = LibUtils.ToString(ConfigurationManager.WexinSettings["WxPayCancelUrl"]);
|
||
|
||
string strcode = "充电-支付";////商品描述交易字段格式根据不同的应用场景按照以下格式:APP——需传入应用市场上的APP名字-实际商品名称,天天爱消除-游戏充值。
|
||
byte[] buffer = Encoding.UTF8.GetBytes(strcode);
|
||
string body = Encoding.UTF8.GetString(buffer, 0, buffer.Length);
|
||
System.Random Random = new System.Random();
|
||
var dic = new Dictionary<string, string>
|
||
{
|
||
{"appid", appid},
|
||
{"mch_id", mch_id},
|
||
{"nonce_str", GetRandomString(20)/*Random.Next().ToString()*/},
|
||
{"out_trade_no",orderNo+"_"+totalfee+"_"+orderType},//商户自己的订单号码
|
||
{"out_refund_no",code+"@"+totalfee},//退款单号
|
||
{"total_fee",totalfee.ToString()},
|
||
{"refund_fee", refundfee.ToString()},//退款金额
|
||
{ "notify_url",WxPayCancelUrl},//异步通知的地址,不能带参数
|
||
};
|
||
//加入签名
|
||
dic.Add("sign", GetSignStringByTenant(dic, wxPaykey));
|
||
|
||
var sb = new StringBuilder();
|
||
sb.Append("<xml>");
|
||
foreach (var d in dic)
|
||
{
|
||
sb.Append("<" + d.Key + ">" + d.Value + "</" + d.Key + ">");
|
||
}
|
||
sb.Append("</xml>");
|
||
return sb.ToString();
|
||
}
|
||
/// <summary>
|
||
/// 取统一下单的请求参数
|
||
/// </summary>
|
||
/// <param name="openid"></param>
|
||
/// <returns></returns>
|
||
private static string GetPayforChangeParam(string orderNo, string openid, string username, int fee, string desc)
|
||
{
|
||
string appid = LibUtils.ToString(ConfigurationManager.WexinSettings["AppId"]);
|
||
//string secret = LibUtils.ToString(ConfigurationManager.AppSettings["AppSecret"]);
|
||
string mch_id = LibUtils.ToString(ConfigurationManager.WexinSettings["Mch_ID"]);
|
||
|
||
|
||
|
||
System.Random Random = new System.Random();
|
||
var dic = new Dictionary<string, string>
|
||
{
|
||
{"mch_appid", appid},
|
||
{"mchid", mch_id},
|
||
{"nonce_str", GetRandomString(20)/*Random.Next().ToString()*/},
|
||
{"partner_trade_no",orderNo},//提现的订单号
|
||
{"openid",openid},
|
||
{"check_name","NO_CHECK"},//校验姓名:FORCE_CHECK,NO_CHECK:不校验
|
||
{"re_user_name",username},//用户姓名
|
||
{"amount", fee.ToString()},//退款金额
|
||
{ "desc",desc},//异步通知的地址,不能带参数
|
||
};
|
||
//加入签名
|
||
dic.Add("sign", GetSignString(dic));
|
||
|
||
var sb = new StringBuilder();
|
||
sb.Append("<xml>");
|
||
foreach (var d in dic)
|
||
{
|
||
sb.Append("<" + d.Key + ">" + d.Value + "</" + d.Key + ">");
|
||
}
|
||
sb.Append("</xml>");
|
||
return sb.ToString();
|
||
}
|
||
|
||
|
||
/// <summary>
|
||
/// 获取返回给小程序的支付参数
|
||
/// </summary>
|
||
/// <param name="root"></param>
|
||
/// <param name="appid"></param>
|
||
/// <param name="key"></param>
|
||
/// <returns></returns>
|
||
private static PayRequesEntity GetPayRequestParam(XElement root, string wxPaykey)
|
||
{
|
||
string appid = LibUtils.ToString(ConfigurationManager.WexinSettings["AppId"]);
|
||
//当return_code 和result_code都为SUCCESS时才有我们要的prepay_id
|
||
if (root.Element("return_code").Value == "SUCCESS" && root.Element("result_code").Value == "SUCCESS")
|
||
{
|
||
var res = new Dictionary<string, string>
|
||
{
|
||
{"appId", appid},
|
||
{"timeStamp", Convert.ToInt64((DateTime.Now - new DateTime(1970, 1, 1)).TotalSeconds).ToString()},
|
||
{"nonceStr", GetRandomString(20)},
|
||
{"package", "prepay_id=" + root.Element("prepay_id").Value},
|
||
{"signType", "MD5"}
|
||
};
|
||
//在服务器上签名
|
||
res.Add("paySign", GetSignStringByTenant(res, wxPaykey));
|
||
|
||
var payEntity = new PayRequesEntity
|
||
{
|
||
package = res["package"],
|
||
nonceStr = res["nonceStr"],
|
||
paySign = res["paySign"],
|
||
signType = res["signType"],
|
||
timeStamp = res["timeStamp"]
|
||
};
|
||
return payEntity;
|
||
}
|
||
else
|
||
{
|
||
throw new Exception("微信返回错误:" + root.Element("err_code_des").Value);
|
||
}
|
||
|
||
return new PayRequesEntity();
|
||
}
|
||
/// <summary>
|
||
/// 取消订单退款接口
|
||
/// </summary>
|
||
/// <param name="root"></param>
|
||
/// <returns></returns>
|
||
private static bool GetCancelOrderParam(XElement root)
|
||
{
|
||
string appid = LibUtils.ToString(ConfigurationManager.WexinSettings["AppId"]);
|
||
//当return_code 和result_code都为SUCCESS时才有我们要的prepay_id
|
||
if (root.Element("return_code").Value == "SUCCESS" && root.Element("result_code").Value == "SUCCESS")
|
||
{
|
||
|
||
return true;
|
||
}
|
||
else
|
||
{
|
||
throw new Exception("微信返回错误:" + root.ToString());
|
||
}
|
||
|
||
}
|
||
|
||
/// <summary>
|
||
/// 从字符串里随机得到,规定个数的字符串.
|
||
/// </summary>
|
||
/// <param name="allChar"></param>
|
||
/// <param name="CodeCount"></param>
|
||
/// <returns></returns>
|
||
private static string GetRandomString(int CodeCount)
|
||
{
|
||
string allChar = "1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,i,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z";
|
||
string[] allCharArray = allChar.Split(',');
|
||
string RandomCode = "";
|
||
int temp = -1;
|
||
Random rand = new Random();
|
||
for (int i = 0; i < CodeCount; i++)
|
||
{
|
||
if (temp != -1)
|
||
{
|
||
rand = new Random(temp * i * ((int)DateTime.Now.Ticks));
|
||
}
|
||
int t = rand.Next(allCharArray.Length - 1);
|
||
while (temp == t)
|
||
{
|
||
t = rand.Next(allCharArray.Length - 1);
|
||
}
|
||
temp = t;
|
||
RandomCode += allCharArray[t];
|
||
}
|
||
|
||
return RandomCode;
|
||
}
|
||
|
||
|
||
private static string GetSignString(Dictionary<string, string> dic)
|
||
{
|
||
string key = LibUtils.ToString(ConfigurationManager.WexinSettings["WxPayKey"]);//商户平台 API安全里面设置的KEY 32位长度
|
||
dic = dic.OrderBy(d => d.Key).ToDictionary(d => d.Key, d => d.Value);//排序
|
||
//连接字段
|
||
var sign = dic.Aggregate("", (current, d) => current + (d.Key + "=" + d.Value + "&"));
|
||
sign += "key=" + key;
|
||
System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create();
|
||
sign = BitConverter.ToString(md5.ComputeHash(Encoding.UTF8.GetBytes(sign))).Replace("-", null);
|
||
return sign;
|
||
}
|
||
/// <summary>
|
||
/// 运营商Key
|
||
/// </summary>
|
||
/// <param name="dic"></param>
|
||
/// <returns></returns>
|
||
private static string GetSignStringByTenant(Dictionary<string, string> dic,string key)
|
||
{
|
||
//string key = LibUtils.ToString(ConfigurationManager.WexinSettings["WxPayKey"]);//商户平台 API安全里面设置的KEY 32位长度
|
||
dic = dic.OrderBy(d => d.Key).ToDictionary(d => d.Key, d => d.Value);//排序
|
||
//连接字段
|
||
var sign = dic.Aggregate("", (current, d) => current + (d.Key + "=" + d.Value + "&"));
|
||
sign += "key=" + key;
|
||
System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create();
|
||
sign = BitConverter.ToString(md5.ComputeHash(Encoding.UTF8.GetBytes(sign))).Replace("-", null);
|
||
return sign;
|
||
}
|
||
|
||
|
||
private static Object PostUnifiedOrder(string payUrl, string para)
|
||
{
|
||
string result = string.Empty;
|
||
try
|
||
{
|
||
HttpClient client = new HttpClient();
|
||
HttpContent httpContent = new StringContent(para);
|
||
httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");
|
||
httpContent.Headers.ContentType.CharSet = "utf-8";
|
||
HttpResponseMessage hrm = client.PostAsync(payUrl, httpContent).Result;
|
||
return hrm;
|
||
}
|
||
catch (Exception e)
|
||
{
|
||
result = e.Message;
|
||
}
|
||
return result;
|
||
}
|
||
}
|
||
public class PayRequesEntity
|
||
{
|
||
/// <summary>
|
||
/// 时间戳从1970年1月1日00:00:00至今的秒数,即当前的时间
|
||
/// </summary>
|
||
public string timeStamp { get; set; }
|
||
|
||
/// <summary>
|
||
/// 随机字符串,长度为32个字符以下。
|
||
/// </summary>
|
||
public string nonceStr { get; set; }
|
||
|
||
/// <summary>
|
||
/// 统一下单接口返回的 prepay_id 参数值
|
||
/// </summary>
|
||
public string package { get; set; }
|
||
|
||
/// <summary>
|
||
/// 签名算法
|
||
/// </summary>
|
||
public string signType { get; set; }
|
||
|
||
/// <summary>
|
||
/// 签名
|
||
/// </summary>
|
||
public string paySign { get; set; }
|
||
|
||
public dynamic order { get; set; }
|
||
}
|
||
|
||
/// <summary>
|
||
/// Http方法
|
||
/// </summary>
|
||
public class HttpMethods
|
||
{
|
||
/// <summary>
|
||
/// 创建HttpClient
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
public static HttpClient CreateHttpClient(string url, IDictionary<string, string> cookies = null)
|
||
{
|
||
HttpClient httpclient;
|
||
HttpClientHandler handler = new HttpClientHandler();
|
||
var uri = new Uri(url);
|
||
if (cookies != null)
|
||
{
|
||
foreach (var key in cookies.Keys)
|
||
{
|
||
string one = key + "=" + cookies[key];
|
||
handler.CookieContainer.SetCookies(uri, one);
|
||
}
|
||
}
|
||
//如果是发送HTTPS请求
|
||
if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
|
||
{
|
||
ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true;
|
||
httpclient = new HttpClient(handler);
|
||
}
|
||
else
|
||
{
|
||
httpclient = new HttpClient(handler);
|
||
}
|
||
return httpclient;
|
||
}
|
||
|
||
|
||
#region 同步请求
|
||
|
||
/// <summary>
|
||
/// post 请求
|
||
/// </summary>
|
||
/// <param name="url">请求地址</param>
|
||
/// <param name="jsonData">请求参数</param>
|
||
/// <returns></returns>
|
||
public static string Post(string url, string jsonData)
|
||
{
|
||
HttpClient httpClient = CreateHttpClient(url);
|
||
var postData = new StringContent(jsonData);
|
||
postData.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json");
|
||
Task<string> result = httpClient.PostAsync(url, postData).Result.Content.ReadAsStringAsync();
|
||
return result.Result;
|
||
}
|
||
public static string PostByCert(string xml, string url, bool isUseCert, int timeout)
|
||
{
|
||
System.GC.Collect();//垃圾回收,回收没有正常关闭的http连接
|
||
|
||
string result = "";//返回结果
|
||
|
||
HttpWebRequest request = null;
|
||
HttpWebResponse response = null;
|
||
Stream reqStream = null;
|
||
|
||
try
|
||
{
|
||
//设置最大连接数
|
||
ServicePointManager.DefaultConnectionLimit = 200;
|
||
//设置https验证方式
|
||
if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
|
||
{
|
||
ServicePointManager.ServerCertificateValidationCallback =
|
||
new RemoteCertificateValidationCallback(CheckValidationResult);
|
||
}
|
||
|
||
/***************************************************************
|
||
* 下面设置HttpWebRequest的相关属性
|
||
* ************************************************************/
|
||
request = (HttpWebRequest)WebRequest.Create(url);
|
||
//request.UserAgent = USER_AGENT;
|
||
request.Method = "POST";
|
||
request.Timeout = timeout * 1000;
|
||
|
||
//设置POST的数据类型和长度
|
||
request.ContentType = "text/xml";
|
||
byte[] data = System.Text.Encoding.UTF8.GetBytes(xml);
|
||
request.ContentLength = data.Length;
|
||
|
||
//是否使用证书
|
||
if (isUseCert)
|
||
{
|
||
X509Certificate2 cert = new X509Certificate2(LibUtils.ToString(ConfigurationManager.WexinSettings["CertPath"]),
|
||
LibUtils.ToString(ConfigurationManager.WexinSettings["CertPassword"]));
|
||
request.ClientCertificates.Add(cert);
|
||
}
|
||
|
||
//往服务器写入数据
|
||
reqStream = request.GetRequestStream();
|
||
reqStream.Write(data, 0, data.Length);
|
||
reqStream.Close();
|
||
|
||
//获取服务端返回
|
||
response = (HttpWebResponse)request.GetResponse();
|
||
|
||
//获取服务端返回数据
|
||
StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
|
||
result = sr.ReadToEnd().Trim();
|
||
sr.Close();
|
||
}
|
||
catch (System.Threading.ThreadAbortException e)
|
||
{
|
||
System.Threading.Thread.ResetAbort();
|
||
}
|
||
catch (Exception e)
|
||
{
|
||
throw new Exception(e.Message);
|
||
}
|
||
finally
|
||
{
|
||
//关闭连接和流
|
||
if (response != null)
|
||
{
|
||
response.Close();
|
||
}
|
||
if (request != null)
|
||
{
|
||
request.Abort();
|
||
}
|
||
}
|
||
return result;
|
||
}
|
||
public static string PostByCertByTenant(string xml, string url, bool isUseCert, int timeout, string certpath, string certpassword)
|
||
{
|
||
System.GC.Collect();//垃圾回收,回收没有正常关闭的http连接
|
||
|
||
string result = "";//返回结果
|
||
|
||
HttpWebRequest request = null;
|
||
HttpWebResponse response = null;
|
||
Stream reqStream = null;
|
||
|
||
try
|
||
{
|
||
//设置最大连接数
|
||
ServicePointManager.DefaultConnectionLimit = 200;
|
||
//设置https验证方式
|
||
if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
|
||
{
|
||
ServicePointManager.ServerCertificateValidationCallback =
|
||
new RemoteCertificateValidationCallback(CheckValidationResult);
|
||
}
|
||
|
||
/***************************************************************
|
||
* 下面设置HttpWebRequest的相关属性
|
||
* ************************************************************/
|
||
request = (HttpWebRequest)WebRequest.Create(url);
|
||
//request.UserAgent = USER_AGENT;
|
||
request.Method = "POST";
|
||
request.Timeout = timeout * 1000;
|
||
|
||
//设置POST的数据类型和长度
|
||
request.ContentType = "text/xml";
|
||
byte[] data = System.Text.Encoding.UTF8.GetBytes(xml);
|
||
request.ContentLength = data.Length;
|
||
|
||
//是否使用证书
|
||
if (isUseCert)
|
||
{
|
||
X509Certificate2 cert = new X509Certificate2(certpath,certpassword);
|
||
request.ClientCertificates.Add(cert);
|
||
}
|
||
|
||
//往服务器写入数据
|
||
reqStream = request.GetRequestStream();
|
||
reqStream.Write(data, 0, data.Length);
|
||
reqStream.Close();
|
||
|
||
//获取服务端返回
|
||
response = (HttpWebResponse)request.GetResponse();
|
||
|
||
//获取服务端返回数据
|
||
StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
|
||
result = sr.ReadToEnd().Trim();
|
||
sr.Close();
|
||
}
|
||
catch (System.Threading.ThreadAbortException e)
|
||
{
|
||
System.Threading.Thread.ResetAbort();
|
||
}
|
||
catch (Exception e)
|
||
{
|
||
throw new Exception(e.Message);
|
||
}
|
||
finally
|
||
{
|
||
//关闭连接和流
|
||
if (response != null)
|
||
{
|
||
response.Close();
|
||
}
|
||
if (request != null)
|
||
{
|
||
request.Abort();
|
||
}
|
||
}
|
||
return result;
|
||
}
|
||
private static bool CheckValidationResult(object sender,
|
||
X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
|
||
{
|
||
if (errors == SslPolicyErrors.None)
|
||
return true;
|
||
return false;
|
||
}
|
||
|
||
/// <summary>
|
||
/// post 请求
|
||
/// </summary>
|
||
/// <param name="url">请求地址</param>
|
||
/// <param name="req">请求参数</param>
|
||
/// <returns></returns>
|
||
public static string Post(string url, byte[] req)
|
||
{
|
||
HttpClient httpClient = CreateHttpClient(url);
|
||
var postData = new ByteArrayContent(req);
|
||
Task<string> result = httpClient.PostAsync(url, postData).Result.Content.ReadAsStringAsync();
|
||
return result.Result;
|
||
}
|
||
/// <summary>
|
||
/// post 请求
|
||
/// </summary>
|
||
/// <param name="url">请求地址</param>
|
||
/// <param name="pairs">请求参数</param>
|
||
/// <returns></returns>
|
||
public static string Post(string url, Dictionary<string, string> pairs)
|
||
{
|
||
HttpClient httpClient = CreateHttpClient(url);
|
||
var postData = new FormUrlEncodedContent(pairs);
|
||
var result = httpClient.PostAsync(url, postData).Result.Content.ReadAsStringAsync();
|
||
return result.Result;
|
||
|
||
}
|
||
/// <summary>
|
||
/// get 请求
|
||
/// </summary>
|
||
/// <param name="url">请求地址</param>
|
||
/// <returns></returns>
|
||
public static string Get(string url)
|
||
{
|
||
HttpClient httpClient = CreateHttpClient(url);
|
||
Task<string> result = httpClient.GetAsync(url).Result.Content.ReadAsStringAsync();
|
||
return result.Result;
|
||
}
|
||
|
||
#endregion
|
||
|
||
#region 异步请求
|
||
/// <summary>
|
||
/// post 请求
|
||
/// </summary>
|
||
/// <param name="url">请求地址</param>
|
||
/// <param name="jsonData">请求参数</param>
|
||
/// <returns></returns>
|
||
public static Task<HttpResponseMessage> PostAsync(string url, string jsonData)
|
||
{
|
||
HttpClient httpClient = CreateHttpClient(url);
|
||
var postData = new StringContent(jsonData);
|
||
postData.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json");
|
||
var result = httpClient.PostAsync(url, postData);
|
||
return result;
|
||
}
|
||
/// <summary>
|
||
/// post 请求
|
||
/// </summary>
|
||
/// <param name="url">请求地址</param>
|
||
/// <param name="req">请求参数</param>
|
||
/// <returns></returns>
|
||
public static Task<HttpResponseMessage> PostAsync(string url, byte[] req)
|
||
{
|
||
HttpClient httpClient = CreateHttpClient(url);
|
||
var postData = new ByteArrayContent(req);
|
||
var result = httpClient.PostAsync(url, postData);
|
||
return result;
|
||
}
|
||
/// <summary>
|
||
/// post 请求
|
||
/// </summary>
|
||
/// <param name="url">请求地址</param>
|
||
/// <param name="pairs">请求参数</param>
|
||
/// <returns></returns>
|
||
public static Task<HttpResponseMessage> PostAsync(string url, Dictionary<string, string> pairs)
|
||
{
|
||
HttpClient httpClient = CreateHttpClient(url);
|
||
var postData = new FormUrlEncodedContent(pairs);
|
||
var result = httpClient.PostAsync(url, postData);
|
||
return result;
|
||
}
|
||
|
||
/// <summary>
|
||
/// get 请求
|
||
/// </summary>
|
||
/// <param name="url">请求地址</param>
|
||
/// <returns></returns>
|
||
public static Task<HttpResponseMessage> GetAsync(string url)
|
||
{
|
||
HttpClient httpClient = CreateHttpClient(url);
|
||
var result = httpClient.GetAsync(url);
|
||
return result;
|
||
}
|
||
#endregion
|
||
|
||
}
|
||
}
|