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