在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美

當(dāng)前位置:雨林木風(fēng)下載站 > 應(yīng)用軟件教程 > 詳細(xì)頁面

java完成微信小程序登錄態(tài)維護(hù)

java完成微信小程序登錄態(tài)維護(hù)

更新時(shí)間:2025-09-27 文章作者:未知 信息來源:網(wǎng)絡(luò) 閱讀次數(shù):

導(dǎo)微信小程序,簡稱小程序,英文名Mini Program,是一種不需要下載安裝即可使用的應(yīng)用,它實(shí)現(xiàn)了應(yīng)用“觸手可及”的夢(mèng)想,用戶掃一掃或搜一下即可打開應(yīng)用。小程序是一種不用下載就能使用的應(yīng)用,也是一...
微信小程序,簡稱小程序,英文名Mini Program,是一種不需要下載安裝即可使用的應(yīng)用,它實(shí)現(xiàn)了應(yīng)用“觸手可及”的夢(mèng)想,用戶掃一掃或搜一下即可打開應(yīng)用。小程序是一種不用下載就能使用的應(yīng)用,也是一項(xiàng)門檻非常高的創(chuàng)新,經(jīng)過將近兩年的發(fā)展,已經(jīng)構(gòu)造了新的小程序開發(fā)環(huán)境和開發(fā)者生態(tài)。
本篇文章主要介紹了java實(shí)現(xiàn)微信小程序登錄態(tài)維護(hù)的示例代碼,具有一定的參考價(jià)值,有興趣的可以了解一下

相信不少喜歡開發(fā)的朋友都已經(jīng)知道微信小程序是個(gè)什么物種了,樓主也是從小程序內(nèi)測期間就開始關(guān)注,并且也寫過幾個(gè)已經(jīng)上線的微信小程序。但是基本上都是寫的純前端,最近樓主從后端到前端寫一個(gè)完整的小程序項(xiàng)目,中間碰到了一些問題,樓主會(huì)找一些個(gè)人覺得有學(xué)習(xí)價(jià)值的點(diǎn)不定時(shí)的拿出來跟大家分享,希望對(duì)你有一些幫助。

本次就從最基本的微信小程序登錄態(tài)維護(hù)開始吧。小程序官方api文檔里面有對(duì)登錄態(tài)的一個(gè)完整的解釋,并且有相關(guān)的代碼。想看詳情,可以出門右轉(zhuǎn):https://mp.weixin.qq.com/debug/wxadoc/dev/api/api-login.html#wxloginobject 我第一次看的時(shí)候沒怎么看懂,并且代碼沒有提供java版本的,這讓一個(gè)java程序員情何以堪,所以在努力研究了以后決定要做一個(gè)java版本的簡單的demo放出來。

作為服務(wù)端,如果想獲得到使用微信小程序的會(huì)員信息,就需要小程序作為客戶端把會(huì)員的基本信息傳過來。類似于手機(jī)號(hào),openId可以作為當(dāng)前小程序中用戶的唯一性標(biāo)志。然而如果把會(huì)員的openId信息明文直接在服務(wù)端與小程序端來回傳輸?shù)脑挘瑫?huì)有安全性的問題。萬一被別人得到這個(gè)openId,就相當(dāng)于得到會(huì)員的手機(jī)號(hào)一樣,就可以做一些其他操作了,顯然是不安全的。

為了解決這一問題微信采用了相對(duì)安全的方式。

//app.js
App({
 onLaunch: function() {
  wx.login({
   success: function(res) {
    if (res.code) {
     //發(fā)起網(wǎng)絡(luò)請(qǐng)求
     wx.request({
      url: 'https://test.com/onLogin',
      data: {
       code: res.code
      }
     })
    } else {
     console.log('獲取用戶登錄態(tài)失敗!' + res.errMsg)
    }
   }
  });
 }
})

微信小程序端會(huì)調(diào)用wx.login的api,然后會(huì)得到一個(gè)code,這個(gè)code對(duì)外人來講是沒有任何意義的,可以放心的傳給服務(wù)端。服務(wù)端得到code以后,加上你申請(qǐng)小程序時(shí)的appId, app secret,去調(diào)微信的接口

https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code

就可以得到以下參數(shù):

  • openid 用戶唯一標(biāo)識(shí)

  • session_key 會(huì)話密鑰

  • unionid 本字段在滿足一定條件的情況下才返回

其中openid 就是會(huì)員的唯一性標(biāo)記,此時(shí)服務(wù)端可以保存下來。

session_key 以后解密 unionId(整個(gè)開放平臺(tái)會(huì)員的唯一性標(biāo)識(shí))時(shí)有用。

服務(wù)端得到openid以后,為了后邊的交互,要保存下來。一般來講有兩種方式:一種是直接入數(shù)據(jù)庫,一種是采用效率高一點(diǎn)的緩存。樓主采用的是后者,方式是redis。

按照微信的建議此時(shí)需要生成一個(gè)不重復(fù)值作為openId的唯一性標(biāo)識(shí)。這里采用的是java的uuid。然后把這個(gè)uuid值作為key,把openid以及后面會(huì)用到的session_key作為value,存進(jìn)redis。并且把uuid值返回給小程序。這樣小程序就可以直接拿uuid值跟服務(wù)端交互。

也許會(huì)有人問,如果有人得到uuid值其實(shí)跟得到openid沒什么區(qū)別啊,都相當(dāng)于是會(huì)員的唯一性標(biāo)志。

所以這里要對(duì)這個(gè)uuid值進(jìn)行一個(gè)處理。首先存入redis時(shí)要有時(shí)效性。session_key在微信服務(wù)器有效期是30天,建議服務(wù)端緩存session_key不超過30天。當(dāng)小程序傳過來的uuid值過期時(shí),認(rèn)為這是過期的uuid,則重新走wx.login步驟。

為了方便redis中不僅會(huì)寸uuid與openid的對(duì)應(yīng)關(guān)系。還會(huì)再存一條openid對(duì)應(yīng)uuid的記錄,目的是為了下一次重新wx.login步驟時(shí)根據(jù)openid找到之前老的uuid,如果存在的話就刪掉,然后查詢一條新的uuid值,并且把openid對(duì)應(yīng)的這條記錄也更新掉。這樣redis服務(wù)器中就不會(huì)有多余的臟數(shù)據(jù),減輕服務(wù)器的負(fù)擔(dān)。

以上就是我理解的整個(gè)登錄態(tài)的過程,當(dāng)然還有wx.checkSession這些沒有講到,其實(shí)就是發(fā)現(xiàn)session_key失效是再重新走一遍上述的流程就可以了。所以沒有仔細(xì)說。不知道我有沒有講清楚。我會(huì)把整個(gè)流程的關(guān)鍵代碼貼出來,供大家參考。

@ActionKey("/loginByWeixin")
  public void loginByWeixin() throws Exception {
    logger.info("Start getSessionKey");
    String json = HttpKit.readData(getRequest());
    JSONObject reqJson = JSON.parseObject(json);
    String jsCode = reqJson.getString("code");
    if (jsCode == null || "".equals(jsCode)) {
      logger.info("缺少必要參數(shù)");
      renderJson(new OutRoot().setCode("100").setMsg(SYS.PARAMETER_FAIL));
    } else {
      List<Record> record = appInfoService.selectAppInfo();
      String appId = record.get(0).get("app_id");
      String appSecret = record.get(0).getStr("app_secret");
      if (appId == null || "".equals(appId) || appSecret == null || "".equals(appSecret)) {
        logger.info("缺少必要參數(shù)");
        renderJson(new OutRoot().setCode("100").setMsg(SYS.PARAMETER_FAIL));
      } else {
        String url = "https://api.weixin.qq.com/sns/jscode2session";
        String httpUrl = url + "?appid=" + appId + "&secret=" + appSecret + "&js_code=" + jsCode
            + "&grant_type=authorization_code";
        String ret = HttpRequest.sendGetRequest(httpUrl);
        logger.info("微信返回的結(jié)果 {}", ret);
        if (ret == null || "".equals(ret)) {
          logger.info("網(wǎng)絡(luò)超時(shí)");
          renderJson(new OutRoot().setCode("101").setMsg(SYS.CONTACT_FAIL));
        } else {
          JSONObject obj = JSONObject.parseObject(ret);
          if (obj.containsKey("errcode")) {
            String errcode = obj.get("errcode").toString();
            logger.info("微信返回的錯(cuò)誤碼{}", errcode);
            renderJson(new OutRoot().setCode("101").setMsg(SYS.CONTACT_FAIL));
          } else if (obj.containsKey("session_key")) {
            logger.info("調(diào)微信成功");
            // 開始處理userInfo
            String openId = obj.get("openid").toString();
            Record tbMember = new Record();
            tbMember.set("weixin_openid", openId);
            System.out.println("openId==" + openId);
            // 先查詢openId存在不存在,存在不入庫,不存在就入庫
            List<Record> memberList = tbMemberService.selectMember(tbMember);
            if (memberList != null && memberList.size() > 0) {
              logger.info("openId已經(jīng)存在,不需要插入");
            } else {
              JSONObject rawDataJson = reqJson.getJSONObject("userInfo");
              String nickName = rawDataJson.getString("nickName");
              String avatarUrl = rawDataJson.getString("avatarUrl");
              String gender = rawDataJson.getString("gender");
              String province = rawDataJson.getString("province");
              String city = rawDataJson.getString("city");
              String country = rawDataJson.getString("country");
              tbMember.set("gender", gender);
              tbMember.set("nick_name", nickName);
              tbMember.set("avatar_url", avatarUrl);
              Long openId2 = tbMemberService.addMember(tbMember);
              logger.info("openId不存在,插入數(shù)據(jù)庫");
            }
            // (1) 獲得sessionkey
            String sessionKey = obj.get("session_key").toString();
            logger.info("sessionKey==" + sessionKey);
            logger.info("openId==" + openId);
            // (2) 得到sessionkey以后存到緩存,key值采用不會(huì)重復(fù)的uuid
            String rsession = UUID.randomUUID().toString();
            Cache tokenCache = Redis.use("redis_00");
            // (3) 首先根據(jù)openId,取出來之前存的openId對(duì)應(yīng)的sessionKey的值。
            String oldSeesionKey = tokenCache.getJedis().get(openId);
            if (oldSeesionKey != null && !"".equals(oldSeesionKey)) {
              logger.info("oldSeesionKey==" + oldSeesionKey);
              // (4) 刪除之前openId對(duì)應(yīng)的緩存
              tokenCache.getJedis().del(oldSeesionKey);
              logger.info("老的openId刪除以后==" + tokenCache.getJedis().get(oldSeesionKey));
            }
            // (5) 開始緩存新的sessionKey: key --> uuid, value --> sessionObj
            JSONObject sessionObj = new JSONObject();
            sessionObj.put("openId", openId);
            sessionObj.put("sessionKey", sessionKey);
            tokenCache.getJedis().set(rsession, sessionObj.toJSONString());

            // (6) 開始緩存新的openId與session對(duì)應(yīng)關(guān)系 : key --> openId , value --> rsession
            tokenCache.getJedis().set(openId, rsession);

            String newOpenId = tokenCache.getJedis().get(openId);
            String newrSession = tokenCache.getJedis().get(rsession);
            logger.info("新的openId==" + newOpenId);
            logger.info("新的newrSession==" + newrSession);
            // (7) 把新的sessionKey返回給小程序
            JSONObject objret = new JSONObject();
            objret.put("rdSessionKey", rsession);
            objret.put("errno", 0);
            renderJson(objret);
          }

        }
      }
    }
  }

項(xiàng)目框架是我比較喜歡Jfinal,java輕量級(jí)急速開發(fā)框架,非常高效,也推薦給大家。可能有哪些遺漏的地方歡迎大家積極提出意見和批評(píng)。

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,更多相關(guān)內(nèi)容請(qǐng)關(guān)注PHP中文網(wǎng)!

相關(guān)推薦:

關(guān)于微信小程序的登陸流程

微信小程序之小豆瓣圖書的介紹

以上就是java實(shí)現(xiàn)微信小程序登錄態(tài)維護(hù)的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注php中文網(wǎng)其它相關(guān)文章!


小程序是一種不需要下載安裝即可使用的應(yīng)用,它實(shí)現(xiàn)了應(yīng)用“觸手可及”的夢(mèng)想,用戶掃一掃或者搜一下即可打開應(yīng)用。

溫馨提示:喜歡本站的話,請(qǐng)收藏一下本站!

本類教程下載

系統(tǒng)下載排行

在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美
  • <li id="86scu"><menu id="86scu"></menu></li>
    <li id="86scu"></li>
    <button id="86scu"></button>
  • <s id="86scu"></s><button id="86scu"><menu id="86scu"></menu></button>
  • www.五月天色| 北条麻妃av高潮尖叫在线观看| 少妇高清精品毛片在线视频| 人妻无码一区二区三区四区| 久久久无码中文字幕久...| 日韩在线一区视频| 911av视频| 欧美a级黄色大片| 日本xxxxxxxxxx75| av免费播放网址| 冲田杏梨av在线| 亚洲一级片免费观看| 国产成人精品免费看在线播放 | 精品久久久久久无码中文野结衣| 亚洲AV无码成人精品一区| 一级 黄 色 片一| 永久免费看av| 女人扒开屁股爽桶30分钟| 99草草国产熟女视频在线| 激情 小说 亚洲 图片: 伦| 日韩av片专区| 欧美一区二区激情| 亚洲乱码国产一区三区| 自拍偷拍一区二区三区四区| 三日本三级少妇三级99| 欧美精品一区二区三区三州| 欧洲熟妇精品视频| a级黄色片网站| 97免费视频观看| 亚洲最大成人在线观看| 400部精品国偷自产在线观看| 国产精品成人久久电影| 午夜在线观看av| 免费看毛片的网址| 韩国中文字幕av| 国产高清不卡无码视频| 制服丝袜综合网| 99热亚洲精品| 男人的天堂成人| 手机在线看福利| 青青草国产精品视频| 手机av在线网| 日本成年人网址| 成人午夜免费在线视频| 欧洲美女亚洲激情| 热久久精品免费视频| 久久在线中文字幕| 天天操天天干天天玩| 污色网站在线观看| 免费大片在线观看| 无码人妻丰满熟妇区96| 欧美另类videos| 一级 黄 色 片一| 91插插插插插插插插| 777米奇影视第四色| 成人午夜视频在线观看免费| 一区二区三区日韩视频| 中文字幕一区久久| 999精彩视频| 在线观看av网页| 三上悠亚在线一区二区| 国产l精品国产亚洲区久久| 免费成人午夜视频| 欧美一级在线看| 欧美 丝袜 自拍 制服 另类| 日本阿v视频在线观看| 亚洲18在线看污www麻豆| 少妇大叫太大太粗太爽了a片小说| 久久久久久蜜桃一区二区| 成 年 人 黄 色 大 片大 全| 高清无码一区二区在线观看吞精| 9999在线观看| 国产女人18毛片| 欧美一二三不卡| 国产一区二区网| 日本三区在线观看| 三上悠亚在线一区| 亚洲欧美一区二区三区不卡| 国产大尺度在线观看| 中文字幕日韩精品无码内射| h无码动漫在线观看| 日日碰狠狠添天天爽超碰97| 国产97色在线 | 日韩| 国产日韩欧美久久| 嫩草影院中文字幕| 国产免费黄视频| 亚洲一级免费在线观看| 成人免费看片视频在线观看| 久久久性生活视频| 密臀av一区二区三区| www.久久com| 2018日日夜夜| 色一情一区二区三区| 国产精品视频二| 国产三级三级看三级| 欧美大黑帍在线播放| 日韩视频免费在线播放| 中文字幕精品在线播放| 国产网站免费在线观看| 三级性生活视频| 欧美一级在线看| 色婷婷777777仙踪林| 欧美一级黄色影院| 欧美极品少妇无套实战| 亚洲精品久久久中文字幕| 久久www视频| 中文字幕在线综合| 国产精品无码一区二区在线| 亚洲第一精品区| 久久久久久三级| 妞干网在线视频观看| 日本高清久久久| 女人另类性混交zo| 日韩精品在线视频免费观看| 五月花丁香婷婷| 精品免费国产一区二区| 国产在线播放观看| 成人短视频在线看| 性生生活大片免费看视频| 97在线免费公开视频| 人人干视频在线| 欧美狂野激情性xxxx在线观| 善良的小姨在线| 爽爽爽在线观看| a在线观看免费视频| 国产精品无码av无码| 丰满爆乳一区二区三区| 91视频 -- 69xx| 国产肥臀一区二区福利视频| 国产乱淫av片杨贵妃| 91网站在线观看免费| 2022中文字幕| 女人色极品影院| 真人抽搐一进一出视频| 丁香色欲久久久久久综合网| 日韩不卡视频一区二区| 18视频在线观看娇喘| 成人短视频在线观看免费| 一级性生活视频| 精品国偷自产一区二区三区| 97在线免费视频观看| 国产曰肥老太婆无遮挡| 国产h视频在线播放| 亚洲成熟丰满熟妇高潮xxxxx| 日韩毛片在线免费看| 国产高潮免费视频| 人人爽人人爽av| 狠狠噜天天噜日日噜| 欧美人与动牲交xxxxbbbb| 男人添女人荫蒂免费视频| 午夜肉伦伦影院| 99re精彩视频| 2022中文字幕| 欧美激情国产精品日韩| 99久久国产宗和精品1上映| 性生活免费在线观看| 波多野结衣三级在线| 国产伦精品一区二区三区四区视频_| 97国产在线播放| www.cao超碰| 日韩精品视频在线观看视频| 欧美一级在线看| 日本特黄在线观看| 亚洲自偷自拍熟女另类| 看看黄色一级片| 免费在线a视频| 免费成人黄色大片| 无码人妻丰满熟妇区96| 天天操精品视频| 日韩av在线综合| 亚洲国产精品女人| wwww.国产| 欧美 日韩 国产 高清| 国产精品jizz在线观看老狼| 精品视频在线观看一区| 日韩av加勒比| 五月天激情视频在线观看| 2018国产在线| 国产性生活免费视频| 一级黄色特级片| 国产l精品国产亚洲区久久| 无颜之月在线看| 亚洲最新免费视频| www.99r| 妞干网在线免费视频| 国产96在线 | 亚洲| 国产日产欧美一区二区| 国产欧美一区二| 天天干天天玩天天操| 亚洲视频在线观看一区二区三区| 人妻夜夜添夜夜无码av| 成人午夜免费剧场| 日本黄色播放器| 中国一级黄色录像| 日韩欧美色视频| 北条麻妃亚洲一区| 波多野结衣免费观看| 中国黄色片一级| 在线看免费毛片| 亚洲五月激情网|