本文通过实现的微信开放平台之网站授权微信登录功能,需要的小伙伴一起看看吧admin管理员组文章数量:1539852
1 微信开放平台:https://open.weixin.qq/
2 微信官方教程:https://open.weixin.qq/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:核心代码
?1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 |
public
class
weixin_helper
{
public
weixin_helper()
{
}
/// <summary>
/// 根据AppID和AppSecret获得access token(默认过期时间为2小时)
/// </summary>
/// <returns>Dictionary</returns>
public
static
Dictionary<
string
,
object
> get_access_token()
{
//获得配置信息
oauth_config config = oauth_helper.get_config(2);
string
send_url =
"https://api.weixin.qq/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.DeserializeObject<Dictionary<
string
,
object
>>(result);
return
dic;
}
catch
{
return
null
;
}
}
/// <summary>
/// 取得临时的Access Token(默认过期时间为2小时)
/// </summary>
/// <param name="code">临时Authorization Code</param>
/// <param name="state">防止CSRF攻击,成功授权后回调时会原样带回</param>
/// <returns>Dictionary</returns>
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/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.DeserializeObject<Dictionary<
string
,
object
>>(result);
return
dic;
}
catch
{
return
null
;
}
}
/// <summary>
/// 根据access_token判断access_token是否过期
/// </summary>
/// <param name="access_token"></param>
/// <returns>true表示未失效</returns>
public
static
bool
check_access_token(
string
access_token)
{
//获得配置信息
oauth_config config = oauth_helper.get_config(2);
string
send_url =
"https://api.weixin.qq/sns/auth?access_token="
+ access_token +
"&openid="
+ config.oauth_app_id;
//发送并接受返回值
string
result = Utils.HttpGet(send_url);
try
{
Dictionary<
string
,
object
> dic = JsonConvert.DeserializeObject<Dictionary<
string
,
object
>>(result);
if
(dic.ContainsKey(
"errmsg"
))
{
if
(dic[
"errmsg"
].ToString()==
"ok"
)
{
return
true
;
}
else
{
return
false
;
}
}
return
false
;
}
catch
{
return
false
;
}
}
/// <summary>
/// 若fresh_token已过期则根据refresh_token取得新的refresh_token
/// </summary>
/// <param name="refresh_token">refresh_token</param>
/// <returns>Dictionary</returns>
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/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.DeserializeObject<Dictionary<
string
,
object
>>(result);
return
dic;
}
catch
{
return
null
;
}
}
/// <summary>
/// 获取登录用户自己的基本资料
/// </summary>
/// <param name="access_token">临时的Access Token</param>
/// <param name="open_id">用户openid</param>
/// <returns>Dictionary</returns>
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/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;
}
}
|
控制器的核心代码:
?1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 |
#region 微信登录
/// <summary>
/// 微信登录
/// </summary>
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/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);
//跳转到微信自己 指定的关联登陆页面
}
/// <summary>
/// 微信登录返回action
/// </summary>
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<string, object> dic2 = weixin_helper.get_user_info(access_token,openid);
//第三步:跳转到指定页面
return
Content(WeChatResultJson());
}
/// <summary>
/// 微信登录返回action, 处理用户信息
/// </summary>
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
|
版权声明:本文标题:微信开放平台之网站授权微信登录功能 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dianzi/1725776836a1041934.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论