You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

249 lines
9.3 KiB
C#

9 months ago
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";
///// <summary>
///// 平台接口地址
///// 测试环境
///// </summary>
//public static string Url { get; set; } = "https://zhttest.sxallinpay.com/prod-api/yunshangtong/openApi/gateway";
/// <summary>
/// 平台接口地址
/// 正式环境
/// </summary>
public static string Url { get; set; } = "https://zht.sxallinpay.com/prod-api/yunshangtong/openApi/gateway";
/// <summary>
/// 商户号
/// 锦祥店通联商户号563162058142J5Y
/// 美耀通联商户号56216205814X69H
/// 艳斌通联商户号56216205814TS2P
/// </summary>
public static string VspCusid { get; set; } = "56216205814X69H";
//测试用
//public static string VspCusid { get; set; } = "990161054116000";
/// <summary>
/// 商户系统用户标识,商户系统中唯一编号。
/// 大同市平城区开闻快餐店(锦祥店) bizUserId:ZHTQY_OUT16890697512466994
/// 大同市平城区美耀快餐店 bizUserId:ZHTQY_OUT16916554874517117 终端号13330966
/// 大同市平城区艳斌餐馆 bizUserId:ZHTQY_OUT16916549249000154 终端号13301797
/// ZHTQY_OUT16916549249000154
/// ZHTQY_OUT16916549249000154
/// </summary>
public static string BizUserId { get; set; } = "ZHTQY_OUT16916554874517117";
//测试用
//public static string BizUserId { get; set; } = "ZHTQY_OUT16895858764912934";
/// <summary>
/// 付款账号
/// 通联平台业务参数,可有平台申请会员并分配给门店或统一使用。
/// </summary>
public static string Payuserid { get; set; } = "ZHTGR_OUT16890642002687211";
//测试用
//public static string Payuserid { get; set; } = "ZHTQY_OUT16805986184591273";
/// <summary>
/// 签名(非必须参数,没有值不参与签名)
/// </summary>
/// <param name="dict"></param>
/// <returns></returns>
internal static string GetSign(Dictionary<string, string> 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<string, string> paramsMap)
{
var vDic = (from objDic in paramsMap.Where(p => p.Value.IsNotNullAndWhiteSpace()) orderby objDic.Key ascending select objDic);
StringBuilder str = new StringBuilder();
foreach (KeyValuePair<string, string> 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, TResult>(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<TResult>();
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}>毫秒");
}
}
/// <summary>
/// 发起请求
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
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;
//}
}
}
}