最近项目移动端需要实现微信自定义分享功能,包含分享自定义标题、描述等。

  • 首先到公众号的后台,功能设置里面,添加将要被分享的域名,如图

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

  注意:

  1. 签名用的noncestr和timestamp必须与wx.config中的nonceStr和timestamp相同。
  2. 移动端分享时,不能本地测试,需要发布到外网测试,否则报签名错误
  3. 生成的签名,可以实用校验工具校验是否正确。https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign

.netcore2.1 JS-SDK 从后台获取微信签名,实现自定义分享标题、描述、图片的更多相关文章

  1. java后台获取微信小程序openid

    一.jar包准备 1.在网盘下载 链接:https://pan.baidu.com/s/15HAAWOg_yn768g4s9IrcPg 提取码:hgj0 二.在pom文件中添加依赖 1.将外部的引入的 ...

  2. JS将后台获取毫秒数转换为自定义格式日期

    重写prototype  Date.prototype.Format = function(fmt) { var o = { "M+" : this.getMonth()+1, / ...

  3. JS和C#后台获取网站URL

    例:网页URL :  http://localhost:8086/index.aspx?topicId=361 1.设置或获取 href 属性中跟在问号后面的部分:window.location.se ...

  4. 微信JSSDK使用步骤(用于在微信浏览器中自定义分享,分享到朋友圈,拍照,扫一扫等功能)

    一.使用JSSDK需要一个公众号(需要认证!): (1).把自己项目的服务器地址输入. (2).把MP_verify_m7Qp93BAuIGDWRVO.txt  文件下载下来,放到该服务器域名指向的根 ...

  5. 微信JS-SDK实现自定义分享功能,分享给朋友,分享到朋友圈

    分享出去的内容,可以通过jssdk进行修改. 1.配置jssdk Wx_config.html <?php import("@.ORG.jssdk"); $jssdk = n ...

  6. .NET微信自定义分享标题、缩略图、超链接及描述的设置方法

    前端Js引用: <script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script> ...

  7. 使用微信JS-SDK 实现 自定义 分享 功能

    微信PC端点击页面,转发给朋友.

  8. 封装的通过微信JS-SDK实现自定义分享到朋友圈或者朋友的ES6类!

    引言: 我们经常在做微信H5的过程中需要自定义分享网页,这个如何实现呢?请看如下的封装的ES6类及使用说明! /** * @jssdk js对象,包括appId,timestamp,nonceStr, ...

  9. 微信应用js-sdk自定义分享图文

    之前写过步骤 但是代码很少 这里奉献上我自己写的代码 我是用js做的 先奉上js部分的代码 <head> <meta charset="utf-8"> &l ...

随机推荐

  1. 【每天一题】LeetCode 121. 买卖股票的最佳时机

    开源地址:点击该链接 题目描述 * https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock * 题目描述: * 给定一个数组, ...

  2. 常用的数据压缩lib

    最近项目需要使用数据压缩,下面针对数据压缩库进行调研,并进行简单记录,对于关于库的介绍,可以在官网阅读最新的文档,我就不在这里重复了: A fast compressor/decompressor:  ...

  3. Nginx安装与运行

    目录 Nginx安装与运行 安装Nginx 运行 注意事项 Nginx安装与运行 安装Nginx 在Nginx官网下载对应的nginx包(推荐使用稳定版[Stable version]) 上传ngin ...

  4. 通知advice

    基于注解的Spring AOP开发,来自https://www.cnblogs.com/junzi2099/p/8274813.html 1.定义目标类接口和实现类 2.编写Spring AOP的as ...

  5. IoT缺德相关

    https://github.com/nebgnahz/awesome-iot-hacks <揭秘家用路由器0day漏洞挖掘技术> Embedded Device Security: Pw ...

  6. 微软与阿里云合作推出“开放应用模型(OAM)”

    英文原文:Announcing the Open Application Model (OAM) 原文标题:微软与阿里云合作推出“开放应用模型(OAM)” 用于 Kubernetes 及更多平台的应用 ...

  7. IT兄弟连 HTML5教程 CSS3属性特效 渐变2 线性渐变实例

    3 线性渐变实例 一.颜色从顶部向底部渐变 制作从顶部到底部直线渐变有三种方法,第一种是起点参数不设置,因为起点参数的默认值为“top”:第二种方法起点参数设置为“top”:第三种起点参数使用“-90 ...

  8. Android Studio 第一个Android项目

    创建步骤 Start a new Android Studio project 选择 Empty Activity   设置Android项目的名称.位置,开发语言 打开初始界面 初步认识Androi ...

  9. android sdk tools里找不到draw9patch.bat 如何制作.9.png 格式图片

    1.什么是.9.png格式 .9.png格式的图片可以在安卓平台指定拉伸区域,防止图片失真,一般用作背景图. 2.前提 最近项目中要用到.9.png格式图片,想着这个简单使用draw9patch.ba ...

  10. maven配置多个镜像

    问题场景 1.国内访问maven默认远程中央镜像特别慢 2.用阿里的镜像替代远程中央镜像 3.大部分jar包都可以在阿里镜像中找到,部分jar包在阿里镜像中没有,需要单独配置镜像 解决方案 setti ...