摘要:小程序登錄微信網頁授權版首先呢,登錄授權授權登錄,是一樣的意思,不用糾結。寫小程序授權登錄的代碼前,需要了解清楚與的區別,這里再簡單介紹一下騰訊有個微信開放平臺,只有企業才能注冊賬號,可理解為微信體系里,最頂級的賬號。
小程序登錄、微信網頁授權(Java版)
首先呢,“登錄”、“授權”、“授權登錄”,是一樣的意思,不用糾結。
寫小程序授權登錄的代碼前,需要了解清楚openid與unionid的區別,這里再簡單介紹一下:
騰訊有個 “微信·開放平臺”,只有企業才能注冊賬號,可理解為微信體系里,最頂級的賬號。官網地址:https://open.weixin.qq.com
除了這個微信開放平臺,還有另一個叫做 “微信公眾平臺”,可注冊四種賬號,包括服務號、訂閱號、小程序、企業微信。也就是說,公眾號(服務號和訂閱號可統稱為公眾號)占一個賬號,小程序也占一個賬號。在沒有綁定開放平臺前,小程序授權登錄只能拿到用戶的openid。官網地址:https://mp.weixin.qq.com
小程序可綁定在公眾號下,公眾號可以綁定在微信開放平臺下,小程序也可以綁定在微信開放平臺下。(好像有點小繞)簡單點說,所有的公眾平臺賬號都需要綁定在 “開放平臺” 下,才可獲得的unionid,這是打通同個企業下所有微信公眾賬號的最有效方法(官方推薦)
更加具體的可自行百度...
一、以下為小程序登錄的代碼:
方式一:通過code調用code2session接口獲得message,包含openid、session_key,滿足條件的情況下還能直接獲得unionid
條件如下:(存在局限性)
官方說明UnionID獲取途徑,如果開發者帳號下存在同主體的公眾號,并且該用戶已經關注了該公眾號。開發者可以直接通過 wx.login + code2Session 獲取到該用戶 UnionID,無須用戶再次授權。
開發者帳號下存在同主體的公眾號或移動應用,并且該用戶已經授權登錄過該公眾號或移動應用。也可通過code2session獲取該用戶的 UnionID。
/** * Author: huanglp * Date: 2018-11-28 */ public class WeiXinUtils { private static Logger log = LoggerFactory.getLogger(WeiXinUtils.class); /** * 通過前端傳過來的code, 調用小程序登錄接口, 獲取到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("微信服務器請求錯誤", e); message = new JSONObject(); } log.info("message:" + message.toString()); log.info("==============小程序登錄方法結束================"); return message; // 后續, 可獲取openid session_key等數據, 以下代碼一般放在Service層 //if (message.get("errcode") != null) { // throw new ValidationException(message.toString()); //} //String openid = message.get("openid").toString(); //String sessionKey = message.get("session_key").toString(); //... } }
補充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; } }
補充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,但若不滿足條件,即使將小程序綁定到微信開放平臺上,也獲取不到unionid,所以此方式不穩定,推薦使用解密的方式獲取數據。
方式二:通過解密的方式獲取用戶unionid
/** * 通過encryptedData,sessionKey,iv獲得解密信息, 擁有用戶豐富的信息, 包含openid,unionid,昵稱等 */ public static JSONObject decryptWxData(String encryptedData, String sessionKey, String iv) throws Exception { log.info("============小程序登錄解析數據方法開始=========="); 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("============小程序登錄解析數據方法結束=========="); return userInfo; }
補充1: AesCbcUtil工具類,直接復制即可,需要添加bouncycastle依賴。BouncyCastle是一個開源的加解密解決方案,官網可查看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 //被加密的數據 * @param key //加密秘鑰 * @param iv //偏移量 * @param encoding //解密后的結果需要進行的編碼 */ 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; } }
到此已經獲取到 JSONObject類型的 userInfo,包含openid,unionid,昵稱,頭像等數據
后續可以將用戶信息保存到數據庫,再返回給前端一個token即可,shiro經過公司封裝了一層,代碼如下:
... // 獲得用戶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;二、以下為公眾號(網頁)授權的代碼:
網頁授權更加簡單,可查看 官方文檔
需添加 riversoft 相關依賴包,公眾號網頁授權,只需要將公眾號綁定了開放平臺,就能獲取到unionid及其他用戶信息。
public static OpenUser webSiteLogin(String code, String state) { log.info("============微信公眾號(網頁)授權開始==========="); 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("============微信公眾號(網頁)授權結束==========="); return openUser; // 后續, 可將用戶信息保存 // 最后一步, 生成token后, 需重定向回頁面 //return "redirect:" + state + "?token=" + token; }
隆鵬
廣州蘆葦科技Java開發團隊
蘆葦科技-廣州專業互聯網軟件服務公司
抓住每一處細節 ,創造每一個美好
關注我們的公眾號,了解更多
想和我們一起奮斗嗎?lagou搜索“ 蘆葦科技 ”或者投放簡歷到 server@talkmoney.cn 加入我們吧
關注我們,你的評論和點贊對我們最大的支持
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/72772.html
摘要:微信登錄用戶可使用微信帳號快速登錄你的網站,同一用戶使用微信登錄你的不同應用和公眾帳號,會對應同一個,以便進行不同業務間的帳號統一微信授權登錄可分為掃碼登錄一般用于網頁微信開放平臺跳轉授權登錄第三方使用微信開放平臺微信內置瀏覽器內登錄一 微信登錄: 用戶可使用微信帳號快速登錄你的網站,同一用戶使用微信登錄你的不同應用和公眾帳號,會對應同一個UnionID,以便進行不同業務間的帳號統一 ...
摘要:小程序仍在不斷更新和完善,舊代碼可能會因不符合新政策,在下次發布的時候無法正常運行。用戶微信支付后,需要后臺推送消息到服務器,才能確認支付成功。小程序也存在兼容性問題,對待不愿更新微信的用戶,要像對待忠實的用戶一樣,小程序基礎庫版本分布。 小程序沒有跳轉公眾號、跳轉公眾號圖文素材的能力。除非用戶通過掃描二維碼進入小程序的情景,可以顯示關注公眾號組件。公眾號菜單、公眾號圖文素材可以打開...
摘要:項目作用訪問項目的網頁,掃一掃網頁上的二維碼,就會顯示你的微信好友中將你刪除的人的列表。顯示參考文檔該功能的實現網頁微信登錄原理項目源碼項目源碼 項目作用 訪問項目的網頁,掃一掃網頁上的二維碼,就會顯示你的微信好友中將你刪除的人的列表。 在線網址: 訪問115.29.55.54:8080/WXApi就可以使用該項目所說的網頁 項目原理 在微信中,將你刪掉的好友是無法加入你創建的群...
摘要:項目作用訪問項目的網頁,掃一掃網頁上的二維碼,就會顯示你的微信好友中將你刪除的人的列表。顯示參考文檔該功能的實現網頁微信登錄原理項目源碼項目源碼 項目作用 訪問項目的網頁,掃一掃網頁上的二維碼,就會顯示你的微信好友中將你刪除的人的列表。 在線網址: 訪問115.29.55.54:8080/WXApi就可以使用該項目所說的網頁 項目原理 在微信中,將你刪掉的好友是無法加入你創建的群...
摘要:除官方外的參考文章微信小程序實例創建下發模板消息實例手把手教你開發微信小程序之模版消息開發教你突破小程序模板消息的推送限制獲取用戶信息接口的廢棄問題接口是獲取用戶信息昵稱,頭像等的接口,在官方文檔上寫是即將廢棄。 ----------------更新-------------- 2018年10月10日官網3個接口廢棄的通知: 1、分享監聽接口分享消息給好友時,開發者將無法從callba...
閱讀 3713·2023-04-26 00:56
閱讀 2693·2021-09-30 10:01
閱讀 969·2021-09-22 15:30
閱讀 3926·2021-09-07 10:21
閱讀 1527·2021-09-02 15:40
閱讀 2762·2021-08-30 09:47
閱讀 1246·2021-08-16 10:57
閱讀 1871·2019-08-30 14:01