配置文件 H5登陆
<bean id="wxMpInMemoryConfigStorage" class="me.chanjar.weixin.mp.api.WxMpInMemoryConfigStorage">
<property name="appId" value="${wx_mp_appid}"/>
<property name="secret" value="${wx_mp_secret}"/>
<property name="token" value="${wx_mp_mytoken}"/>
</bean>
<bean id="wxMpService" class="me.chanjar.weixin.mp.api.impl.WxMpServiceImpl">
<property name="wxMpConfigStorage" ref="wxMpInMemoryConfigStorage"/>
</bean>
wx_mp_appid=appid
wx_mp_secret=secret
wx_mp_redirect_uri=http://*******************/userInfo
wx_mp_mytoken=testtoken
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-mp</artifactId>
<version>${weixin.tools.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<version>2.0.4.RELEASE</version>
</dependency>
/**
* 检验token是否合法
*
* @param response
* @param timestamp
* @param nonce
* @param signature
* @param echostr
*/
@RequestMapping("/check")
@ApiOperation("检验token是否合法")
public void check(ServletResponse response, String timestamp, String nonce, String signature, String echostr) {
if (!wxMpService.checkSignature(timestamp, nonce, signature)) {
log.error("不合法");
throw new RuntimeException();
}
PrintWriter o = null;
try {
o = new PrintWriter(response.getWriter());
o.print(echostr);
} catch (IOException e) {
log.error("写回微信端错误{}", e.getMessage());
} finally {
o.close();
}
}
/**
* 授权,获取code
*
* @param returnUrl
* @return
*/
@RequestMapping("authorize")
@ApiOperation("授权,获取code")
public String authorize(@RequestParam("returnUrl") String returnUrl) {
String result = wxMpService.oauth2buildAuthorizationUrl(redirectUri, WxConsts.OAuth2Scope.SNSAPI_BASE, returnUrl);
log.info("获取得redirectUrl ==========>>>>>>{}", result);
return "redirect:" + result;
}
/**
* 处理业务层,比如获取到open_id跳转到某个页面
*
* @param code 授权code
* @param returnUrl 返回用户的请求url
* @return
*/
@ApiOperation("处理业务层,比如获取到open_id跳转到某个页面")
@GetMapping(value = {"userInfo"})
public String userInfo(@RequestParam("code") String code, @RequestParam("state") String returnUrl) {
log.info("code===>{} , state====>{}", code, returnUrl);
WxMpOAuth2AccessToken wxMpOAuth2AccessToken = null;
try {
wxMpOAuth2AccessToken = this.wxMpService.oauth2getAccessToken(code);
} catch (WxErrorException e) {
log.error("wechat error{}", e.getError().getErrorMsg());
throw new RuntimeException(e.getError().getErrorMsg());
}
boolean valid = this.wxMpService.oauth2validateAccessToken(wxMpOAuth2AccessToken);
if (!valid) {
try {
wxMpOAuth2AccessToken = this.wxMpService.oauth2refreshAccessToken(wxMpOAuth2AccessToken.getRefreshToken());
} catch (WxErrorException e) {
log.error("wechat error{}", e.getError().getErrorMsg());
throw new RuntimeException(e.getError().getErrorMsg());
}
}
WxMpUser wxMpUser = null;
try {
wxMpUser = this.wxMpService.oauth2getUserInfo(wxMpOAuth2AccessToken, null);
log.info("获取到的用户信息是:=================================>>>>{}", wxMpUser);
log.info("获取到wxMpOAuth2AccessToken========================>>>>{}", wxMpOAuth2AccessToken);
} catch (WxErrorException e) {
log.error("wechat error{}", e.getError().getErrorMsg());
e.printStackTrace();
}
//更新保存用户数据
UserEntity entity = this.userService.selectByOpenIdUser(wxMpUser.getOpenId());
if (ObjectUtils.isEmpty(entity)) {
entity = new UserEntity();
entity.setOpenId(wxMpUser.getOpenId());
entity.setUserImg(wxMpUser.getHeadImgUrl());
entity.setCreateTime(new Date());
entity.setNickName(wxMpUser.getNickname());
try {
this.userService.inserUser(entity);
} catch (RRException r) {
r.setMsg("插入用户数据异常");
log.error(r.getMsg());
}
} else {
try {
this.userService.updateById(entity);
} catch (RRException r) {
r.setMsg("插入用户数据异常");
log.error(r.getMsg());
}
}
RedisUtil redisUtil = RedisUtil.getInstance();
// redisService.add(wxMpOAuth2AccessToken.getAccessToken(),entity.toString(),7200,0);
redisUtil.putInRedis(wxMpOAuth2AccessToken.getAccessToken(),entity.toString(),7200);
return "redirect:" + returnUrl + "?token=" + wxMpOAuth2AccessToken.getAccessToken();
}
公众号配置:
开发者工具---->公众平台测试账号
URL:与项目中的要一致
Token:与项目中的一致
关注公众号
网页服务--------->网页账号-------------->修改,输入下面路径
junwei.free.idcfengye.com(解析出来的网址)
微信工具访问:
例:http://www.baidu.com(映射到外网的地址)/**********/authorize?returnUrl=http://www.baidu.com
以上是测试环境
配置不变:
在公众号中:开发者工具------->web开发者工具--------->绑定开发者微信号
接口权限:网页服务---->网页授权---------->修改------->网页授权域名 配置的域名是解析并备案的只要域名(www.baidu.com)
基本配置中的,服务器配置------->修改配置
配置完成
本地调试可搜索“内网映射外网工具”进行映射访问
APP登陆
@ResponseBody @PostMapping("/getUserInfo") @ApiImplicitParam(name = "code", value = "code", paramType = "query") public YJResult getWeChatUserInfoByCode(String code) { log.info("1:进入微信授权登录:code={}",code); // accessToken/openid/unionid 获取 JSONObject wechatAccessToken = HttpUtils.getInstance().sendGet(setUrl(code)); log.info("2:通过get方式获取到的数据:{}",wechatAccessToken.toJSONString()); if (wechatAccessToken.get("errcode") != null) { return YJResult.error(1005, "获取微信授权数据失败"); } String accessToken = wechatAccessToken.getString("access_token"); String openid = wechatAccessToken.getString("openid"); String unionid = wechatAccessToken.getString("unionid"); // 判断并校验获取到的数据 if (StringUtils.isEmpty(accessToken) || StringUtils.isEmpty(openid) || StringUtils.isEmpty(unionid)) { return YJResult.error(1005, "失败"); } log.info("3:wechatAccessToken:accessToken:{},openid:{},unionid:{}",accessToken,openid,unionid); // 通过openId查询本地数, WeChatUserInfo weChatUserInfo = weChatUserInfoService.findByOpenId(openid); // 如果本地数据不存在 if (ObjectUtils.isEmpty(weChatUserInfo)) { // 新用户,获取用户信息数据 weChatUserInfo = getUserInfoByAccessToken(accessToken,openid); if (ObjectUtils.isEmpty(weChatUserInfo)) { return YJResult.error(1005, "获取微信授权数据失败"); } log.info("4:新用户注册微信:{}",weChatUserInfo.toString()); // 数据库插入的操作 weChatUserInfoService.insertInto(weChatUserInfo); }else if (weChatUserInfo != null) { log.info("4:老用户更新微信:{}",weChatUserInfo.toString()); weChatUserInfoService.update(weChatUserInfo); } log.info("5:微信授权登录weChatUserInfo:{}",weChatUserInfo.toString()); // 获取关联数据更新redis Customer customer = customerService.getByOpenId(openid); log.info("6:获取到的用户的数据:{}",customer.toString()); String token = tokenManager.createToken(customer); Map map = new HashMap(3); map.put("token", token); map.put("customer", customer); map.put("weChatUserInfo", weChatUserInfo); log.info("7: YJResult<Map> Map:{}",JSONObject.toJSONString(map)); return YJResult.success(map); }