微信公众号平台单点登录开发
微信公众号平台地址:
公众平台服务号、订阅号、企业微信以及小程序的相关说明地址(区别):
https://kf.qq.com/faq/120911VrYVrA130805byM32u.html
不同类型的微信公众号接口权限:
注:订阅号不能自定义网站链接,只能用微信自己的链接地址。
单点登录流程
微信公众号单点登录流程,这里主要是认证后的服务号,不注册公众号也可以通过测试账号做测试。
只有服务号能获取用户基本信息(不过能获取的信息有限):
对比企业微信能获取的用户信息:
https://work.weixin.qq.com/api/doc/90001/90143/90332
一般公司有自己的服务号或企业号,要对外提供Web服务,配置自己的H5网站,必须是认证后的服务号。
测试账号配置
微信开发平台中提供了测试开发功能,测试开发的时候,不需要注册公众号,只是测试,而且开放所有权限。
如果有公众号账号(订阅号或者服务号都可以)
【开发】菜单中找到【开发者工具】
然后找到【公众平台测试账号】
没有公众号也可以直接用网址进入:
https://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/index
微信登录
配置消息接口,和js的安全域名,这里可以拿到测试的appID和appSecret,这两个是接口调用必需的。
配置网页授权登录,这个是用于单点登录的,一定要配置。
在微信开发者工具中测试的话可以用hosts配置本地的域名或者IP地址,正式环境只支持域名。
正式配置
要使用正式环境配置,需要用到服务号且必须认证通过的。
绑定微信开发者
绑定微信开发者:
配置appID和appSecret
【开发】的【基本配置】中可以配置appID和appSecret,appSecret只会出现一次,需要复制保存下来,不然就只能重置生成了。
配置消息服务需要的服务器地址:
授权网页登录
授权后配置网页登录授权(必须是认证后的服务号):
https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html
配置REDIRECT_URI对应的域名,否则不能正常单点登录跳转。
【设置】》【公众号设置】》【功能设置】
网页授权域名需要下载这个txt文件放到根目录才能认证通过。
认证后在这里配置跳转域名,对应REDIRECT_URI
:
授权路径(上面配置的就是
REDIRECT_URI
的域名):获取code后,请求以下链接获取access_token:
配置IP白名单
没有配置Ip白名单,不能调用接口
没有配置Ip白名单调用接口报错:
错误代码:40164, 错误信息:invalid ip 116.214.32.226 ipv6 ::ffff:116.214.32.226, not in whitelist rid: 607002a4-787b5f8f-68776f86,微信原始报文:{"errcode":40164,"errmsg":"invalid ip 116.214.32.226 ipv6 ::ffff:116.214.32.226, not in whitelist rid: 607002a4-787b5f8f-68776f86"}
开发代码
目前可以使用第三方库来访问:
Github地址:https://github.com/Wechat-Group/WxJava
引入依赖并使用
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-mp</artifactId>
<version>${weixin-java-mp.version}</version>
</dependency>
接口调用获取用户信息:
String code = ""; // 前台跳转带过来的code,用于获取用户信息,code只能用一次
String appId = "wxxxxxxxxxxxxxxxx";
String appSecret = "4afa1xxxxxxxxxxxxxxxxxxxxxx";
WxMpService wxMpService = new WxMpServiceImpl();
WxMpDefaultConfigImpl wxMpConfigStorage = new WxMpDefaultConfigImpl();
wxMpConfigStorage.setAppId(appId);
wxMpConfigStorage.setSecret(appSecret);
wxMpService.setWxMpConfigStorage(wxMpConfigStorage);
WxMpOAuth2AccessToken wxMpOAuth2AccessToken = wxMpService.oauth2getAccessToken(code);
WxMpUser wxMpUser = wxMpService.oauth2getUserInfo(wxMpOAuth2AccessToken, "zh_CN");
System.out.println(wxMpUser);
WxMpOAuth2AccessToken
中已经包含有openId,可以直接用于用户关联和单点登录,不用再次调用获取WxMpUser
,首次注册时可能需要获取WxMpUser
。
如果已经绑定了openID到用户,可以用OpenId单点登录了。
sns/userinfo和cgi-bin/user/info区别
注意:这里使用的是sns/userinfo接口,这个接口是授权模式必须是,否则获取报错
公众号获取用户信息有两个地址:
关注用户可以用:
https://api.weixin.qq.com/cgi-bin/user/info
针对未关注的用户也可以,不过需要用户授权:
https://api.weixin.qq.com/sns/userinfo