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#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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