Acesso à plataforma Open WeChat, site oficial: https://open.weixin.qq.com, você pode obter APP_ID e APP_SECRET após registrar e adicionar aplicativos no site oficial.
Etapa 1: Crie uma interface que herde o AuthService, WeChatauthService, como segue
interface pública weChatauthservice estende automervice {public jsonObject getUserinfo (string accessToken, string openId);}Etapa 2: A implementação específica do WechatService é a seguinte
@ServicePublic Classe weChatauthServiceImpl estende o DefaultAuthServiceImpl implementa WeChatauthService {private logger logger = LoggerFactory.getLogger (WechatauthServiceImpl.class); // solicitar este endereço e saltar para o código QR Login interface private string string "https://open.weixin.qq.com/connect/qrconnect?appid=%S&redirect_uri=%S&RESPONSE_TYPE=CODE&SOSCOPE=%S&state=tens#wechat_redirect"; // Get the URL of the user openid and access-toke private static final String ACCESSTOKE_OPENID_URL = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=authorization_code"; String final privada String refresh_token_url = "https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=%S&GRANT_TYPE=Refresh_Token&refresh_Token=%S"; String final estática privada user_info_url = "https://api.weixin.qq.com/sns/userinfo?access_token=%S&openid=tens&lang=zh_cn"; String final estática privada app_id = "xxxxxx"; String final estática privada app_secret = "xxxxxxx"; SCRILA DE STRING FINAL PRIVADO ESTÁTICO = "SNSAPI_LOGIN"; private string callbackurl = "https://www.xxx.cn/auth/wechat"; // chamando o nome do domínio @Override public string getAuthorizationurl () lança UnsupportEdEncodingException {callbackurl = urlencoder.encode (callbackurl, "utf-8"); String url = string.format (autorização_url, app_id, callbackurl, escopo, system.currenttimemillis ()); Retornar URL; } @Override public String getAccessToken (código da string) {string url = string.format (accesstoke_openid_url, app_id, app_secret, código); URICOMPONENTSBUILLER Builder = URICOMPONENTSBUILDER.Fromhttpurl (URL); Uri uri = builder.build (). Encode (). Tourri (); String resp = getRestTemplate (). GetForObject (URI, String.class); logger.error ("getAccessToken resp ="+resp); if (resp.Contains ("OpenId")) {jsonObject jsonObject = jsonObject.parseObject (resp); String access_token = jsonObject.getString ("access_token"); String OpenId = JsonObject.getString ("OpenId") ;; JsonObject res = new jsonObject (); res.put ("access_token", access_token); res.put ("OpenId", OpenID); res.put ("refresh_token", jsonObject.getString ("refresh_token")); retornar res.tojSonstring (); } else {lança nova serviceException ("Token de acesso falhou, msg ="+resp); }} // Na interface WeChat, Token e OpenID Return juntos; portanto, esse método não precisa ser implementado @Override public String getOpenId (String accessToken) {return null; } @Override public jsonObject getUserinfo (string accessToken, string openId) {string url = string.format (user_info_url, accessToken, openId); URICOMPONENTSBUILLER Builder = URICOMPONENTSBUILDER.Fromhttpurl (URL); Uri uri = builder.build (). Encode (). Tourri (); String resp = getRestTemplate (). GetForObject (URI, String.class); Logger.error ("getUserinfo resp ="+resp); if (resp.Contains ("errcode")) {throw New ServiceException ("Erro obtendo informações do usuário, msg ="+resp); } else {jsonObject data = jsonObject.parseObject (resp); Resultado jsonObject = new jsonObject (); resultado.put ("id", data.getString ("UnionId")); resultado.put ("apelido", data.getString ("apelido")); resultado.put ("avatar", data.getString ("headimgurl")); resultado de retorno; }} // O token do WeChat possui apenas um período de validade de duas horas e precisa ser reavivado de tempos em tempos, para que o funcionário forneça um método para atualizar e obter o token de acordo com o refresh_token. Este projeto obtém apenas o usuário // informações e armazena as informações na biblioteca; portanto, duas horas são suficientes @Override public string refreshToken (string refresh_token) {string url = string.format (refresh_token_url, app_id, refresh_token); URICOMPONENTSBUILLER Builder = URICOMPONENTSBUILDER.Fromhttpurl (URL); Uri uri = builder.build (). Encode (). Tourri (); ResponderEntity <JsonObject> resp = getRestTemplate (). Getforentity (URI, JSONOBJET.CLASS); JsonObject jsonObject = resp.getBody (); String access_token = jsonObject.getString ("access_token"); return access_token; }}Etapa 3:
Chamado no controlador, o código é o seguinte:
@RequestMapping (value = "/wxLoginPage", método = requestMethod.get) public jsonObject wxLoginpage () lança exceção {string uri = wechatauthservice.getauthorizationurl (); retornar loginpage (URI); } @ReQuestMapp (value = "/weChat") public void de retorno de chamada (código da string, solicitação httpServletRequest, resposta httpServletResponse) lança exceção {string resultado = wechatauthservice.getAccessToken (code); JsonObject jsonObject = jsonObject.parseObject (resultado); String access_token = jsonObject.getString ("access_token"); String OpenId = JsonObject.getString ("OpenId"); // String refresh_token = jsonObject.getString ("refresh_token"); // Salvar access_token to Cookie, expirado por duas horas de cookie accessTokencookie = new Cookie ("AccessToken", access_token); AccessTokencookie.setMaxage (60 *2); Response.addcookie (AccessTokencookie); Cookie OpenIdCookie = New Cookie ("OpenId", OpenID); OpenIdCookie.setMaxage (60 *2); Response.addcookie (OpenIdCookie); // julga se o usuário efetuou login com base no OpenID. KmsUser User = UserService.getUserBycondition (OpenId); if (user == null) {Response.sendRedirect (request.getContextPath () + "/student/html/index.min.html#/bind?type="+constants.login_type_wechat); } else {// Se o usuário já existir, faça login diretamente em Response.sendRedirect (request.getContextPath () + "/student/html/index.min.html#/app/home?open_id=" + OpenId); }} Etapa 4:
Na recepção JS, primeiro solicite auth/wxloginpage, obtenha o endereço de autorização e ligue/auth/weChat após a autorização do usuário e execute o processamento lógico nesse método.
Problemas encontrados:
1. Ao configurar o nome de domínio de retorno de chamada no site oficial do WeChat, você não precisa de alguns protocolos HTTP ou HTTPS. Você só precisa escrever o domínio. Por exemplo, http://baidu.com, você só precisa preencher o Baidu.com. Se você deseja pular para um controlador abaixo do projeto, como baidu.com/auth/wechat, você só precisa configurar o baidu.com e não precisa especificar o Auth/WeChat subsequente. O endereço subsequente pode ser gravado no endereço do retorno de chamada no código. O código deve ser configurado como https://baidu.com/auth/wechat.
2. Ao pular para a interface de código QR autorizada, você encontrará a situação em que o código QR não pode ser lançado. Isso ocorre devido ao endereço de retorno de chamada no código. Não deve haver problema em configurar o método no código acima.
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.