No desenvolvimento do WeChat, geralmente existem essas necessidades: obter avatares de usuários, vincular contas do WeChat para enviar mensagens aos usuários ... então o pré -requisito para alcançá -los é a autorização!
1. Configure o nome de domínio de retorno de chamada seguro:
Antes de solicitar a autorização da página da Web do usuário pela conta pública do WeChat, os desenvolvedores precisam ir para a opção de configuração de "Desenvolvimento - Permissões de Interface - Serviços da Web - Contas da Web - Autorização da Web para obter informações básicas do usuário" no site oficial da plataforma pública para modificar o nome de domínio de retorno de chamada da autorização. Vale a pena notar que isso deve escrever diretamente o nome de domínio completo, como: www.liliangel.cn. No entanto, em nosso desenvolvimento do H5, geralmente usamos nomes de domínio secundários, como: h5.liliangel.cn, que também está nos nomes de domínio de retorno de chamada seguro.
2. Autorização no nível do usuário e autorização silenciosa
1. A autorização da página da web iniciada pelo SNSAPI_BASE é usada para obter o OpenID do usuário que entra na página e é silenciosamente autorizado e saltou automaticamente para a página de retorno de chamada. O que o usuário percebe é que ele entra diretamente na página de retorno de chamada.
2. A autorização da página da web iniciada pelo SNSAPI_USERINFO como escopo é usada para obter informações básicas do usuário. No entanto, essa autorização requer o consentimento manual do usuário e, como o usuário concordou, não é necessário prestar atenção a ele e as informações básicas do usuário podem ser obtidas após a autorização.
3. A diferença entre a autorização da web access_token e o comum Access_token
1. A autorização da página da WeChat é implementada através do mecanismo OAuth2.0. Depois que o usuário autoriza a conta oficial, a conta oficial pode obter uma credencial de chamada de interface (Autorização da Web Access_Token) exclusiva da autorização da página da web. A chamada da interface de autorização pode ser executada através da página da web Authorization Access_Token, como a obtenção de informações básicas do usuário;
2. Para outras interfaces do WeChat, são necessárias chamadas comuns do Access_Token através da interface "Get Access_Token" no suporte básico.
4. Oriente o usuário da página de autorização para concordar com a autorização e obter o código
Depois que o WeChat é atualizado, a página de autorização também mudou. Na verdade, estou acostumado com a página verde clássica ...
JS:
var Center = {init: function () {.......}, EnterWXauthor: function () {var wxUserinfo = localStorage.getItem ("wxuserinfo"); if (! wxuserinfo) {var code = Common.geturlParameter ('código'); if (code) {Common.getwxUserinfo (); Center.init (); } else {// Nenhuma informação do usuário do WeChat, nenhuma autorização ->> Autorização é necessária, pule para a página de autorização window.location.href = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid='+ wx_apid+' & redirect_urect_uriii ='pid?pid='+ wx_apid+ '& redirect_urect_uriii ='pid'pid='+ wx_apid+' & redirect_urect_uriii ='pid/'pid='Apt. +'& Response_type = Code & Scope = SNSAPI_USERINFO#WECHAT_REDIRECT'; }} else {Center.init (); }}} $ (document) .ready (function () {Center.enterwxauthor ();}Tome escopo = ssapi_userinfo como exemplo. Quando a página for carregada, digite o método de autorização. Primeiro, obtenha o objeto wxuserinfo no cache. Se houver alguma explicação, digite diretamente o método de inicialização. Caso contrário, determine se o URL contém um código. Se houver um código, significa que é a página depois de inserir o retorno de chamada da página de autorização. Em seguida, troque as informações do usuário através do código. Não há código, ou seja, o usuário insere a página pela primeira vez e guias para a página de autorização. Redirect_uri é o endereço da página atual.
Método GetwxUserinfo:
/ *** Obtenha as informações básicas do usuário após a autorização*/ getwxuserinfo: function (par) {var code = Common.geturlParameter ("código"); se (par) código = par; $ .ajax ({assíncrono: false, dados: {code: code}, digite: "get", url: wx_root + "weChat/autorização", sucesso: function (json) {if (json) {tente {// garantir que o wxuserinfo escrito seja correto var = json.parse (json; se LocalStorage.SetItem ('wxuserinfo', json); // grava cache-Wechat User Information}} Catch (e) {// TODO: lide a exceção}}}}}); },5. Backend Restful-- /WeChat /Autorização, Exchange Informações do usuário com base no código
/*** Autorização do WeChat* O código @param expira após o uso** @return User Information Basic Information* @THOWS IOException*/@RequestMapping (value = "/autorização", método = requestmethod.get) public void OrtionizationWeixin (@ReQuestParam String Code, HtTPSETLETLEEXTEMCENTEMENTIZING (@RequestParam String Code, HTTPSO request.setcharacterencoding ("UTF-8"); Response.Setcharacterencoding ("UTF-8"); PrintWriter out = Response.getWriter (); Logger.info ("RESTful dos parâmetros de autorização Código: {}", código); tente {string rs = wechatService.getoauthaccessToken (código); out.WRITE (RS); Logger.info ("Restful da autorização é bem -sucedido"., RS); } catch (Exceção e) {Logger.error ("Restful da autorização é erro.", e); } finalmente {out.close (); }}Há um access_token autorizado aqui. Lembre -se: Aception Acepts_Token Autorizado não é Global Access_Token e requer o uso do cache. Eu uso redis aqui. Não vou dizer muito sobre a configuração específica e escrever uma postagem de blog de configuração relacionada posteriormente. Obviamente, você também pode usar o ehcache. Há uma introdução detalhada à configuração EHCAHE no meu primeiro blog.
/ ** * Obtenha tokens autorizados com base no código só estão disponíveis ao autorizar, diferente de Global Access_tokens * @Param Code * @return * @throws ioexception * @throws ClientProtocolexception */ public String getOauthAccessToken (Código de String) ThrowSprotoToToToxception, IoException {StringAccess = String rs_access_token = null; String rs_openid = null; String url = wx_oauth_access_token_url+"? Appid ="+wx_appid+"& secret ="+wx_appsecret+"& code ="+code+"& conceda_type = autorização_code"; if (stringUtils.isEmpty (dados)) {sincronizado (this) {// expirou, string hs = apiservice.Doget (url); JsonObject json = jsonObject.parseObject (hs); String refresh_token = json.getString ("refresh_token"); String refresh_url = "https://api.weixin.qq.com/sns/oauth2/refresh_token?appid="+wx_appid+"&grant_type=refresh_token&refresh_token="+Fresh_Token; String r_hs = apiservice.Doget (refresh_url); JsonObject r_json = jsonObject.parseObject (r_hs); String r_access_token = r_json.getString ("access_token"); String r_expires_in = r_json.getString ("expires_in"); rs_openid = r_json.getString ("OpenId"); rs_access_token = r_access_token; redisService.set ("weixin_sq_access_token", r_access_token, inteiro.parseint (r_expires_in) - 3600); Logger.info ("Definir SQ Access_token com Redis é bem -sucedido.Parameters Hora: {}, RealTime", Integer.parseint (r_expires_in), Integer.parseint (r_expires_in) - 3600); }} else {// String não expirada HS = Apiservice.Doget (URL); JsonObject json = jsonObject.parseObject (hs); rs_access_token = json.getString ("access_token"); rs_openid = json.getString ("OpenId"); Logger.info ("Get Sq Access_token de Redis é bem -sucedido.rs_access_token: {}, rs_openid: {}", rs_access_token, rs_openid); } retornar getOauthUserinfo (rs_access_token, rs_openid); }/** * Obtenha informações do usuário com base em token autorizado * @param acess_token * @param openId * @return */public String getOauthuserinfo (string access_token, string openId) {String Url = "https://api.weixin.qq.q.com/sns/Userinfo? +"& lang = zh_cn"; tente {string hs = Apiservice.Doget (URL); // salvar informações do usuário saveweixinuser (hs); retornar hs; } catch (ioexception e) {logger.error ("repouso da autorização é erro.", e); } retornar nulo; }Eu estava com pressa e a nomeação do código estava confusa. Como você pode ver, usei um método de sincronização para obter a chave do cache como weixin_sq_access_token. Se as instruções forem recuperadas, chamarei diretamente a interface fornecida pelo WeChat através do HTTPClient e retornará a sequência de informações do usuário ao front -end. Se não for recuperado, significa que não é ou expirou. Em seguida, atualize o access_token de acordo com o refresh_token e escreva o cache. Como o Access_Token tem um curto período de validade, defino o tempo de expiração do cache aqui para reduzir o tempo dado pelo WeChat em mais uma hora. Olhando para o código, descobri que a lógica acima é um pequeno problema. Escrever como essa causará a primeira aquisição ou falha em cache em atualizar o Access_token para a primeira aquisição, que não afetará o uso por enquanto. Farei otimização e modificarei o TODO mais tarde.
6: Salvar informações do usuário
Geralmente, após a autorização, salvaremos as informações do usuário na tabela de banco de dados, o OpenID como a única chave primária e a chave estrangeira associará nossa própria tabela de usuários. Dessa forma, não importa qual negócio que queira realizar no futuro ou fazer estatísticas de dados operacionais, temos uma associação com a conta pública do WeChat. Vale a pena notar que o Headimgurl que obtivemos é um endereço de URL fornecido pelo WeChat. Quando o usuário modifica o avatar, o endereço original pode ser inválido, por isso é melhor salvar a imagem no servidor local e salvar o URL do endereço local!
O valor retornado por WeChat:
Link de referência:
Documento oficial da plataforma pública do WeChat: https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842&token=&lang=zh_cn
Ferramenta de depuração de interface online: http://mp.weixin.qq.com/debug
Sem benefícios oficiais da conta: Aplicativo da conta de teste http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
O exposto acima é todo o conteúdo deste artigo. Espero que o conteúdo deste artigo seja de ajuda para estudar ou trabalhar de todos. Eu também espero apoiar mais wulin.com!