WeChat Open Platform Access, เว็บไซต์อย่างเป็นทางการ: https://open.weixin.qq.com คุณสามารถรับ App_id และ App_Secret หลังจากลงทะเบียนและเพิ่มแอปพลิเคชันในเว็บไซต์ทางการ
ขั้นตอนที่ 1: สร้างอินเทอร์เฟซที่สืบทอด AuthService, WeChatauthService ดังนี้
อินเทอร์เฟซสาธารณะ WeChatauthService ขยาย AuthService {สาธารณะ jsonObject getUserInfo (สตริง accessToken, สตริง openId);}ขั้นตอนที่ 2: การใช้งานเฉพาะของ WeChatservice มีดังนี้
@ServicePublic คลาส WeChatauthServiceImpl ขยายค่า defaultauthserviceimpl ใช้ wechatauthservice {logger ส่วนตัว logger = loggerfactory.getLogger (wechatauthserviceimpl.class); // ขอที่อยู่นี้ "https://open.weixin.qq.com/connect/qrconnect?appid=%S&redirect_uri=%S&response_type=code&scope=%S&state=%S#wechat_redirect"; // รับ URL ของผู้ใช้ OpenId และ Access-Toke String สุดท้ายคงที่ accessToke_Openid_url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=%S&secret=%S&Code=%S&Grant_Tyepe สตริงสุดท้ายคงที่ 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.qq.com/sns/userinfo?access_token=%S&openid=%S&lang=zh_cn"; สตริงสุดท้ายคงที่ส่วนตัว app_id = "xxxxxx"; สตริงสุดท้ายคงที่ส่วนตัว app_secret = "xxxxxx"; Private Static Final String scope = "SNSAPI_LOGIN"; สตริงส่วนตัว callbackurl = "https://www.xxx.cn/auth/wechat"; // การเรียกชื่อโดเมน @Override สตริงสาธารณะ getAuthorizationUrl () พ่น unsupportencodingException {callbackurl = urlencoder.encode (callbackurl, "utf-8"); string url = string.format (Authorization_url, app_id, callbackurl, ขอบเขต, system.currenttimeMillis ()); url กลับ; } @Override สตริงสาธารณะ getAccessToken (รหัสสตริง) {string url = string.format (AccessToke_Openid_url, app_id, app_secret, รหัส); UricomponentsBuilder Builder = UricomponentsBuilder.Fromhttpurl (URL); uri uri = builder.build (). encode (). touri (); 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")); return res.tojsonstring (); } else {โยน serviceException ใหม่ ("การเข้าถึงโทเค็นล้มเหลว, msg ="+resp); }} // ในอินเทอร์เฟซ WeChat โทเค็นและ OpenID กลับมารวมกันดังนั้นวิธีนี้ไม่จำเป็นต้องใช้ @Override Public String getOpenid (String AccessToken) {return null; } @Override สาธารณะ 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 (); String resp = getRestTemplate (). getForObject (uri, string.class); logger.error ("getUserInfo resp ="+resp); if (resp.contains ("errcode")) {โยน 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 ("Avatar", data.getString ("headimgurl")); ผลการกลับมา; }} // โทเค็นของ WeChat มีระยะเวลาเพียง 2 ชั่วโมงเท่านั้นและจำเป็นต้องได้รับการจัดเก็บใหม่เป็นครั้งคราวดังนั้นอย่างเป็นทางการจึงให้วิธีการรีเฟรชและรับโทเค็นตาม Refresh_Token โครงการนี้ได้รับเฉพาะผู้ใช้ // ข้อมูลและจัดเก็บข้อมูลลงในห้องสมุดดังนั้นสองชั่วโมงจึงเพียงพอ @Override สตริงสาธารณะ RefreshToken (string refresh_token) {string url = string.format (refresh_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 (); String Access_token = jsonObject.getString ("access_token"); return access_token; -ขั้นตอนที่ 3:
เรียกในคอนโทรลเลอร์รหัสมีดังนี้:
@RequestMapping (value = "/wxLogInPage", method = requestMethod.get) สาธารณะ jsonObject wxLoginPage () โยนข้อยกเว้น {String uri = wechatauthservice.getauthorizationurl (); กลับเข้าสู่ระบบ (URI); } @RequestMapping (value = "/weChat") โมฆะการโทรกลับสาธารณะ (รหัสสตริง, คำขอ httpservletRequest, การตอบสนอง httpservletResponse) โยนข้อยกเว้น {string result = wechatauthservice.getAccessToken (รหัส); jsonObject jsonObject = jsonObject.parseObject (ผลลัพธ์); String Access_token = jsonObject.getString ("access_token"); string openId = jsonObject.getString ("openId"); // string refresh_token = jsonObject.getString ("refresh_token"); // บันทึก access_token เป็นคุกกี้หมดอายุเป็นเวลาสองชั่วโมงคุกกี้ AccessTokencookie = คุกกี้ใหม่ ("AccessToken", Access_Token); AccessTokencookie.setMaxage (60 *2); Response.addcookie (AccessTokencookie); Cookie OpenIdCookie = NEW COOKIE ("OpenId", OpenID); OpenIdCookie.SetMaxage (60 *2); Response.addcookie (OpenIdCookie); // ตัดสินว่าผู้ใช้เข้าสู่ระบบตาม OpenID หรือไม่ ผู้ใช้ kmsuser = userservice.getUserByCondition (openId); if (user == null) {response.sendredirect (request.getContextPath () + "/student/html/index.min.html#/bind?type="+Constants.login_type_wechat); } else {// หากผู้ใช้มีอยู่แล้วให้เข้าสู่ระบบโดยตรงไปยัง Response.Sendredirect (request.getContextPath () + "/student/html/index.min.html#/app/home?open_id=" + openId); - ขั้นตอนที่ 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 มากขึ้น