[Skip]
[Route("api/[controller]/[action]")]
[ApiController]
public class WxShareController : ControllerBase
{
[EnableCors("ShareCors")]
public ActionResult GetShareConfig(string url)
{
try
{
string appid = AppSettings.GetObject<string>("WechatDev:AppId");//appid
string appSecret = AppSettings.GetObject<string>("WechatDev:AppSecret");//secret
string jsapiTicket = GetJsApiTicket(appid, appSecret);
// 获取时间戳
string timestamp = Convert.ToString(GetTimeStamp());
// 获取随机字符串
string nonceStr = CreateNonceStr();
// 获取签名signature
string rawstring = $"jsapi_ticket={jsapiTicket}&noncestr={nonceStr}×tamp={timestamp}&url={url}";
string signature = SHA1_Hash(rawstring);
var json = new { appid, timestamp, nonceStr, signature };
var jsonstr = json.ToJson();
Log4Helper.Info($"jsapiTicket:{jsapiTicket},URL:{url},{jsonstr}");
return Content(jsonstr);
}
catch (Exception e)
{
Log4Helper.Error($"{e.Message}{e.InnerException?.Message}");
return null;
}
}
//创建随机字符串
public string CreateNonceStr()
{
int length = 16;
string chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
string str = "";
Random rad = new Random();
for (int i = 0; i < length; i++)
{
str += chars.Substring(rad.Next(0, chars.Length - 1), 1);
}
return str;
}
public string GetTimeStamp()
{
TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
return Convert.ToInt64(ts.TotalSeconds).ToString();
}
public string SHA1_Hash(string str_sha1_in)
{
SHA1 sha1 = new SHA1CryptoServiceProvider();
byte[] bytes_sha1_in = Encoding.Default.GetBytes(str_sha1_in);
byte[] bytes_sha1_out = sha1.ComputeHash(bytes_sha1_in);
string str_sha1_out = BitConverter.ToString(bytes_sha1_out);
str_sha1_out = str_sha1_out.Replace("-", "").ToLower();
return str_sha1_out;
}
// 获取Token
public string GetToken(string appid, string secret)
{
//获取token,有效期7200秒,需要cache
string strJson = string.Empty;
if (GetCache("sharetoken") != null)
{
strJson = GetCache("sharetoken").ToString();
}
else
{
strJson = RequestUrl($"https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={appid}&secret={secret}");
SetCache("sharetoken", strJson, 119);
}
var jd = strJson.ToObject<dynamic>();
return jd.access_token.ToString();
}
//获取ticket
public string GetJsApiTicket(string appid, string appSecret)
{
//获取ticket,有效期7200秒,需要cache
string token = GetToken(appid, appSecret);
string strJson = string.Empty;
if (GetCache("shareticket") != null)
{
strJson = GetCache("shareticket").ToString();
}
else
{
strJson = RequestUrl($"https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token={token}");
SetCache("shareticket", strJson, 119);
}
var jd = strJson.ToObject<dynamic>();
return jd.ticket.ToString();
}//公共方法,request网络获取
public string RequestUrl(string url)
{
// 设置参数
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
CookieContainer cookieContainer = new CookieContainer();
request.CookieContainer = cookieContainer;
request.AllowAutoRedirect = true;
request.Method = "get";
request.ContentType = "text/html";
request.Headers.Add("charset", "utf-8");
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
Stream responseStream = response.GetResponseStream();
StreamReader sr = new StreamReader(responseStream, Encoding.UTF8);
string content = sr.ReadToEnd();
return content;
}
/// <summary>
/// 创建缓存项过期
/// </summary>
/// <param name="key">缓存Key</param>
/// <param name="obj">object对象</param>
/// <param name="expires">过期时间(分钟)</param>
public void SetCache(string key, object obj, int expires)
{
MemoryCacheHelper.Set(key, obj, TimeSpan.FromMinutes(expires));
}
public object GetCache(string key)
{
if (string.IsNullOrEmpty(key))
{
return null;
}
return MemoryCacheHelper.Get(key);
}
}此方法适用于在微信内部打开的网页,点击右上角分享到朋友圈或好友!
注意事项:需要在公众号后台设置jssdk,安全域名及白名单IP。
页面js代码将在下一篇分享,不然篇幅太长,影响阅读。