一、背景
一直以來,公司這邊有運作一個微信號和兩個小程序。在每個應用的入口除了賬密登錄,還有一個微信快速登錄。
目前是使用openid的方式來進行業務邏輯處理的。但是這樣就存在一個問題:因為分屬不同的應用,導致同一個微信
用戶小程序1和小程序2所返回的openid是不一樣的。
顯然,這是很不合理的!就解決方案來說:
① 可以把倆個openId都存儲起來,然后進行比對。但是會隨著應用增多所保存的openid也逐漸增加
② 針對于此,官方給出的方案是使用 unionid
二、什么是unionid
2.1、什么是unionid
簡單來說,如果開發者擁有多個移動應用、網站應用、公眾號應用等情況下,可以通過unionid來區分用戶的唯一性,
因為只要是同一個微信開放平臺賬號下的應用、網站、公眾號,其unionid是唯一的。換句話說:同一用戶對同一個微信
開放平臺下的不同應用,其unionid是相同的。
2.2、如何獲取unionid
綁定了開發者賬號的小程序,可以通過以下途徑獲取unionid
① 開發者使用wx.login + jscode2session來獲取該用戶的unionid。無需用戶授權
② 小程序端調用云函數時,可在云函數中通過Cloud.getWXContet獲取unionid
2.3、綁定小程序到微信開放平臺
① 注冊微信開放平臺
登錄到微信開放平臺:
https://open.weixin.qq.com/
② 注冊賬號
填寫郵箱 -> 密碼 -> 填寫機構名稱 -> 地區及所在地 -> 認證個人信息(姓名和身份證號)-> 綁定管理員
PS: 基本的賬號注冊流程,沒啥特別好說的
③ 綁定小程序
填寫小程序登錄賬號及密碼,最后小程序管理員確認掃碼即可。大致如下:
三、unionid獲取的整個流程
3.1、小程序中進行微信登錄
微信可以快速登錄相關代碼:
<!-- 微信快捷登錄 -->
<view class="xa-wechat-login-panel">
<button class="xa-wechat-login-btn" bindtap="wechatLogin">
<image class="xa-wechat-login-logo" src="../login/wechat.png"></image>
</button>
</view>
<view class="container">
<view class="userinfo">
<block wx:if="{{!hasUserInfo}}">
<button wx:if="{{canIUseGetUserProfile}}" bindtap="getUserProfile"> 獲取頭像昵稱 </button>
<button wx:else open-type="getUserInfo" bindgetuserinfo="getUserInfo"> 獲取頭像昵稱 </button>
</block>
<block wx:else>
<image bindtap="bindViewTap" class="userinfo-avatar" src="{{userInfo.avatarUrl}}" mode="cover"></image>
<text class="userinfo-nickname">{{userInfo.nickName}}</text>
</block>
</view>
JAVA
3.2、向后端發起驗證請求
wechatLogin(){
const that = this;
wx.login({
success (res) {
if (res.code) {
/* 發起網絡請求 */
debugger;
that.doWechatFastLogin(res.code);
} else {
console.log('登錄失??!' + res.errMsg)
}
}
})
},
Java
3.3、后端發起網絡請求
public R wechatFastLogin(WeichatFastLoginVO weichatFastLoginVO) {
String url = null;
try {
url = userAccessTokenUrl.replace("AppID", appId).replace("SECRET", secret)
.replace("JSCODE", weichatFastLoginVO.getWechatCode());
logger.info("獲取微信登錄憑證校驗Url:" + url);
} catch (Exception e) {
logger.info("獲取微信登錄憑證校驗失敗:" + url);
}
/* 發送get請求獲取WXUserAccessToken */
String respRlt = HttpClientUtil.doGet(url, null);
WxUserAccessTokenDTO wxUserAccessTokenDTO = JSONObject.parseobject(respRlt, WxUserAccessTokenDTO.class);
if (null == wxUserAccessTokenDTO) {
return R.error("微信未登錄,請先登錄微信!");
} else if (null != wxUserAccessTokenDTO.getErrcode() && wxUserAccessTokenDTO.getErrcode() != 0) {
return R.error("微信未登錄,請先登錄微信!");
} else if (null == wxUserAccessTokenDTO.getOpenid() || wxUserAccessTokenDTO.getOpenid().isEmpty()) {
return R.error("微信未登錄,請先登錄微信!");
}
String openId = wxUserAccessTokenDTO.getOpenid();
...
/* unionid存在于wxUserAccessTokenDTO,可進行自定義相關業務邏輯處理 */
}
Java
四、注意事項
4.1、一定要加入微信開放平臺
4.2、微信公眾平臺需認證
微信公眾平臺需要證人,但是如果你是同一主體的話可以暫時不做認證。認證費用大約為300元。
4.3、關聯不同主體時
當你要關聯不同主體的微信公眾號、小程序時,必須要先進行認證處理。