WechatController.java 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. package com.yingying.tourist.web;
  2. import java.io.UnsupportedEncodingException;
  3. import java.util.Map;
  4. import java.util.concurrent.TimeUnit;
  5. import org.apache.commons.lang3.StringUtils;
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.data.redis.core.StringRedisTemplate;
  8. import org.springframework.data.redis.core.ValueOperations;
  9. import org.springframework.stereotype.Controller;
  10. import org.springframework.web.bind.annotation.RequestMapping;
  11. import org.springframework.web.bind.annotation.ResponseBody;
  12. import com.alibaba.fastjson.JSON;
  13. import com.alibaba.fastjson.JSONObject;
  14. import com.baomidou.mybatisplus.mapper.EntityWrapper;
  15. import com.yingying.tourist.common.WechatUtil;
  16. import com.yingying.tourist.domain.User;
  17. import com.yingying.tourist.exception.ErrorCode;
  18. import com.yingying.tourist.result.MessageResult;
  19. import com.yingying.tourist.service.UserService;
  20. import com.yingying.tourist.service.WechatService;
  21. import lombok.extern.slf4j.Slf4j;
  22. @Controller
  23. @Slf4j
  24. public class WechatController {
  25. @Autowired
  26. private WechatService wechatService;
  27. @Autowired
  28. private UserService userService;
  29. @Autowired
  30. private StringRedisTemplate redisTemplate;
  31. @RequestMapping(value = "token")
  32. @ResponseBody
  33. public String checkToken(String signature, String echostr, String timestamp, String nonce) {
  34. return echostr;
  35. }
  36. @RequestMapping(value = "checkJsAuth")
  37. @ResponseBody
  38. public MessageResult<String> checkJsAuth(String url) {
  39. // 先从redis取jsapi_ticket,如果未取到,调用微信接口获取
  40. ValueOperations<String, String> opsForValue = redisTemplate.opsForValue();
  41. String jsapiTicket = opsForValue.get("jsapi_ticket");
  42. if (StringUtils.isBlank(jsapiTicket)) {
  43. jsapiTicket = wechatService.getTicket();
  44. opsForValue.set("jsapi_ticket", jsapiTicket, 7200, TimeUnit.SECONDS);
  45. }
  46. Map<String, String> map = WechatUtil.sign(jsapiTicket, url);
  47. String sign = JSON.toJSONString(map);
  48. if (StringUtils.isBlank(sign)) {
  49. return new MessageResult<String>().failure(ErrorCode.JS_SIGN_NULL);
  50. }
  51. return new MessageResult<String>().ok(sign);
  52. }
  53. @RequestMapping(value = "code", produces = "application/json;charset=utf-8")
  54. @ResponseBody
  55. public MessageResult<String> code(String code) {
  56. String result = wechatService.getAuthToken(code);
  57. JSONObject jsonObject = JSONObject.parseObject(result);
  58. String openId = jsonObject.getString("openid");
  59. String token = jsonObject.getString("access_token");
  60. if (StringUtils.isBlank(openId)) {
  61. return new MessageResult<String>().failure(ErrorCode.OPENID_NULL);
  62. }
  63. // 首先查询openid 是否在数据库中,如果存在直接返回openid
  64. EntityWrapper<User> userWrapper = new EntityWrapper<>();
  65. userWrapper.eq("openid", openId);
  66. User user = userService.selectOne(userWrapper);
  67. if (user != null) {
  68. return new MessageResult<String>().ok(openId);
  69. }
  70. try {
  71. // 如果不存在,通过token和openid去获取用户信息,并插入到数据库中
  72. User wechatUser = wechatService.getWechatUser(token, openId);
  73. if (wechatUser != null) {
  74. userService.insert(wechatUser);
  75. }
  76. } catch (UnsupportedEncodingException e) {
  77. log.info("编码集转换失败");
  78. }
  79. return new MessageResult<String>().ok(openId);
  80. }
  81. }