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

微信登录(网站应用)ASP.NET

微信登录(网站应用)ASP.NET第一步:请求CODE.第二步:通过CODE获取access_token.第三步:通过access_token调用接

微信登录(网站应用)ASP.NET

第一步:请求CODE.
第二步:通过CODE获取access_token.
第三步:通过access_token调用接口
代码在底部

官方开发指南(指南已经说的很清楚了)

官方流程图:
这里写图片描述


第一步:
第三方使用网站应用授权登录前请注意已获取相应网页授权作用域(scope=snsapi_login),则可以通过在PC端打开以下链接:
https://open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
若提示“该链接无法访问”,请检查参数是否填写错误,如redirect_uri的域名与审核时填写的授权域名不一致或scope不为snsapi_login

这里写图片描述
这里写图片描述

请求示例

登录一号店网站应用
https://passport.yhd.com/wechat/login.do
打开后,一号店会生成state参数,跳转到
https://open.weixin.qq.com/connect/qrconnect?appid=wxbdc5610cc59c1631&redirect_uri=https%3A%2F%2Fpassport.yhd.com%2Fwechat%2Fcallback.do&response_type=code&scope=snsapi_login&state=3d6be0a4035d839573b04816624a415e#wechat_redirect
微信用户使用微信扫描二维码并且确认登录后,PC端会跳转到
https://passport.yhd.com/wechat/callback.do?code=CODE&state=3d6be0a4035d839573b04816624a415e

第二步:
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
这里写图片描述
这里写图片描述

第三步:(我调用的是获取个人信息接口)
获取用户个人信息(UnionID机制)
接口说明
此接口用于获取用户个人信息。开发者可通过OpenID来获取用户基本信息。特别需要注意的是,如果开发者拥有多个移动应用、网站应用和公众帐号,可通过获取用户基本信息中的unionid来区分用户的唯一性,因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号,用户的unionid是唯一的。换句话说,同一用户,对同一个微信开放平台下的不同应用,unionid是相同的。请注意,在用户修改微信头像后,旧的微信头像URL将会失效,因此开发者应该自己在获取用户信息后,将头像图片保存下来,避免微信头像URL失效后的异常情况。
请求说明
http请求方式: GET
https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID

这里写图片描述

这里写图片描述

代码:

//=======【微信开放平台应用基本信息设置】
/* 微信登录信息配置
* L_APPID:微信开放平台应用的APPID
* L_APPSECRET:微信开放平台应用asecert
* L_QRCONNECTION :请求code 地址
* L_REDIRECTURL :重定向地址(必须进行UrlEncode)
*/


///
/// 转到微信登录窗口,拼接URL 进行请求
///

///
///
public partial class redirectPage : System.Web.UI.Page
{
string state = WxPayApi.GenerateNonceStr();
Session["validState"] = state;
string wxLoginPage = WxPayConfig.L_QRCONNECTION + "appid=" + WxPayConfig.L_APPID + "&redirect_uri=" + HttpUtility.UrlEncode(WxPayConfig.L_REDIRECTURL) + "&response_type=code&scope=snsapi_login&state=" + state + "#wechat_redirect";//
Response.Redirect(wxLoginPage);
}

用户进行扫码后,重定向到配置的redirect_uri 页面,此页面代码:

    public partial class wxLoginRedirectURL : System.Web.UI.Page
{
private static JavascriptSerializer jss = null;
private static BLL.User user = null;
private static Model.UserEntity uentity = null;
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
string code = Request.QueryString["code"] ?? "";
if (!string.IsNullOrEmpty(code))
{
string state = Request.QueryString["state"] ?? "";//微信回发的上一步设置的state
if (!string.IsNullOrEmpty(Session["validState"].ToString()) && !string.IsNullOrEmpty(state))
{
if (Equals(Session["validState"].ToString(), state))// 校验是否相等
{
//域名所属人ID
string duserid = 1;//测试用户id
//拼接获取access_token的URL(通过code获取access_token)
string getTokenUrl = WxPayConfig.L_ACCESSTOKEN + "appid=" + WxPayConfig.L_APPID + "&secret=" + WxPayConfig.L_APPSECRET + "&code=" + code + "&grant_type=authorization_code";
string tokenResult = HttpService.Get(getTokenUrl);//开始请求
jss = new JavascriptSerializer();
// 反序列化token 信息
TokenResult obj = jss.Deserialize(tokenResult);
if (string.IsNullOrEmpty(obj.errcode))
{
user = new BLL.User();
//拼接获取用户信息的接口,通过access_token调用接口(获取用户个人信息接口(/sns/userinfo))
string wxUserInfoUrl = WxPayConfig.L_SNSUSERINFO + "access_token=" + obj.access_token + "&openid=" + obj.openid;
string userInfoResult = HttpService.Get(wxUserInfoUrl);
// 反序列化用户信息
UserInfoResult uobj = jss.Deserialize(userInfoResult);
//检查是否数据库中存在
Model.UserEntity IsExistEntity = user.SelectByUserName(uobj.unionid);
if (IsExistEntity != null)
{
//用户存在
Session["uid"] = IsExistEntity.Id;
// Log.Info("用户存在=", "!=null");
Model.UserEntity pentity = user.Select(Convert.ToInt32(duserid));
Response.Redirect(pentity.DomainLevel);
}
else
{
//用户不存在
// 存储数据库
uentity = new Model.UserEntity();
uentity.Name = uobj.nickname;
uentity.UserName = uobj.unionid;
uentity.Description = uobj.headimgurl;
if (!string.IsNullOrEmpty(duserid))
{
uentity.ParentId = Convert.ToInt32(duserid);
}
int uid = user.Save(uentity);
if (uid > 0)
{//存储session
Session["uid"] = uid;
//根据Session["pid"] 获取host
Model.UserEntity pentity = user.Select(Convert.ToInt32(duserid));
if (pentity != null)
{
Response.Redirect(" pentity.DomainLevel);
}
else
{
Log.Info("
pentity=", "null");
Response.Redirect("
~/custompage/err.htm");
}
}
}
}
else
{
// 失败
Log.Info("
反序列化openid", obj.errcode + ":" + obj.errmsg);
// 转走
Response.Redirect("
~/custompage/err.htm");
}

}
else
{
//校验失败
Response.Redirect("
~/custompage/err.htm");
}
}
else
{
//state 或Session["
validState"] 为null/空
Log.Info("
session[validstate]", Session["validState"].ToString());
}
}
else
{ //用户禁止授权
Response.Redirect("
~/main.aspx");
}
}
}
}
#region定义的序列化类
///
/// 获取微信用户信息
///

public class UserInfoResult : PubClass
{
public string nickname { get; set; }
public string province { get; set; }
public string city { get; set; }
public string country { get; set; }
public string headimgurl { get; set; }
public Array[] privilege { get; set; }
public string language { get; set; }
public int sex { get; set; }
}
///
/// access_token
///

public class TokenResult : PubClass
{
public string access_token { get; set; }
public string expires_in { get; set; }
public string refresh_token { get; set; }

public string scope { get; set; }

public string errcode { get; set; }
public string errmsg { get; set; }
}
///
/// 公有字段
///

public class PubClass
{
public string unionid { get; set; }
public string openid { get; set; }
}
#endregion

推荐阅读
  • 如何使用企业号实现文本、图片、文件、语音、视频、图文消息等消息的发送操作
    这篇文章主要为大家展示了“如何使用企业号实现文本、图片、文件、语音、视频、图文消息等消息的发送操作”,内容简而易懂,条理清晰,希望能够帮 ... [详细]
  • asp.net微信开发中有关高级群发文本的示例分析
    小编给大家分享一下asp.net微信开发中有关高级群发文本的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读 ... [详细]
  • 本文主要介绍关于的知识点,对【微信网页登录】和【微信登录】有兴趣的朋友可以看下由【蜗牛使劲冲】投稿的技术文章,希望该技术和经验能帮到你解决你所遇的【微信开发】相关技术问题。微信登录参考:https ... [详细]
  • 微信公众平台开发之如何上传下载多媒体文件
    这篇文章主要为大家展示了“微信公众平台开发之如何上传下载多媒体文件”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑, ... [详细]
  • 微信公众号推送模板40036问题
    返回码错误码描述说明40001invalidcredential不合法的调用凭证40002invalidgrant_type不合法的grant_type40003invalidop ... [详细]
  • 在JavaWeb开发中,文件上传是一个常见的需求。无论是通过表单还是其他方式上传文件,都必须使用POST请求。前端部分通常采用HTML表单来实现文件选择和提交功能。后端则利用Apache Commons FileUpload库来处理上传的文件,该库提供了强大的文件解析和存储能力,能够高效地处理各种文件类型。此外,为了提高系统的安全性和稳定性,还需要对上传文件的大小、格式等进行严格的校验和限制。 ... [详细]
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
  • 全面解析JavaScript代码注释技巧与标准规范
    在Web前端开发中,JavaScript代码的可读性和维护性至关重要。本文将详细介绍如何有效地使用注释来提高代码的可读性,并探讨JavaScript代码注释的最佳实践和标准规范。通过合理的注释,开发者可以更好地理解和维护复杂的代码逻辑,提升团队协作效率。 ... [详细]
  • 在浏览器进行微信h5支付时出现:在https:pay.weixin.qq.comwikidocapiH5.php?chapter15_4官 ... [详细]
  • 1.我说的swiper不显示图片是只有一个swiper的框,但不显示设置好的图片。第一个要确定的是图片路径设置的正不正确,确定路径没有设置错,还有一个可能的原因就是,放swiper的这个页面(也就是这 ... [详细]
  • 微信开发之消息回复--文本消息(三)
    一、消息格式1<xml>2<ToUserName><![CDATA[toUser]]>3<ToUserName ... [详细]
  • 【微信开发】微信支付参数设置【图】
    设置微信支付需要的4个参数APPIDAPPSECRETMCHIDKEY在哪里找呢其中APPIDAPPSECRET为公众号的appid和appsecret,在微信公众平台后台查看开发》基本配 ... [详细]
  •     参考:微信JS-SDK文档其中包含有分享朋友圈、发送给朋友的js接口方法。(似乎不知道什么时候就会废弃)    文档中有完整的步骤,麻烦的是第三步:通过config接口注入权限验证配置。其 ... [详细]
  • 微信开发中怎样接收视频消息的接口和参数
    这篇文章主要介绍微信开发中怎样接收视频消息的接口和参数,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!接收普通消息 ... [详细]
  • 一.案例介绍这里模拟一个实际业务场景,进行介绍微信支付,业务功能包括:登录、注册、充值、查看充值记录。  页面图:  二.概要设计1.数据库设计  这里数 ... [详细]
author-avatar
Jolina
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有