Dans le développement de WeChat, il y a souvent de tels besoins : obtenir des avatars d'utilisateurs, lier un identifiant WeChat pour envoyer des messages aux utilisateurs... Alors la condition préalable pour y parvenir est l'autorisation !
Avant que le compte officiel WeChat ne demande la page Web de l'utilisateur autorisation, les développeurs doivent d'abord accéder aux options de configuration "Développement - Autorisations d'interface - Services Web - Comptes Web - Autorisation Web pour obtenir des informations utilisateur de base" sur le site officiel de la plateforme publique pour modifier le nom de domaine de rappel d'autorisation. notant que le nom de domaine complet est écrit directement ici. Tel que : www.liliangel.cn. Cependant, lorsque nous développons h5, nous utilisons généralement des noms de domaine de deuxième niveau, tels que h5.liliangel.cn, qui figure également dans le nom de domaine de rappel de sécurité.
1 L'autorisation de page Web initiée avec snsapi_base car la portée est utilisée pour obtenir. L'openid de l'utilisateur qui entre dans la page est autorisé en silence et passe automatiquement à la page de rappel. Ce que l'utilisateur perçoit, c'est qu'il accède directement à la page de rappel.
2. Autorisation de page Web initiée avec snsapi_userinfo car la portée est utilisée pour obtenir les informations de base de l'utilisateur. Cependant, ce type d'autorisation nécessite le consentement manuel de l'utilisateur, et puisque l'utilisateur a accepté, les informations de base de l'utilisateur peuvent être obtenues après autorisation sans y prêter attention.
1. L'autorisation de page Web WeChat est mise en œuvre via le mécanisme OAuth2.0. compte officiel, Le compte public peut obtenir un certificat d'appel d'interface spécifique à l'autorisation de page Web (access_token d'autorisation de page Web). Grâce au access_token d'autorisation de page Web, l'appel d'interface post-autorisation peut être effectué, par exemple pour obtenir des informations utilisateur de base. >
2. D'autres interfaces WeChat doivent être transmises. L'interface "get access_token" dans le support de base est utilisée pour obtenir l'appel access_token ordinaire. 4. Guidez l'utilisateur pour qu'il accède à la page d'autorisation pour accepter l'autorisation et obtenir le code Après la mise à jour de WeChat, la page d'autorisation a également changé. En fait, je suis habituée à la page verte classique..js:var center = { init: function(){ ..... }, enterWxAuthor: function(){ var wxUserInfo = localStorage.getItem("wxUserInfo"); if (!wxUserInfo) { var code = common.getUrlParameter('code'); if (code) { common.getWxUserInfo(); center.init(); }else{ //没有微信用户信息,没有授权-->> 需要授权,跳转授权页面 window.location.href = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid='+ WX_APPID +'&redirect_uri='+ window.location.href +'&response_type=code&scope=snsapi_userinfo#wechat_redirect'; } }else{ center.init(); } } } $(document).ready(function() { center.enterWxAuthor(); }
/** * 授权后获取用户的基本信息 */ getWxUserInfo:function(par){ var code = common.getUrlParameter("code"); if (par) code = par; $.ajax({ async: false, data: {code:code}, type : "GET", url : WX_ROOT + "wechat/authorization", success : function(json) { if (json){ try { //保证写入的wxUserInfo是正确的 var data = JSON.parse(json); if (data.openid) { localStorage.setItem('wxUserInfo',json);//写缓存--微信用户信息 } } catch (e) { // TODO: handle exception } } } }); },
/** * 微信授权 * @param code 使用一次后失效 * * @return 用户基本信息 * @throws IOException */ @RequestMapping(value = "/authorization", method = RequestMethod.GET) public void authorizationWeixin( @RequestParam String code, HttpServletRequest request, HttpServletResponse response) throws IOException{ request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); PrintWriter out = response.getWriter(); LOGGER.info("RestFul of authorization parameters code:{}",code); try { String rs = wechatService.getOauthAccessToken(code); out.write(rs); LOGGER.info("RestFul of authorization is successful.",rs); } catch (Exception e) { LOGGER.error("RestFul of authorization is error.",e); }finally{ out.close(); } }
/** * 根据code 获取授权的token 仅限授权时使用,与全局的access_token不同 * @param code * @return * @throws IOException * @throws ClientProtocolException */ public String getOauthAccessToken(String code) throws ClientProtocolException, IOException{ String data = redisService.get("WEIXIN_SQ_ACCESS_TOKEN"); String rs_access_token = null; String rs_openid = null; String url = WX_OAUTH_ACCESS_TOKEN_URL + "?appid="+WX_APPID+"&secret="+WX_APPSECRET+"&code="+code+"&grant_type=authorization_code"; if (StringUtils.isEmpty(data)) { synchronized (this) { //已过期,需要刷新 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="+refresh_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, Integer.parseInt(r_expires_in) - 3600); LOGGER.info("Set sq access_token to redis is successful.parameters time:{},realtime",Integer.parseInt(r_expires_in), Integer.parseInt(r_expires_in) - 3600); } }else{ //还没有过期 String 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 from redis is successful.rs_access_token:{},rs_openid:{}",rs_access_token,rs_openid); } return getOauthUserInfo(rs_access_token,rs_openid); } /** * 根据授权token获取用户信息 * @param access_token * @param openid * @return */ public String getOauthUserInfo(String access_token,String openid){ String url = "https://api.weixin.qq.com/sns/userinfo?access_token="+ access_token +"&openid="+ openid +"&lang=zh_CN"; try { String hs = apiService.doGet(url); //保存用户信息 saveWeixinUser(hs); return hs; } catch (IOException e) { LOGGER.error("RestFul of authorization is error.",e); } return null; }
Il convient de noter que le headimgurl que nous avons obtenu est une adresse URL fournie par WeChat. Lorsque l'utilisateur modifie l'avatar, l'adresse d'origine peut devenir invalide, il est donc préférable de sauvegarder l'image sur un serveur local, puis de sauvegarder l'image. URL de l'adresse locale.
Valeur renvoyée par WeChat :Pour plus d'articles sur l'autorisation de page Web d'auteur pour le développement de WeChat, veuillez faire attention au site Web PHP chinois !