PageRenderTime 34ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/src/main/java/com/penuel/mythopoet/service/WxAuthWithoutUserService.java

https://gitlab.com/tycoon/mythopoet
Java | 228 lines | 169 code | 32 blank | 27 comment | 17 complexity | 6f7a0ff25cde28bb5f405bfa5712e17a MD5 | raw file
  1. package com.penuel.mythopoet.service;
  2. import java.io.UnsupportedEncodingException;
  3. import java.net.URLEncoder;
  4. import java.util.SortedMap;
  5. import java.util.TreeMap;
  6. import org.slf4j.Logger;
  7. import org.slf4j.LoggerFactory;
  8. import org.springframework.beans.factory.annotation.Autowired;
  9. import org.springframework.stereotype.Service;
  10. import com.alibaba.fastjson.JSONObject;
  11. import com.penuel.mythopoet.dao.WxAuthDAO;
  12. import com.penuel.mythopoet.model.WxAuthUser;
  13. import com.penuel.mythopoet.utils.Constants;
  14. import com.penuel.mythopoet.utils.HttpClientUtil;
  15. import com.penuel.mythopoet.utils.WxPayUtil;
  16. @Service
  17. public class WxAuthWithoutUserService {
  18. private static final Logger LOGGER = LoggerFactory
  19. .getLogger(WxAuthWithoutUserService.class);
  20. /** 获取code url */
  21. public static final String CODE_URL = WxAuthService.CODE_URL;
  22. public static final String CODE_RECALL_URL = Constants.get("HOST_URL")
  23. + "/authWithoutLogin/wxcode";// TODO 上线更改
  24. /** 获取 accesstoken url */
  25. public static final String ACCESS_TOKEN_URL = WxAuthService.ACCESS_TOKEN_URL;
  26. /** 获取 openid url */
  27. public static final String REFRESH_ACCESS_TOKEN_URL = WxAuthService.REFRESH_ACCESS_TOKEN_URL;
  28. /** 获取 jsapi_ticket url */
  29. public static final String REFRESH_JSAPI_TICKET_URL = WxAuthService.REFRESH_JSAPI_TICKET_URL;
  30. /**
  31. * 获取 jsapi_accesstoken url
  32. * http://mp.weixin.qq.com/wiki/15/54ce45d8d30b6bf6758f68d2e95bc627.html
  33. */
  34. public static final String REFRESH_JSAPI_ACCESSTOKEN_URL = WxAuthService.REFRESH_JSAPI_ACCESSTOKEN_URL;
  35. @Autowired
  36. private WxAuthDAO wxAuthDAO;
  37. public int insert(WxAuthUser wxAuthUser) {
  38. return wxAuthDAO.insert(wxAuthUser);
  39. }
  40. public WxAuthUser getByOpenId(String openId) {
  41. return wxAuthDAO.getByOpenId(openId);
  42. }
  43. /**
  44. * @param
  45. * @return { { "access_token":"ACCESS_TOKEN", "expires_in":7200,
  46. * "refresh_token":"REFRESH_TOKEN", "openid":"OPENID",
  47. * "scope":"SCOPE", "unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL" }
  48. */
  49. public WxAuthUser getAccessToken(String code, Long userId) {
  50. String accessTokenUrl = genrateAccessTokenUrl(code);
  51. String content = HttpClientUtil.sendGetRequest(accessTokenUrl, "UTF-8");
  52. LOGGER.info("WxAuthService.getAccessToken content = " + content);
  53. JSONObject obj = JSONObject.parseObject(content);
  54. WxAuthUser wxAuthUser = this.getByOpenId(obj.getString("openid"));
  55. if (wxAuthUser == null) {
  56. wxAuthUser = new WxAuthUser();
  57. wxAuthUser.setCode(code);
  58. wxAuthUser.setUserId(userId);
  59. wxAuthUser.setAccessToken(obj.getString("access_token"));
  60. wxAuthUser.setExpiresIn(obj.getLongValue("expires_in"));
  61. wxAuthUser.setRefreshToken(obj.getString("refresh_token"));
  62. wxAuthUser.setOpenId(obj.getString("openid"));
  63. wxAuthUser.setScope(obj.getString("scope"));
  64. wxAuthUser.setUnionId(obj.getLongValue("unionid"));
  65. this.insert(wxAuthUser);
  66. }else{
  67. wxAuthUser.setCode(code);
  68. wxAuthUser.setUserId(userId);
  69. wxAuthUser.setAccessToken(obj.getString("access_token"));
  70. wxAuthUser.setExpiresIn(obj.getLongValue("expires_in"));
  71. wxAuthUser.setRefreshToken(obj.getString("refresh_token"));
  72. wxAuthUser.setOpenId(obj.getString("openid"));
  73. wxAuthUser.setScope(obj.getString("scope"));
  74. wxAuthUser.setUnionId(obj.getLongValue("unionid"));
  75. wxAuthDAO.updateAccessToken(wxAuthUser);
  76. }
  77. return wxAuthUser;
  78. }
  79. /**
  80. * @param wxAuthUser
  81. * @return { "access_token":"ACCESS_TOKEN", "expires_in":7200,
  82. * "refresh_token":"REFRESH_TOKEN", "openid":"OPENID",
  83. * "scope":"SCOPE" }
  84. */
  85. public int refreshAccessToken(WxAuthUser wxAuthUser) {
  86. String accessTokenUrl = refreshAccessTokenUrl(wxAuthUser
  87. .getRefreshToken());
  88. String content = HttpClientUtil.sendGetRequest(accessTokenUrl, "UTF-8");
  89. JSONObject obj = JSONObject.parseObject(content);
  90. int errcode = obj.getIntValue("errcode");
  91. LOGGER.info("WxAuthService.refreshAccessToken content = " + content
  92. + ",errcode=" + errcode);
  93. if (errcode == 40001 || errcode == 41001) {// invalid credential,
  94. // access_token is invalid
  95. // or not latest
  96. getAccessToken(wxAuthUser.getCode(), wxAuthUser.getUserId());
  97. }
  98. wxAuthUser.setAccessToken(obj.getString("access_token"));
  99. wxAuthUser.setExpiresIn(obj.getLongValue("expires_in"));
  100. wxAuthUser.setRefreshToken(obj.getString("refresh_token"));
  101. wxAuthUser.setOpenId(obj.getString("openid"));
  102. wxAuthUser.setScope(obj.getString("scope"));
  103. return wxAuthDAO.updateAccessToken(wxAuthUser);
  104. }
  105. public int refreshJsapiAccessToken(WxAuthUser wxAuthUser) {
  106. String content = HttpClientUtil.sendGetSSLRequest(
  107. getRefreshJsapiAccesstokenUrl(), "UTF-8");
  108. LOGGER.info("WxAuthService.refreshJsapiAccessToken content = "
  109. + content + ",authUser=" + JSONObject.toJSONString(wxAuthUser));
  110. JSONObject obj = JSONObject.parseObject(content);
  111. int errcode = obj.getIntValue("errcode");
  112. if (errcode == 0) {// OK
  113. String access_token = obj.getString("access_token");
  114. long expires_in = obj.getLongValue("expires_in");
  115. wxAuthUser.setJsapiToken(access_token);
  116. wxAuthUser.setJsapiTokenExpiresIn(expires_in);
  117. return wxAuthDAO.updateJsapiToken(wxAuthUser);
  118. } else {
  119. return 0;
  120. }
  121. }
  122. public int refreshJsapiTicket(WxAuthUser wxAuthUser) {
  123. String jsapiTicketUrl = refreshJsapiTicket(wxAuthUser.getJsapiToken());
  124. String content = HttpClientUtil.sendGetRequest(jsapiTicketUrl, "UTF-8");
  125. LOGGER.info("WxAuthService.refreshJsapiTicket content = " + content);
  126. JSONObject obj = JSONObject.parseObject(content);
  127. int errcode = obj.getIntValue("errcode");
  128. String errmsg = obj.getString("errmsg");
  129. if (errcode == 40001 || errcode == 41001 || errcode == 42001) {
  130. refreshJsapiAccessToken(wxAuthUser);
  131. jsapiTicketUrl = refreshJsapiTicket(wxAuthUser.getJsapiToken());
  132. content = HttpClientUtil.sendGetRequest(jsapiTicketUrl, "UTF-8");
  133. obj = JSONObject.parseObject(content);
  134. errcode = obj.getIntValue("errcode");
  135. }
  136. if (errcode != 0) {
  137. LOGGER.error("WxAuthService.refreshJsapiTicket Error: errcode="
  138. + errcode + ",errmsg=" + errmsg);
  139. return 0;
  140. }
  141. wxAuthUser.setJsapiTicket(obj.getString("ticket"));
  142. wxAuthUser.setJsapiExpiresIn(obj.getLongValue("expires_in"));
  143. return wxAuthDAO.updateJsapiTicket(wxAuthUser);
  144. }
  145. public SortedMap<Object, Object> fillJsapiTicketParam(String jsapiTicket,
  146. String url) {
  147. SortedMap<Object, Object> parameters = new TreeMap<Object, Object>();
  148. parameters.put("noncestr", PayService.genNonceStr());
  149. parameters.put("jsapi_ticket", jsapiTicket);
  150. long timestamp = System.currentTimeMillis() / 1000;
  151. parameters.put("timestamp", timestamp);
  152. parameters.put("url", url);
  153. String sign = WxPayUtil.createSha1Sign(parameters);
  154. parameters.put("sign", sign);
  155. parameters.put("appId", Constants.get("APP_ID"));
  156. return parameters;
  157. }
  158. private String genrateCodeUrl(String state) {
  159. try {
  160. String redirect_url = URLEncoder.encode(CODE_RECALL_URL, "UTF-8");
  161. return String.format(CODE_URL, Constants.get("APP_ID"),
  162. redirect_url, "code", "snsapi_base", state);
  163. } catch (UnsupportedEncodingException e) {
  164. LOGGER.error("WxAuthService.genrateCodeUrl Error:", e);
  165. }
  166. return null;
  167. }
  168. private String genrateAccessTokenUrl(String code) {
  169. return String.format(ACCESS_TOKEN_URL, Constants.get("APP_ID"),
  170. Constants.get("APP_AUTH_SECRET"), code, "authorization_code");
  171. }
  172. /**
  173. * @param accessToken
  174. * @return
  175. */
  176. private String refreshAccessTokenUrl(String accessToken) {
  177. return String.format(REFRESH_ACCESS_TOKEN_URL, Constants.get("APP_ID"),
  178. "refresh_token", accessToken);
  179. }
  180. private String refreshJsapiTicket(String accessToken) {
  181. return String.format(REFRESH_JSAPI_TICKET_URL, accessToken);
  182. }
  183. public String authorizeURL(Long userId,String currentUrl) {
  184. StringBuffer state = new StringBuffer();
  185. //state.append(userId).append("@").append(currentUrl);
  186. state.append("");
  187. return genrateCodeUrl(state.toString());
  188. }
  189. public String getRefreshJsapiAccesstokenUrl() {
  190. return String.format(REFRESH_JSAPI_ACCESSTOKEN_URL,
  191. Constants.get("APP_ID"), Constants.get("APP_AUTH_SECRET"));
  192. }
  193. public int clearCodeByOpenId(String openId) {
  194. return wxAuthDAO.clearCodeByOpenId(openId);
  195. }
  196. }