摘要:小程序登錄微信網(wǎng)頁授權(quán)版首先呢,登錄授權(quán)授權(quán)登錄,是一樣的意思,不用糾結(jié)。寫小程序授權(quán)登錄的代碼前,需要了解清楚與的區(qū)別,這里再簡單介紹一下騰訊有個(gè)微信開放平臺(tái),只有企業(yè)才能注冊賬號,可理解為微信體系里,最頂級的賬號。
小程序登錄、微信網(wǎng)頁授權(quán)(Java版)
首先呢,“登錄”、“授權(quán)”、“授權(quán)登錄”,是一樣的意思,不用糾結(jié)。
寫小程序授權(quán)登錄的代碼前,需要了解清楚openid與unionid的區(qū)別,這里再簡單介紹一下:
騰訊有個(gè) “微信·開放平臺(tái)”,只有企業(yè)才能注冊賬號,可理解為微信體系里,最頂級的賬號。官網(wǎng)地址:https://open.weixin.qq.com
除了這個(gè)微信開放平臺(tái),還有另一個(gè)叫做 “微信公眾平臺(tái)”,可注冊四種賬號,包括服務(wù)號、訂閱號、小程序、企業(yè)微信。也就是說,公眾號(服務(wù)號和訂閱號可統(tǒng)稱為公眾號)占一個(gè)賬號,小程序也占一個(gè)賬號。在沒有綁定開放平臺(tái)前,小程序授權(quán)登錄只能拿到用戶的openid。官網(wǎng)地址:https://mp.weixin.qq.com
小程序可綁定在公眾號下,公眾號可以綁定在微信開放平臺(tái)下,小程序也可以綁定在微信開放平臺(tái)下。(好像有點(diǎn)小繞)簡單點(diǎn)說,所有的公眾平臺(tái)賬號都需要綁定在 “開放平臺(tái)” 下,才可獲得的unionid,這是打通同個(gè)企業(yè)下所有微信公眾賬號的最有效方法(官方推薦)
更加具體的可自行百度...
一、以下為小程序登錄的代碼:
方式一:通過code調(diào)用code2session接口獲得message,包含openid、session_key,滿足條件的情況下還能直接獲得unionid
條件如下:(存在局限性)
官方說明UnionID獲取途徑,如果開發(fā)者帳號下存在同主體的公眾號,并且該用戶已經(jīng)關(guān)注了該公眾號。開發(fā)者可以直接通過 wx.login + code2Session 獲取到該用戶 UnionID,無須用戶再次授權(quán)。
開發(fā)者帳號下存在同主體的公眾號或移動(dòng)應(yīng)用,并且該用戶已經(jīng)授權(quán)登錄過該公眾號或移動(dòng)應(yīng)用。也可通過code2session獲取該用戶的 UnionID。
/** * Author: huanglp * Date: 2018-11-28 */ public class WeiXinUtils { private static Logger log = LoggerFactory.getLogger(WeiXinUtils.class); /** * 通過前端傳過來的code, 調(diào)用小程序登錄接口, 獲取到message并返回 (包含openid session_key等) * * @param code * @return */ public static JSONObject login(String code) { log.info("==============小程序登錄方法開始================"); WxMiniProperties properties = WeiXinPropertiesUtils.getWxMiniProperties(); String url = properties.getInterfaceUrl() + "/sns/jscode2session?appid=" + properties.getAppId() + "&secret=" + properties.getAppSecret() + "&js_code=" + code + "&grant_type=authorization_code"; JSONObject message; try { // RestTemplate是Spring封裝好的, 挺好用, 可做成單例模式 RestTemplate restTemplate = new RestTemplate(); String response = restTemplate.getForObject(url, String.class); message = JSON.parseObject(response); } catch (Exception e) { log.error("微信服務(wù)器請求錯(cuò)誤", e); message = new JSONObject(); } log.info("message:" + message.toString()); log.info("==============小程序登錄方法結(jié)束================"); return message; // 后續(xù), 可獲取openid session_key等數(shù)據(jù), 以下代碼一般放在Service層 //if (message.get("errcode") != null) { // throw new ValidationException(message.toString()); //} //String openid = message.get("openid").toString(); //String sessionKey = message.get("session_key").toString(); //... } }
補(bǔ)充1: WeiXinPropertiesUtils工具類
public class WeiXinPropertiesUtils { // 微信小程序配置 private static WxMiniProperties miniProperties; // 微信公眾號配置 private static WxProperties wxProperties; private static void init() { if (miniProperties == null) { miniProperties = ContextLoader.getCurrentWebApplicationContext() .getBean(WxMiniProperties.class); } if (wxProperties == null) { wxProperties = ContextLoader.getCurrentWebApplicationContext() .getBean(WxProperties.class); } } public static WxMiniProperties getWxMiniProperties() { init(); return miniProperties; } public static WxProperties getWxProperties() { init(); return wxProperties; } }
補(bǔ)充2: WxMiniProperties配置類
@Data @Component @ConfigurationProperties(prefix = "luwei.module.wx-mini") public class WxMiniProperties { private String appId; private String appSecret; private String interfaceUrl; }
到此已能通過code獲取到用戶的openid和session_key,但若不滿足條件,即使將小程序綁定到微信開放平臺(tái)上,也獲取不到unionid,所以此方式不穩(wěn)定,推薦使用解密的方式獲取數(shù)據(jù)。
方式二:通過解密的方式獲取用戶unionid
/** * 通過encryptedData,sessionKey,iv獲得解密信息, 擁有用戶豐富的信息, 包含openid,unionid,昵稱等 */ public static JSONObject decryptWxData(String encryptedData, String sessionKey, String iv) throws Exception { log.info("============小程序登錄解析數(shù)據(jù)方法開始=========="); String result = AesCbcUtil.decrypt(encryptedData, sessionKey, iv, "UTF-8"); JSONObject userInfo = new JSONObject(); if (null != result && result.length() > 0) { userInfo = JSONObject.parseObject(result); } log.info("result: " + userInfo); log.info("============小程序登錄解析數(shù)據(jù)方法結(jié)束=========="); return userInfo; }
補(bǔ)充1: AesCbcUtil工具類,直接復(fù)制即可,需要添加bouncycastle依賴。BouncyCastle是一個(gè)開源的加解密解決方案,官網(wǎng)可查看http://www.bouncycastle.org/
package com.luwei.common.utils; import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.apache.commons.codec.binary.Base64; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import java.security.AlgorithmParameters; import java.security.Security; /** * Updated by huanglp * Date: 2018-11-28 */ public class AesCbcUtil { static { Security.addProvider(new BouncyCastleProvider()); } /** * AES解密 * * @param data //被加密的數(shù)據(jù) * @param key //加密秘鑰 * @param iv //偏移量 * @param encoding //解密后的結(jié)果需要進(jìn)行的編碼 */ public static String decrypt(String data, String key, String iv, String encoding) { // org.apache.commons.codec.binary.Base64 byte[] dataByte = Base64.decodeBase64(data); byte[] keyByte = Base64.decodeBase64(key); byte[] ivByte = Base64.decodeBase64(iv); try { Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding"); SecretKeySpec spec = new SecretKeySpec(keyByte, "AES"); AlgorithmParameters parameters = AlgorithmParameters.getInstance("AES"); parameters.init(new IvParameterSpec(ivByte)); cipher.init(Cipher.DECRYPT_MODE, spec, parameters);// 初始化 byte[] resultByte = cipher.doFinal(dataByte); if (null != resultByte && resultByte.length > 0) { return new String(resultByte, encoding); } return null; } catch (Exception e) { e.printStackTrace(); } return null; } }
到此已經(jīng)獲取到 JSONObject類型的 userInfo,包含openid,unionid,昵稱,頭像等數(shù)據(jù)
后續(xù)可以將用戶信息保存到數(shù)據(jù)庫,再返回給前端一個(gè)token即可,shiro經(jīng)過公司封裝了一層,代碼如下:
... // 獲得用戶ID int userId = wxUser.getWxUserId(); shiroTokenService.afterLogout(userId); String uuid = UUID.randomUUID().toString(); String token = StringUtils.deleteAny(uuid, "-") + Long.toString(System.currentTimeMillis(), Character.MAX_RADIX); shiroTokenService.afterLogin(userId, token, null); return token;二、以下為公眾號(網(wǎng)頁)授權(quán)的代碼:
網(wǎng)頁授權(quán)更加簡單,可查看 官方文檔
需添加 riversoft 相關(guān)依賴包,公眾號網(wǎng)頁授權(quán),只需要將公眾號綁定了開放平臺(tái),就能獲取到unionid及其他用戶信息。
public static OpenUser webSiteLogin(String code, String state) { log.info("============微信公眾號(網(wǎng)頁)授權(quán)開始==========="); WxProperties properties = WeiXinPropertiesUtils.getWxProperties(); AppSetting appSetting = new AppSetting(properties.getAppId(), properties.getAppSecret()); OpenOAuth2s openOAuth2s = OpenOAuth2s.with(appSetting); AccessToken accessToken = openOAuth2s.getAccessToken(code); // 獲取用戶信息 OpenUser openUser = openOAuth2s.userInfo(accessToken.getAccessToken(), accessToken.getOpenId()); log.info("============微信公眾號(網(wǎng)頁)授權(quán)結(jié)束==========="); return openUser; // 后續(xù), 可將用戶信息保存 // 最后一步, 生成token后, 需重定向回頁面 //return "redirect:" + state + "?token=" + token; }
隆鵬
廣州蘆葦科技Java開發(fā)團(tuán)隊(duì)
蘆葦科技-廣州專業(yè)互聯(lián)網(wǎng)軟件服務(wù)公司
抓住每一處細(xì)節(jié) ,創(chuàng)造每一個(gè)美好
關(guān)注我們的公眾號,了解更多
想和我們一起奮斗嗎?lagou搜索“ 蘆葦科技 ”或者投放簡歷到 [email protected] 加入我們吧
關(guān)注我們,你的評論和點(diǎn)贊對我們最大的支持
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/72772.html
摘要:微信登錄用戶可使用微信帳號快速登錄你的網(wǎng)站,同一用戶使用微信登錄你的不同應(yīng)用和公眾帳號,會(huì)對應(yīng)同一個(gè),以便進(jìn)行不同業(yè)務(wù)間的帳號統(tǒng)一微信授權(quán)登錄可分為掃碼登錄一般用于網(wǎng)頁微信開放平臺(tái)跳轉(zhuǎn)授權(quán)登錄第三方使用微信開放平臺(tái)微信內(nèi)置瀏覽器內(nèi)登錄一 微信登錄: 用戶可使用微信帳號快速登錄你的網(wǎng)站,同一用戶使用微信登錄你的不同應(yīng)用和公眾帳號,會(huì)對應(yīng)同一個(gè)UnionID,以便進(jìn)行不同業(yè)務(wù)間的帳號統(tǒng)一 ...
摘要:小程序仍在不斷更新和完善,舊代碼可能會(huì)因不符合新政策,在下次發(fā)布的時(shí)候無法正常運(yùn)行。用戶微信支付后,需要后臺(tái)推送消息到服務(wù)器,才能確認(rèn)支付成功。小程序也存在兼容性問題,對待不愿更新微信的用戶,要像對待忠實(shí)的用戶一樣,小程序基礎(chǔ)庫版本分布。 小程序沒有跳轉(zhuǎn)公眾號、跳轉(zhuǎn)公眾號圖文素材的能力。除非用戶通過掃描二維碼進(jìn)入小程序的情景,可以顯示關(guān)注公眾號組件。公眾號菜單、公眾號圖文素材可以打開...
摘要:項(xiàng)目作用訪問項(xiàng)目的網(wǎng)頁,掃一掃網(wǎng)頁上的二維碼,就會(huì)顯示你的微信好友中將你刪除的人的列表。顯示參考文檔該功能的實(shí)現(xiàn)網(wǎng)頁微信登錄原理項(xiàng)目源碼項(xiàng)目源碼 項(xiàng)目作用 訪問項(xiàng)目的網(wǎng)頁,掃一掃網(wǎng)頁上的二維碼,就會(huì)顯示你的微信好友中將你刪除的人的列表。 在線網(wǎng)址: 訪問115.29.55.54:8080/WXApi就可以使用該項(xiàng)目所說的網(wǎng)頁 項(xiàng)目原理 在微信中,將你刪掉的好友是無法加入你創(chuàng)建的群...
摘要:項(xiàng)目作用訪問項(xiàng)目的網(wǎng)頁,掃一掃網(wǎng)頁上的二維碼,就會(huì)顯示你的微信好友中將你刪除的人的列表。顯示參考文檔該功能的實(shí)現(xiàn)網(wǎng)頁微信登錄原理項(xiàng)目源碼項(xiàng)目源碼 項(xiàng)目作用 訪問項(xiàng)目的網(wǎng)頁,掃一掃網(wǎng)頁上的二維碼,就會(huì)顯示你的微信好友中將你刪除的人的列表。 在線網(wǎng)址: 訪問115.29.55.54:8080/WXApi就可以使用該項(xiàng)目所說的網(wǎng)頁 項(xiàng)目原理 在微信中,將你刪掉的好友是無法加入你創(chuàng)建的群...
摘要:除官方外的參考文章微信小程序?qū)嵗齽?chuàng)建下發(fā)模板消息實(shí)例手把手教你開發(fā)微信小程序之模版消息開發(fā)教你突破小程序模板消息的推送限制獲取用戶信息接口的廢棄問題接口是獲取用戶信息昵稱,頭像等的接口,在官方文檔上寫是即將廢棄。 ----------------更新-------------- 2018年10月10日官網(wǎng)3個(gè)接口廢棄的通知: 1、分享監(jiān)聽接口分享消息給好友時(shí),開發(fā)者將無法從callba...
閱讀 3717·2023-04-26 00:56
閱讀 2706·2021-09-30 10:01
閱讀 974·2021-09-22 15:30
閱讀 3934·2021-09-07 10:21
閱讀 1541·2021-09-02 15:40
閱讀 2774·2021-08-30 09:47
閱讀 1256·2021-08-16 10:57
閱讀 1874·2019-08-30 14:01