微信分享到朋友或朋友圈

直接上代码

说明:因为微信的jsapi_ticket和token有时效性(7200秒)但微信那边有限制你不能频繁访问,所以,我这里是将这两个参数存放至数据库的,为避免刚好到7200秒时造成的分享失效,所以,在从数据库查询的时候,时效失效时间比较是比较的5000秒
注意:我这种写法虽然可以实现功能,但是不建议使用这种方式,因为js部分是通过后台注册到前端的,如果与前端某个js有冲突,或者前端有js报错,那么注册部分的js就不会接着往下运行。正确写法是写到js里面或者直接写到页面里面
微信分享的核心就是带着appid等参数进行两次接口对接获取参数。

前台需引用的js:
<%--微信分享相关js--%>
<script src="http://res.wx.qq.com/open/js/jweixin-1.2.0.js"></script>

后台部分代码:
private void RegisterWeiXinShareScript()
        {
            string aaa = CreateTimeStamp().ToString();
            //公众号的应用ID  
            string appid = "wxxxxxxxxxxxx";
            //公众号的应用密钥  
            string secret = "xxxxxxxxxxxxxx";
            //生成签名的时间戳  
            TimeSpan ts = DateTime.Now - DateTime.Parse("1970-01-01 00:00:00");
            string timestamp = ts.TotalSeconds.ToString().Split('.')[0]; 
            //生成签名的随机串  
            string nonceStr = Utils.Number(6);
            //微信access_token,用于获取微信jsapi_ticket  
            string token = GetAccess_token(appid, secret);
            if (string.IsNullOrWhiteSpace(token))
            {
               string tokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appid + "&secret=" + secret;
                //移除拼接过程中产生的换行符、空格
                tokenUrl = tokenUrl.Replace("\n", "").Replace(" ", "").Replace("\t", "").Replace("\r", "");
                string jsonresult = HttpGet(tokenUrl, "UTF-8");
                WX_Token wx = JsonDeserialize<WX_Token>(jsonresult);
                //刷新数据库缓存数据
                token = wx.access_token;
                //Utils.WriteLog("", "token", "token第二次获取结果:" + token + "---" + System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
            }
            //微信jsapi_ticket  
            string ticket = GetTicket(token);
            if (string.IsNullOrWhiteSpace(ticket))
            {
                 //--------------------------------第二次获取证书失效,可能是token过期
                string ticketUrl = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + token + "&type=jsapi";

                //移除拼接过程中产生的换行符、空格
                ticketUrl = ticketUrl.Replace("\n", "").Replace(" ", "").Replace("\t", "").Replace("\r", "");
                string jsonresult = HttpGet(ticketUrl, "UTF-8");
                WX_Ticket wxTicket = JsonDeserialize<WX_Ticket>(jsonresult);
                ticket = wxTicket.ticket;
                }
            //当前网页的URL  
            string pageurl = Request.Url.AbsoluteUri;
            //对所有待签名参数按照字段名的ASCII 码从小到大排序(字典序)后,使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串  
            string str = "jsapi_ticket=" + ticket + "&noncestr=" + nonceStr + "&timestamp=" + timestamp + "&url=" + pageurl;
            //签名,使用SHA1生成  
            string signature = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(str, "SHA1").ToLower();

            //要注册到页面的JS脚本  
            StringBuilder sbjsApi = new StringBuilder();
            sbjsApi.Append("<script>");

            //通过config接口注入权限验证配置  
            sbjsApi.Append("wx.config({debug:false,");
            sbjsApi.Append("appId: '" + appid + "',");
            sbjsApi.Append("timestamp: " + timestamp + ",");
            sbjsApi.Append("nonceStr: '" + nonceStr + "',");
            sbjsApi.Append("signature: '" + signature + "',");
            sbjsApi.Append("jsApiList: ['onMenuShareTimeline', 'onMenuShareAppMessage', 'chooseImage', 'uploadImage', 'getNetworkType']});");
            //通过ready接口处理成功验证  
            sbjsApi.Append("wx.ready(on_weixin_ready);");
            sbjsApi.Append("function on_weixin_ready() {weixin_share();}");
            //获取“分享给朋友”按钮点击状态及自定义分享内容接口  
            sbjsApi.Append("function weixin_share(){");
            sbjsApi.Append("wx.onMenuShareAppMessage({");
            sbjsApi.Append("title:'" + act_detail_title + "',");
            sbjsApi.Append("desc:'" + act_detail_desc + "',");
            //sbjsApi.Append("link:'分享出去的链接地址',");
            sbjsApi.Append("imgUrl:'" + act_detail_img + "',");
            sbjsApi.Append("type:'link',");
            sbjsApi.Append("dataUrl:'',");
            sbjsApi.Append("success: function () { $.post('../programs/Pro_User.ashx', { action: 'AddShareNo',typeId:'" + SjuneRequest.GetQueryString("id") + "' }, '', 'Json');alert('分享成功!【朋友】');},");
            sbjsApi.Append("cancel:function () {}");
            sbjsApi.Append("});");

            //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口  
            sbjsApi.Append("wx.onMenuShareTimeline({");
            sbjsApi.Append("title:'" + act_detail_title + "',");
            sbjsApi.Append("imgUrl:'" + act_detail_img + "',");
            sbjsApi.Append("success: function () { $.post('../programs/Pro_User.ashx', { action: 'AddShareNo',typeId:'" + SjuneRequest.GetQueryString("id") + "' }, '', 'Json');alert('分享成功!【朋友圈】');},");
            sbjsApi.Append("cancel:function () {}");
            sbjsApi.Append("});}");

            sbjsApi.Append("</script>");

            Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "weixin", sbjsApi.ToString().Trim());
        }

        /// <summary>  
        /// 获取微信jsapi_ticket  
        /// </summary>  
        /// <param name="token">access_token</param>  
        /// <returns>jsapi_ticket</returns>  
        public string GetTicket(string token)
        {
            string tickId = "";
            //DataSet ds = new BLL.Ticket().GetList(" id=1");
            //int start_time = ds.Tables[0].Rows[0]["Ticket_Dt"].ToInt();
            //int new_time = CreateTimeStamp();
            //if ((new_time.ToInt() - start_time.ToInt()) > 7000)
            //{
            //超时,重新生成并更新数据
            string ticketUrl = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + token + "&type=jsapi";
            ticketUrl = ticketUrl.Replace("\n", "").Replace(" ", "").Replace("\t", "").Replace("\r", "");
            string jsonresult = HttpGet(ticketUrl, "UTF-8");
            WX_Ticket wxTicket = JsonDeserialize<WX_Ticket>(jsonresult);
            //刷新数据库缓存数据
            //Model.Ticket db_model = new BLL.Ticket().GetModel(1);
            //db_model.Ticket_Dt = CreateTimeStamp().ToString();
            //db_model.Ticket_Id = wxTicket.ticket;
            //new BLL.Ticket().Update(db_model);
            tickId = wxTicket.ticket;
            //}
            //else
            //{
            //    tickId = ds.Tables[0].Rows[0]["Ticket_Id"].ToString();
            //}
            return tickId;
        }

        /// <summary>  
        /// 获取微信access_token  
        /// </summary>  
        /// <param name="appid">公众号的应用ID</param>  
        /// <param name="secret">公众号的应用密钥</param>  
        /// <returns>access_token</returns>  
        private string GetAccess_token(string appid, string secret)
        {

            string tokenId = "";
            DataSet ds = new BLL.Ticket().GetList(" id=1");
            int start_time = ds.Tables[0].Rows[0]["Ticket_Dt"].ToInt();
            int new_time = CreateTimeStamp();
            if ((new_time.ToInt() - start_time.ToInt()) > 5000)
            {
                //超时,重新生成并更新数据
                string tokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appid + "&secret=" + secret;
                tokenUrl = tokenUrl.Replace("\n", "").Replace(" ", "").Replace("\t", "").Replace("\r", "");
                string jsonresult = HttpGet(tokenUrl, "UTF-8");
                WX_Token wx = JsonDeserialize<WX_Token>(jsonresult);
                //刷新数据库缓存数据
                Model.Ticket db_model = new BLL.Ticket().GetModel(1);
                db_model.Ticket_Dt = CreateTimeStamp().ToString();
                db_model.Token_Id = wx.access_token;
                new BLL.Ticket().Update(db_model);

                tokenId = wx.access_token;
            }
            else
            {
                tokenId = ds.Tables[0].Rows[0]["Token_Id"].ToString();
            }
            return tokenId;
        }

        /// <summary>  
        /// JSON反序列化  
        /// </summary>  
        /// <typeparam name="T">实体类</typeparam>  
        /// <param name="jsonString">JSON</param>  
        /// <returns>实体类</returns>  
        private T JsonDeserialize<T>(string jsonString)
        {
            DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
            MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString));
            T obj = (T)ser.ReadObject(ms);
            return obj;
        }

        /// <summary>  
        /// HttpGET请求  
        /// </summary>  
        /// <param name="url">请求地址</param>  
        /// <param name="encode">编码方式:GB2312/UTF-8</param>  
        /// <returns>字符串</returns>  
        private string HttpGet(string url, string encode)
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            request.Method = "GET";
            request.ContentType = "application/json; encoding=utf-8";
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            Stream myResponseStream = response.GetResponseStream();
            StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding(encode));
            string retString = myStreamReader.ReadToEnd();
            myStreamReader.Close();
            myResponseStream.Close();

            return retString;
        }

        /// <summary>
        /// 生成时间戳
        /// </summary>
        /// <returns></returns>
        private int CreateTimeStamp()
        {
            TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
            return Convert.ToInt64(ts.TotalSeconds).ToInt();
        }

        /// <summary>  
        /// 通过微信API获取access_token得到的JSON反序列化后的实体  
        /// </summary>  
        public class WX_Token
        {
            public string access_token { get; set; }
            public string expires_in { get; set; }
        }

        /// <summary>  
        /// 通过微信API获取jsapi_ticket得到的JSON反序列化后的实体  
        /// </summary>  
        public class WX_Ticket
        {
            public string errcode { get; set; }
            public string errmsg { get; set; }
            public string ticket { get; set; }
            public string expires_in { get; set; }
        }

如有问题,请加我QQ:631931078或352167311

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

纪寻川

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值