微信公众号开发流程

日期:2016-5-14 13:51 | 标签: | 阅读:188

记录微信公众号开发步骤流程,备忘。代码示例( C#/JS )

微信后台登陆

现分为三类用户

  1. 管理员,可以添加用户
  2. 运营开发者,可以不需扫码登录
  3. 普通用户,需要 管理员 或者 运营开发者 扫码后方可登录

调试

说明文档,可以 下载 专门的桌面调试工具进行调试。把菜单中的链接拷贝进调试工具,则可以 happy 的进行调试了。

微信免登陆

第一步

从微信浏览器中得到微信提供的随机 code

var code = window.location.search.substring(6, window.location.search.indexOf('&'));

第二步

通过 code 请求 access_token 与 openid

string appid = AppID;
string appsect = Appsect;
string url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + appid + "&secret=" + appsect + "&code=" + code + "&grant_type=authorization_code";
RequestUrl(url , 'POST');

// 请求辅助方法
public static string RequestUrl(string url, string method)
            // 设置参数
            HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
            CookieContainer cookieContainer = new CookieContainer();
            request.CookieContainer = cookieContainer;
            request.AllowAutoRedirect = true;
            request.Method = method;
            request.ContentType = "text/html";
            request.Headers.Add("charset", "utf-8");

            //发送请求并获取相应回应数据
            HttpWebResponse response = request.GetResponse() as HttpWebResponse;
            //直到request.GetResponse()程序才开始向目标网页发送Post请求
            Stream responseStream = response.GetResponseStream();
            StreamReader sr = new StreamReader(responseStream, Encoding.UTF8);
            //返回结果网页(html)代码
            string content = sr.ReadToEnd();
            return content;
}

第三步

通过 openid 去服务端获取用户,若不存在,则通过 acctoken 与 openid 去微信服务器获取用户信息

 string url = "https://api.weixin.qq.com/sns/userinfo?access_token=" + acc_token + "&openid=" + openid + "&lang=zh_CN ";
RequestUrl(url , 'POST');

返回消息示例

{
    nickname: 'kobepeng'
    province : '广东省'
    city: '深圳市'
    headimgurl: 'url'
}

调用微信 API ( 定位 )

第一步

获取 Token,请求方式同上,不同的是由于接口调用比较频繁,应该把 access_token 保存在本地,这样可以降低调用次数。

using System.Runtime.Caching;

ObjectCache Cache = MemoryCache.Default;
CacheItemPolicy policy = new CacheItemPolicy();
policy.Priority = CacheItemPriority.NotRemovable;
if (Cache["access_token"] == null || Cache["access_token"] == "")
{
      string access_token ="获取方式同上";
      // Set 方法首先会检查 Key 是否在缓存中存在,如果存在,更新 value,不存在则创建新的
       Cache.Set("access_token", access_token, policy);
}

第二步

若已保存,则判断 token 是否过时

string jsonStr = HttpRequestUtil.RequestUrl(string.Format("https://api.weixin.qq.com/cgi-bin/menu/get?access_token={0}", access_token));
 if (Tools.GetJsonValue(jsonStr, "errcode") == "42001")
{
     return true;
}

 #region 获取Json字符串某节点的值
/// <summary>
/// 获取Json字符串某节点的值
/// </summary>
public static string GetJsonValue(string jsonStr, string key)
 {
     string result = string.Empty;
     if (!string.IsNullOrEmpty(jsonStr))
      {
         key = "\"" + key.Trim('"') + "\"";
         int index = jsonStr.IndexOf(key) + key.Length + 1;
         if (index > key.Length + 1){
              // 先截逗号,若是最后一个,截“}”号,取最小值
              int end = jsonStr.IndexOf(',', index);
              if (end == -1){
                  end = jsonStr.IndexOf('}', index);
              }
              result = jsonStr.Substring(index, end - index);
              result = result.Trim(new char[] { '"', ' ', '\'' }); //过滤引号或空格
         }
      }
    return result;
}
#endregion

第三步

获取 jsapi_ticket,同样,这也是可以保存在本地的

string url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + access_token + "&type=jsapi";
string res=HttpRequestUtil.RequestUrl(url);
string ticket = Tools.GetJsonValue(res, "ticket");

第四步

若 jsapi_ticket 保存在本地,检查是否过期

第五步

通过 jsapi_ticket获取签名

public static string GetSinature(string url,string ticket2){
     string noncestr = "Wm3WZYTPz0wzccnW";
     int timestamp = 1414587457;
     string ticket = ticket2;
     string string1 = "jsapi_ticket=" + ticket + "&noncestr=" + noncestr + "&timestamp=" + timestamp + "&url=" + url;
     string signature = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(string1, "SHA1");
     return signature;
}

第六步

微信 Webview 通过签名初始化

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

版权声明: 署名-非商业性使用-禁止演绎 4.0 国际(CC BY-NC-ND 4.0
Copyright ©2013-2017 | 粤ICP备14081691号 | yipeng手工打造 | 联系方式