WeChat Open Platform Access, 공식 웹 사이트 : https://open.weixin.qq.com에서는 공식 웹 사이트에 응용 프로그램을 등록하고 추가 한 후 APP_ID 및 APP_SECRET을 얻을 수 있습니다.
1 단계 : 다음과 같이 AuthService, wechatauthservice를 상속하는 인터페이스 생성
public interface wechatauthservice 확장 authservice {public jsonobject getUserInfo (String AccessToken, String OpenID);}2 단계 : Wechatservice의 특정 구현은 다음과 같습니다.
@ServicePublic Class Wechatauthserviceimpl은 defaultauthserviceimpl을 wechatauthservice {private logger = loggerfactory.getLogger (wechatauthserviceimpl.class); // QR 코드 인터페이스 개인 정적 최종 문자열 _url = QR Code Interface로 가져옵니다. "https://open.weixin.qq.com/connect/qrconnect?appid=%S&redirect_uri=%S&response_type=code&scope=%S&state=%S#wechat_redirect"; // 사용자 OpenID의 URL 및 액세스-테크 개인 정적 최종 문자열 accesstoke_openid_url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=%S&secret=%S&code= rant_type=authorization_code"; 개인 정적 최종 문자열 refresh_token_url = "https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=%S&grant_type=refresh_token&refresh_token=%S"; 개인 정적 최종 문자열 user_info_url = "https://api.weixin.qqq.com/sns/userinfo?access_token=%S&openid=%S&lang=zh_cn"; 개인 정적 최종 문자열 app_id = "xxxxxx"; 개인 정적 최종 문자열 app_secret = "xxxxxx"; 개인 정적 최종 문자열 scope = "snsapi_login"; 개인 문자열 callbackUrl = "https://www.xxx.cn/auth/wechat"; // 도메인 이름을 호출 @Override public String getAuthorizationUrl ()는 unsupportedEncodingException {callbackurl = urlencoder.encode (CallbackUrl, "utf-8"); String url = string.format (supperization_url, app_id, callbackurl, scope, system.currenttimeMillis ()); 반환 URL; } @override public String getAccessToken (String Code) {String url = String.format (accessToke_openid_url, app_id, app_secret, code); URICOMPONENTSBUILDER BUILDER = URICOMPONENTSBUILDER.FROMHTTPURL (URL); uri uri = builder.build (). encode (). touri (); 문자열 resp = getRestTemplate (). getForObject (uri, String.class); logger.error ( "getAccesstoken resp ="+resp); if (resp.contains ( "OpenID")) {jsonObject jsonObject = jsonObject.parseObject (resp); 문자열 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")); return res.tojsonstring (); } else {Throw New ServiceException ( "액세스 토큰 실패, msg ="+resp); }} // WeChat 인터페이스에서 Token 및 OpenID는 함께 Return을 함께 반환 하므로이 메소드는 @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); URICOMPONENTSBUILDER BUILDER = URICOMPONENTSBUILDER.FROMHTTPURL (URL); uri uri = builder.build (). encode (). touri (); 문자열 resp = getRestTemplate (). getForObject (uri, String.class); logger.error ( "getuserinfo resp ="+resp); if (resp.contains ( "errcode")) {throw new serviceException ( "사용자 정보를 얻는 오류, msg ="+resp); } else {jsonobject data = jsonobject.parseobject (resp); jsonobject result = new jsonobject (); result.put ( "id", data.getString ( "UnionID")); result.put ( "닉네임", data.getString ( "닉네임")); result.put ( "아바타", data.getString ( "headimgurl")); 반환 결과; }} // WeChat의 토큰은 2 시간의 유효 기간에 불과하며 때때로 재 점수를 받아야하므로 공무원은 Refresh_Token에 따라 새로 고침 및 토큰을 얻는 방법을 제공합니다. 이 프로젝트는 사용자 // 정보 만 얻고 정보를 라이브러리에 저장하므로 2 시간 정도는 @override public string refreshToken (String Croshing_Token) {String url = string.format (reformat_token_url, app_id, refresh_token)입니다. URICOMPONENTSBUILDER BUILDER = URICOMPONENTSBUILDER.FROMHTTPURL (URL); uri uri = builder.build (). encode (). touri (); Responseentity <JsonObject> resp = getRestTemplate (). getforentity (uri, jsonobject.class); jsonobject jsonobject = resp.getbody (); 문자열 access_token = jsonobject.getString ( "access_token"); Return Access_token; }}3 단계 : 3 단계 :
컨트롤러에서 호출되는 코드는 다음과 같습니다.
@requestmapping (value = "/wxloginpage", method = requestmethod.get) public jsonobject wxloginpage ()는 예외 {string uri = wechatauthservice.getAuthorizationUrl (); LoginPage (URI)를 반환합니다. } @RequestMapping (value = "/wechat") public void 콜백 (문자열 코드, httpservletrequest 요청, httpservletResponse 응답) 예외 {string result = wechatauthservice.getAccessToken (코드); jsonobject jsonobject = jsonobject.parseobject (결과); 문자열 access_token = jsonobject.getString ( "access_token"); String OpenID = jsonObject.getString ( "OpenID"); // String refresh_token = jsonobject.getString ( "Crophment_Token"); // access_token 저장 쿠키, 2 시간 동안 만료 쿠키 accesstokencookie = new Cookie ( "accessToken", access_token); AccessTokenCookie.SetMaxage (60 *2); 응답 .addcookie (AccessTokenCookie); 쿠키 OpenIdCookie = New Cookie ( "OpenID", OpenID); OpenIdCookie.SetMaxage (60 *2); 응답 .addcookie (OpenIdCookie); // OpenID에 따라 사용자가 로그인했는지 판단합니다. kmsuser user = userervice.getUserByCondition (OpenID); if (user == null) {response.sendRedirect (request.getContextPath () + "/student/html/index.min.html#/bind?type="+constants.login_type_wechat); } else {// 사용자가 이미 존재하는 경우 응답에 직접 로그인합니다. }} Step 4:
프론트 데스크 js에서 먼저 Auth/WxloginPage를 요청하고 권한 부여 주소를 얻은 다음 사용자 승인 후/auth/wechat을 호출 한 다음이 방법에서 논리적 처리를 수행하십시오.
발생하는 문제 :
1. 공식 WeChat 웹 사이트에서 콜백 도메인 이름을 구성 할 때는 HTTP 또는 HTTPS 프로토콜이 필요하지 않습니다. 도메인 만 작성하면됩니다. 예를 들어 http://baidu.com은 baidu.com을 작성하면됩니다. baidu.com/auth/wechat과 같은 프로젝트 아래의 컨트롤러로 이동하려면 baidu.com을 구성하면되며 후속 인증/wechat을 지정할 필요가 없습니다. 후속 주소는 코드의 콜백 주소에 기록 될 수 있습니다. 코드는 https://baidu.com/auth/wechat로 구성해야합니다.
2. 공인 QR 코드 인터페이스로 점프 할 때 QR 코드를 해제 할 수없는 상황이 발생합니다. 코드의 콜백 주소 때문입니다. 위 코드에서 메소드를 구성하는 데 아무런 문제가 없어야합니다.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.