C# 微信分享到朋友圈,分享给朋友JS代码

Ject | | 访问(743)

  说明:2015年,微信公众平台升级了开发文档。

  其实就是限制了没有加入公众平台的人的分享权限。

  如果你没有公众平台的账号,你也可以copy过去使用,只是分享的时候没有介绍,只有标题和图片。

  右下角灰色的介绍会用一个当前的网址代替。

  说明:该代码所示没有图样,只有点击右上角的分享到朋友圈或者分享给朋友,才会显示出效果。

  注意事项:

  测试你生成的ticket是否正确 http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign

  设置JS接口安全域名 这个太重要了,千万不要忘记

  我的域名没备案,没法搞,只能呵呵了,不过我用了别人的域名

  下面是实现的C#代码

public static class Business {
    public static WeiXinShare GetShare(string url) {
        WeiXinShare share = new WeiXinShare();

        if (url.IndexOf("#") > -1) {
          url = url.Substring(0, url.IndexOf("#"));
        }

        string appid = ConfigHelper.GetAppSettings("WX-appid"); //从web.config读取微信公众账号appid的值
        string secret = ConfigHelper.GetAppSettings("WX-secret"); //从web.config读取微信公众账号secret的值
        string ticket = "";

        FileHelper fileHelper = new FileHelper(); //读写txt文件的封装类
        //临时txt文件 结构是  2015-06-05 09:27:56,sM4AOVdWfPE4DxkXGEs8VL-9UnMt7eEBh6U86D5tIFtfzFJufPVkY8wa66TTwHqMFgtdlatKj1KADLktLuZmjw  时间和ticket用逗号分隔的字符串
        string tempPath = System.Web.HttpContext.Current.Server.MapPath(@"\Themes\Temp");
        string filepath = tempPath + @"\Ticket.txt";
        string read = fileHelper.Read(filepath);
        if (!string.IsNullOrEmpty(read)) {
            string[] array_read = read.Split(new string[] {
                ","
            },
            StringSplitOptions.RemoveEmptyEntries);
            if (array_read != null && array_read.Length > 1) {
                string readTime = array_read[0];
                string readTicket = array_read[1];
                int hours = Convert.ToDateTime(string.Format("{0:yyyy-MM-dd HH:mm:ss}", DateTime.Now))
                               .Subtract(Convert.ToDateTime(string.Format("{0:yyyy-MM-dd HH:mm:ss}", readTime))).Hours;
                if (hours > 0) //执行从微信端获取ticket操作
                {
                    ticket = GetTicket(appid, secret, filepath);
                } else //获取文件里已经存在的ticket
                {
                    ticket = readTicket;
                }
            } else //执行从微信端获取ticket操作
            {
                ticket = GetTicket(appid, secret, filepath);
            }
        }

        string noncestr = string.Format("{0:yyyyMMddHHmmssffff}", DateTime.Now);
        string timestamp = (Convert.ToInt32((DateTime.Now - TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1))).TotalSeconds)).ToString(); //时间戳
        string n = "jsapi_ticket=" + ticket + "&noncestr=" + noncestr + "&timestamp=" + timestamp + "&url=" + url;

        string signature = HashCryto.GetHash2String(n, HashAlgorithmType.SHA1).ToLower(); //这里是 将字符串 SHA1 编码的方法,此方法需自己寻找解决方案
        share.appid = appid;
        share.noncestr = noncestr;
        share.timestamp = timestamp;
        share.signature = signature;
        return share;
    }

    // 通过微信获取Ticket
    public static string GetTicket(string appid, string secret, string filepath) {
        string ticket = "";
        HttpConnect hc = new HttpConnect(); //请求URL 返回 内容 的 封装类
        //获取access_token	
        string AccessTokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appid + "&secret=" + secret;
        string AccessTokenJson = hc.GetResponseString(AccessTokenUrl, "GET");
        //{"access_token":"hBUh3WHwyziskPkWUUCA3NvN7BcP8PZbeyKbhzlvBZFl_4FapnhB-NwcSqL0NU62jb6DkW9BdX1FyET5eCejH27EU5tgFIZeE0O9mYlSPfU","expires_in":7200}
        AccessToken at = JsonHelper.JSONToObject < AccessToken > (AccessTokenJson); //Json字符串转实体的封装类
        //获取ticket
        if (at != null && at.access_token != null) {
            string TicketUrl = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + at.access_token + "&type=jsapi";
            string TicketJson = hc.GetResponseString(TicketUrl, "GET");
            //{"errcode":0,"errmsg":"ok","ticket":"sM4AOVdWfPE4DxkXGEs8VCxRWOUAYCyyChHKAoESYbj7RMmIZ_ejKQgM4xxvIKmB28luMuNJynJeQ_7rr00l0A","expires_in":7200}
            if (TicketJson.IndexOf("ok") > -1) {
                Ticket t = JsonHelper.JSONToObject < Ticket > (TicketJson);
                if (t != null && t.ticket != null) {
                    ticket = t.ticket;
                    FileHelper fileHelper = new FileHelper(); //读写txt文件的封装类
                    fileHelper.Write(string.Format("{0:yyyy-MM-dd HH:mm:ss}", DateTime.Now) + "," + ticket, filepath);
                }
            }
        }
        return ticket;
    }

}
public class WeiXinShare {
    public string appid {
        get;
        set;
    }
    public string timestamp {
        get;
        set;
    }
    public string noncestr {
        get;
        set;
    }
    public string signature {
        get;
        set;
    }
}
public class AccessToken {
    public string access_token {
        get;
        set;
    }
    public string expires_in {
        get;
        set;
    }
}
public class Ticket {
    public string errcode {
        get;
        set;
    }
    public string errmsg {
        get;
        set;
    }
    public string ticket {
        get;
        set;
    }
    public string expires_in {
        get;
        set;
    }
}
public class FileHelper {
    byte[] byData = new byte[9999];
    char[] charData = new char[9999];
    public string Read(string path = "d:\\code.txt") {
        string txt = "";
        FileStream file = new FileStream(path, FileMode.Open);
        try {
            file.Seek(0, SeekOrigin.Begin);
            //byData传进来的字节数组,用以接受FileStream对象中的数据,第2个参数是字节数组中开始写入数据的位置,它通常是0,
            //表示从数组的开端文件中向数组写数据,最后一个参数规定从文件读多少字符.
            file.Read(byData, 0, 9999);
            Decoder d = Encoding.Default.GetDecoder();
            d.GetChars(byData, 0, byData.Length, charData, 0);
            if (charData != null && charData.Length > 0) {
                foreach(var item in charData) {
                    if (item.ToString() == "\0") {
                        break;
                    }
                    txt += item.ToString();
                }
            }

            file.Close();
        } catch {
            file.Close();
        } finally {
            file.Close();
        }
        return txt;
    }

    public void Write(string txt, string path = "d:\\code.txt") {
        FileStream fs = new FileStream(path, FileMode.Create);
        try {
            //获得字节数组
            byte[] data = System.Text.Encoding.Default.GetBytes(txt);
            //开始写入
            fs.Write(data, 0, data.Length);
            //清空缓冲区、关闭流
            fs.Flush();
            fs.Close();
        } catch {
            fs.Flush();
            fs.Close();
        }
    }

}
// 远程读取网页地址 的摘要说明
public class HttpConnect {
    public HttpConnect() {}

    //参数
    private Dictionary < string,
    string > m_params = new Dictionary < string,
    string > ();
    //Cookie
    private CookieContainer m_container = new CookieContainer();

    // 获取参数
    public string this[string _name] {
        get {
            if (m_params.ContainsKey(_name.ToUpper())) return m_params[_name.ToUpper()];
            return null;
        }
        set {
            m_params[_name.ToUpper()] = value;
        }
    }

    // 创建请求
    public HttpWebRequest CreateRequest(string _url, string _method, string _other) {
        HttpWebRequest request = (HttpWebRequest) HttpWebRequest.Create(_url);
        request.Method = _method;
        request.CookieContainer = m_container;
        byte[] data = ASCIIEncoding.Default.GetBytes(_other);
        if (data.Length > 0) {
            //request.ContentLength = data.Length;
            request.GetRequestStream().Write(data, 0, data.Length);
            request.GetRequestStream().Flush();
        }
        return request;
    }

    public string GetResponseString(string _url, string _method) {
        return GetResponseString(_url, _method, "", "");
    }

    public string GetResponseString(string _url, string _method, string _other) {
        return GetResponseString(_url, _method, _other, "");
    }

    public string GetResponseString(string _url, string _method, string _other, string _referer) {
        HttpWebRequest request = CreateRequest(_url, _method, _other);
        if (_referer != null) request.Referer = _referer;
        HttpWebResponse response = (HttpWebResponse) request.GetResponse();
        string result;
        using(StreamReader reader = new StreamReader(response.GetResponseStream())) {
            result = reader.ReadToEnd();
        }
        return result;
    }

    public void GetResponseFile(string _url, string _method, string _filename, string _other) {
        HttpWebRequest request = CreateRequest(_url, _method, _other);
        request.Timeout = 5000;
        HttpWebResponse response = (HttpWebResponse) request.GetResponse();
        Stream stream = response.GetResponseStream();
        byte[] buffer = new byte[response.ContentLength];
        int size = stream.Read(buffer, 0, buffer.Length);
        while (size < buffer.Length) {
            size += stream.Read(buffer, size, buffer.Length - size);
        }
        using(FileStream fs = new FileStream(_filename, FileMode.OpenOrCreate)) {
            fs.Write(buffer, 0, buffer.Length);
        }
    }

}

  下面是实现的HTML代码

<script type="text/javascript" src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js">
</script>
@{//这里是C# MVC 的语法
WeiXinShare share = Business.GetShare(Request.Url.ToString()); 
if (share== null) { share = new WeiXinShare(); }
}
<script language="javascript" type="text/javascript">
    wx.config({
        debug: false,
        appId: '@(share.appid)',
        timestamp: '@(share.timestamp)',
        nonceStr: '@(share.noncestr)',
        signature: '@(share.signature)',
        jsApiList: ['onMenuShareTimeline', 'onMenuShareAppMessage', 'onMenuShareQQ', 'onMenuShareWeibo']
    });
    wx.ready(function() {
        wx.onMenuShareTimeline({
            title: "理财团,一万元体验活动",
            // 分享标题
            link: "http://hd.lctuan.com",
            // 分享链接
            imgUrl: "http://www.lctuan.com/themes/201506/images/lctuan-logo.jpg",
            // 分享图标
            success: function() {
                // 用户确认分享后执行的回调函数
            },
            cancel: function() {
                // 用户取消分享后执行的回调函数
            }
        });
        wx.onMenuShareAppMessage({
            title: "理财团,一万元体验活动",
            // 分享标题
            desc: "妈妈再也不用担心我站在天台上了",
            // 分享描述
            link: "http://hd.lctuan.com",
            // 分享链接
            imgUrl: "http://www.lctuan.com/themes/201506/images/lctuan-logo.jpg",
            // 分享图标
            type: '',
            // 分享类型,music、video或link,不填默认为link
            dataUrl: '',
            // 如果type是music或video,则要提供数据链接,默认为空
            success: function() {
                // 用户确认分享后执行的回调函数
            },
            cancel: function() {
                // 用户取消分享后执行的回调函数
            }
        });
        wx.onMenuShareQQ({
            title: "理财团,一万元体验活动",
            // 分享标题
            desc: "妈妈再也不用担心我站在天台上了",
            // 分享描述
            link: "http://hd.lctuan.com",
            // 分享链接
            imgUrl: "http://www.lctuan.com/themes/201506/images/lctuan-logo.jpg",
            // 分享图标
            success: function() {
                // 用户确认分享后执行的回调函数
            },
            cancel: function() {
                // 用户取消分享后执行的回调函数
            }
        });
        wx.onMenuShareWeibo({
            title: "理财团,一万元体验活动",
            // 分享标题
            desc: "妈妈再也不用担心我站在天台上了",
            // 分享描述
            link: "http://hd.lctuan.com",
            // 分享链接
            imgUrl: "http://www.lctuan.com/themes/201506/images/lctuan-logo.jpg",
            // 分享图标
            success: function() {
                // 用户确认分享后执行的回调函数
            },
            cancel: function() {
                // 用户取消分享后执行的回调函数
            }
        });
    });

    function ShowWeiXinShareTips(page) {
        var div = '<div id="WeiXinShareTips"><img src="http://www.lctuan.com/themes/201506/images/lctuan-logo.jpg" width="165" height="114"/></div>';
        $(page).append(div);
        $('#WeiXinShareTips').on('click',
        function() {
            $('#WeiXinShareTips').remove();
        });
        setTimeout(function() {
            $('#WeiXinShareTips').remove();
        },
        5000);
    }
    function IsWeiXinBrowser() {
        return window.navigator.userAgent.indexOf('MicroMessenger') >= 0;
    }
    function IsAndroid() {
        return window.navigator.userAgent.indexOf('Android') >= 0;
    }
</script>