APS.NET微信分享自定义标题描述与图片
来源:互联网 发布:想在淘宝开店货源 编辑:程序博客网 时间:2024/05/21 06:31
前期的准备工作可以去上网查一下,网上介绍的很详细。
大概就是需要微信服务号一个,并且已经通过了实名认证。
用于得到Appid和AppSecret以及设置JS接口安全域名。
这里就不详细介绍了。
需要修改的地方有两处:
① protected string WeiXinAppId = “此次填写你的Appid”;
② protected string WeiXinAppSecret = “此次填写你的AppSecret”;
代码如下:
后台cs部分:
//可能要引用的命名空间
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Services;
using System.Text;
using System.Data;
using System.Configuration;
using System.Data.SqlClient;
using System.Runtime.Serialization.Json
using System.IO;
using System.Net;
using System.Web.Security;
// 接口文档地址:http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html
#region 字段private string _WeiXinAccessToken = ""; // 微信访问凭证 AccessTokenprivate string _WeiXinJsapiTicket = ""; // Jsapi 的访问凭证 Ticketprivate string _Timestamp = null; // 签名的时间戳private string _Noncestr = null; // 签名的随机串private string _Signature = ""; // 签名 // js显示的内容protected string WeiXinAppId = "此次填写你的Appid";protected string WeiXinAppSecret = "此次填写你的AppSecret";protected string JsTitle = "此次填写你的标题"; // 分享标题protected string JsDesc = "此次填写你的描述"; // 分享描述protected string JsLink // 分享链接{ get { return Request.Url.ToString(); }}// 图片大小要大于300pix才能显示protected string JsImgUrl = "此次填写你的图片链接"; // 分享图标#endregion#region 属性/// <summary>/// 签名的时间戳/// </summary>protected string Timestamp{ get { if (string.IsNullOrEmpty(_Timestamp)) _Timestamp = GetTimestamp(); return _Timestamp; }}/// <summary>/// 签名的随机串/// </summary>protected string Noncestr{ get { if (string.IsNullOrEmpty(_Noncestr)) _Noncestr = CreateNoncestr(); return _Noncestr; }}/// <summary>/// 签名/// </summary>protected string Signature{ get { if (string.IsNullOrEmpty(_Signature)) { if (string.IsNullOrEmpty(_WeiXinAccessToken)) GetWeiXinAccessToken(); if (!string.IsNullOrEmpty(_WeiXinAccessToken) && string.IsNullOrEmpty(_WeiXinJsapiTicket)) GetWeiXinJsapiTicket(_WeiXinAccessToken); if (!string.IsNullOrEmpty(_WeiXinJsapiTicket)) _Signature = GetSignature(_WeiXinJsapiTicket, Noncestr, Timestamp, JsLink); } return _Signature; }}#endregion#region 第一步:Get方式 获取 access_token/// <summary>/// 第一步:Get方式 获取 access_token/// </summary>/// <returns></returns>private void GetWeiXinAccessToken(){ #region Get 方式获取 access_token string getUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + WeiXinAppId + "&secret=" + WeiXinAppSecret; HttpWebRequest req = (HttpWebRequest)WebRequest.Create(getUrl); req.Method = "GET"; HttpWebResponse res = null; Stream st = null; StreamReader sr = null; string html = string.Empty; try { res = (HttpWebResponse)req.GetResponse(); st = res.GetResponseStream(); sr = new StreamReader(st, System.Text.Encoding.UTF8); Console.WriteLine(sr.CurrentEncoding); html = sr.ReadToEnd(); } catch (IOException ex) { JsMsgBox.Show(this, ex.Message); _WeiXinAccessToken = ""; } // 解析内容 try { // 反序列化 DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(WeiXinButtonToken)); MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(html)); WeiXinButtonToken tokenMsg = (WeiXinButtonToken)ser.ReadObject(ms); _WeiXinAccessToken = tokenMsg.access_token; } catch { // 反序列化 DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(WeiXinButtonError)); MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(html)); WeiXinButtonError errrorMsg = (WeiXinButtonError)ser.ReadObject(ms); JsMsgBox.Show(this, errrorMsg.errcode + ":" + errrorMsg.errmsg); _WeiXinAccessToken = ""; } #endregion Application["WeiXinAccessToken"] = _WeiXinAccessToken;}#endregion#region 第二步:Get方式 获取 jsapi_ticket/// <summary>/// 第二步:Get方式 获取 jsapi_ticket/// </summary>/// <returns></returns>private void GetWeiXinJsapiTicket(string accessToken){ #region Get 方式获取 jsapi_ticket string getUrl = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + accessToken + "&type=jsapi"; HttpWebRequest req = (HttpWebRequest)WebRequest.Create(getUrl); req.Method = "GET"; HttpWebResponse res = null; Stream st = null; StreamReader sr = null; string html = string.Empty; try { res = (HttpWebResponse)req.GetResponse(); st = res.GetResponseStream(); sr = new StreamReader(st, System.Text.Encoding.UTF8); Console.WriteLine(sr.CurrentEncoding); html = sr.ReadToEnd(); } catch (IOException ex) { JsMsgBox.Show(this, ex.Message); _WeiXinJsapiTicket = ""; } // 解析内容 try { // 反序列化 DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(WeiXinJsapiToken)); MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(html)); WeiXinJsapiToken tokenMsg = (WeiXinJsapiToken)ser.ReadObject(ms); _WeiXinJsapiTicket = tokenMsg.ticket; } catch { } #endregion Application["WeiXinJsapiTicket"] = _WeiXinJsapiTicket;}#endregion#region 第三步:获取 签名/// <summary>/// 第三步:获取 签名/// </summary>/// <param name="jsapi_ticket"></param>/// <param name="noncestr">生成签名的随机串</param>/// <param name="timestamp">生成签名的时间戳</param>/// <param name="url"></param>/// <returns></returns>private string GetSignature(string jsapi_ticket, string noncestr, string timestamp, string url){ string tmpStr = "jsapi_ticket=" + jsapi_ticket + "&noncestr=" + noncestr + "×tamp=" + timestamp + "&url=" + url; return FormsAuthentication.HashPasswordForStoringInConfigFile(tmpStr, "SHA1");}#endregion#region 其它函数/// <summary>/// 生成签名的时间戳/// </summary>/// <returns></returns>private string GetTimestamp(){ TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0); return Convert.ToInt64(ts.TotalSeconds).ToString();}/// <summary>/// 生成签名的随机串/// </summary>/// <returns></returns>private static String CreateNoncestr(){ String chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; String res = ""; Random rd = new Random(); for (int i = 0; i < 16; i++) { res += chars[rd.Next(chars.Length - 1)]; } return res;}#endregion//引用public class JsMsgBox{ /// <summary> /// 显示消息提示对话框 /// </summary> /// <param name="page">当前页面指针,一般为this</param> /// <param name="msg">提示信息</param> public static void Show(Page page, string msg) { page.ClientScript.RegisterStartupScript(page.GetType(), "message", "<script language='javascript' defer>alert('" + msg.ToString() + "');</script>"); } /// <summary> /// 控件点击 消息确认提示框 /// </summary> /// <param name="page">当前页面指针,一般为this</param> /// <param name="msg">提示信息</param> public static void ShowConfirm(WebControl Control, string msg) { Control.Attributes.Add("onclick", "return confirm('" + msg + "');"); } /// <summary> /// 显示消息提示对话框,并进行页面跳转 /// </summary> /// <param name="page">当前页面指针,一般为this</param> /// <param name="msg">提示信息</param> /// <param name="url">跳转的目标URL</param> public static void ShowAndRedirect(Page page, string msg, string url) { page.ClientScript.RegisterStartupScript(page.GetType(), "message", "<script language='javascript' defer>alert('" + msg + "');window.location=\"" + url + "\"</script>"); } /// <summary> /// 显示消息提示对话框,并进行页面跳转 /// </summary> /// <param name="page">当前页面指针,一般为this</param> /// <param name="msg">提示信息</param> /// <param name="url">跳转的目标URL</param> public static void ShowAndRedirects(Page page, string msg, string url) { StringBuilder Builder = new StringBuilder(); Builder.Append("<script language='javascript' defer>"); Builder.AppendFormat("alert('{0}');", msg); Builder.AppendFormat("top.location.href='{0}'", url); Builder.Append("</script>"); page.ClientScript.RegisterStartupScript(page.GetType(), "message", Builder.ToString()); } /// <summary> /// 输出自定义脚本信息 /// </summary> /// <param name="page">当前页面指针,一般为this</param> /// <param name="script">输出脚本</param> public static void ResponseScript(Page page, string script) { page.ClientScript.RegisterStartupScript(page.GetType(), "message", "<script language='javascript' defer>" + script + "</script>"); } #region 扩展 Js alert插件 /// <summary> /// Js alert()消息框 /// 使用时:当期页 一定要引入:layer.js /// </summary> /// <param name="page"></param> /// <param name="msg"></param> public static void ShowMsg(Page page, string msg) { page.ClientScript.RegisterStartupScript(page.GetType(), "message", "<script language='javascript' defer>layer.msg('" + msg.ToString() + "',{icon: 6});</script>"); } /// <summary> /// 提示 /// </summary> /// <param name="page"></param> /// <param name="msg"></param> public static void ShowTooMsg(Page page, string msg) { page.ClientScript.RegisterStartupScript(page.GetType(), "message", "<script language='javascript' defer>layer.msg('" + msg.ToString() + "',{icon: 6});</script>"); } public static void ShowAndRedirectMsg(Page page, string msg, string url) { page.ClientScript.RegisterStartupScript(page.GetType(), "message", "<script language='javascript' defer>layer.msg('" + msg + "',{icon: 6});window.location=\"" + url + "\"</script>"); } #endregion public static void ShowLogin(Page page) { page.ClientScript.RegisterStartupScript(page.GetType(), "message", "<script language='javascript' defer>$(function(){liSaveSeta()})</script>"); }}// {"errcode":0,"errmsg":"ok"}public class WeiXinButtonError{ public int errcode { get; set; } public string errmsg { get; set; }}// {"access_token":"ACCESS_TOKEN","expires_in":7200}public class WeiXinButtonToken{ public string access_token { get; set; } public int expires_in { get; set; }}// {"errcode":0,"errmsg":"ok","ticket":"bxLdikRXVbTPdHSM05e5u5sUoXNKd8-41ZO3MhKoyN5OfkWITDGgnr2fwJ0m9E8NYzWKVZvdVtaUgWvsdshFKA","expires_in":7200}public class WeiXinJsapiToken{ public int errcode { get; set; } public string errmsg { get; set; } public string ticket { get; set; } public int expires_in { get; set; }}
前端JS部分
<script type="text/javascript"> wx.config({ debug: false, <% /* 开启调试模式,调用的所有api的返回值会在客户端alert出来 */ %> appId: '<%=WeiXinAppId %>', <% /* 必填,公众号的唯一标识 */ %> timestamp: <%=Timestamp %>, <% /* 必填,生成签名的时间戳 */ %> nonceStr: '<%=Noncestr %>', <% /* 必填,生成签名的随机串 */ %> signature: '<%=Signature %>', <% /* 必填,签名 */ %> jsApiList: [ <% /* 必填,需要使用的JS接口列表 */ %> 'onMenuShareTimeline', 'onMenuShareAppMessage', 'onMenuShareQQ', 'onMenuShareWeibo' ] });</script><script type="text/javascript"> wx.ready(function () { <% /* 以下方法 必须先config成功,然后在wx.ready里才能调用 */ %> <% /* 注意:以下配置要全部都没错的情况下,才会运行正常,比如图片找不到,就不会显示任何信息 */ %> <% /* 获取“分享到朋友圈”按钮点击状态及自定义分享内容接口 */ %> wx.onMenuShareTimeline({ title: '<%=JsTitle %>', link: '<%=JsLink %>', imgUrl: '<%=JsImgUrl %>', success: function () { alert("用户确认分享后执行的回调函数"); }, cancel: function () { alert("用户取消分享后执行的回调函数"); } }); <% /* 获取“分享给朋友”按钮点击状态及自定义分享内容接口 */ %> wx.onMenuShareAppMessage({ title: '<%=JsTitle %>', desc: '<%=JsDesc %>', link: '<%=JsLink %>', imgUrl: '<%=JsImgUrl %>', type: '', <% /* 分享类型,music、video或link,不填默认为link */ %> dataUrl: '', <% /* 如果type是music或video,则要提供数据链接,默认为空 */ %> success: function () { alert("用户确认分享后执行的回调函数"); }, cancel: function () { alert("用户取消分享后执行的回调函数"); } }); <% /* 获取“分享到QQ”按钮点击状态及自定义分享内容接口 */ %> wx.onMenuShareQQ({ title: '<%=JsTitle %>', desc: '<%=JsDesc %>', link: '<%=JsLink %>', imgUrl: '<%=JsImgUrl %>', success: function () { alert("用户确认分享后执行的回调函数"); }, cancel: function () { alert("用户取消分享后执行的回调函数"); } }); <% /* 获取“分享到QQ空间”按钮点击状态及自定义分享内容接口 */ %> wx.onMenuShareWeibo({ title: '<%=JsTitle %>', desc: '<%=JsDesc %>', link: '<%=JsLink %>', imgUrl: '<%=JsImgUrl %>', success: function () { // 用户确认分享后执行的回调函数 }, cancel: function () { // 用户取消分享后执行的回调函数 } }); // alert("config信息验证成功!"); });</script>
阅读全文
0 0
- APS.NET微信分享自定义标题描述与图片
- php 微信分享自定义标题 图片 描述接口开发
- 微信浏览器分享到朋友圈自定义标题、描述和图片,查看图片可伸缩、保存
- 关于微信自定义分享的链接、标题、描述、图片都未生效问题详解
- 如何实现微信自定义分享标题、图片、描述等信息
- 微信自定义分享标题、描述关键词限制(红包)
- 吐血中, 调用分享到微信好友,加载的网络图片显示不出来,微信分享,自定义分享标题、内容描述关键词限制(红包)
- 微信分享自定义(包含图片、标题等)
- jsp自定义微信分享的标题,图片,摘要
- 微信分享时如何自定义标题,简介和图片
- 使用微信JSSDK自定义微信分享标题、描述时需要注意的问题
- 微信分享自定义图片
- 微信分享朋友圈自定义标题链接
- 微信分享标题和图片设置
- 设置微信分享的标题 缩略图 连接 描述
- 设置微信分享的标题 缩略图 连接 描述
- 微信开发--微信分享自定义图标和标题
- 微信JS-SDK 修改分享标题 分享图片
- 【C++】虚函数原理
- 2017 沈阳区域赛部分题解
- 多线程基础02
- Python3.6.1下载与安装
- CentOS6设置静态IP
- APS.NET微信分享自定义标题描述与图片
- HP EliteBook 开启虚拟化
- SecureCRT7一些常用设置
- 设置SublimeText支持中文编码
- jsp 登陆失败后在跳回本页面时css样式没有了和批量删除思路和去除input样式
- WinXP下 扫雷程序逆向分析 --扫雷辅助(一)
- 【LeetCode 26】Remove Duplicates from Sorted Array(Python)
- Map,java中的io流,异常
- windows上phpstudy配置memcache