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

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

  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. MySQL数据库~~~~初识、基础数据类型

    一 数据库初识 1.1 什么是数据库 数据库(DataBase,简称DB),简而言之可视为电子化的文件柜----存储电子文件的处所,用户可以对文件中的数据运行新增,截取,更新,删除等操作. 所谓数据库 ...

  2. 常见SQL编写和优化

    常见的SQL优化方式 对查询进行优化,应尽量避免全表扫描,首先应考虑在where及order by 涉及的列上建立索引. 应尽量避免在 where 子句中对字段进行null 值判断,否则将导致引擎放弃 ...

  3. windows 安装xps查看器; windows 10 安装 xps viewer

    最近发现windows 默认是没有xps 查看器的,需要自己手动添加: 安装完成后,即可使用: 参考链接:https://www.windowscentral.com/how-get-xps-view ...

  4. 【红宝书】第20章.JSON

      JSON是一种轻量级的数据格式.JSON使用JS语法的子集表示对象.数组.字符串.数值.布尔值和null,不支持undefined JSON.stringify() // JSON.stringi ...

  5. vscode 设置免密远程

    第一步: 生成秘钥 ssh-keygen -t rsa 生成 id_rsa id_rsa.pub cat id_rsa.pub >>  authorized_keys 将私钥文件id_rs ...

  6. 中移动物联手机端APP软件

    https://open.iot.10086.cn/doc/book/device-develop/multpro/sdk-doc-tool/APP.html

  7. Spring Boot 静态资源能加载css 不能加载js

    Spring Boot 配置拦截器的时候默认 是放行 静态资源 , 也就是说不需要进行配置 registry.addResourceHandler("/**") .addResou ...

  8. doPost()和doGet()方法的区别?

    GET和POST请求都是http的请求方式,用户通过不同的http的请求方式完成对资源(url)的不同操作.GET,POST,PUT,DELETE就对应着对这个资源的查 ,改 ,增 ,删 4个操作,具 ...

  9. Attach Files to Objects 将文件附加到对象

    In this lesson, you will learn how to attach file collections to business objects. For this purpose, ...

  10. CSS雪碧图(精灵图)使用

    1:CSS雪碧图:CSS雪碧图 即 CSS Sprites,也有人叫它CSS精灵图. 2:雪碧图的由来:一个网站的页面需要大量的小图片或者小图标,但是大量的图片如果放在服务器上,每次当打开网站并且向服 ...