using Newtonsoft.Json; using POSV.Payment.AllinPay.Enums; using POSV.Payment.AllinPay.Models; using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Net; using System.Text; namespace POSV.Payment.AllinPay { public class AllinpayLib { private static NLog.Logger logger = NLog.LogManager.GetLogger("POSV.Payment.AllinPay"); public static void WriteLog(LogTagType tag, string content) { logger.Warn($"[{tag.ToString()}]:{content}"); } internal static Random Random = new Random(); //测试用 //public static string AppId { get; set; } = "1293840404734611458"; //正式用 public static string AppId { get; set; } = "1668228235653623810"; ////测试用 //public static string AppKey { get; set; } = "eaa59d04162548d581526ef6a81bc8a8"; //正式用 public static string AppKey { get; set; } = "ec684c893a42467a866cc78aad0b7a97"; ///// ///// 平台接口地址 ///// 测试环境 ///// //public static string Url { get; set; } = "https://zhttest.sxallinpay.com/prod-api/yunshangtong/openApi/gateway"; /// /// 平台接口地址 /// 正式环境 /// public static string Url { get; set; } = "https://zht.sxallinpay.com/prod-api/yunshangtong/openApi/gateway"; /// /// 商户号 /// 锦祥店通联商户号:563162058142J5Y /// 美耀通联商户号:56216205814X69H /// 艳斌通联商户号:56216205814TS2P /// public static string VspCusid { get; set; } = "56216205814X69H"; //测试用 //public static string VspCusid { get; set; } = "990161054116000"; /// /// 商户系统用户标识,商户系统中唯一编号。 /// 大同市平城区开闻快餐店(锦祥店) bizUserId:ZHTQY_OUT16890697512466994 /// 大同市平城区美耀快餐店 bizUserId:ZHTQY_OUT16916554874517117 终端号:13330966 /// 大同市平城区艳斌餐馆 bizUserId:ZHTQY_OUT16916549249000154 终端号:13301797 /// ZHTQY_OUT16916549249000154 /// ZHTQY_OUT16916549249000154 /// public static string BizUserId { get; set; } = "ZHTQY_OUT16916554874517117"; //测试用 //public static string BizUserId { get; set; } = "ZHTQY_OUT16895858764912934"; /// /// 付款账号 /// 通联平台业务参数,可有平台申请会员并分配给门店或统一使用。 /// public static string Payuserid { get; set; } = "ZHTGR_OUT16890642002687211"; //测试用 //public static string Payuserid { get; set; } = "ZHTQY_OUT16805986184591273"; /// /// 签名(非必须参数,没有值不参与签名) /// /// /// internal static string GetSign(Dictionary dict) { //var secret = AppSecret; //var sign = secret + dict.Where(p => p.Value.IsNotNullAndWhiteSpace()).OrderBy(p => p.Key).Select(p => p.Key + p.Value).StringJoin(string.Empty) + secret; //var sign = dict.Where(p => p.Value.IsNotNullAndWhiteSpace()).OrderBy(p => p.Key).Select(p => p.Key + "=" + p.Value).StringJoin("&"); var sign = getParamSrc(dict); Log("signStr:" + sign); return sign.ToMD5(1).ToUpper(); } public static string getParamSrc(Dictionary paramsMap) { var vDic = (from objDic in paramsMap.Where(p => p.Value.IsNotNullAndWhiteSpace()) orderby objDic.Key ascending select objDic); StringBuilder str = new StringBuilder(); foreach (KeyValuePair kv in vDic) { string pkey = kv.Key; string pvalue = kv.Value; str.Append(pkey + "=" + pvalue + "&"); } string result = str.ToString().Substring(0, str.ToString().Length - 1); return result; } [Conditional("DEBUG")] internal static void Log(object obj) { Console.WriteLine(JsonConvert.SerializeObject(obj)); } internal static TResult Request(TRequest request, Stopwatch watch = null) where TRequest : BaseParamInfo { var _method = "NULL"; var res = ""; try { if (watch == null) { watch = Stopwatch.StartNew(); } //request.format = "json"; var dict = request.GetParamDict(); _method = dict["method"]; var sign = GetSign(dict); Log("sing md5:" + sign); request.sign = sign; dict.Add("sign", sign); res = Request(dict.Select(p => p.Key + "=" + p.Value.UrlEncode()).StringJoin("&"), request.HttpMethod); //Log("request result:" + res); //logger.Info($"请求结果<{_method}>:{res}"); StringBuilder str = new StringBuilder(); str.Append("{\"response\":"); str.Append(res); str.Append("}"); var t1 = str.ToString().ToDeserialize(); return t1; } catch (Exception ex) { //Log("request erroe:" + ex.Message); logger.Error(ex, $"请求结果<{_method}>:发生错误,{ex.Message}"); throw new Exception($"请求结果<{_method}>:发生错误"); } finally { logger.Info($"请求结果<{_method}>:{res},耗时<{watch.ElapsedMilliseconds}>毫秒"); } } /// /// 发起请求 /// /// /// private static string Request(string data, string method) { var urlReq = Url + "?" + data; //WriteLog(LogTagType.RequestParams, urlReq); try { var content = !string.Equals(method, "post", StringComparison.OrdinalIgnoreCase) ? HttpGet(urlReq) : HttpPost(Url, data); //WriteLog(LogTagType.ResultContent, content); return content; } catch (Exception ex) { logger.Error(ex, $"{method}请求发生错误,{ex.Message}"); throw ex; } } private static string HttpGet(string url) { using (var webClient = new WebClient()) { webClient.Encoding = Encoding.UTF8; return webClient.DownloadString(url); } } private static string HttpPost(string url, string param) { string result = ""; HttpWebRequest request = null; if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase)) { ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072; ServicePointManager.ServerCertificateValidationCallback = delegate { return true; }; ServicePointManager.CheckCertificateRevocationList = false; ServicePointManager.DefaultConnectionLimit = 512; ServicePointManager.Expect100Continue = false; request = WebRequest.Create(url) as HttpWebRequest; request.ProtocolVersion = HttpVersion.Version10; } else { request = WebRequest.Create(url) as HttpWebRequest; } request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded;charset=UTF-8"; request.Referer = null; request.AllowAutoRedirect = true; request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36"; request.Accept = "application/json, text/plain, */*"; request.Timeout = 5000 * 10; #region 添加Post 参数 byte[] data = Encoding.UTF8.GetBytes(param); request.ContentLength = data.Length; using (Stream reqStream = request.GetRequestStream()) { reqStream.Write(data, 0, data.Length); reqStream.Close(); } #endregion HttpWebResponse resp = (HttpWebResponse)request.GetResponse(); Stream stream = resp.GetResponseStream(); //获取响应内容 using (StreamReader reader = new StreamReader(stream, Encoding.UTF8)) { result = reader.ReadToEnd(); } resp.Close(); return result; //using (var webClient = new WebClient()) //{ // webClient.Encoding = Encoding.UTF8; // webClient.Headers.Add("Content-Type", "application/x-www-form-urlencoded"); // string reply = webClient.UploadString(url, param); // return reply; //} } } }