微信企业号开发步骤
1.申请微信企业号测试账号,参考http://www.cnblogs.com/comsokey/p/enterprise.html。
2.熟悉微信企业号后台功能,参考http://www.cnblogs.com/comsokey/p/enterprise.html。
着重练习下通讯录管理,可以先看本文的最后部分。
3.获取AccessToken,参考http://qydev.weixin.qq.com/wiki/index.php?title=%E4%B8%BB%E5%8A%A8%E8%B0%83%E7%94%A8
(1)系统管理员可通过管理端的权限管理功能创建管理组,分配管理组对应用、通讯录的访问权限。完成后,管理组即可获得唯一的secret。
(2)系统管理员可通过权限管理查看所有管理组的secret,其他管理员可通过设置中的开发者凭据查看。
(3)当企业应用调用企业号接口时,企业号后台为根据此次访问的AccessToken,校验访问的合法性以及所对应的管理组的管理权限以返回相应的结果。
AccessToken需要用CorpID和Secret来换取,不同的Secret会返回不同的AccessToken。正常情况下AccessToken有效期为7200秒,有效期内重复获取返回相同结果;有效期内有接口交互(包括获取AccessToken的接口),会自动续期。
点击[创建并管理所有分级管理员账号]
以下界面会看到CorpID及Secret,
4.企业获取code(参考http://qydev.weixin.qq.com/wiki/index.php?title=OAuth%E9%AA%8C%E8%AF%81%E6%8E%A5%E5%8F%A3)
这里的获取code以及上面第三点中获取的AccessToken,都是为了下一步获取userid做准备,这里先讨论如何获取code。
企业如果需要员工在跳转到企业网页时带上员工的身份信息,需构造如下的链接:(注意必须在微信中发起,做法可以是新建一个菜单,然后将下面链接绑定到菜单项)
举个例子(appid是上节得到的CorpID)
https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx4396b735dd7d0519&redirect_uri=http://www.douyh.com&response_type=code&scope=snsapi_base&state=111&connect_redirect=1#wechat_redirect
接下来说一下如何将链接绑定到菜单项。还是在自己的微信企业号后台:
应用中心,如下图:
新建一个应用:
比如考勤,建好后,点击考勤,进到以下界面:
点击模式选择下的普通模式,进入到以下界面:
点击启用
点右上角加号:
点击跳转到网页按钮,将上面 的链接添加到里面,如下图所示:
不要忘记保存和发布。
需要注意的是:此URL的域名,必须完全匹配企业应用设置项中的'可信域名'(如果你的redirect_uri有端口号,那'可信域名'也必须加上端口号),否则跳转时会提示redirect_uri参数错误。
设置可信域名的地方在下面这里:
点击菜单,会访问以下链接:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx4396b735dd7d0519&redirect_uri=http://www.douyh.com&response_type=code&scope=snsapi_base&state=111&connect_redirect=1#wechat_redirect
会新跳转到一个新链接,在微信里点击复制链接:
页面将跳转至 redirect_uri/?code=CODE&state=STATE
在程序里,我们可以通过request["code"]拿到CODE
这个CODE参数加上上节的AccessToken有助于我们拿到登录者的userid,而通过这个userid(按一定规则定义),我们可以识别登录者身份。
5.根据code及AccessToken获取成员信息
(参考http://qydev.weixin.qq.com/wiki/index.php?title=OAuth%E9%AA%8C%E8%AF%81%E6%8E%A5%E5%8F%A3)
- 请求说明
Https请求方式:GET
https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo?access_token=ACCESS_TOKEN&code=CODE
- 返回结果
a)企业成员授权时返回示例如下:
{ "UserId":"USERID", "DeviceId":"DEVICEID" }
通过这个userid,我们可以得到登录者信息,比如userid当时在后台定义成回汇雅_财务_张三],我们可以通过userid解析出登录者的工厂和角色,从而决定出其能够使用系统功能范围。
userid是第一部分中,申请到测试企业号后,自己在用户管理界面中添加的。注意,要先在后台添加好用户(用户的微信号,电话,邮箱),然后相应用户扫描微信号才可以关注成功。
这篇文章的例子不错,可以参考一下:
http://blog.csdn.net/angle_greensky110/article/details/32936289
以下给出一段例子代码:
using System; using System.Data; using System.Configuration; using System.Collections; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using System.Net; using System.Text; using System.Runtime.Serialization.Json; using System.IO; using System.Data.SqlClient; public partial class wxProcess2 : System.Web.UI.Page { public string reurl = ""; protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { string code = ""; if (Request.QueryString["code"] != null && Request.QueryString["code"] != "") { //获取微信回传的code code = Request.QueryString["code"].ToString(); AccessToken Model = Get_AccessToken(); //获取token OAuthUser OAuthUser_Model = Get_UserInfo(Model.access_token, code); if (OAuthUser_Model.UserId != null && OAuthUser_Model.UserId != "") //已获取得openid及其他信息 { //在页面上输出用户信息 Response.Write("用户UserId:" + OAuthUser_Model.UserId); //或跳转到自己的页面,想怎么处理就怎么处理 //Response.Redirect(reurl); } } } } #region 属性 public string strCorpID = "wx43b735dd7d0519"; //公众微信平台下可以找到 public string appsecret = "nRqMz-tGd-rspiEKJDFp9DqaG-tj7NW3TRBIMlAHYjsKCD6L8MYsTIGCCdvGZC"; //公众微信平台下可以找到 #endregion //https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=id&corpsecret=secrect //根据appid,secret,code获取微信openid、access token信息 protected AccessToken Get_AccessToken() { //获取微信回传的openid、access token string Str = GetJson("https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=" + strCorpID + "&corpsecret=" + appsecret); //微信回传的数据为Json格式,将Json格式转化成对象 AccessToken Oauth_Token_Model = JsonHelper.ParseFromJson<AccessToken>(Str); return Oauth_Token_Model; } // https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo?access_token=ACCESS_TOKEN&code=CODE //根据openid,access token获得用户信息 protected OAuthUser Get_UserInfo(string strAccessToken, string strCode) { string Str = GetJson("https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo?access_token=" + strAccessToken + "&code=" + strCode); OAuthUser OAuthUser_Model = JsonHelper.ParseFromJson<OAuthUser>(Str); return OAuthUser_Model; } //访问微信url并返回微信信息 protected string GetJson(string url) { WebClient wc = new WebClient(); wc.Credentials = CredentialCache.DefaultCredentials; wc.Encoding = Encoding.UTF8; string returnText = wc.DownloadString(url); if (returnText.Contains("errcode")) { //可能发生错误 } return returnText; } /// <summary> /// token类 /// </summary> public class AccessToken { public AccessToken() { // //TODO: 在此处添加构造函数逻辑 // } //access_token 网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同 //expires_in access_token接口调用凭证超时时间,单位(秒) private string _access_token; private string _expires_in; public string access_token { set { _access_token = value; } get { return _access_token; } } public string expires_in { set { _expires_in = value; } get { return _expires_in; } } } /// <summary> /// 用户信息类 /// </summary> public class OAuthUser { public OAuthUser() { } #region 数据库字段 private string _UserId; private string _DeviceId; #endregion #region 字段属性 /// <summary> /// 用户的唯一标识 /// </summary> public string UserId { set { _UserId = value; } get { return _UserId; } } /// <summary> /// /// </summary> public string DeviceId { set { _DeviceId = value; } get { return _DeviceId; } } #endregion } /// <summary> /// 将Json格式数据转化成对象 /// </summary> public class JsonHelper { /// <summary> /// 生成Json格式 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="obj"></param> /// <returns></returns> public static string GetJson<T>(T obj) { DataContractJsonSerializer json = new DataContractJsonSerializer(obj.GetType()); using (MemoryStream stream = new MemoryStream()) { json.WriteObject(stream, obj); string szJson = Encoding.UTF8.GetString(stream.ToArray()); return szJson; } } /// <summary> /// 获取Json的Model /// </summary> /// <typeparam name="T"></typeparam> /// <param name="szJson"></param> /// <returns></returns> public static T ParseFromJson<T>(string szJson) { T obj = Activator.CreateInstance<T>(); using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(szJson))) { DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType()); return (T)serializer.ReadObject(ms); } } } }