Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 684|回复: 0

.NET微信网页开发之通过UnionID机制,解决用户在不同公众号,或在公众号、移动应用之间帐号统一问题

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-7-3 23:05:27 | 显示全部楼层 |阅读模式

    开发背景:

      最近一段时间一直在做关于微信方面的网站应用开发,这段时间也收获的不少关于微信开发方面的开发技能,接触的比较多的主要有微信公众号和微信网站app第三方登录授权,以及微信会员卡,优惠券和扫描二位码的功能,今天我主要想要总结的是微信公众号登录和网站app第三方应用微信授权登录这两者之间获取到的Openid关联问题,实现两边登录都是同一个账号。

        首先我们必须区别开来微信公众平台开发是指微信公众号进行业务开发(https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1445241432),为网站微信登录授权是需要在微信开发平台中创建网站应用来使用的(https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&lang=zh_CN),但是要想把微信公众号于微信网站授权登录获取到的Oppenid关联起来的话我们可以通过UnionID关联起来。

    微信开放平台配置:

    登录进入微信开放平台>进行微信公众号绑定

    微信开发平台公众账号关联的如下图:


     

    UnionID机制说明:

    开发者可通过OpenID来获取用户基本信息。特别需要注意的是,如果开发者拥有多个移动应用、网站应用和公众帐号,可通过获取用户基本信息中的unionid来区分用户的唯一性,因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号,用户的unionid是唯一的。换句话说,同一用户,对同一个微信开放平台下的不同应用,unionid是相同的。

    获取用户基本信息(包括UnionID机制)开发者可通过OpenID来获取用户基本信息。请使用https协议。

    接口调用请求说明
    http请求方式: GET
    https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN 

     

     微信公众号微信登录配置:

    在基本配置中获取微信公众号的appid和appsecrect(一定是要自己公众号的),白名单是你在本地调试的微信项目的时候需要添加的你本地的ip地址,不然获取不到你想要的accsee_token

     

    配置服务器地址(url):这里是你的项目与微信服务器通讯的地方,一定不能填错,Token是你项目中的,将其复制到这里即可,消息加密解密密钥是微信端随机生成的

     

    在微信公众号设置设置对应业务域名,js接口安全域名,以及网页授权域名

     

    代码实现:

    用户同意授权获取对应的授权码code(注意:我这里使用的是微信公众号的登录授权,假如你需要做网站授权的换一个api即可下面两步都是一样)

    微信网站用户同意授权获取code的api:

    第三方使用网站应用授权登录前请注意已获取相应网页授权作用域(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。

     

     

    //授权入口
    public ActionResult WxLogin()
    {
    //异步跳转地址
    var loginUrl = "http://" + Request.Url.Authority + Url.Action("WxRegisterAndLogin") ;
    return Redirect("https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + appid + "&redirect_uri=" + Url.Encode(loginUrl) + "&response_type=code&scope=snsapi_userinfo&state=state#wechat_redirect");
    }

    通过通过code获取网页授权access_token和用户唯一标识Openid,最后拉取用户信息(需要scope为snsapi_userinfo)

    /// <summary>
    /// 微信登录注册(通过unionid来判断之前是否已经存在同一个工作平台注册过的账号,假如存在的话则关联起来,不存在注册一个新的账号)
    /// </summary>
    /// <param name="code">获取用户凭证换取用户网页授权</param>
    /// <param name="ReturnUrl">跳转地址</param>
    /// <returns></returns>
    public async Task<ActionResult> WxRegisterAndLogin(string code, string ReturnUrl = "")
    {
    
    try
    {
    
    //登录成功后跳转的地址
    string url=ReturnUrl;
    
    //通过Code以及微信appscrect和wxappid换取网页授权access_token和用户oppenid
    HttpClient webClient = new HttpClient();
    var  jsonString = await (await webClient.GetAsync("https://api.weixin.qq.com/sns/oauth2/access_token?appid=" +公众号appid+ "&secret=" + 公众号AppSecret + "&code=" + code + "&grant_type=authorization_code")).Content.ReadAsStringAsync();
    
    //异步获取的用户oppenid和access_token
    var  jsonOAuthorObj = JsonConvert.DeserializeObject(jsonString, new { access_token = "", openid = "" }.GetType());
    
    if (jsonOAuthorObj.openid == null)
    {
    return Content(jsonString + "出现错误请重试");
    }
    
    var myuser = new user { WxOpenId = jsonOAuthorObj.openid }.SelectObject();
    
    //注册成功后直接登录,授权会判断是否有账户
    if (myuser == null)
    {
    
    //拉取用户信息(需scope为 snsapi_userinfo),和unionid(只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段)
    jsonString = await (await webClient.GetAsync("https://api.weixin.qq.com/sns/userinfo?access_token=" + jsonOAuthorObj.access_token + "&openid=" + jsonOAuthorObj.openid + "&lang=zh_CN")).Content.ReadAsStringAsync();
    dynamic jsonObj = JsonConvert.DeserializeObject(jsonString, new { nickname = "", headimgurl = "", sex = "", openid = "", country = "", province = "", city = "",unionid=""}.GetType());
    
    //查询系统中是否存在unionid用户信息,若存在则更新当前用户openid,并直接登录,如果不存在的话则需要创建一个新的用户信息
    var isExistUserInfo=new user(){unionid=unionid }.SelectObject();
    if(isExistUserInfo!=null)//存在该用户记录
    {
    //更新公众号openid
     isExistUserInfo.WxOpenId=jsonObj.openid;
     isExistUserInfo.Update();
    //存在用户信息直接登录
    return Redirect(url);
    }
    else//不存在该用户记录
    {
    //创建用户
    int cUserId = new user { Wximage= jsonObj.headimgurl, WxNickName = jsonObj.nickname, WxOpenId = jsonObj.openid, Sex = Convert.ToInt32(jsonObj.sex), Country = jsonObj.country, Province = jsonObj.province, City = jsonObj.city,unionid=unionid }.Create();
    return RedirectToAction("WxRegister", "Login", new { ReturnUrl = url });
    }
    }
    else
    {
    //存在用户信息直接登录
    return Redirect(url);
    }
    }
    catch (Exception e)
    {
    return View("MessageInfo", "", e.ToString());
    }
    } 
    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-12-22 21:50 , Processed in 0.111603 second(s), 28 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表