Dalam pengembangan WeChat, seringkali ada kebutuhan seperti itu: dapatkan avatar pengguna, ikat akun WeChat untuk mengirim pesan kepada pengguna ... maka prasyarat untuk mencapai ini adalah otorisasi!
1. Mengkonfigurasi Nama Domain Callback Aman:
Sebelum meminta otorisasi halaman web pengguna oleh WeChat Public Account, pengembang perlu pergi ke opsi konfigurasi "Pengembangan - Izin Antarmuka - Layanan Web - Akun Web - Otorisasi Web untuk mendapatkan Informasi Dasar Pengguna" di situs web resmi platform publik untuk memodifikasi nama domain callback otorisasi. Perlu dicatat bahwa ini untuk secara langsung menulis nama domain lengkap, seperti: www.liliangel.cn. Namun, dalam pengembangan H5 kami, kami umumnya menggunakan nama domain sekunder, seperti: h5.liliangel.cn, yang juga ada dalam nama domain callback aman.
2. Otorisasi tingkat pengguna dan otorisasi diam
1. Otorisasi halaman web yang diprakarsai oleh SNSAPI_BASE digunakan untuk mendapatkan OpenID dari pengguna yang memasuki halaman, dan secara diam -diam diotorisasi dan secara otomatis melompat ke halaman callback. Apa yang pengguna rasakan adalah bahwa dia langsung memasuki halaman panggilan balik.
2. Otorisasi halaman web yang diprakarsai oleh snsapi_userinfo sebagai ruang lingkup digunakan untuk mendapatkan informasi pengguna dasar. Namun, otorisasi ini membutuhkan persetujuan manual pengguna, dan karena pengguna telah setuju, tidak perlu memperhatikannya dan informasi dasar pengguna dapat diperoleh setelah otorisasi.
3. Perbedaan antara otorisasi web Access_token dan Access_Token biasa
1. Otorisasi halaman web WeChat diimplementasikan melalui mekanisme OAuth2.0. Setelah pengguna mengesahkan akun resmi, akun resmi dapat memperoleh kredensial panggilan antarmuka (otorisasi web access_token) yang unik untuk otorisasi halaman web. Panggilan antarmuka otorisasi dapat dilakukan melalui otorisasi halaman web Access_Token, seperti mendapatkan informasi dasar pengguna;
2. Untuk antarmuka WeChat lainnya, panggilan Access_Token biasa diperlukan melalui antarmuka "dapatkan akses_token" dalam dukungan dasar.
4. Pandu pengguna ke halaman otorisasi untuk menyetujui otorisasi dan mendapatkan kode
Setelah WeChat diperbarui, halaman otorisasi juga telah berubah. Sebenarnya, saya sudah terbiasa dengan halaman hijau klasik ...
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 {// Tidak ada informasi pengguna weChat, tidak ada otorisasi ->> diperlukan otorisasi, lompat ke halaman otorisasi window.location.href = 'https://open.weixin.qq.com/connect/oauth2/Authorize?appid='+ wx_appid+' & redirect_uri = '+pid='+ wx_appid+' & redirect_uri = '+' +++++++ '& redirect_uri ='+ +'& response_type = kode & scope = snsapi_userinfo#weChat_redirect'; }} else {center.init (); }}} $ (dokumen) .ready (function () {center.enterwxauthor ();}Ambil SCOPE = SNSAPI_USERINFO sebagai contoh. Saat halaman dimuat, masukkan metode otorisasi. Pertama, dapatkan objek WXUSERINFO dari cache. Jika ada penjelasan, masukkan metode inisialisasi secara langsung. Jika tidak, tentukan apakah URL berisi kode. Jika ada kode, itu berarti bahwa itu adalah halaman setelah memasukkan panggilan balik halaman otorisasi. Kemudian bertukar informasi pengguna melalui kode. Tidak ada kode, yaitu, pengguna memasuki halaman untuk pertama kalinya dan memandu ke halaman otorisasi. Redirect_uri adalah alamat halaman saat ini.
Metode getWxuserInfo:
/ *** Dapatkan informasi dasar dari pengguna setelah otorisasi*/ 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 { // Ensure that the wxUserInfo written is correct var data = JSON.parse(json); if (data.openid) { localstorage.setitem ('wxuserinfo', json); // tulis cache-informasi pengguna weChat}} catch (e) {// todo: menangani pengecualian}}}}}); },5. Backend Restful-- /WeChat /Otorisasi, pertukaran informasi pengguna berdasarkan kode
/** * WeChat authorization* @param code expires after use* * @return User basic information* @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 Otoration Parameters Code: {}", kode); coba {string rs = weChatService.getoAuthAccessToken (kode); out.write (rs); Logger.info ("Restful of Authorization berhasil.", RS); } catch (Exception e) {logger.error ("Restful of Authorization adalah kesalahan.", e); } akhirnya {out.close (); }}Ada Access_Token resmi di sini. Ingat: Access_Token yang diotorisasi bukanlah Global Access_Token, dan itu membutuhkan penggunaan cache. Saya menggunakan Redis di sini. Saya tidak akan banyak bicara tentang konfigurasi spesifik dan menulis posting blog konfigurasi terkait nanti. Tentu saja, Anda juga dapat menggunakan ehcache. Ada pengantar rinci untuk konfigurasi Ehcahe di blog pertama saya.
/ ** * Dapatkan token resmi berdasarkan kode hanya tersedia saat mengesahkan, berbeda dari Global Access_tokens * @param Code * @return * @throws ioException * @throws ClientProtocolException */ Public String getOAuthAccessToken (string code) weecprotocolException, ioException {string {string ("redscsception (ioException {string" {string (ioException {ioException {ioException {ioException {string {ioException {string {ioException {ioException {ioException {string String rs_access_token = null; String rs_openid = null; String url = wx_oauth_access_token_url+"? Appid ="+wx_appid+"& rahasia ="+wx_appsecret+"& code ="+kode+"& grant_type = otorisasi_code"; if (stringutils.isempty (data)) {disinkronkan (ini) {// kedaluwarsa, 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 ke Redis berhasil.parameters waktu: {}, realtime", integer.parseint (r_expires_in), integer.parseint (r_expires_in) - 3600); }} else {// tidak kadaluwarsa string hs = apiservice.doget (url); JsonObject json = jsonobject.parseObject (hs); rs_access_token = json.getString ("access_token"); rs_openid = json.getString ("openId"); Logger.info ("Dapatkan sq access_token dari redis berhasil.rs_access_token: {}, rs_openid: {}", rs_access_token, rs_openid); } return getoAuthuserInfo (rs_access_token, rs_openid); }/** * Dapatkan informasi pengguna berdasarkan token resmi * @param access_token * @param openId * @return */public string getoAuthuserInfo (string access_token, string openId) {string url = "https://api.weixin.qq.com/sns/userinfo?access =pi.weixin.qq.com +"& lang = zh_cn"; coba {string hs = apiservice.doget (url); // Simpan Informasi Pengguna SaveKeixInUser (HS); mengembalikan hs; } catch (ioException e) {logger.error ("Restful of Authorization adalah kesalahan.", e); } return null; }Saya sedang terburu -buru dan penamaan kode berantakan. Seperti yang Anda lihat, saya menggunakan metode sinkronisasi untuk mendapatkan kunci dari cache sebagai weixin_sq_access_token. Jika instruksi diambil, saya akan secara langsung memanggil antarmuka yang disediakan oleh WeChat melalui HTTPClient dan mengembalikan string informasi pengguna ke ujung depan. Jika tidak diambil, itu berarti bahwa itu bukan atau telah kedaluwarsa. Kemudian Segarkan Access_Token sesuai dengan refresh_token dan tulis cache. Karena Access_Token memiliki periode validitas pendek, saya mengatur waktu kedaluwarsa cache di sini untuk mengurangi waktu yang diberikan oleh WeChat pada satu jam lagi. Melihat kembali kode, saya menemukan bahwa logika di atas adalah masalah kecil. Menulis seperti ini akan menyebabkan akuisisi pertama atau kegagalan cache untuk menyegarkan akses_token untuk akuisisi pertama, yang tidak akan mempengaruhi penggunaan untuk saat ini. Saya akan membuat optimasi dan memodifikasi TODO nanti.
6: Simpan informasi pengguna
Biasanya, setelah otorisasi, kami akan menyimpan informasi pengguna ke tabel database, dengan OpenID sebagai satu -satunya kunci utama, dan kunci asing yang terkait dengan tabel pengguna kami sendiri. Dengan cara ini, tidak peduli bisnis apa pun yang ingin kami lakukan di masa depan atau melakukan statistik data operasional, kami memiliki hubungan dengan akun publik WeChat. Perlu dicatat bahwa headimgurl yang kami peroleh adalah alamat URL yang disediakan oleh WeChat. Ketika pengguna memodifikasi avatar, alamat asli mungkin tidak valid, jadi yang terbaik adalah menyimpan gambar ke server lokal dan kemudian menyimpan URL alamat lokal!
Nilai yang dikembalikan oleh WeChat:
Tautan referensi:
Dokumen Resmi Platform Publik WeChat: https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842&token=&lang=zh_cn
Alat debugging antarmuka online: http://mp.weixin.qq.com/debug
Tidak ada manfaat akun resmi: Aplikasi akun uji http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
Di atas adalah semua konten artikel ini. Saya berharap konten artikel ini akan membantu untuk belajar atau bekerja semua orang. Saya juga berharap untuk mendukung wulin.com lebih lanjut!