1 package org.oxerr.spring.security.wechat.samples.helloworld.service.impl;
2
3 import java.io.IOException;
4 import java.net.URI;
5 import java.net.URISyntaxException;
6
7 import javax.servlet.ServletException;
8 import javax.servlet.http.HttpServletRequest;
9 import javax.servlet.http.HttpServletResponse;
10
11 import org.apache.logging.log4j.LogManager;
12 import org.apache.logging.log4j.Logger;
13 import org.oxerr.spring.security.wechat.samples.helloworld.WeChatProperties;
14 import org.oxerr.spring.security.wechat.web.authentication.AbstractJavaScriptRedirectWeChatService;
15 import org.springframework.beans.factory.annotation.Autowired;
16 import org.springframework.stereotype.Service;
17
18 import com.foxinmy.weixin4j.mp.api.OauthApi;
19
20 @Service
21 public class WeChatServiceImpl extends AbstractJavaScriptRedirectWeChatService {
22
23 private final Logger log = LogManager.getLogger();
24
25 private WeChatProperties weChatProperties;
26
27 private OauthApi oauthApi;
28
29 @Autowired
30 public WeChatServiceImpl(WeChatProperties weChatProperties, OauthApi oauthApi) {
31 this.weChatProperties = weChatProperties;
32 this.oauthApi = oauthApi;
33 }
34
35
36
37
38 @Override
39 public String getAuthorizationURL(HttpServletRequest request,
40 HttpServletResponse response) throws ServletException, IOException {
41 String redirectUri = this.getRedirectUri(request);
42 String state = null;
43 String scope = "snsapi_userinfo";
44 String url = oauthApi.getUserAuthorizationURL(redirectUri, state, scope);
45 return url;
46 }
47
48 private String getRedirectUri(HttpServletRequest request) {
49 final StringBuffer urlStringBuffer = request.getRequestURL();
50 final String queryString = request.getQueryString();
51 if (queryString != null) {
52 urlStringBuffer.append("?").append(queryString);
53 }
54 final URI uri = URI.create(urlStringBuffer.toString());
55 final String scheme = uri.getScheme();
56
57
58 final int port = -1;
59
60 URI redirectUri;
61 try {
62 redirectUri = new URI(
63 scheme, uri.getUserInfo(),
64 this.weChatProperties.getRedirectDomain(), port,
65 uri.getPath(), uri.getQuery(), uri.getFragment()
66 );
67 } catch (URISyntaxException e) {
68 throw new RuntimeException(e);
69 }
70
71 final String redirectUriString = redirectUri.toString();
72 log.debug("redirectUriString: {}", redirectUriString);
73 return redirectUriString;
74 }
75
76 }