你的位置:首页 > ASP.net教程

[ASP.net教程]微信开发笔记


引言:

  工作中开发微信网站,简称微网站。由于微网站的分享内容是系统自动选取的当前网址,客户需要改变分享的内容,即点击屏幕右上角的分享按钮,选择发送给朋友和发送到朋友圈,其中的内容和图片需要自定义。于是查找文档微信JS-SDK说明文档一文和网站众多高手的经验,大体知道了调用的步骤,但是具体如何调用才能成功却是不了解的。经过一番试验,终于成功调用发送朋友和发送到朋友圈两个接口,此处记录调用的具体过程。

 

步骤一:引用js文件。

在需要调用JS接口的页面引入如下JS文件,(支持https):http://res.wx.qq.com/open/js/jweixin-1.0.0.js

 

步骤二:通过config接口注入权限验证配置

wx.config({  debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。  appId: '', // 必填,公众号的唯一标识  timestamp: , // 必填,生成签名的时间戳  nonceStr: '', // 必填,生成签名的随机串  signature: '',// 必填,签名,见附录1  jsApiList: [] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2});

网上众多网友也是这样写的,但是具体如果配却谈之甚少,接下来介绍本文是如何调用的。

debug和appId,都不用说,很简单。

timespan生成签名的时间戳:

/// <summary>    /// 生成时间戳    /// 从 1970 年 1 月 1 日 00:00:00 至今的秒数,即当前的时间,且最终需要转换为字符串形式    /// </summary>    /// <returns></returns>    public string getTimestamp()    {      TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);      return Convert.ToInt64(ts.TotalSeconds).ToString();    }

 

nonceStr生成签名的随机串:

/// <summary>    /// 生成随机字符串    /// </summary>    /// <returns></returns>    public string getNoncestr()    {      Random random = new Random();      return MD5Util.GetMD5(random.Next(1000).ToString(), "GBK");    }

 

singature签名的生成比较麻烦。

首先生成获取access_token(有效期7200秒,开发者必须在自己的服务全局缓存access_token)

public string Getaccesstoken()    {      string appid = System.Configuration.ConfigurationManager.AppSettings["WXZjAppID"].ToString();      string secret = System.Configuration.ConfigurationManager.AppSettings["WXZjAppSecret"].ToString();      string urljson = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appid + "&secret=" + secret;      string strjson = "";      UTF8Encoding encoding = new UTF8Encoding();      HttpWebRequest myRequest =      (HttpWebRequest)WebRequest.Create(urljson);      myRequest.Method = "GET";      myRequest.ContentType = "application/x-www-form-urlencoded";      HttpWebResponse response;      Stream responseStream;      StreamReader reader;      string srcString;      response = myRequest.GetResponse() as HttpWebResponse;      responseStream = response.GetResponseStream();      reader = new System.IO.StreamReader(responseStream, Encoding.UTF8);      srcString = reader.ReadToEnd();      reader.Close();      if (srcString.Contains("access_token"))      {        //CommonJsonModel model = new CommonJsonModel(srcString);        HP.CPS.BLL.WeiXin.CommonJsonModel model = new BLL.WeiXin.CommonJsonModel(srcString);        strjson = model.GetValue("access_token");        Session["access_tokenzj"] = strjson;      }      return strjson;    }

public class CommonJsonModelAnalyzer  {    protected string _GetKey(string rawjson)    {      if (string.IsNullOrEmpty(rawjson))        return rawjson;      rawjson = rawjson.Trim();      string[] jsons = rawjson.Split(new char[] { ':' });      if (jsons.Length < 2)        return rawjson;      return jsons[0].Replace("\"", "").Trim();    }    protected string _GetValue(string rawjson)    {      if (string.IsNullOrEmpty(rawjson))        return rawjson;      rawjson = rawjson.Trim();      string[] jsons = rawjson.Split(new char[] { ':' }, StringSplitOptions.RemoveEmptyEntries);      if (jsons.Length < 2)        return rawjson;      StringBuilder builder = new StringBuilder();      for (int i = 1; i < jsons.Length; i++)      {        builder.Append(jsons[i]);        builder.Append(":");      }      if (builder.Length > 0)        builder.Remove(builder.Length - 1, 1);      string value = builder.ToString();      if (value.StartsWith("\""))        value = value.Substring(1);      if (value.EndsWith("\""))        value = value.Substring(0, value.Length - 1);      return value;    }    protected List<string> _GetCollection(string rawjson)    {      //[{},{}]      List<string> list = new List<string>();      if (string.IsNullOrEmpty(rawjson))        return list;      rawjson = rawjson.Trim();      StringBuilder builder = new StringBuilder();      int nestlevel = -1;      int mnestlevel = -1;      for (int i = 0; i < rawjson.Length; i++)      {        if (i == 0)          continue;        else if (i == rawjson.Length - 1)          continue;        char jsonchar = rawjson[i];        if (jsonchar == '{')        {          nestlevel++;        }        if (jsonchar == '}')        {          nestlevel--;        }        if (jsonchar == '[')        {          mnestlevel++;        }        if (jsonchar == ']')        {          mnestlevel--;        }        if (jsonchar == ',' && nestlevel == -1 && mnestlevel == -1)        {          list.Add(builder.ToString());          builder = new StringBuilder();        }        else        {          builder.Append(jsonchar);        }      }      if (builder.Length > 0)        list.Add(builder.ToString());      return list;    }  }  public class CommonJsonModel : CommonJsonModelAnalyzer  {    private string rawjson;    private bool isValue = false;    private bool isModel = false;    private bool isCollection = false;    public CommonJsonModel(string rawjson)    {      this.rawjson = rawjson;      if (string.IsNullOrEmpty(rawjson))        throw new Exception("missing rawjson");      rawjson = rawjson.Trim();      if (rawjson.StartsWith("{"))      {        isModel = true;      }      else if (rawjson.StartsWith("["))      {        isCollection = true;      }      else      {        isValue = true;      }    }    public string Rawjson    {      get { return rawjson; }    }    public bool IsValue()    {      return isValue;    }    public bool IsValue(string key)    {      if (!isModel)        return false;      if (string.IsNullOrEmpty(key))        return false;      foreach (string subjson in base._GetCollection(this.rawjson))      {        CommonJsonModel model = new CommonJsonModel(subjson);        if (!model.IsValue())          continue;        if (model.Key == key)        {          CommonJsonModel submodel = new CommonJsonModel(model.Value);          return submodel.IsValue();        }      }      return false;    }    public bool IsModel()    {      return isModel;    }    public bool IsModel(string key)    {      if (!isModel)        return false;      if (string.IsNullOrEmpty(key))        return false;      foreach (string subjson in base._GetCollection(this.rawjson))      {        CommonJsonModel model = new CommonJsonModel(subjson);        if (!model.IsValue())          continue;        if (model.Key == key)        {          CommonJsonModel submodel = new CommonJsonModel(model.Value);          return submodel.IsModel();        }      }      return false;    }    public bool IsCollection()    {      return isCollection;    }    public bool IsCollection(string key)    {      if (!isModel)        return false;      if (string.IsNullOrEmpty(key))        return false;      foreach (string subjson in base._GetCollection(this.rawjson))      {        CommonJsonModel model = new CommonJsonModel(subjson);        if (!model.IsValue())          continue;        if (model.Key == key)        {          CommonJsonModel submodel = new CommonJsonModel(model.Value);          return submodel.IsCollection();        }      }      return false;    }    /// <summary>    /// 当模型是对象,返回拥有的key    /// </summary>    /// <returns></returns>    public List<string> GetKeys()    {      if (!isModel)        return null;      List<string> list = new List<string>();      foreach (string subjson in base._GetCollection(this.rawjson))      {        string key = new CommonJsonModel(subjson).Key;        if (!string.IsNullOrEmpty(key))          list.Add(key);      }      return list;    }    /// <summary>    /// 当模型是对象,key对应是值,则返回key对应的值    /// </summary>    /// <param name="key"></param>    /// <returns></returns>    public string GetValue(string key)    {      if (!isModel)        return null;      if (string.IsNullOrEmpty(key))        return null;      foreach (string subjson in base._GetCollection(this.rawjson))      {        CommonJsonModel model = new CommonJsonModel(subjson);        if (!model.IsValue())          continue;        if (model.Key == key)          return model.Value;      }      return null;    }    /// <summary>    /// 模型是对象,key对应是对象,返回key对应的对象    /// </summary>    /// <param name="key"></param>    /// <returns></returns>    public CommonJsonModel GetModel(string key)    {      if (!isModel)        return null;      if (string.IsNullOrEmpty(key))        return null;      foreach (string subjson in base._GetCollection(this.rawjson))      {        CommonJsonModel model = new CommonJsonModel(subjson);        if (!model.IsValue())          continue;        if (model.Key == key)        {          CommonJsonModel submodel = new CommonJsonModel(model.Value);          if (!submodel.IsModel())            return null;          else            return submodel;        }      }      return null;    }    /// <summary>    /// 模型是对象,key对应是集合,返回集合    /// </summary>    /// <param name="key"></param>    /// <returns></returns>    public CommonJsonModel GetCollection(string key)    {      if (!isModel)        return null;      if (string.IsNullOrEmpty(key))        return null;      foreach (string subjson in base._GetCollection(this.rawjson))      {        CommonJsonModel model = new CommonJsonModel(subjson);        if (!model.IsValue())          continue;        if (model.Key == key)        {          CommonJsonModel submodel = new CommonJsonModel(model.Value);          if (!submodel.IsCollection())            return null;          else            return submodel;        }      }      return null;    }    /// <summary>    /// 模型是集合,返回自身    /// </summary>    /// <returns></returns>    public List<CommonJsonModel> GetCollection()    {      List<CommonJsonModel> list = new List<CommonJsonModel>();      if (IsValue())        return list;      foreach (string subjson in base._GetCollection(rawjson))      {        list.Add(new CommonJsonModel(subjson));      }      return list;    }    /// <summary>    /// 当模型是值对象,返回key    /// </summary>    private string Key    {      get      {        if (IsValue())          return base._GetKey(rawjson);        return null;      }    }    /// <summary>    /// 当模型是值对象,返回value    /// </summary>    private string Value    {      get      {        if (!IsValue())          return null;        return base._GetValue(rawjson);      }    }  }

View Code

 

接着获取jsapi_ticket:

用第一步拿到的access_token 采用http GET方式请求获得jsapi_ticket(有效期7200秒,开发者必须在自己的服务全局缓存jsapi_ticket)

public string Getjsapi_ticket()    {      string accesstoken = (string)Session["access_tokenzj"];      string urljson = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + accesstoken + "&type=jsapi";      string strjson = "";      UTF8Encoding encoding = new UTF8Encoding();      HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(urljson);      myRequest.Method = "GET";      myRequest.ContentType = "application/x-www-form-urlencoded";      HttpWebResponse response = myRequest.GetResponse() as HttpWebResponse;      Stream responseStream = response.GetResponseStream();      StreamReader reader = new System.IO.StreamReader(responseStream, Encoding.UTF8);      string srcString = reader.ReadToEnd();      reader.Close();      if (srcString.Contains("ticket"))      {        HP.CPS.BLL.WeiXin.CommonJsonModel model = new BLL.WeiXin.CommonJsonModel(srcString);        strjson = model.GetValue("ticket");        Session["ticketzj"] = strjson;      }      return strjson;    }

 

最后生成signature:

public string Getsignature(string nonceStr, string timespanstr)    {      if (Session["access_tokenzj"] == null)      {        Getaccesstoken();      }      if (Session["ticketzj"] == null)      {        Getjsapi_ticket();      }      string url = Request.Url.ToString();      string str = "jsapi_ticket=" + (string)Session["ticketzj"] + "&noncestr=" + nonceStr +        "&timestamp=" + timespanstr + "&url=" + url;// +"&wxref=mp.weixin.qq.com";      string singature = SHA1Util.getSha1(str);      string ss = singature;      return ss;    }

class SHA1Util  {    public static String getSha1(String str)    {      //建立SHA1对象      SHA1 sha = new SHA1CryptoServiceProvider();      //将mystr转换成byte[]       ASCIIEncoding enc = new ASCIIEncoding();      byte[] dataToHash = enc.GetBytes(str);      //Hash运算      byte[] dataHashed = sha.ComputeHash(dataToHash);      //将运算结果转换成string      string hash = BitConverter.ToString(dataHashed).Replace("-", "");      return hash;    }  }

View Code

 

本文调用实例:

<script type="text/javascript">    wx.config({      debug: false,      appId: '<%=corpid %>',      timestamp: <%=timestamp%>,      nonceStr: '<%=nonceStr%>',      signature: '<%=signature %>',      jsApiList: ['onMenuShareTimeline', 'onMenuShareAppMessage']    });  </script>

 

步骤三:调用接口

在进行完第二步的调用后,步骤三就显得非常轻巧了。

wx.ready(function(){  // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。});


本文的调用实例是:
<script type="text/javascript" >  wx.ready(function () {    wx.onMenuShareAppMessage({      title: '<%=shareTitle %>',      desc: '<%=shareContent %>',      link: '<%=currentUrl %>',      imgUrl: '<%=shareImageUrl %>'    });    wx.onMenuShareTimeline({      title: '<%=shareContent %>',      link: '<%=currentUrl %>',      imgUrl: '<%=shareImageUrl %>'    });  })   </script>


本文基本上总结到此处。

易出现的问题:

1、检查后台是否设置:右上角公众号名称--功能设置--JS接口安全域名

2、检查代码里的appid和公众号后台的id是否一致

3、图片的调用地址是绝对路径(相对路径好像不行)。



引用文档:
微信JS-SDK说明文档