热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

微信开放平台—网站授权微信登录功能(附带源码)

1微信开放平台:https://open.weixin.qq.com/2微信官方教程:ht


1 微信开放平台:https://open.weixin.qq.com/

2 微信官方教程:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419316505&token=&lang=zh_CN

3.pc页面显示技术分享

4. 通过官方提供的文档,我们可以看出一共分4个步骤

第一步:请求CODE

第二步:通过code获取access_token

第三步:通过access_token调用接口

第4步:获取用户个人信息(UnionID机制)

api:核心代码

public class weixin_helper
{
public weixin_helper()
{
}
///


/// 根据AppID和AppSecret获得access token(默认过期时间为2小时)
///

/// Dictionary
public static Dictionary<string, object> get_access_token()
{
//获得配置信息
oauth_config cOnfig= oauth_helper.get_config(2);
string send_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" +
config.oauth_app_id
+ "&secret=" + config.oauth_app_key + "";
//发送并接受返回值
string result = Utils.HttpGet(send_url);
if (result.Contains("errmsg"))
{
return null;
}
try
{
Dictionary
<string, object> dic = JsonConvert.DeserializeObjectstring, object>>(result);
return dic;
}
catch
{
return null;
}
}
///
/// 取得临时的Access Token(默认过期时间为2小时)
///

/// 临时Authorization Code
/// 防止CSRF攻击,成功授权后回调时会原样带回
/// Dictionary
public static Dictionary<string, object> get_access_token(string code, string state)
{
//获得配置信息
oauth_config cOnfig= oauth_helper.get_config(2);
string send_url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" +
config.oauth_app_id
+ "&secret=" + config.oauth_app_key + "&code="+code+"&grant_type=authorization_code";
//发送并接受返回值
string result = Utils.HttpGet(send_url);
if (result.Contains("errmsg"))
{
return null;
}
try
{
Dictionary
<string, object> dic = JsonConvert.DeserializeObjectstring, object>>(result);
return dic;
}
catch
{
return null;
}
}
///
/// 根据access_token判断access_token是否过期
///

///
/// true表示未失效
public static bool check_access_token(string access_token)
{
//获得配置信息
oauth_config cOnfig= oauth_helper.get_config(2);
string send_url = "https://api.weixin.qq.com/sns/auth?access_token=" + access_token + "&openid=" + config.oauth_app_id;
//发送并接受返回值
string result = Utils.HttpGet(send_url);
try
{
Dictionary
<string, object> dic = JsonConvert.DeserializeObjectstring, object>>(result);
if (dic.ContainsKey("errmsg"))
{
if (dic["errmsg"].ToString()=="ok")
{
return true;
}
else
{
return false;
}
}
return false;
}
catch
{
return false;
}
}
///
/// 若fresh_token已过期则根据refresh_token取得新的refresh_token
///

/// refresh_token
/// Dictionary
public static Dictionary<string, object> get_refresh_token(string refresh_token)
{
//获得配置信息
oauth_config cOnfig= oauth_helper.get_config(2);
string send_url =
"https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=" +
config.oauth_app_id
+ "&grant_type=refresh_token&refresh_token=" + refresh_token;
//发送并接受返回值
string result = Utils.HttpGet(send_url);
if (result.Contains("errmsg"))
{
return null;
}
try
{
Dictionary
<string, object> dic = JsonConvert.DeserializeObjectstring, object>>(result);
return dic;
}
catch
{
return null;
}
}
///
/// 获取登录用户自己的基本资料
///

/// 临时的Access Token
/// 用户openid
/// Dictionary
public static Dictionary<string, object> get_user_info(string access_token, string open_id)
{
//获得配置信息
oauth_config cOnfig= oauth_helper.get_config(2);
//发送并接受返回值
string send_url = "https://api.weixin.qq.com/sns/userinfo?access_token="+access_token+"&openid="+open_id;
//发送并接受返回值
string result = Utils.HttpGet(send_url);
if (result.Contains("errmsg"))
{
return null;
}
//反序列化JSON
Dictionary<string, object> dic = JsonHelper.DataRowFromJSON(result);
return dic;
}
}

控制器的核心代码:

#region 微信登录
///


/// 微信登录
///

public ActionResult WeChat()
{
//获得配置信息
oauth_config cOnfig= oauth_helper.get_config(2); //主键id
if (cOnfig== null)
{
return Content("出错了,您尚未配置微信相关的API信息!");
}
string state = Guid.NewGuid().ToString().Replace("-", "");
Session[
"oauth_state"] = state;
string send_url =
"https://open.weixin.qq.com/connect/qrconnect?appid=" + config.oauth_app_id +
"&redirect_uri=" + Utils.UrlEncode(config.return_uri.ToLower()) +
"&response_type=code&scope=snsapi_login&state=" + state +
"#wechat_redirect";
//开始发送
return Redirect(send_url); //跳转到微信自己 指定的关联登陆页面
}
///
/// 微信登录返回action
///

public ActionResult WeChatReturnUrl(string state, string code)
{
//取得返回参数
string access_token = string.Empty;
string expires_in = string.Empty;
string client_id = string.Empty;
string openid = string.Empty;
string refresh_token = string.Empty;
if (Session["oauth_state"] == null || Session["oauth_state"].ToString() == "" ||
state
!= Session["oauth_state"].ToString() || string.IsNullOrEmpty(code))//若返回参数中未包含code或者state没有通过验证则提示出错
{
return Content("出错啦,state未初始化!");
}
//第一步:通过code来获取Access Token以及openid
Dictionary<string, object> dic1 = weixin_helper.get_access_token(code, state);
if (dic1 == null || !dic1.ContainsKey("access_token"))
{
return Content("错误代码:,无法获取Access Token,请检查App Key是否正确!");
}
if (dic1 == null || !dic1.ContainsKey("openid"))
{
if (dic1.ContainsKey("errmsg"))
{
return Content("errcode:" + dic1["errcode"] + ",errmsg:" + dic1["errmsg"]);
}
else
{
return Content("出错啦,无法获取用户授权Openid!");
}
}
access_token
= dic1["access_token"].ToString();//获取access_token
expires_in = dic1["expires_in"].ToString();//获取过期时间
refresh_token = dic1["refresh_token"].ToString();//获取用于重新刷新access_token的凭证
openid = dic1["openid"].ToString();//用户唯一标示openid
//储存获取数据用到的信息
Session["oauth_name"] = "webchat";
Session[
"oauth_access_token"] = access_token;
Session[
"oauth_openid"] = openid;
Session[
"oauth_refresh_token"] = refresh_token;
#region todo 将获取到的用户信息保存到数据库中
#endregion
//第二步:通过Access Token以及openid来获取用户的基本信息
//Dictionary dic2 = weixin_helper.get_user_info(access_token,openid);
//第三步:跳转到指定页面
return Content(WeChatResultJson());
}
///
/// 微信登录返回action, 处理用户信息
///

public string WeChatResultJson()
{
string oauth_access_token = string.Empty;
string oauth_openid = string.Empty;
string oauth_name = string.Empty;
string oauth_refresh_token = string.Empty;
if (Session["oauth_name"] == null || Session["oauth_access_token"] == null ||
Session[
"oauth_openid"] == null)
{
return "{"ret":"1", "msg":"出错啦,Access Token已过期或不存在!"}";
}
oauth_name
= Session["oauth_name"].ToString();
oauth_access_token
= Session["oauth_access_token"].ToString();
oauth_openid
= Session["oauth_openid"].ToString();
oauth_refresh_token
= Session["oauth_refresh_token"].ToString();
if (!weixin_helper.check_access_token(oauth_access_token)) //调用access_token前需判断是否过期
{
Dictionary
<string, object> dic1 = weixin_helper.get_refresh_token(oauth_refresh_token);//如果已过期则重新换取新的access_token
if (dic1 == null || !dic1.ContainsKey("access_token"))
{
return "{"openid":"0", "msg":"出错啦,无法获取access_token!"}";
}
oauth_access_token
= dic1["access_token"].ToString();
}
Dictionary
<string, object> dic = weixin_helper.get_user_info(oauth_access_token, oauth_openid);
if (dic == null)
{
return "{"openid":"0", "msg":"出错啦,无法获取授权用户信息!"}";
}
try
{
StringBuilder str
= new StringBuilder();
str.Append(
"{");
str.Append(
""openid": "" + dic["openid"].ToString() + "", ");
str.Append(
""nickname": "" + dic["nickname"].ToString() + "", ");
str.Append(
""sex": "" + dic["sex"].ToString() + "", ");
str.Append(
""province": "" + dic["province"].ToString() + "", ");
str.Append(
""city": "" + dic["city"].ToString() + "", ");
str.Append(
""country": "" + dic["country"].ToString() + "", ");
str.Append(
""headimgurl": "" + dic["headimgurl"].ToString() + "", ");
str.Append(
""privilege": "" + dic["privilege"].ToString() + "", ");
str.Append(
""unionid": "" + dic["unionid"].ToString() + """);
str.Append(
""oauth_name": "" + oauth_name + """);
str.Append(
""oauth_access_token": "" + oauth_access_token + """);
str.Append(
""oauth_openid": "" + oauth_openid + """);
str.Append(
"}");
return str.ToString();
}
catch
{
return "{"ret":"0", "msg":"出错啦,无法获取授权用户信息!"}";
}
}
#endregion

 5.源码下载地址:http://files.cnblogs.com/files/xxpeng/%E5%BE%AE%E4%BF%A1%E6%89%AB%E7%A0%81%E6%8E%88%E6%9D%83%E7%99%BB%E5%BD%95.rar

我的签名:坚持赚钱,顺便理想

微信开放平台---网站授权微信登录功能(附带源码)

原文:http://www.cnblogs.com/xxpeng/p/4832051.html




推荐阅读
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • 使用nodejs爬取b站番剧数据,计算最佳追番推荐
    本文介绍了如何使用nodejs爬取b站番剧数据,并通过计算得出最佳追番推荐。通过调用相关接口获取番剧数据和评分数据,以及使用相应的算法进行计算。该方法可以帮助用户找到适合自己的番剧进行观看。 ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 本文讨论了Kotlin中扩展函数的一些惯用用法以及其合理性。作者认为在某些情况下,定义扩展函数没有意义,但官方的编码约定支持这种方式。文章还介绍了在类之外定义扩展函数的具体用法,并讨论了避免使用扩展函数的边缘情况。作者提出了对于扩展函数的合理性的质疑,并给出了自己的反驳。最后,文章强调了在编写Kotlin代码时可以自由地使用扩展函数的重要性。 ... [详细]
  • React项目中运用React技巧解决实际问题的总结
    本文总结了在React项目中如何运用React技巧解决一些实际问题,包括取消请求和页面卸载的关联,利用useEffect和AbortController等技术实现请求的取消。文章中的代码是简化后的例子,但思想是相通的。 ... [详细]
  • 如何查询zone下的表的信息
    本文介绍了如何通过TcaplusDB知识库查询zone下的表的信息。包括请求地址、GET请求参数说明、返回参数说明等内容。通过curl方法发起请求,并提供了请求示例。 ... [详细]
  • uniapp开发H5解决跨域问题的两种代理方法
    本文介绍了uniapp开发H5解决跨域问题的两种代理方法,分别是在manifest.json文件和vue.config.js文件中设置代理。通过设置代理根域名和配置路径别名,可以实现H5页面的跨域访问。同时还介绍了如何开启内网穿透,让外网的人可以访问到本地调试的H5页面。 ... [详细]
  • 图像因存在错误而无法显示 ... [详细]
author-avatar
tcs126_924
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有