WeChat 개발에는 종종 그러한 요구가 있습니다. 사용자 아바타를 얻고 WeChat 계정을 바인딩하여 사용자에게 메시지를 보냅니다. 그런 다음이를 달성하기위한 전제 조건은 승인입니다!
1. 보안 콜백 도메인 이름 구성 :
WeChat Public 계정의 사용자 웹 페이지 승인을 요청하기 전에 개발자는 공개 플랫폼의 공식 웹 사이트에서 "개발 - 인터페이스 권한 - 웹 서비스 - 웹 계정"구성 옵션으로 이동하여 권한 부여 콜백 도메인 이름을 수정해야합니다. www.liliangel.cn과 같은 전체 도메인 이름을 직접 작성하는 것이 좋습니다. 그러나 H5의 개발에서 우리는 일반적으로 보안 콜백 도메인 이름에있는 h5.liliangel.cn과 같은 보조 도메인 이름을 사용합니다.
2. 사용자 수준의 승인 및 무음 승인
1. SNSAPI_BASE가 시작한 웹 페이지 승인은 페이지에 입력하는 사용자의 OpenID를 얻는 데 사용되며 조용히 승인되며 자동으로 콜백 페이지로 이동합니다. 사용자가 인식하는 것은 그가 콜백 페이지를 직접 입력한다는 것입니다.
2. SNSAPI_USERINFO가 시작한 웹 페이지 승인 범위로 기본 사용자 정보를 얻는 데 사용됩니다. 그러나이 승인에는 사용자의 수동 동의가 필요하며, 사용자는 동의 했으므로 이에주의를 기울일 필요가 없으며 허가 후에 사용자의 기본 정보를 얻을 수 있습니다.
3. 웹 승인 Access_Token과 일반적인 Access_Token의 차이
1. WeChat 웹 페이지 인증은 OAUTH2.0 메커니즘을 통해 구현됩니다. 사용자가 공식 계정을 승인 한 후 공식 계정은 웹 페이지 승인에 고유 한 인터페이스 통화 자격 증명 (웹 권한 Access_Token)을 얻을 수 있습니다. 인증 인터페이스 호출은 사용자 기본 정보를 얻는 것과 같은 웹 페이지 인증 access_token을 통해 수행 할 수 있습니다.
2. 다른 WeChat 인터페이스의 경우 기본 지원의 "get access_token"인터페이스를 통해 일반적인 Access_Token 호출이 필요합니다.
4. 승인에 동의하고 코드를 얻으려면 사용자를 승인 페이지로 안내하십시오.
WeChat이 업데이트 된 후 인증 페이지도 변경되었습니다. 사실, 나는 클래식 그린 페이지에 익숙합니다 ...
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 {// weChat 사용자 정보가없고, 승인 없음 ->> 승인이 필요합니다. 권한 부여 페이지로 점프하십시오. +'& response_type = code & scope = snsapi_userinfo#wechat_redirect'; }} else {center.init (); }}}} $ (document) .ready (function () {center.enterwxauthor ();}SCOPE = SNSAPI_USERINFO를 예로 들어 보겠습니다. 페이지가로드되면 인증 방법을 입력하십시오. 먼저 캐시에서 wxuserinfo 객체를 가져옵니다. 설명이 있으면 초기화 메소드를 직접 입력하십시오. 그렇지 않은 경우 URL에 코드가 포함되어 있는지 확인하십시오. 코드가있는 경우 권한 부여 페이지 콜백을 입력 한 후 페이지임을 의미합니다. 그런 다음 코드를 통해 사용자 정보를 교환하십시오. 코드가 없습니다. 즉, 사용자는 처음으로 페이지를 입력하고 인증 페이지로 안내합니다. Redirect_uri는 현재 페이지 주소입니다.
getwxuserinfo 방법 :
/ *** 인증 후 사용자의 기본 정보를 받으십시오*/ getwxuserInfo : function (par) {var code = common.geturlparameter ( "code"); if (par) code = par; $ .ajax ({async : false, data : {code : code}, type : "get : get", url : url : wx_root + "wechat/supportization", success (json) {if (json) {wxuserinfo가 올바른 var data = json.parse (json)인지 확인하십시오. localStorage.setitem ( 'wxuserinfo', json); // 캐시 작성-white us user information}} catch (e) {// todo : handle exception}}}}); },5. Backend Restful- /WeChat /Authorization, Code를 기반으로 사용자 정보 교환
/*** weChat 권한* @Param 코드 사용 후 만료** @return 사용자 기본 정보* @Throws IOException*/@RequestMapping (value = "/respestmapping", method = requestmethod.get) public void authorizationweixin (@requestparam 문자열 코드, @requestpervletrequest 요청, httpservletr resonge 응답). request.setcharacterencoding ( "UTF-8"); 응답 .SetchAracterEncoding ( "UTF-8"); printwriter out = response.getwriter (); logger.info ( "권한 부여 매개 변수 코드 : {}", 코드); try {string rs = wechatservice.getoauthaccesstoken (code); out.write (rs); logger.info ( "승인의 편안함이 성공적입니다.", rs); } catch (예외 e) {logger.error ( "권한의 편안한 권한은 오류입니다.", e); } 마침내 {out.close (); }}여기에는 승인 된 Access_Token이 있습니다. 기억하십시오 : 승인 된 Access_Token은 Global Access_Token이 아니며 캐시를 사용해야합니다. 나는 여기에 Redis를 사용합니다. 특정 구성에 대해별로 말하지 않고 나중에 관련 구성 블로그 게시물을 작성합니다. 물론 Ehcache를 사용할 수도 있습니다. 첫 번째 블로그에는 Ehcahe 구성에 대한 자세한 소개가 있습니다.
/ ** * 코드를 기반으로 한 승인 토큰을 기반으로 한 글로벌 access_tokens * @param code * @return * @throws ioexception * @throws clientProtocoLexception */ public string getoauthaccesstoken (문자열 코드) throws clientProtoColexception, ioException {weix _Accescess.get ( "weix _accescess. 문자열 rs_access_token = null; 문자열 rs_openid = null; 문자열 url = wx_oauth_access_token_url+"? appid ="+wx_appid+"& secret ="+wx_appsecret+"& code ="+code+"& grant_type = alustrization_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; 문자열 r_hs = apiservice.doget (refresh_url); jsonobject r_json = jsonobject.parseobject (r_hs); 문자열 r_access_token = r_json.getstring ( "access_token"); 문자열 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 {// 만료되지 않은 문자열 hs = apiservice.doget (url); jsonobject json = jsonobject.parseobject (hs); rs_access_token = json.getstring ( "access_token"); rs_openid = json.getString ( "openID"); logger.info ( "redis에서 sq access_token을 얻으십시오. } return getoauthuserinfo (rs_access_token, rs_openid); }/** * 승인 된 토큰을 기반으로하는 사용자 정보 가져 오기 * @param access_token * @param openid * @return */public string getoauthuserinfo (String access_token, String openID) {String url = "https://api.weixin.qq.com/sns/userInfo?access anceven+"+ openid = & openid = " +"& lang = zh_cn"; try {string hs = apiservice.doget (url); // 사용자 정보 저장 SaveWeixInuser (HS); 반환 hs; } catch (ioexception e) {logger.error ( "권한의 편안한 권한은 오류입니다.", e); } return null; }나는 서두르고 코드 이름 지정은 지저분했다. 보시다시피, 나는 동기화 방법을 사용하여 캐시에서 weixin_sq_access_token으로 키를 얻었습니다. 지침이 검색되면 httpclient를 통해 WeChat이 제공 한 인터페이스를 직접 호출하고 사용자 정보 문자열을 프론트 엔드로 반환합니다. 검색되지 않으면 그것이 만료되지 않았거나 만료되지 않았 음을 의미합니다. 그런 다음 Compert_token에 따라 Access_token을 새로 고치고 캐시를 작성하십시오. Access_Token은 유효 기간이 짧기 때문에 WeChat이 제공 한 시간을 1 시간으로 줄이기 위해 캐시 만료 시간을 설정했습니다. 코드를 되돌아 보면 위의 논리가 약간 문제라는 것을 알았습니다. 이와 같은 글을 쓰면 첫 번째 획득 또는 캐시 실패가 첫 번째 획득을 위해 Access_Token을 새로 고치지 않아 당분간 사용에 영향을 미치지 않습니다. 나는 최적화를 만들고 나중에 할 일을 수정하겠습니다.
6 : 사용자 정보 저장
일반적으로 승인 후 사용자 정보를 데이터베이스 테이블에 저장하고 OpenID를 유일한 기본 키로 저장하며 외국 키는 자체 사용자 테이블을 연관시킵니다. 이런 식으로, 우리는 미래에 어떤 사업을 수행하거나 운영 데이터 통계를 수행하든 WeChat 공개 계정과 관련이 있습니다. 우리가 얻은 Headimgurl은 WeChat에서 제공하는 URL 주소라는 점에 주목할 가치가 있습니다. 사용자가 아바타를 수정하면 원래 주소가 유효하지 않을 수 있으므로 이미지를 로컬 서버에 저장 한 다음 로컬 주소 URL을 저장하는 것이 가장 좋습니다!
WeChat이 반환 한 값 :
참조 링크 :
WeChat 공개 플랫폼의 공식 문서 : https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842&token=&lang=zh_cn
온라인 인터페이스 디버깅 도구 : http://mp.weixin.qq.com/debug
공식 계정 혜택 없음 : 시험 계정 응용 프로그램 http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
위는이 기사의 모든 내용입니다. 이 기사의 내용이 모든 사람의 연구 나 업무에 도움이되기를 바랍니다. 또한 wulin.com을 더 지원하기를 바랍니다!