Carrey Mu

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

每个人注册微信后都会有个都有的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写到库中。再次登录的时候奇迹出现了,直接跳到主页面,无需登录。

posted on 2014-05-12 00:20  Carrey Mu  阅读(1560)  评论(1编辑  收藏  举报