.netcore2.1 JS-SDK 从后台获取微信签名,实现自定义分享标题、描述、图片
最近项目移动端需要实现微信自定义分享功能,包含分享自定义标题、描述等。
- 首先到公众号的后台,功能设置里面,添加将要被分享的域名,如图

- 后端签名算法实现 ,参考腾讯开发者文档https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115
jsapi_ticket
生成签名之前必须先了解一下jsapi_ticket,jsapi_ticket是公众号用于调用微信JS接口的临时票据。正常情况下,jsapi_ticket的有效期为7200秒,通过access_token来获取。由于获取jsapi_ticket的api调用次数非常有限,频繁刷新jsapi_ticket会导致api调用受限,影响自身业务,开发者必须在自己的服务全局缓存jsapi_ticket 。
生成签名步骤,获取AccessToken-》获取JsApiTicket-》生成签名
appsettings配置文件添加配置
"Api": {
"JSJDKBaseApi": "https://api.weixin.qq.com/cgi-bin"
},
"JSJDK": {
"AppId": "***",
"Secret": "****"
}
- 创建签名公用类
public class JSSDKSignHelper
{
private static AccessTokenResponse singleAccessToken; private string _tencentApi { get; set; }
private string _appid { get; set; }
private string _appSecret { get; set; } public JSSDKSignHelper(IConfiguration config)
{ _tencentApi = config["Api:JSJDKBaseApi"];
_appid = config["JSJDK:AppId"];
_appSecret = config["JSJDK:Secret"];
} public string GetAccessTokenSingle(out bool isNewObj)
{
isNewObj = false;
if (singleAccessToken != null && (singleAccessToken.expire_out > DateTime.Now.AddHours()))
{
return singleAccessToken.access_token;
}
else
{
var response = GetAccessToken();
if (response.errcode == )
{
response.expire_out = DateTime.Now.AddHours(expireHour);
singleAccessToken = response;
isNewObj = true;
return response?.access_token;
}
}
return null;
} /// <summary>
/// 获取access_token
/// </summary>
/// <returns></returns>
private AccessTokenResponse GetAccessToken()
{ string url = _tencentApi + "/token?grant_type=client_credential&appid=" + _appid + "&secret=" + _appSecret;
var response = ApiClient.GetJson<AccessTokenResponse>(url);
return response;
} /// <summary>
/// 获取JsApiTicket
/// </summary>
/// <param name="accessToken"></param>
/// <returns></returns>
public string GetJsApiTicket(string accessToken)
{
if (string.IsNullOrWhiteSpace(accessToken))
{
return null;
}
string url = _tencentApi + $"/ticket/getticket?type=jsapi&access_token={accessToken}"; var response = ApiClient.GetJson<AccessTicketResponse>(url); return response?.ticket;
} /// <summary>
/// 获取签名
/// </summary>
/// <param name="jsapi_ticket"></param>
/// <param name="noncestr">随机字符串(必须与wx.config中的nonceStr相同)</param>
/// <param name="timestamp">时间戳(必须与wx.config中的timestamp相同)</param>
/// <param name="url">当前网页的URL,不包含#及其后面部分(必须是调用JS接口页面的完整URL)</param>
/// <returns></returns>
public string GetSignature(string jsapi_ticket, string noncestr, string timestamp, string url)
{
if (string.IsNullOrEmpty(jsapi_ticket) || string.IsNullOrEmpty(noncestr) || string.IsNullOrEmpty(timestamp) || string.IsNullOrEmpty(url))
return null;
var string1Builder = new StringBuilder();
string1Builder.Append("jsapi_ticket=").Append(jsapi_ticket).Append("&")
.Append("noncestr=").Append(noncestr).Append("&")
.Append("timestamp=").Append(timestamp).Append("&")
.Append("url=").Append(url.IndexOf("#") >= ? url.Substring(, url.IndexOf("#")) : url);
return Sha1Sign(string1Builder.ToString());
} /// <summary>
/// Sha1加密签名
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public string Sha1Sign(string str)
{
SHA1 sha1 = new SHA1CryptoServiceProvider();
byte[] bytes_sha1_in = System.Text.UTF8Encoding.Default.GetBytes(str);
byte[] bytes_sha1_out = sha1.ComputeHash(bytes_sha1_in);
string signature = BitConverter.ToString(bytes_sha1_out);
signature = signature.Replace("-", "").ToLower();
return signature;
} }
- 签名定义的Model
public class AccessTokenResponse: BaseResponse
{
/// <summary>
/// 返回access_token值,有效期7200秒
/// </summary>
public string access_token { get; set; }
/// <summary>
/// 过期时间,单位小时
/// </summary>
public DateTime expire_out { get; set; } } public class AccessTicketResponse : BaseResponse
{
/// <summary>
/// 返回Ticket票据,有效期7200秒
/// </summary>
public string ticket { get; set; } }
public class BaseResponse
{
/// <summary>
/// 过期时间,单位秒
/// </summary>
public string expire_in { get; set; }
/// <summary>
/// 错误代码
/// </summary>
public Int32 errcode { get; set; }
/// <summary>
/// 错误信息描述
/// </summary>
public string errmsg { get; set; }
}
- 创建生成签名的时间戳和随机串
/// <summary>
/// 获取微信JS-JDK时间戳
/// </summary>
/// <returns></returns>
public static string GetTimeStamp()
{
TimeSpan ts = DateTime.UtcNow - new DateTime(, , , , , ); return Convert.ToInt64(ts.TotalSeconds).ToString();
} /// <summary>
/// JS-JDK 创建随机字符串
/// </summary>
/// <returns></returns>
public static string CreatenNonce_str()
{
Random r = new Random();
var sb = new StringBuilder();
var length = strs.Length;
for (int i = ; i < ; i++)
{
sb.Append(strs[r.Next(length - )]);
}
return sb.ToString();
}
- Action中实际调用
[HttpPost]
[Route("GetSignature")]
public string GetSignature(string url= "http://www.sina.cn/")
{
try
{
if (string.IsNullOrEmpty(url)) return "url不能为空";
string _jsTicket = null, _signature = null;
string _accessToken = _jsSignHelper.GetAccessTokenSingle(out bool isNewObj);
WxConfigModel model = new WxConfigModel();
model.AppId = appId;
model.TimeStamp = MyUtil.GetTimeStamp();
model.NonceStr = MyUtil.CreatenNonce_str();
if (isNewObj|| _wxConfigModel.Signature==null)
{ _jsTicket = _jsSignHelper.GetJsApiTicket(_accessToken);
_signature = _jsSignHelper.GetSignature(_jsTicket, model.NonceStr, model.TimeStamp, url);
model.jsTicket = _jsTicket;
model.Signature = _signature;
_wxConfigModel = model;
}
return JsonConvert.SerializeObject(model);
}
catch (Exception ex)
{
throw ex;
}
}
注意:
- 签名用的noncestr和timestamp必须与wx.config中的nonceStr和timestamp相同。
- 移动端分享时,不能本地测试,需要发布到外网测试,否则报签名错误
- 生成的签名,可以实用校验工具校验是否正确。https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign
.netcore2.1 JS-SDK 从后台获取微信签名,实现自定义分享标题、描述、图片的更多相关文章
- java后台获取微信小程序openid
一.jar包准备 1.在网盘下载 链接:https://pan.baidu.com/s/15HAAWOg_yn768g4s9IrcPg 提取码:hgj0 二.在pom文件中添加依赖 1.将外部的引入的 ...
- JS将后台获取毫秒数转换为自定义格式日期
重写prototype Date.prototype.Format = function(fmt) { var o = { "M+" : this.getMonth()+1, / ...
- JS和C#后台获取网站URL
例:网页URL : http://localhost:8086/index.aspx?topicId=361 1.设置或获取 href 属性中跟在问号后面的部分:window.location.se ...
- 微信JSSDK使用步骤(用于在微信浏览器中自定义分享,分享到朋友圈,拍照,扫一扫等功能)
一.使用JSSDK需要一个公众号(需要认证!): (1).把自己项目的服务器地址输入. (2).把MP_verify_m7Qp93BAuIGDWRVO.txt 文件下载下来,放到该服务器域名指向的根 ...
- 微信JS-SDK实现自定义分享功能,分享给朋友,分享到朋友圈
分享出去的内容,可以通过jssdk进行修改. 1.配置jssdk Wx_config.html <?php import("@.ORG.jssdk"); $jssdk = n ...
- .NET微信自定义分享标题、缩略图、超链接及描述的设置方法
前端Js引用: <script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script> ...
- 使用微信JS-SDK 实现 自定义 分享 功能
微信PC端点击页面,转发给朋友.
- 封装的通过微信JS-SDK实现自定义分享到朋友圈或者朋友的ES6类!
引言: 我们经常在做微信H5的过程中需要自定义分享网页,这个如何实现呢?请看如下的封装的ES6类及使用说明! /** * @jssdk js对象,包括appId,timestamp,nonceStr, ...
- 微信应用js-sdk自定义分享图文
之前写过步骤 但是代码很少 这里奉献上我自己写的代码 我是用js做的 先奉上js部分的代码 <head> <meta charset="utf-8"> &l ...
随机推荐
- Spring基础——IOC九种bean声明方式
Spring简介 Spring不是服务于开发web项目的功能,或业务.而是服务于项目的开发,方便各层间的解耦调用,方便对类的批量管理,是提高软件开发效率,降低后期维护成本的框架. Spring的核心思 ...
- Sql Server数据库常用Transact-SQL脚本
数据库 1.创建数据库 USE master ; GO CREATE DATABASE Sales ON ( NAME = Sales_dat, FILENAME = 'C:\Program File ...
- Hystrix集群及集群监控turbine
Hystrix集群及监控turbine 前面Dashboard演示的仅仅是单机服务监控,实际项目基本都是集群,所以这里集群监控用的是turbine. turbine是基于Dashboard的. 先搞个 ...
- js基础总结04 --bom对象
1.Bom 定义:浏览器对象模型,包含一系列与浏览器窗口交互的对象,如:Window,Location,History,Document,Screen 2.Window对象 定义:窗口对象,所有js中 ...
- c博客06-2019-结构体&文件
1.本章学习总结 1.1 学习内容总结 结构体如何定义.成员如何赋值: 1.常见的定义: struct student { int num; char name[20]; }stu; //2.采用ty ...
- LeetCode H2O 生成
第1117题 现在有两种线程,氢 oxygen 和氧 hydrogen,你的目标是组织这两种线程来产生水分子. 存在一个屏障(barrier)使得每个线程必须等候直到一个完整水分子能够被产生出来. 氢 ...
- 每天3分钟操作系统修炼秘籍(12):OOM和swap分区
点我查看秘籍连载 OOM和swap分区 进程的虚拟内存空间是映射到整个物理内存空间的,所以在进程自身看来它拥有了整个物理内存,它也能使用整个物理内存,只需在使用的时候请求操作系统帮忙分配更多空间即可. ...
- C#中try catch中throw ex和throw方式抛出异常有何不同_异常捕获堆栈丢失问题
前言,最近遇到一个使用try-catch异常捕获后记录一下日志,然后再抛出该异常后,异常堆栈里无法显示准确的堆栈地址的问题? 其实以前也遇到过类似问题,没有重视,这次好好研究了下,并上度娘上找了找 ...
- FineUICore基础版部署到docker实战
FineUI用了好多年,最近出了FineUICore版本,一直没时间是试一下docker,前几天买了一个腾讯云服务器,1核2g,装了centos7.6,开始的时候主要是整个个人博客,在腾讯云安装了宝塔 ...
- PlayJava Day027
进程状态 1.创建状态:在程序中用构造方法创建了一个线程对象后,新的线程对象便处于新建状态 此时,它已经有了相应的内存空间和其他资源,但还处于不可运行状态 新建一个线程对象可采用Thread类的构造方 ...
