APS.NET微信分享自定义标题描述与图片

前期的准备工作可以去上网查一下,网上介绍的很详细。
大概就是需要微信服务号一个,并且已经通过了实名认证。
用于得到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 = ""; // 微信访问凭证 AccessToken
private string _WeiXinJsapiTicket = ""; // Jsapi 的访问凭证 Ticket
private 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值