网上参考了很多,从中总结了一下(适合自己的才是最好的)。这里大致总结一些细节性的东西,配置步骤啥的参考他人的即可。首先了解openid到底是个啥:所谓的openid就是公众号普通用户的一个唯一的标识,只针对当前的公众号有效,开发者可以通过openID来获取用户的基本信息,比如说:所在城市,省份,国家,性别等等。(对不同的公众号同一个人普通用户的openID是不同的!)
环境配置阶段
1.申请测试微信公众号(没什么限制性的地方,只需设置几个关键的地方即可)
申请网址:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
2.知己知彼(名词理解)
APPID:微信公众号ID
ASPECTSECRET:微信公众号密钥
URL:进行相关接口开发的URL
TOKEN:验证接口的令牌,可以自己定义(需要与在后台自定义的token进行校验,验证成功后才会配置成功)
JS域名:安全设置,调用微信JS-SDK的时候,域名与此相同。一般调试的话填写映射地址,无http://
之后的操作当时我只是为了调试是否能得到openID,所以只用到了App ID和ASPECTSECRET,后面的配置没怎么用到,到文章最后再总结一下其他参数的配置。
后台实现阶段
1.用到的主要的maven依赖包-------------------weixin-java-mp.
<!--weixin-->
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-mp</artifactId>
<version>2.6.0</version>
</dependency>
2.配置类(主要是里面WxMpService,我们需要将其封装为我们自己的service,也就是需要写入APPID和SECRET)
@Component
public class WxMpConfig {
@Value("${wxconfig.AppId}")
private String AppId;
@Value("${wxconfig.Secret}")
private String Secret;
@Bean
public WxMpService wxMpService(){
WxMpService wxMpService = new WxMpServiceImpl();
WxMpInMemoryConfigStorage ConfigStorage = new WxMpInMemoryConfigStorage();
ConfigStorage.setAppId(AppId);
ConfigStorage.setSecret(Secret);
wxMpService.setWxMpConfigStorage(ConfigStorage);
return wxMpService;
}
}
注意:配置文件的信息要配置好,我这里用的是yml格式,用Value进行读取。
3.应用层进行获取openID以及重定向路由:
@RestController
@Slf4j
@RequestMapping("wx")
public class WinxinController {
//这个就是我们封装好的service
@Autowired
private WxMpService wxMpService;
@GetMapping("openid")
public Map<String,Object> getOpenId(@RequestParam String code) {
log.info("微信获取openID 入参:{}",code);
Map<String,Object> resultMap = new HashMap<>();
if (StringUtils.isEmpty(code)){
resultMap.put("404","参数为空");
return resultMap;
}
try {
//未登录过获取openId进行授权
String openID = null;
WxMpOAuth2AccessToken accessToken = wxMpService.oauth2getAccessToken(code);
openID = accessToken.getOpenId();
resultMap.put("openId",openID);
return resultMap;
}catch (WxErrorException e) {
// e.printStackTrace(); //尽量不要使用这个打印异常,会造成内存锁,使用log日志就好
log.error(e.getError().getErrorMsg());
resultMap.put("404","参数为空");
return resultMap;
}
@GetMapping("authorize")
public SinochemHttpResponse<Object> getAuthorize(@RequestParam String url,@RequestParam String state){
log.info("重定向的页面路由URL:{}",url);
log.info("获取用户自定义信息:{}",state);
Map<String,Object> resultMap = new HashMap<>();
try {
String redictUrl = wxMpService.oauth2buildAuthorizationUrl(url,WxConsts.OAUTH2_SCOPE_BASE,URLEncoder.encode(state,"UTF-8"));
resultMap.put("redictUrl",redictUrl);
return SinochemHttpResponse.success(resultMap);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
return SinochemHttpResponse.error("404","获取失败(重定向路由)!");
}
}
}
第二个GET请求主要是用来重定向路由的,如果你的请求在微信直接访问是会报错的,微信有专门的访问机制,先到微信服务器然后回调你自己的路由才能正确的跳转返回数据。WxMpservice里面的函数oauth2buildAuthorizationUrl(),第一个参数是你要跳转的路由,也就是回调地址;第二个参数是作用域范围,(snsapi_userinfo指的是弹出用户授权页面,获取用户的基本信息,即使用户未关注的情况下,只要用户点击确定就可以获取基本信息;snsapi_base指的是不跳出授权页面只能获取用到的openid信息)这里选基本snsapi_base即可;第三个参数state一般是用户自定义的附加信息,可以加密后进行后续调用验证.(个人理解),函数里面的实现都是封装好的,拿来用就可以,也可以你自己去拼接路由:
例如:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=你的APPID&redirect_uri=你的回调地址(也就是跳转地址)&response_type=code&scope=选择的作用域&state=如果有附带信息就写没有就是null#wechat_redirect
第二个GET请求返回的结果就是上面的这种格式.
测试阶段
1.在测试之前我们需要做一件事情,那就是请求需要公网,需要把内网进行映射一下.(当然有自己的服务器就更完美啦)
具体怎么映射,参考上一篇博客:https://blog.youkuaiyun.com/H_XINGHAI/article/details/95339243
还有一点就是:端口号最好设置成8080进行调试
2.下载微信开发者工具.进行调试.
3.选择公众号网页调试.如下:
4.请求第二个GET请求
这里的参数是第一个GET请求的路由,目的就是为了获取openID
发送请求后返回的重定向结果也就是之前处理过并且拼接好的字符串放到微信开发者工具里面进行调试,发送请求后既可以得到redictUrl.(并且会把code以及state携带到重定向后的url中)
如下:
然后复制这个网址到微信开发者工具再次访问后结果如下:
已经获取到了openid,然后就可以接下来我们自己服务接口的操作了.
遇到问题的解决方案
1.{"errcode":40029,"errmsg":"invalid code, hints: [ req_id: xxxxxxxxx ]"}
这个问题是我发送了两次请求,导致报错:
查找相关资料后了解到:微信网页授权得到的code只能使用一次(5min内有效)使用一次后马上失效.
解决方案的话个人感觉就是前端怎么存储了,存储到cookie里设置一个有效时间,授权后直接取到用即可;也可以每次获取openid的时候,先判断她是否为空,如果是空的话,就调用重定向接口,去获取openid.这样也能拿到新的openid;
2.{‘errcode’:40029,’errmsg’:’invalid code, hints: [ req_id: 0407ns44 ]’}
这个问题主要原因是code失效问题
查找网上的资料都说时域名出错.我本地测试都是内网穿透工具生成的映射公网,估计会有些许问题.到生产环境应该没问题.
写在最后(遗留问题的补充)
之前问题是我们只用到了APPID和SECRET剩下的几个参数没有用到.参考这篇博客就可以大致了解了
https://blog.youkuaiyun.com/lovePaul77/article/details/78556059
我再总结几个需要注意的地方:
1.在微信公众平台接口配置信息模块的token在后台实现时需要保持一致,也就是需要写验证token的代码(加密,解密的过程)
配置好后先重启,将代码运行起来! 将代码运行起来! 将代码运行起来! 重要的事情说三遍!!! 点击提交显示配置成功
2.js接口安全域名的域名是你内网穿透后没有http://后的部分,点击提交 配置成功.
3.最后要修改的地方就是网页服务----->网页账号------>网页授权获取用户基本信息里面的 授权回调页面域名也是没有http://的部分.
以上如果没错的话,基本上微信公众平台环境就搭建好了,就看个人怎么开发了.