WeChat Open Platform Access, situs web resmi: https://open.weixin.qq.com, Anda dapat memperoleh app_id dan app_secret setelah mendaftarkan dan menambahkan aplikasi di situs web resmi.
Langkah 1: Buat antarmuka yang mewarisi AuthService, wechatauthservice, sebagai berikut
antarmuka publik wechatauthservice meluaskan authservice {public jsonObject getUserInfo (string accessToken, string openId);}Langkah 2: Implementasi spesifik dari WeChatService adalah sebagai berikut
@ServicePublic kelas wechatauthserviceImpl memperluas defaultAuthServiceImpl mengimplementasikan wechatauthservice {private Logger Logger = LoggerFactory.getLogger (wechatauthserviceImpl.class); // Minta alamat ini dan lompat ke kode WECHATAUTHSERVICEIMPL. "https://open.weixin.qq.com/connect/qrconnect?appid=%s&redirect_uri=%s&response_type=code&scope=%s&state=%s#wechat_redirect"; // Dapatkan URL pengguna OpenID dan Access-Toke Private Static Final String AccessToke_openid_Url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=AraRization_CECRET=" Private Static Final String refresh_token_url = "https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=%s&grant_type=refresh_token&refresh_token=%S"; Private Static Final String user_info_url = "https://api.weixin.qq.com/sns/userinfo?access_token=%s&openid=%s&lang=zh_cn"; private static final string app_id = "xxxxxx"; Private Static Final String app_secret = "xxxxxx"; Private Static Final String Scope = "snsapi_login"; Private String callbackUrl = "https://www.xxx.cn/Auth/weChat"; // Memanggil nama domain @Override Public String getAuthorizationUrl () melempar UnsportedencodingException {callbackUrl = urlencoder.encode (callbackurl, "UTF-8"); String url = string.format (otorization_url, app_id, callbackurl, scope, system.currentTimeMillis ()); URL pengembalian; } @Override String publik getAccessToken (kode string) {string url = string.format (accessToke_openid_url, app_id, app_secret, kode); UricomponentsBuilder Builder = UricomponentsBuilder.FromHttpurl (URL); Uri uri = builder.build (). Encode (). Pouri (); 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 {lempar serviceException baru ("Token akses gagal, msg ="+resp); }} // Di antarmuka WeChat, token dan OpenId kembali bersama, jadi metode ini tidak perlu diimplementasikan @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 (). Pouri (); String resp = getRestTemplate (). GetForObject (uri, string.class); Logger.Error ("getUserInfo resp ="+resp); if (resp.contains ("errcode")) {lempar serviceException baru ("Kesalahan mendapatkan informasi pengguna, msg ="+resp); } else {jsonobject data = jsonobject.parseObject (resp); JSONObject hasil = jsonObject () baru; result.put ("id", data.getString ("UnionId")); result.put ("julukan", data.getString ("nama panggilan")); result.put ("avatar", data.getString ("headimgurl")); hasil pengembalian; }} // Token WeChat hanya memiliki periode validitas 2 jam, dan perlu diperoleh ulang dari waktu ke waktu, sehingga pejabat menyediakan metode untuk menyegarkan dan mendapatkan token sesuai dengan refresh_token. Proyek ini hanya mendapatkan pengguna // informasi dan menyimpan informasi ke dalam pustaka, jadi dua jam sudah cukup @Override public string 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 (). Pouri (); ResponEntity <JsonObject> resp = getRestTemplate (). GetForEntity (uri, jsonObject.class); JsonObject jsonObject = resp.getbody (); String access_token = jsonobject.getString ("access_token"); return access_token; }}Langkah 3:
Dipanggil dalam pengontrol, kodenya adalah sebagai berikut:
@RequestMapping (value = "/wxlogInpage", Method = requestMethod.get) public jsonObject wxlogInpage () melempar pengecualian {string uri = wechatauthservice.getauthorizationUrl (); Return LoginPage (URI); } @RequestMapping (value = "/weChat") public void callback (kode string, permintaan httpservletRequest, respons httpservletResponse) melempar pengecualian {string hasil = wechatauthservice.getAccessToken (kode); JsonObject jsonObject = jsonobject.parseObject (hasil); String access_token = jsonobject.getString ("access_token"); String openId = jsonObject.getString ("openId"); // string refresh_token = jsonobject.getString ("refresh_token"); // Simpan akses_token ke cookie, kadaluwarsa selama dua jam cookie accessTokencookie = cookie baru ("AccessToken", Access_Token); AccessTokencookie.setmaxage (60 *2); response.addcookie (AccessTokencookie); Cookie openIdcookie = cookie baru ("OpenId", OpenID); OpenIdCookie.setmaxage (60 *2); response.addcookie (openIdcookie); // menilai apakah pengguna telah masuk berdasarkan OpenID. KMSUSER USER = USERSERVICE.GetUserbyCondition (OpenID); if (user == null) {response.sendredirect (request.getContextPath () + "/student/html/index.min.html#/bind?type="+constants.login_type_weChat); } else {// Jika pengguna sudah ada, masuk langsung ke response.sendredirect (request.getContextPath () + "/student/html/index.min.html#/app/home?open_id=" + openId); }} Langkah 4:
Di meja depan JS, permintaan pertama AUTH/WXLOGINPAGE, dapatkan alamat otorisasi, dan hubungi kembali/auth/weChat setelah otorisasi pengguna, dan kemudian melakukan pemrosesan logis dalam metode ini.
Masalah yang ditemui:
1. Saat mengkonfigurasi nama domain callback di situs web resmi WeChat, Anda tidak memerlukan beberapa protokol HTTP atau HTTPS. Anda hanya perlu menulis domain. Misalnya, http://baidu.com, Anda hanya perlu mengisi Baidu.com. Jika Anda ingin melompat ke pengontrol di bawah proyek, seperti baidu.com/auth/wechat, Anda hanya perlu mengkonfigurasi baidu.com, dan Anda tidak perlu menentukan auth/weChat berikutnya. Alamat selanjutnya dapat ditulis pada alamat panggilan balik dalam kode. Kode harus dikonfigurasi sebagai https://baidu.com/Auth/weChat.
2. Saat melompat ke antarmuka kode QR yang resmi, Anda akan menemukan situasi di mana kode QR tidak dapat dirilis. Ini karena alamat panggilan balik dalam kode. Seharusnya tidak ada masalah dalam mengkonfigurasi metode dalam kode di atas.
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.