坐峰怀雪灬

路漫漫其修远兮,吾将上下而求索。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

前端Js引用:

  1  <script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
  2     <script type="text/javascript">
  3         var data = '<%=JsApiirray %>';
  4         data = eval("(" + data + ")");//实例化
  5         wxconfig(data);
  6     </script>
  7     <script>
  8         function wxconfig(data) {
  9             wx.config({
 10                 // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
 11                 debug: false,
 12                 // 必填,公众号的唯一标识
 13                 appId: data.appId,
 14                 // 必填,生成签名的时间戳
 15                 timestamp: data.timestamp,
 16                 // 必填,生成签名的随机串
 17                 nonceStr: data.nonceStr,
 18                 // 必填,签名
 19                 signature: data.signature,
 20                 // 必填,需要使用的JS接口列表
 21                 jsApiList: [
 22                      'checkJsApi',
 23                  'onMenuShareTimeline',
 24                'onMenuShareAppMessage',
 25                'onMenuShareQQ',
 26                  'onMenuShareWeibo'
 27                 ]
 28             });
 29         }
 30         // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
 31         wx.ready(function () {
 32             wx.checkJsApi({
 33                 jsApiList: [
 34                 'onMenuShareTimeline',
 35                    'onMenuShareAppMessage',
 36                     'onMenuShareQQ',
 37                     'onMenuShareWeibo'
 38                 ]
 39             });
 40             var title = "上海长宽神游戏“神龟不掉线”,千万别小看它!";
 41             var des = "我玩过了上海长宽的游戏神作“神龟不掉线”,真的比想象中更难,你快来试试并领取电影红包吧!";
 42             wx.onMenuShareTimeline({
 43                 title: title, //分享标题
 44                 link: 'http://m.gwbnsh.net.cn/sgbdx/', //分享链接
 45                 desc: des, //分享描述
 46                 imgUrl: 'http://m.gwbnsh.net.cn/sgbdx/img/logo.png',//分享图片地址
 47                 trigger: function (res) {
 48                     //alert('用户点击分享到朋友圈');
 49                 },
 50                 success: function (res) {
 51                     $.ajax({
 52                         type: "POST",
 53                         url: "User.ashx",   //处理页的相对地址
 54                         data: { isshare: 1 },
 55                         async: true,
 56                         success: function (data) {
 57                             location = "http://m.maizuo.com/act/lucky-package/?__locate=false#!/active/NUxySmNbvQFF";
 58                         }
 59                     });
 60                 },
 61                 cancel: function (res) {
 62                     //alert('已取消');
 63                 }
 64             });
 65             wx.onMenuShareAppMessage({
 66                 title: title, //分享标题
 67                 link: 'http://m.gwbnsh.net.cn/sgbdx/', //分享链接
 68                 desc: des, //分享描述
 69                 imgUrl: 'http://m.gwbnsh.net.cn/sgbdx/img/logo.png',//分享图片地址
 70                 trigger: function (res) {
 71                     //alert('用户点击分享到朋友圈');
 72                 },
 73                 success: function (res) {
 74                     $.ajax({
 75                         type: "POST",
 76                         url: "User.ashx",   //处理页的相对地址
 77                         data: { isshare: 1 },
 78                         async: true,
 79                         success: function (data) {
 80                             location = "http://m.maizuo.com/act/lucky-package/?__locate=false#!/active/NUxySmNbvQFF";
 81                         }
 82                     });
 83                 },
 84                 cancel: function (res) {
 85                     //alert('已取消');
 86                 }
 87             });
 88             wx.onMenuShareQQ({
 89                 title: title, //分享标题
 90                 link: 'http://m.gwbnsh.net.cn/sgbdx/', //分享链接
 91                 desc: des, //分享描述
 92                 imgUrl: 'http://m.gwbnsh.net.cn/sgbdx/img/logo.png',//分享图片地址
 93                 trigger: function (res) {
 94                     //alert('用户点击分享到朋友圈');
 95                 },
 96                 success: function (res) {
 97                     $.ajax({
 98                         type: "POST",
 99                         url: "User.ashx",   //处理页的相对地址
100                         data: { isshare: 1 },
101                         async: true,
102                         success: function (data) {
103                             location = "http://m.maizuo.com/act/lucky-package/?__locate=false#!/active/NUxySmNbvQFF";
104                         }
105                     });
106                 },
107                 cancel: function (res) {
108                     //alert('已取消');
109                 }
110             });
111             wx.onMenuShareQZone({
112                 title: title, //分享标题
113                 link: 'http://m.gwbnsh.net.cn/sgbdx/', //分享链接
114                 desc: des, //分享描述
115                 imgUrl: 'http://m.gwbnsh.net.cn/sgbdx/img/logo.png',//分享图片地址
116                 trigger: function (res) {
117                     //alert('用户点击分享到朋友圈');
118                 },
119                 success: function (res) {
120                     $.ajax({
121                         type: "POST",
122                         url: "User.ashx",   //处理页的相对地址
123                         data: { isshare: 1 },
124                         async: true,
125                         success: function (data) {
126                             location = "http://m.maizuo.com/act/lucky-package/?__locate=false#!/active/NUxySmNbvQFF";
127                         }
128                     });
129                 },
130                 cancel: function (res) {
131                     //alert('已取消');
132                 }
133             });
134             wx.error(function (res) {
135                 // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
136                 alert("errorMSG:" + res);
137             });
138         });
139     </script>

或者

 1 <script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
 2     <script type="text/javascript">
 3         var data = '<%=JsApiirray %>';
 4         data = eval("(" + data + ")");//实例化
 5         wxconfig(data);
 6     </script>
 7     <script>
 8         function wxconfig(data) {
 9             wx.config({
10                 // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
11                 debug: false,
12                 // 必填,公众号的唯一标识
13                 appId: data.appId,
14                 // 必填,生成签名的时间戳
15                 timestamp: data.timestamp,
16                 // 必填,生成签名的随机串
17                 nonceStr: data.nonceStr,
18                 // 必填,签名
19                 signature: data.signature,
20                 // 必填,需要使用的JS接口列表
21                 jsApiList: [
22                      'checkJsApi',
23                  'onMenuShareTimeline',
24                'onMenuShareAppMessage',
25                'onMenuShareQQ',
26                  'onMenuShareWeibo'
27                 ]
28             });
29         }
30         /*
31  * 注意:
32  * 1. 所有的JS接口只能在公众号绑定的域名下调用,公众号开发者需要先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”。
33  * 2. 如果发现在 Android 不能分享自定义内容,请到官网下载最新的包覆盖安装,Android 自定义分享接口需升级至 6.0.2.58 版本及以上。
34  * 3. 完整 JS-SDK 文档地址:http://mp.weixin.qq.com/wiki/7/1c97470084b73f8e224fe6d9bab1625b.html
35  * 如有问题请通过以下渠道反馈:
36  * 邮箱地址:weixin-open@qq.com
37  * 邮件主题:【微信JS-SDK反馈】具体问题
38  * 邮件内容说明:用简明的语言描述问题所在,并交代清楚遇到该问题的场景,可附上截屏图片,微信团队会尽快处理你的反馈。
39  *config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
40  */
41         wx.ready(function () {
42             wx.checkJsApi({
43                 jsApiList: [
44                 'onMenuShareTimeline',
45                    'onMenuShareAppMessage',
46                     'onMenuShareQQ',
47                     'onMenuShareWeibo'
48                 ],
49                 success: function (res) {
50                     alert(JSON.stringify(res));
51                 }
52             });
53             var shareData = {
54                 title: '标题',
55                 desc: '描述',
56                 link: '链接',
57                 imgUrl: '图片',
58                 trigger: function (res) {
59                     alert('用户点击发送给朋友');
60                 },
61                 success: function (res) {
62                     alert('已分享');
63                 },
64                 cancel: function (res) {
65                     alert('已取消');
66                 },
67                 fail: function (res) {
68                     alert(JSON.stringify(res));
69                 }
70             };
71             wx.onMenuShareAppMessage(shareData);
72             wx.onMenuShareTimeline(shareData);
73             wx.onMenuShareQQ(shareData);
74             wx.onMenuShareWeibo(shareData);
75         });
76         wx.error(function (res) {
77             // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
78             alert("errorMSG:" + res);
79         });
80     </script>

验证JsAPI权限配置:

 1 #region 验证JsApi权限配置
 2     /// <summary>
 3     /// 获取JsApi权限配置的数组/四个参数
 4     /// </summary>
 5     /// <returns></returns>
 6     public string GetJsApiInfo(string Appid, string Appsecret)
 7     {
 8         string timestamp = CommonMethod.ConvertDateTimeInt(DateTime.Now).ToString();//生成签名的时间戳
 9         string nonceStr = CommonMethod.GetRandCode(16);//生成签名的随机串
10         string url = System.Web.HttpContext.Current.Request.Url.AbsoluteUri.ToString();//当前的地址
11         string jsapi_ticket = "";
12         //ticket 缓存7200秒
13         if (System.Web.HttpContext.Current.Session["jsapi_ticket"] == null)
14         {
15             jsapi_ticket = CommonMethod.WebRequestPostOrGet("https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + BasicApi.GetTokenSession(Appid, Appsecret) + "&type=jsapi", "");
16             System.Web.HttpContext.Current.Session["jsapi_ticket"] = jsapi_ticket;
17             System.Web.HttpContext.Current.Session.Timeout = 7200;
18         }
19         else
20         {
21             jsapi_ticket = System.Web.HttpContext.Current.Session["jsapi_ticket"].ToString();
22         }
23         Dictionary<string, object> respDic = (Dictionary<string, object>)Jss.DeserializeObject(jsapi_ticket);
24         jsapi_ticket = respDic["ticket"].ToString();//获取ticket
25         string[] ArrayList = { "jsapi_ticket=" + jsapi_ticket, "timestamp=" + timestamp, "noncestr=" + nonceStr, "url=" + url };
26         Array.Sort(ArrayList);
27         string signature = string.Join("&", ArrayList);
28         signature = Md5Hash(signature).ToLower();
29         return "{\"appId\":\"" + Appid + "\", \"timestamp\":" + timestamp + ",\"nonceStr\":\"" + nonceStr + "\",\"signature\":\"" + signature + "\"}";
30     }
31     /// <summary>
32     /// 32位MD5加密
33     /// </summary>
34     /// <param name="input"></param>
35     /// <returns></returns>
36     private string Md5Hash(string input)
37     {
38         MD5CryptoServiceProvider md5Hasher = new MD5CryptoServiceProvider();
39         byte[] data = md5Hasher.ComputeHash(Encoding.Default.GetBytes(input));
40         StringBuilder sBuilder = new StringBuilder();
41         for (int i = 0; i < data.Length; i++)
42         {
43             sBuilder.Append(data[i].ToString("x2"));
44         }
45         return sBuilder.ToString();
46     }
47 
48     #endregion

基础接口BasicApi.cs:

 1 using System.Collections.Generic;
 2 using System.Net;
 3 using System.Text;
 4 using System.Web;
 5 using System.Web.Script.Serialization;
 6 using Newtonsoft.Json.Linq;
 7 using Newtonsoft.Json;
 8 namespace Web
 9 {// <summary>
10     /// 基础接口
11     /// </summary>
12     public class BasicApi
13     {
14         public static string SessionAccessToken = "";//access_token缓存 其他接口的通行证
15 
16         public BasicApi() { }
17 
18         #region 获取access_token缓存
19         public static string GetTokenSession(string AppID, string AppSecret)
20         {
21             string TokenSession = "";
22 
23             if (System.Web.HttpContext.Current.Session[SessionAccessToken] == null)
24             {
25                 TokenSession = AddTokenSession(AppID, AppSecret);
26             }
27             else
28             {
29                 TokenSession = System.Web.HttpContext.Current.Session[SessionAccessToken].ToString();
30             }
31 
32             return TokenSession;
33         }
34         /// <summary>
35         /// 添加AccessToken缓存
36         /// </summary>
37         /// <param name="AppID"></param>
38         /// <param name="AppSecret"></param>
39         /// <returns></returns>
40         public static string AddTokenSession(string AppID, string AppSecret)
41         {
42             //获取AccessToken
43             string AccessToken = GetAccessToken(AppID, AppSecret);
44             HttpContext.Current.Session[SessionAccessToken] = AccessToken;
45             HttpContext.Current.Session.Timeout = 7200;
46             return AccessToken;
47         }
48 
49         /// <summary>
50         /// 获取AccessToken
51         /// </summary>
52         /// <param name="AppID"></param>
53         /// <param name="AppSecret"></param>
54         /// <returns></returns>
55         public static string GetAccessToken(string AppID, string AppSecret)
56         {
57             JavaScriptSerializer Jss = new JavaScriptSerializer();
58             string respText = CommonMethod.WebRequestPostOrGet(string.Format("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}", AppID, AppSecret), "");
59             Dictionary<string, object> respDic = (Dictionary<string, object>)Jss.DeserializeObject(respText);
60             string accessToken = respDic["access_token"].ToString();
61             return accessToken;
62         }
63         /// <summary>
64         /// 用code换取获取用户信息(包括非关注用户的)
65         /// </summary>
66         /// <param name="openid"></param>
67         /// <param name="access_token"></param>
68         /// <returns></returns>
69         public static JObject GetUserInfo(string openid, string access_token)
70         {
71             JavaScriptSerializer Jss = new JavaScriptSerializer();
72             string url = string.Format("https://api.weixin.qq.com/cgi-bin/user/info?access_token={0}&openid={1}&lang=zh_CN", access_token, openid);
73             WebClient wc = new WebClient();
74             byte[] bytes = wc.DownloadData(url);
75             wc.Encoding = Encoding.UTF8;
76             string jsonText = Encoding.UTF8.GetString(bytes);
77             JObject jo = (JObject)JsonConvert.DeserializeObject(jsonText);
78             return jo;
79         }
80         #endregion
81     }
82 }

通用方法CommonMethod.cs:

  1 using System;
  2 using System.Collections.Generic;
  3 using System.IO;
  4 using System.Net;
  5 using System.Web;
  6 
  7 namespace Web
  8 {
  9     /// <summary>
 10     /// 通用方法类
 11     /// </summary>
 12     public class CommonMethod
 13     {
 14         #region Post/Get提交调用抓取
 15         /// <summary>
 16         /// Post/get 提交调用抓取
 17         /// </summary>
 18         /// <param name="url">提交地址</param>
 19         /// <param name="param">参数</param>
 20         /// <returns>string</returns>
 21         public static string WebRequestPostOrGet(string sUrl, string sParam)
 22         {
 23             byte[] bt = System.Text.Encoding.UTF8.GetBytes(sParam);
 24 
 25             Uri uriurl = new Uri(sUrl);
 26             HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(uriurl);//HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url + (url.IndexOf("?") > -1 ? "" : "?") + param);
 27             req.Method = "Post";
 28             req.Timeout = 120 * 1000;
 29             req.ContentType = "application/x-www-form-urlencoded;";
 30             req.ContentLength = bt.Length;
 31 
 32             using (Stream reqStream = req.GetRequestStream())//using 使用可以释放using段内的内存
 33             {
 34                 reqStream.Write(bt, 0, bt.Length);
 35                 reqStream.Flush();
 36             }
 37             try
 38             {
 39                 using (WebResponse res = req.GetResponse())
 40                 {
 41                     //在这里对接收到的页面内容进行处理 
 42 
 43                     Stream resStream = res.GetResponseStream();
 44 
 45                     StreamReader resStreamReader = new StreamReader(resStream, System.Text.Encoding.UTF8);
 46 
 47                     string resLine;
 48 
 49                     System.Text.StringBuilder resStringBuilder = new System.Text.StringBuilder();
 50 
 51                     while ((resLine = resStreamReader.ReadLine()) != null)
 52                     {
 53                         resStringBuilder.Append(resLine + System.Environment.NewLine);
 54                     }
 55 
 56                     resStream.Close();
 57                     resStreamReader.Close();
 58 
 59                     return resStringBuilder.ToString();
 60                 }
 61             }
 62             catch (Exception ex)
 63             {
 64                 return ex.Message;//url错误时候回报错
 65             }
 66         }
 67         #endregion Post/Get提交调用抓取
 68 
 69         #region unix/datatime 时间转换
 70         /// <summary>
 71         /// unix时间转换为datetime
 72         /// </summary>
 73         /// <param name="timeStamp"></param>
 74         /// <returns></returns>
 75         public static DateTime UnixTimeToTime(string timeStamp)
 76         {
 77             DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1));
 78             long lTime = long.Parse(timeStamp + "0000000");
 79             TimeSpan toNow = new TimeSpan(lTime);
 80             return dtStart.Add(toNow);
 81         }
 82 
 83         /// <summary>
 84         /// datetime转换为unixtime
 85         /// </summary>
 86         /// <param name="time"></param>
 87         /// <returns></returns>
 88         public static int ConvertDateTimeInt(System.DateTime time)
 89         {
 90             System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1));
 91             return (int)(time - startTime).TotalSeconds;
 92         }
 93         #endregion
 94 
 95         #region 记录bug,以便调试
 96         /// <summary>
 97         /// 记录bug,以便调试
 98         /// </summary>
 99         public static bool WriteTxt(string str)
100         {
101             try
102             {
103                 string LogPath = HttpContext.Current.Server.MapPath("/err_log/");
104                 if (!Directory.Exists(LogPath))
105                 {
106                     Directory.CreateDirectory(LogPath);
107                 }
108                 FileStream FileStream = new FileStream(System.Web.HttpContext.Current.Server.MapPath("/err_log//lwf_" + DateTime.Now.ToLongDateString() + "_.txt"), FileMode.Append);
109                 StreamWriter StreamWriter = new StreamWriter(FileStream);
110                 //开始写入
111                 StreamWriter.WriteLine(str);
112                 //清空缓冲区
113                 StreamWriter.Flush();
114                 //关闭流
115                 StreamWriter.Close();
116                 FileStream.Close();
117             }
118             catch (Exception)
119             {
120                 return false;
121             }
122             return true;
123         }
124         #endregion
125 
126         #region 生成随机字符
127         /// <summary>
128         /// 生成随机字符
129         /// </summary>
130         /// <param name="iLength">生成字符串的长度</param>
131         /// <returns>返回随机字符串</returns>
132         public static string GetRandCode(int iLength)
133         {
134             string sCode = "";
135             if (iLength == 0)
136             {
137                 iLength = 4;
138             }
139             string codeSerial = "0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z";
140             string[] arr = codeSerial.Split(',');
141             int randValue = -1;
142             Random rand = new Random(unchecked((int)DateTime.Now.Ticks));
143             for (int i = 0; i < iLength; i++)
144             {
145                 randValue = rand.Next(0, arr.Length - 1);
146                 sCode += arr[randValue];
147             }
148             return sCode;
149         }
150         #endregion
151     }
152 }

附件为源码:微信分享Demo