微信小程序登錄態(tài)和檢驗(yàn)注冊過沒的app.js寫法
0、可參考的官方頁面
獲取登錄憑證:https://developers.weixin.qq.com/miniprogram/dev/api/wx.login.html
檢查登錄態(tài)是否過期: https://developers.weixin.qq.com/miniprogram/dev/api/wx.checkSession.html
備注:你要明白什么是登錄態(tài):這里的登錄態(tài)是微信小程序自己的登錄態(tài),我們可以再自己寫個(gè)登錄頁面作為自己的登錄態(tài),不過為了用戶體驗(yàn)良好我直接以微信登錄態(tài)做為自己的登錄態(tài)。所以我的整個(gè)小程序是直接自動登錄的
注意:微信小程序緩存很容易被清除,所以你必須時(shí)刻提防小程序緩存被清除的狀態(tài)下怎么處理。
備注:我從后臺返回來給小程序的對象格式為:
public ResultCode resultCode; // 業(yè)務(wù)響應(yīng)碼
public String resultMsg = ""; // 返回信息描述
public String errCode; // 錯(cuò)誤代碼
public String errCodeDes = ""; // 錯(cuò)誤描述
public Object data; // 返回業(yè)務(wù)數(shù)據(jù)
public enum ResultCode {
SUCCESS, // 業(yè)務(wù)處理成功
FAIL; // 業(yè)務(wù)處理失敗
}
1、流程
(1)調(diào)用wx.checkSession檢查用戶登錄態(tài)是否過期,如果沒有過期就檢查用戶注冊沒注冊①,如果過期了就去重新執(zhí)行登錄流程②
(2)②的流程為:調(diào)用wx.login來獲取登錄憑證(code),然后把code發(fā)給后臺,后臺調(diào)用 auth.code2Session,使用 code 換取 openid 等信息來獲取openId , 把openId返回給小程序, 然后把openId放到小程序緩存里面,然后檢查用戶注冊沒注冊①
(3)①的流程為:先從緩存查該用戶注冊沒注冊過(通過檢查緩存變量registered存不存在),有就是老用戶,沒有就去后臺通過openId查有沒有這個(gè)用戶,把結(jié)果返回給小程序,如果后臺有這個(gè)用戶,說明已經(jīng)注冊過,就把在緩存里加個(gè)registered并賦值true。
(4)然后我們就可以在其他頁面通過registered來判斷用戶注冊沒注冊過,從而跳轉(zhuǎn)進(jìn)入注冊頁面或者是主頁
2、app.js代碼
App({
globalData: {
serverHost: 'http://localhost:8080', //服務(wù)器域名
},
onLaunch: function() {
var that = this;
//檢查登錄態(tài)是否過期
wx.checkSession({
success() {
// session_key 未過期,并且在本生命周期一直有效
console.log("【用戶小程序登錄態(tài)未過期】");
that.isRegister();
},
fail() {
// session_key 已經(jīng)失效,需要重新執(zhí)行登錄流程
that.wxLogin();
}
})
},
//查看當(dāng)前用戶是否已經(jīng)注冊過
isRegister: function() {
var that = this;
var host = this.globalData.serverHost;
// (先從緩存查該用戶,有就是老用戶,沒有就后臺查有沒有這個(gè)用戶,后臺查到有這個(gè)用戶就放緩存,沒有就是新用戶)
wx.getStorage({
key: 'registered',
success(res) {
console.log("【通過緩存查詢到該用戶是已經(jīng)注冊過的】");
console.log("【當(dāng)前用戶的openid為:】" + wx.getStorageSync('openid'));
},
fail(res) {
var openid;
openid = wx.getStorageSync('openid');
wx.request({
url: host + '寫自己的后臺請求檢查用戶存不存在的URL',
method: 'POST',
data: {
openId: openid,
},
header: {
"Content-Type": "application/x-www-form-urlencoded"
},
success: (res) => {
if (后臺返回注冊過") {
if (res.data.data) {
console.log("【通過后臺查詢到該用戶已經(jīng)注冊過】");
wx.setStorage({
key: "registered",
data: true
});
} else {
console.log("【通過后臺查詢到該用戶還沒注冊過】");
}
}
}
})
},
})
},
//該函數(shù)用來登錄的
wxLogin: function() {
var that = this;
//設(shè)置后臺host
var host = this.globalData.serverHost;
console.log("【用戶重新執(zhí)行小程序登錄流程】");
wx.login({
success(res) {
// 發(fā)起網(wǎng)絡(luò)請求,發(fā)送 res.code 到后臺換取 openId
if (res.code) {
var code = res.code;
wx.request({
url: host + '寫自己后臺用code換取OpenId的請求URL',
method: 'POST',
data: {
code: code,
},
header: {
"Content-Type": "application/x-www-form-urlencoded"
},
success: (res) => {
console.log("【獲取用戶openid成功】");
console.log("【從后臺獲取到用戶openid為】" + res.data.data.openid)
let openId = res.data.data.openid;
wx.setStorage({
key: "openid",
data: res.data.data.openid
});
console.log("【用戶openid放入緩存成功】");
that.isRegister();
}
})
}
}
})
},
},
})
3、java后臺怎么通過code獲取openId
import net.sf.json.JSONObject;
/**
* @author niqinhua
* @date 2019/3/8 9:19
*/
public class WXUtil {
public static JSONObject getOpenidAndSessionKey(String code) {
String url = "https://api.weixin.qq.com/sns/jscode2session";
String param = "appid=寫自己的appId&secret=寫自己的密鑰&js_code=" +
code + "&grant_type=authorization_code";
String wxReturnResult = sendGet(url, param);
JSONObject wxReturnResultObject = JSONObject.fromObject(wxReturnResult);
return wxReturnResultObject;
}
/**
* 從規(guī)范上,建議把這個(gè)方法抽出來放到HttpUtil類里面
* 向指定URL發(fā)送GET方法的請求
* @param url 發(fā)送請求的URL
* @param param 請求參數(shù),請求參數(shù)應(yīng)該是 name1=value1&name2=value2 的形式。
* @return URL 所代表遠(yuǎn)程資源的響應(yīng)結(jié)果
*/
public static String sendGet(String url, String param) {
String result = "";
BufferedReader in = null;
try {
String urlNameString = url + "?" + param;
URL realUrl = new URL(urlNameString);
// 打開和URL之間的連接
URLConnection connection = realUrl.openConnection();
// 設(shè)置通用的請求屬性
connection.setRequestProperty("accept", "*/*");
connection.setRequestProperty("connection", "Keep-Alive");
connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
// 建立實(shí)際的連接
connection.connect();
// 定義 BufferedReader輸入流來讀取URL的響應(yīng)
in = new BufferedReader(new InputStreamReader(
connection.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
result += line;
}
} catch (Exception e) {
System.out.println("【HTTP發(fā)送GET請求出現(xiàn)異?!?訪問URL:"+url+",錯(cuò)誤:"+e.getMessage());
}
// 使用finally塊來關(guān)閉輸入流
finally {
try {
if (in != null) {
in.close();
}
} catch (Exception e2) {
System.out.println("【HTTP請求關(guān)閉輸入流異?!?訪問URL:"+url+",錯(cuò)誤:"+e2.getMessage());
}
}
return result;
}
}
上面只是工具類直接拿就行,真正業(yè)務(wù)邏輯要自己寫,我只給出重點(diǎn)部分
JSONObject wxReturnJson = WXUtil.getOpenidAndSessionKey(code);
if (wxReturnJson.get("errCode")!=null) {
//log.error("【獲取用戶的openid】【失敗】【傳遞參數(shù)code無效】");
} else {
//log.info("【獲取用戶的openid】【成功】【傳遞參數(shù)code無效】");
}
總結(jié)
以上所述是小編給大家介紹的微信小程序登錄態(tài)和檢驗(yàn)注冊過沒的app.js寫法,希望對大家有所幫助,如果大家有任何疑問歡迎給我留言,小編會及時(shí)回復(fù)大家的!
相關(guān)文章
ElementUI的Dialog彈窗實(shí)現(xiàn)拖拽移動功能示例代碼
這篇文章主要介紹了ElementUI的Dialog彈窗實(shí)現(xiàn)拖拽移動功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07
JavaScript實(shí)現(xiàn)圖像壓縮的方法
使用 JavaScript 和 canvas 壓縮圖像可以使用 canvas 的 drawImage() 方法將圖像繪制到 canvas 上,然后使用 toDataURL() 方法將圖像轉(zhuǎn)換為 Data URL 形式,這篇文章主要介紹了JavaScript 圖像壓縮的相關(guān)資料,需要的朋友可以參考下2023-01-01
js實(shí)現(xiàn)多行文本框統(tǒng)計(jì)剩余字?jǐn)?shù)功能
本文主要介紹了js實(shí)現(xiàn)多行文本框統(tǒng)計(jì)剩余字?jǐn)?shù)功能的相關(guān)知識。具有很好的參考價(jià)值。下面跟著小編一起來看下吧2017-03-03
JavaScript簡單驗(yàn)證表單空值及郵箱格式的方法
這篇文章主要介紹了JavaScript簡單驗(yàn)證表單空值及郵箱格式的方法,涉及javascript基本的表單與字符串操作相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2017-01-01
js中刪除數(shù)組中的某一元素實(shí)例(無下標(biāo)時(shí))
下面小編就為大家?guī)硪黄猨s中刪除數(shù)組中的某一元素實(shí)例(無下標(biāo)時(shí))。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-02-02

