每个人注册微信后都会有个都有的ID即(OPENID),所以如果你的移动端使用了一些公司内网需要分享的信息,并且需要登录才可以共享,那么你可以通过微信实现自动跳转.OK,下面是如何实现的步骤:
首先,你的登录用户的表结构需要增加一列,暂且我们就叫它OPID吧,每个人在库中都是一条都有的信息,因此,在登录后我们将相应的OPENID填到这个字段中,作为登录的凭证即可实现整个登录的验证,思想和通过文本框输入用户名密码一样.
这里必须引入个链接:http://www.cnblogs.com/szw/
下载链接中的https://github.com/JeffreySu/WeiXinMPSDK并打开。
现在的关键点就落在如何找到这个OPENID上了。
这个有两种解决方案:
1.暂未通过验证的微信号
未通过认证的微信号可以通过页面获取OPENID,后打开找到CustomMessageHandler_Events.cs找到case "OneClick"事件,修改里面的内容,小测一下是否可以使用.
以下步骤请登录.
1.1 获取Token:
http请求方式: GET https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
利用你登录微信好的APPID和APPSECRET替换黄色部分访问你将得到
{"access_token":"ACCESS_TOKEN","expires_in":7200}
1.2 填写移动端的显示信息
打开 https://mp.weixin.qq.com/debug/cgi-bin/apiinfo?t=index&type=%E8%87%AA%E5%AE%9A%E4%B9%89%E8%8F%9C%E5%8D%95&form=%E8%87%AA%E5%AE%9A%E4%B9%89%E8%8F%9C%E5%8D%95%E5%88%9B%E5%BB%BA%E6%8E%A5%E5%8F%A3%20/menu/create
输入Token并填写按钮信息:
{ "button": [ { "type": "click", "name": "进入微站", "key": "OneClick" } ] }
微信提供了两种访问方式,区别如下
click: 用户点击click类型按钮后,微信服务器会通过消息接口推送消息类型为event的结构给开发者(参考消息接口指南),并且带上按钮中开发者填写的key值,开发者可以通过自定义的key值与用户进行交互; view: 用户点击view类型按钮后,微信客户端将会打开开发者在按钮中填写的url值(即网页链接),达到打开网页的目的,建议与网页授权获取用户基本信息接口结合,获得用户的登入个人信息。
1.3 修改显示信息
找到CustomMessageHandler_Events.cs找到case "OneClick"事件,修改如下:
var strongResponseMessage = CreateResponseMessage<ResponseMessageText>(); reponseMessage = strongResponseMessage; var str = string.Format("Hi亲,<a href='{0}?opid={1}'>猛击这里登录</a>.", "http://mobile.YOURURL.com/pages/login.aspx", requestMessage.FromUserName); strongResponseMessage.Content = str;
如果上面一段消息发送过去,微信官网的接收消息告诉我们你会得到如下XML:
<xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>1348831860</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[this is a test]]></Content> <MsgId>1234567890123456</MsgId> </xml>
注意这里的FromUserName节点就是登录者的OPENID哦。
这也就是为什么OnClick事件中的要带opid这个参数的原因。
1.4 在Login.aspx中做验证
OPENID都已经取来了然后就是登录的处理了:
1.4.1 第一次登录的时候,让用户转到登录界面,输入用户名密码,顺便将当前人的OPENID写到表中,然后再让用户登录。
1.4.2 第二次登录时,首先验证登录者传过来的opid是否在表中存在,存在就跳过登录直接进入主界面,否则就重复1.4.1步骤。
2.通过验证的微信号
上面的步骤要先点击自定义菜单,收到回复消息后才可以进行登录,用户体验并不好.既然我有了个按钮,那么我直接点击这个按钮登录不就OK了吗?
OK,这个就需要关注1.2中的View事件了,这个需要高级用户的授权认证.
微信使用的是OAuth2认证,关于如何进行此认证请参考:http://www.cnblogs.com/txw1958/p/weixin71-oauth20.html
我这里只关心登录。注意上面链接里的一句话【应用授权作用域:由于snsapi_base只能获取到openid,意义不大,所以我们使用snsapi_userinfo】,我们只关心OPENID的获取,因此我们的回调链接中使用
snsapi_base即可。微信自定义菜单如下:
{ "button": [ { "type": "view", "name": "进入微站", "url": "https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=http://wx.YOURURL.com/Pages/Login.aspx&response_type=code&scope=snsapi_base&state=1#wechat_redirect" } ] }
黄色的是你的回调地址,注意替换APPID。
具体实现步骤如下:
2.1 建立四个个需要的类OAuth_Token.cs/Config.cs/JsonHelper.cs
public class OAuth_Token { public OAuth_Token() { // //TODO: 在此处添加构造函数逻辑 // } //access_token 网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同 //expires_in access_token接口调用凭证超时时间,单位(秒) //refresh_token 用户刷新access_token //openid 用户唯一标识,请注意,在未关注公众号时,用户访问公众号的网页,也会产生一个用户和公众号唯一的OpenID //scope 用户授权的作用域,使用逗号(,)分隔 public string access_token { get; set; } public string expires_in { get; set; } public string refresh_token { get; set; } public string openid { get; set; } public string scope { get; set; } }
public struct Config { public static readonly Config Default; static Config() { Default.AppID = ConfigurationManager.AppSettings["AppID"]; Default.AppSecret = ConfigurationManager.AppSettings["AppSecret"]; Default.Token = ConfigurationManager.AppSettings["Token"]; Default.UrlPrefix = ConfigurationManager.AppSettings["WebChatUrl"]; } public string AppID { get; set; } public string AppSecret { get; set; } public string Token { get; set; } public string UrlPrefix { get; set; } }
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); } } }
2.2 修改Web.config
<appSettings> <add key="AppID" value="wxxxxxxxxxxxx" /> <add key="AppSecret" value="b98xxxxxxxxxxxxxx" /> <add key="Token" value="wxxxxxx" /> <add key="WebChatUrl" value="http://mobile.MYURL.com/pages/login.aspx" /> </appSettings>
有些节点并不需要。
2.3 现在可以写Login.aspx.cs了
public partial class Login : System.Web.UI.Page { protected string openID { get; set; }protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { if (!string.IsNullOrEmpty(Request.QueryString["code"])) { string Code = Request.QueryString["code"].ToString();//获得Token OAuth_Token Model = Get_token(Code); //这里验证用户是否存在并写信息OpenID,请根据世纪情况修改 var person = GetPersonInfo(Model.openid); if (person != null) { Session["person"] = person; Login.passportID = person.ID.ToString(); Response.Redirect("home.aspx"); } } } } //获得Token protected static OAuth_Token Get_token(string Code) { string Str = GetJson("https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + Config.Default.AppID + "&secret=" + Config.Default.AppSecret + "&code=" + Code + "&grant_type=authorization_code"); OAuth_Token Oauth_Token_Model = JsonHelper.ParseFromJson<OAuth_Token>(Str); return Oauth_Token_Model; } protected static 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")) { //可能发生错误 } //Response.Write(returnText); return returnText; } }
执行以上之后,用户首次登录获取Token的同时会获取用户OpenID,之后再用用户名和密码登录,此时系统将用户的OPenID写到库中。再次登录的时候奇迹出现了,直接跳到主页面,无需登录。