您的位置:首页 > 运维架构 > 网站架构

如何通过微信自定义菜单跳转到自己的网站

2014-05-12 00:20 519 查看
每个人注册微信后都会有个都有的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请求方式:GEThttps://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"事件,修改如下:


varstrongResponseMessage=CreateResponseMessage<ResponseMessageText>();
reponseMessage=strongResponseMessage;
varstr=string.Format("Hi亲,<ahref='{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[thisisatest]]></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步骤。

[b]2.通过验证的微信号[/b]

上面的步骤要先点击自定义菜单,收到回复消息后才可以进行登录,用户体验并不好.既然我有了个按钮,那么我直接点击这个按钮登录不就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


publicclassOAuth_Token
{
publicOAuth_Token()
{
//
//TODO:在此处添加构造函数逻辑
//
}
//access_token网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同
//expires_inaccess_token接口调用凭证超时时间,单位(秒)
//refresh_token用户刷新access_token
//openid用户唯一标识,请注意,在未关注公众号时,用户访问公众号的网页,也会产生一个用户和公众号唯一的OpenID
//scope用户授权的作用域,使用逗号(,)分隔
publicstringaccess_token{get;set;}
publicstringexpires_in{get;set;}
publicstringrefresh_token{get;set;}
publicstringopenid{get;set;}
publicstringscope{get;set;}
}




publicstructConfig
{
publicstaticreadonlyConfigDefault;

staticConfig()
{
Default.AppID=ConfigurationManager.AppSettings["AppID"];
Default.AppSecret=ConfigurationManager.AppSettings["AppSecret"];
Default.Token=ConfigurationManager.AppSettings["Token"];
Default.UrlPrefix=ConfigurationManager.AppSettings["WebChatUrl"];
}

publicstringAppID{get;set;}
publicstringAppSecret{get;set;}
publicstringToken{get;set;}
publicstringUrlPrefix{get;set;}
}


publicclassJsonHelper
{
///<summary>
///生成Json格式
///</summary>
///<typeparamname="T"></typeparam>
///<paramname="obj"></param>
///<returns></returns>
publicstaticstringGetJson<T>(Tobj)
{
DataContractJsonSerializerjson=newDataContractJsonSerializer(obj.GetType());
using(MemoryStreamstream=newMemoryStream())
{
json.WriteObject(stream,obj);
stringszJson=Encoding.UTF8.GetString(stream.ToArray());returnszJson;
}
}
///<summary>
///获取Json的Model
///</summary>
///<typeparamname="T"></typeparam>
///<paramname="szJson"></param>
///<returns></returns>
publicstaticTParseFromJson<T>(stringszJson)
{
Tobj=Activator.CreateInstance<T>();
using(MemoryStreamms=newMemoryStream(Encoding.UTF8.GetBytes(szJson)))
{
DataContractJsonSerializerserializer=newDataContractJsonSerializer(obj.GetType());
return(T)serializer.ReadObject(ms);
}
}
}


2.2修改Web.config


<appSettings>
<addkey="AppID"value="wxxxxxxxxxxxx"/>
<addkey="AppSecret"value="b98xxxxxxxxxxxxxx"/>
<addkey="Token"value="wxxxxxx"/>
<addkey="WebChatUrl"value="http://mobile.MYURL.com/pages/login.aspx"/>
</appSettings>


有些节点并不需要。

2.3现在可以写Login.aspx.cs了

publicpartialclassLogin:System.Web.UI.Page
{
protectedstringopenID{get;set;}protectedvoidPage_Load(objectsender,EventArgse)
{
if(!IsPostBack)
{
if(!string.IsNullOrEmpty(Request.QueryString["code"]))
{
stringCode=Request.QueryString["code"].ToString();//获得Token
OAuth_TokenModel=Get_token(Code);
           //这里验证用户是否存在并写信息OpenID,请根据世纪情况修改
varperson=GetPersonInfo(Model.openid);
if(person!=null)
{
Session["person"]=person;
Login.passportID=person.ID.ToString();
Response.Redirect("home.aspx");
}
}
}
}

//获得Token
protectedstaticOAuth_TokenGet_token(stringCode)
{
stringStr=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_TokenOauth_Token_Model=JsonHelper.ParseFromJson<OAuth_Token>(Str);
returnOauth_Token_Model;
}
protectedstaticstringGetJson(stringurl)
{
WebClientwc=newWebClient();
wc.Credentials=CredentialCache.DefaultCredentials;
wc.Encoding=Encoding.UTF8;
stringreturnText=wc.DownloadString(url);

if(returnText.Contains("errcode"))
{
//可能发生错误
}
//Response.Write(returnText);
returnreturnText;
}
}


执行以上之后,用户首次登录获取Token的同时会获取用户OpenID,之后再用用户名和密码登录,此时系统将用户的OPenID写到库中。再次登录的时候奇迹出现了,直接跳到主页面,无需登录。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐