2023-08-01 11:45:10 +08:00

120 lines
4.5 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using Infrastructure;
using Infrastructure.Extensions;
using Newtonsoft.Json;
using System;
using System.Security.Cryptography;
using System.Text;
using ZR.Common.Model;
namespace ZR.Common
{
public class WxHelper
{
private static readonly string GetTokenUrl = "https://api.weixin.qq.com/cgi-bin/token";
private static readonly string GetTicketUrl = "https://api.weixin.qq.com/cgi-bin/ticket/getticket";
private static readonly string AppID = AppSettings.App(new string[] { "WxOpen", "AppID" });
private static readonly string AppSECRET = AppSettings.App(new string[] { "WxOpen", "AppSecret" });
/// <summary>
/// 获取访问token
/// </summary>
/// <returns>
/// {"errcode":0,"errmsg":"ok","access_token":"iCbcfE1OjfRhV0_io-CzqTNC0lnrudeW3oF5rhJKfmINaxLClLa1FoqAY_wEXtodYh_DTnrtAwZfzeb-NRXvwiOoqUTHx3i6QKLYcfBtF8y-xd5mvaeaf3e9mvTAPhmX0lkm1cLTwRLmoa1IwzgQ-QZEZcuIcntWdEMGseVYok3BwCGpC87bt6nNdgnekZdFVRp1uuaxoctDGlXpoQlQsA","expires_in":7200}
/// </returns>
private static WxTokenResult GetAccessToken()
{
if (AppID.IsEmpty() || AppSECRET.IsEmpty())
{
Console.WriteLine("公众号配置错误");
throw new ArgumentException("公众号配置错误");
};
var Ck = "wx_token";
string getTokenUrl = $"{GetTokenUrl}?grant_type=client_credential&appid={AppID}&secret={AppSECRET}";
if (CacheHelper.Get(Ck) is WxTokenResult tokenResult)
{
return tokenResult;
}
else
{
string result = HttpHelper.HttpGet(getTokenUrl);
tokenResult = JsonConvert.DeserializeObject<WxTokenResult>(result);
if (tokenResult?.errcode == 0)
{
CacheHelper.SetCache(Ck, tokenResult, 110);
}
else
{
Console.WriteLine("GetAccessToken失败,结果=" + result);
throw new Exception("获取AccessToken失败");
}
}
return tokenResult;
}
/// <summary>
/// 获取ticket
/// </summary>
/// <returns></returns>
public static WxTokenResult GetTicket()
{
WxTokenResult token = GetAccessToken();
string ticket = token?.access_token;
var Ck = "wx_ticket";
string getTokenUrl = $"{GetTicketUrl}?access_token={ticket}&type=jsapi";
if (CacheHelper.Get(Ck) is WxTokenResult tokenResult)
{
return tokenResult;
}
else
{
string result = HttpHelper.HttpGet(getTokenUrl);
tokenResult = JsonConvert.DeserializeObject<WxTokenResult>(result);
if (tokenResult?.errcode == 0)
{
CacheHelper.SetCache(Ck, tokenResult, 110);
}
else
{
Console.WriteLine("GetTicket结果=" + result);
throw new Exception("获取ticket失败");
}
}
return tokenResult;
}
/// <summary>
/// 返回正确的签名
/// </summary>
/// <param name="jsapi_ticket"></param>
/// <param name="timestamp"></param>
/// <param name="noncestr"></param>
/// <param name="url"></param>
/// <returns></returns>
public static string GetSignature(string jsapi_ticket, string timestamp, string noncestr, string url = null)
{
if (string.IsNullOrEmpty(jsapi_ticket) || string.IsNullOrEmpty(noncestr) || string.IsNullOrEmpty(timestamp) || string.IsNullOrEmpty(url))
return null;
//将字段添加到列表中。
string[] arr = new[]
{
string.Format("jsapi_ticket={0}",jsapi_ticket),
string.Format("noncestr={0}",noncestr),
string.Format("timestamp={0}",timestamp),
string.Format("url={0}",url)
};
//字典排序
Array.Sort(arr);
//使用URL键值对的格式拼接成字符串
var temp = string.Join("&", arr);
var sha1Arr = SHA1.HashData(Encoding.UTF8.GetBytes(temp));
return BitConverter.ToString(sha1Arr).Replace("-", "").ToLower();
}
}
}