PageRenderTime 65ms CodeModel.GetById 28ms RepoModel.GetById 1ms app.codeStats 0ms

/src/main/java/com/penuel/mythopoet/controllers/AuthController.java

https://gitlab.com/tycoon/mythopoet
Java | 107 lines | 77 code | 15 blank | 15 comment | 6 complexity | 210cf166296ad5f0c2a6504f541b9f28 MD5 | raw file
  1. package com.penuel.mythopoet.controllers;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.penuel.mythopoet.annotation.LoginRequired;
  4. import com.penuel.mythopoet.constants.PoetConstants;
  5. import com.penuel.mythopoet.model.Orders;
  6. import com.penuel.mythopoet.model.WxAuthUser;
  7. import com.penuel.mythopoet.service.WxAuthService;
  8. import com.penuel.mythopoet.utils.ResponseUtil;
  9. import org.apache.commons.lang3.StringUtils;
  10. import org.apache.commons.lang3.math.NumberUtils;
  11. import org.slf4j.Logger;
  12. import org.slf4j.LoggerFactory;
  13. import org.springframework.beans.factory.annotation.Autowired;
  14. import org.springframework.stereotype.Controller;
  15. import org.springframework.ui.Model;
  16. import org.springframework.web.bind.annotation.*;
  17. import java.util.Date;
  18. import java.util.SortedMap;
  19. import javax.servlet.http.Cookie;
  20. import javax.servlet.http.HttpServletRequest;
  21. import javax.servlet.http.HttpServletResponse;
  22. /**
  23. * AuthController Created with mythopoet.
  24. * User: penuel (penuel.leo@gmail.com)
  25. * Date: 15/4/23 下午10:54
  26. * Desc:
  27. */
  28. @Controller
  29. @RequestMapping("/auth")
  30. @LoginRequired
  31. public class AuthController {
  32. private static final Logger LOGGER = LoggerFactory.getLogger(AuthController.class);
  33. @Autowired
  34. private WxAuthService wxAuthService;
  35. /**
  36. * 获取wx code的url回调地址
  37. *
  38. * @param model
  39. * @param code 返回需要的code,每次用户授权带上的code将不一样,code只能使用一次,5分钟未被使用自动过期<br/>
  40. * 若用户禁止授权,则重定向后不会带上code参数
  41. * @param state orderId@userId 重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值,最多128字节
  42. * @return /order/{orderId}
  43. */
  44. @RequestMapping(value = "/wxcode", method = RequestMethod.GET, produces = "application/json;charset=utf-8")
  45. public String wxcode(Model model, @RequestParam(value = "code", defaultValue = "") String code,
  46. @RequestParam(value = "state", defaultValue = "") String state,HttpServletRequest request, HttpServletResponse response) {
  47. long userId = 0;
  48. long orderId = 0;
  49. try {
  50. if ( StringUtils.isBlank(code) ) {
  51. return "redirect:/pay/order/" + orderId + "?showwxpaytitle=1&errMsg=" + "用户禁止微信授权";
  52. }
  53. LOGGER.info("wxcode:code=" + code + ",state=" + state);
  54. String[] stateArray = state.split("@");
  55. userId = NumberUtils.toLong(stateArray[1]);
  56. orderId = NumberUtils.toLong(stateArray[0]);
  57. WxAuthUser wxAuthUser = wxAuthService.getAccessToken(code, userId);
  58. return "redirect:/pay/order/" + orderId + "?showwxpaytitle=1";//返回到订单支付页面
  59. } catch ( Exception e ) {
  60. LOGGER.error("AuthController.wxcode Error:code=" + code + ",state=" + state, e);
  61. }
  62. return "redirect:/pay/order/" + "/" + orderId + "?showwxpaytitle=1&errMsg=" + "微信授权失败";
  63. }
  64. @RequestMapping( value = "/ticket", method = RequestMethod.POST, produces = "application/json;charset=utf-8" )
  65. @ResponseBody
  66. public String jsapiTicket(Model model, @CookieValue( "userId" ) Long userId,@RequestParam("currentUrl") String currentUrl) {
  67. try {
  68. WxAuthUser wxAuthUser = wxAuthService.getByUserId(userId);
  69. if ( wxAuthUser == null ){
  70. String authUrl = wxAuthService.authorizeURL(userId, -100L);//-100表示是jsAPI获取ticket的时候需要授权,获取accesstoken
  71. return ResponseUtil.result(1001, "微信授权", authUrl);
  72. }
  73. boolean refreshTicket = false;
  74. long millSecond = (new Date()).getTime() - wxAuthUser.getJsapiRefreshTime().getTime();
  75. if ( StringUtils.isBlank(wxAuthUser.getJsapiTicket()) ){
  76. refreshTicket = true;
  77. }else if( millSecond + 5*60*1000 > wxAuthUser.getJsapiExpiresIn()*1000 ){
  78. refreshTicket = true;
  79. }
  80. LOGGER.info("jsapiTicket.wxAuthUser ="+JSONObject.toJSONString(wxAuthUser)+",millSecond="+millSecond);
  81. if ( refreshTicket ){
  82. wxAuthService.refreshJsapiTicket(wxAuthUser);
  83. }
  84. SortedMap<Object, Object> map = wxAuthService.fillJsapiTicketParam(wxAuthUser.getJsapiTicket(), currentUrl);
  85. LOGGER.info("AuthController.jsapiTicket result="+ JSONObject.toJSONString(map));
  86. return ResponseUtil.result(0,"OK",map);
  87. } catch ( Exception e ) {
  88. LOGGER.error("AuthController.jsapiTicket Error:userId=" + userId , e);
  89. return ResponseUtil.result(1, "获取jsAPI初始化参数失败", null);
  90. }
  91. }
  92. }