zoukankan      html  css  js  c++  java
  • 如何通过微信自定义菜单跳转到自己的网站

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

  • 相关阅读:
    精彩的漫画小说
    《Java语言精粹》译者序
    群啊群
    围观透明咆哮体
    读《Cassandra权威指南》
    好书什么样?
    一个关于360和腾讯的调查
    Xcode 3.x class ations 以及outlets 去哪里了 ?
    「译」JavaScript 的 MVC 模式
    MAC OS 虚拟机里的control键设置
  • 原文地址:https://www.cnblogs.com/CarreyMu/p/3722624.html
Copyright © 2011-2022 走看看