为了账号安全,请及时绑定邮箱和手机立即绑定

微信登录(微信公众号授权)的开发(详解)——两三行代码的事,何必呢

标签:
Java WebApp

新版重构的SDK已经开始在写了,具体的使用方法参考wiki

新版重构的SDK已经开始在写了,具体的使用方法参考wiki

新版重构的SDK已经开始在写了,具体的使用方法参考wiki

新版重构的SDK已经开始在写了,具体的使用方法参考wiki

新版重构的SDK已经开始在写了,具体的使用方法参考wiki

新版重构的SDK已经开始在写了,具体的使用方法参考wiki

新版重构的SDK已经开始在写了,具体的使用方法参考wiki


支付和退款都讲完了,就来讲讲微信登录吧。不管微信登录还是微信授权(以下统一称为微信登录),最终的目的,都是获取用户在微信开放平台的信息。

在讲怎么使用我这个SDK(synergic-developing)做微信登录时,先来补充点微信登录的知识。

1.UnionId和OpenId

微信登录最重要的两个返回信息,一个是UnionId,一个是OpenId。两者之间有着必然的联系。

首先,先来理一下微信开放平台的架构。开发微信登录,必须有一个开放平台账号(公众号授权可以不用,后面会讲到)。开放平台下面可以申请多个应用或绑定微信公众号(必须为服务号)。如下图所示

图片描述

APP登录就得申请移动应用(做了微信支付的都知道怎么回事了哈);电脑端登录就得申请网页应用(必须有域名,还得填表什么的,具体就不说了);微信公众号授权,主要场景是,在微信打开某个链接,然后用户统一授权给公众号,表示可以获取用户的微信信息。

开放平台和各种申请的应用或者公众号的关系,如下图所示(别问我为什么这都还要用图表示)。

图片描述

可以把这想象成是订单主表和订单明细的关系(一对多)。

这跟OpenId和UnionId有什么关系呢?

先来讲OpenId,一个微信账户对应每一个应用或者微信公众号,有各自的OpenId,用来标记,这个微信账户,和这个应用,或者微信公众号的关系。接着看图会清晰一点(好羞耻,又有不可描述的图了)

图片描述

PS:图上所示的应用和微信公众号都在同一个开放平台下。但是这个关系即使是应用不在同一个微信开放平台下仍然成立。

接着是UnionId。可以把UnionId看成是微信用户和微信开放平台的关系。再来一个图(请叫我达芬奇,谢谢)。

图片描述

总结起来就一句话,一个微信和不同应用以OpenId联系,与开放平台下以UnionId联系。

2.微信登录(公众号授权)的流程

流程说起来就那么点。获取Code->用Code获取AccessToken和OpenId(和UnionId)->用AccessToken获取微信用户的微信信息。

需要讲的是,每种应用获取Code的方法不一样。UnionId返回的时候可能没有,APP登录需要根据获取code传入的scope来返回,公众号需要绑定了开放平台之后才能获取UnionId。本人姓懒,所以这个SDK获取的Code都是能拿到UnionId的。

首先是APP,微信有官方的SDK提供,几行代码他们APP前端就能获取到Code。

@RequestMapping("/recieveCode")
public void revieveCode(Code4AccessToken codeObj) throws Exception{
    WechatLoginClient.getUserInfoByCode4App(codeObj);
}

接着是电脑端扫码登录。流程大概是这样子的。前端请求服务器->服务器重定向到,拼接好微信扫码登录的链接(里面拼接了回调接口)->微信收到用户扫码登录确认的请求,回调服务器的接口->服务器获得Code->接下来用Code为所欲为。代码示例如下:

//以Spring MVC为例
@GetMapping("/wxauth")
public String wxAuth(String state) throws Exception{
//state我称为胎记,最后会讲到。    
    String authUrl=WechatLoginClient.getPcAuthUrl("域名"+"/recieveCode",state);
    return "redirect:"+authUrl;
}

@RequestMapping("/recieveCode")
public void revieveCode(Code4AccessToken codeObj) throws Exception{
    //拿到微信头像,昵称什么的。当然还有UnionId和OpenId
    WechatUserInfo userInfo = WechatLoginClient.getUserInfoByCode4PC(codeObj);
}

登录的效果如下:
图片描述

PS:还有一种做法呢是引用微信官方的JS,同样是微信扫码确认之后,回调服务器的切口并返回Code,具体看文档吧。

最后是公众号。流程跟Pc扫码的差不多。前端请求服务器->服务器拼接授权地址返回->前端把授权地址分享到微信->用户点开授权->微信回调服务器接口。也可以不经过服务器返回链接,直接像PC端登录一样,请求服务器的时候重定向。但是鉴于有些特殊的需求。比如下面的Demo是演示分销模块的逻辑(就是特么的邀请码什么的)。

@GetMapping("/wxauth")
@ResponseBody
public String wxAuth(@RequestParam("token")String token) throws Exception{

    //处理token
    LoginInfo info = service.findByToken(token);    

    String inviteCode = info.getInviteCode();
    String authUrl=WechatLoginClient.getOfficialAccAuthUrl("域名"+"/recieveCode",inviteCode);
    return authUrl;
}

@RequestMapping("/recieveCode")
public void revieveCode(Code4AccessToken codeObj) throws Exception{
    //获取邀请码
    String inviteCode = codeObj.getState();
    /**
        根据邀请码处理自己的业务
     */

    //拿到微信头像,昵称什么的。当然还有UnionId和OpenId
    WechatUserInfo userInfo = WechatLoginClient.getUserInfoByCode4OffcialAcc(codeObj);
}

3.State参数

接着说说state这个参数。在拼接获取Code链接的时候,会额外传入一个参数叫state。这个参数的值是你怎么传过去给微信,微信怎么传回来给你。我觉得跟胎记很像。就是你不管你的娃去微信那里多久了,你都能根据这个胎记认出,这就是你的娃。分销模块就是个很好的例子。也有的往state里面传入sessionId的,比如扫码登录。

PS:后续会出全新的版本,预计6月份发布(2018.4.19记)。

点击查看更多内容
3人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
JAVA开发工程师
手记
粉丝
105
获赞与收藏
297

关注作者,订阅最新文章

阅读免费教程

感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消