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 + "&timestamp=" + 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