View Javadoc
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  	 * {@inheritDoc}
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  		// WeChat requires default port.
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  }