日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Spring Boot實現微信小程序登錄

瀏覽:275日期:2022-06-24 14:09:44

使用Spring Boot完成微信小程序登錄

由于微信最近的版本更新,wx.getUserInfo()的這個接口即將失效,將用wx.getUserProfile()替換,所以近期我也對自己的登錄進行更新,并且為了鞏固學習到的知識,我自己做了一個小demo,在此分享給大家,希望能對大家有所幫助。廢話不多說,直接上代碼。

前端

.wxml

<button bindtap='bindGetUserInfo'>同意</button>

JS部分

bindGetUserInfo(e) { let that = this let token = wx.getStorageSync(’token’); //token其實就是后臺調用微信登錄接口返回的openid,每個用戶在同一個小程序內是唯一的。 wx.showLoading({ title: ’加載中’, //提示框,加載中的樣式 }) if (token) { //如果已經有token,說明用戶已經登錄,跳轉到指定頁面 wx.switchTab({url: ’’ }) } else { //用戶還未登錄,申請用戶授權 wx.getUserProfile({desc: ’用于完善會員資料’, // 聲明獲取用戶個人信息后的用途,后續會展示在彈窗中,請謹慎填寫success: (res) => { that.setData({ userInfo: res.userInfo, //保存用戶信息 }) if (res.errMsg == 'getUserProfile:ok') { let code = null wx.login({ success: function (e) {code = e.codelet params = {};params.code = code; //用戶code 注:用戶的code每次登錄都是隨機的,所以不需要進行存儲params.avatarUrl = res.userInfo.avatarUrl; //用戶頭像params.nickName = res.userInfo.nickName; //用戶微信名params.gender = res.userInfo.gender; //用戶性別 0為未知,1為男,2為女//還有有用戶微信設置的地址信息,個人認為沒啥用,所以沒處理wx.request({ url: ’’, //后臺接口 data: params, method: ’POST’, header: { ’Content-Type’: ’application/json’, ’X-Nideshop-Token’: wx.getStorageSync(’token’) }, success: function (res) { //URL為你后臺的接口 console.log(res) if (res.data.code === 200) { //存儲用戶信息 wx.setStorageSync(’userInfo’, res.data.userInfo); wx.setStorageSync(’token’, res.data.userInfo.openId); wx.switchTab({url: ’’ //跳轉到指定頁面 }) wx.hideLoading() //關閉提示框 } else { //輸出錯誤信息 } }}) } }) } else { //用戶按了拒絕按鈕 wx.showModal({ title: ’警告通知’, content: ’您點擊了拒絕授權,將無法正常顯示個人信息,點擊確定重新獲取授權。’, success: function (res) {//用戶拒絕登錄后的處理 } }); }} }) } },

前臺的部分都在這了,詳細的解釋都寫在注釋里了,如果多處使用登錄、或者校驗用戶是否登錄,建議進行封裝,方便調用。

后臺

后臺部分我使用的是springboot框架,為了方便新手學習,我會將整個模塊貼在后面,包括jar包。

首先給大家看一下項目目錄結構

Spring Boot實現微信小程序登錄

POM.XML

jar包的內容并不復雜,我相信各位應該都沒啥問題哈哈哈哈哈

<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.47</version></dependency><!--數據庫--><dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.23</version></dependency><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>2.4.4</version></dependency><dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.10</version></dependency><!--SpringBoot啟動器--><dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.4</version></dependency><dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version></dependency><dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.18</version></dependency>

配置類 application.yml

配置類的內容也不復雜,在此就不作解釋啦

mybatis: type-aliases-package: com.cxb.pojo config-location: classpath:mybatis/mybatis-config.xml mapper-locations: classpath:mybatis/mapper/*.xmlspring: application: name: item #數據庫部分 datasource: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql:///item?useUnicode=treu&charactEncoding=utf-8 username: root password: 123456wxMini: appId: #小程序的appid,在哪獲取如果不知道的話可以百度喲 secret: #小程序密匙

mybatis-config.xml

<?xml version='1.0' encoding='UTF-8' ?><!DOCTYPE configurationPUBLIC '-//mybatis.org//DTD Config 3.0//EN''http://mybatis.org/dtd/mybatis-3-config.dtd'><configuration> <settings><setting name='cacheEnabled' value='true'/> <!--開啟二級緩存--> </settings></configuration>

工具類 WeChatUtil

這個工具類是我網上找的一個比較簡單的工具類,因為微信登錄接口返回的參數是加密的,所以需要解密

package com.cxb.utils;import com.alibaba.fastjson.JSONObject;import lombok.extern.slf4j.Slf4j;import javax.net.ssl.HttpsURLConnection;import java.io.*;import java.net.URL;import java.net.URLConnection;import java.nio.charset.StandardCharsets;/** * 微信小程序工具類 */@Slf4jpublic class WeChatUtil { public static String httpRequest(String requestUrl, String requestMethod, String output) {try { URL url = new URL(requestUrl); HttpsURLConnection connection = (HttpsURLConnection) url.openConnection(); connection.setDoOutput(true); connection.setDoInput(true); connection.setUseCaches(false); connection.setRequestMethod(requestMethod); if (null != output) {OutputStream outputStream = connection.getOutputStream();outputStream.write(output.getBytes(StandardCharsets.UTF_8));outputStream.close(); } // 從輸入流讀取返回內容 InputStream inputStream = connection.getInputStream(); InputStreamReader inputStreamReader = new InputStreamReader(inputStream, StandardCharsets.UTF_8); BufferedReader bufferedReader = new BufferedReader(inputStreamReader); String str; StringBuilder buffer = new StringBuilder(); while ((str = bufferedReader.readLine()) != null) {buffer.append(str); } bufferedReader.close(); inputStreamReader.close(); inputStream.close(); connection.disconnect(); return buffer.toString();} catch (Exception e) { e.printStackTrace();}return ''; } /** * 向指定 URL 發送POST方法的請求 * * @param url 發送請求的 URL * @param json 請求參數,請求參數應該是 json 的形式。 * @return 所代表遠程資源的響應結果 */ public static String httpPost(String url, JSONObject json) {PrintWriter out = null;BufferedReader in = null;String result = '';try { URL realUrl = new URL(url); // 打開和URL之間的連接 URLConnection conn = realUrl.openConnection(); // 設置通用的請求屬性 conn.setRequestProperty('accept', '*/*'); conn.setRequestProperty('connection', 'Keep-Alive'); conn.setRequestProperty('user-agent', 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)'); // 發送POST請求必須設置如下兩行 conn.setDoOutput(true); conn.setDoInput(true); // 獲取URLConnection對象對應的輸出流 out = new PrintWriter(conn.getOutputStream()); // 發送請求參數 out.print(json); // flush輸出流的緩沖 out.flush(); // 定義BufferedReader輸入流來讀取URL的響應 in = new BufferedReader( new InputStreamReader(conn.getInputStream())); String line; while ((line = in.readLine()) != null) {result=result.concat(line); }} catch (Exception e) { System.out.println('發送 POST 請求出現異常!' + e); e.printStackTrace();}//使用finally塊來關閉輸出流、輸入流finally { try {if (out != null) { out.close();}if (in != null) { in.close();} } catch (IOException ex) {ex.printStackTrace(); }}return result; }}

接下來就是項目的主題代碼了,因為只是做一個簡單的demo,所以內容并不復雜,但是不管是學習還是普通的小項目都是沒有問題的,可以放心使用

Dao層 UserDao

package com.cxb.dao;import com.cxb.pojo.User;import org.apache.ibatis.annotations.Mapper;import org.springframework.stereotype.Repository;@Mapper@Repositorypublic interface UserDao { User queryById(String openId); void insertUser(User user); void updateUser(User user);}

service層 UserService

package com.cxb.service;import com.cxb.dao.UserDao;import com.cxb.pojo.User;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;@Servicepublic class UserService implements UserDao { @Autowired private UserDao userDao; @Override public User queryById(String openId) {return userDao.queryById(openId); } @Override public void insertUser(User user) {userDao.insertUser(user); } @Override public void updateUser(User user) {userDao.updateUser(user); }}

實體類 User

package com.cxb.pojo;import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;import lombok.experimental.Accessors;import java.io.Serializable;import java.util.Date;@Data@NoArgsConstructor@Accessors(chain = true)public class User implements Serializable { private Long id; //id private String code; //只是為了能接收參數,不需要存入數據庫 private String openId; //微信登錄接口返回的參數之一,就是token private String nickName; //微信名 private String avatarUrl; //頭像 private String gender; //性別 0 未知 1 男 2 女 private Date firstLoginTime; //第一次登錄時間 private Date lastLoginTime; //最后一次登錄時間}

SQL部分 UserMapper.xml

<?xml version='1.0' encoding='UTF-8' ?><!DOCTYPE mapperPUBLIC '-//mybatis.org//DTD Mapepr 3.0//EN''http://mybatis.org/dtd/mybatis-3-mapper.dtd'><mapper namespace='com.cxb.dao.UserDao'> <select resultType='User'>select * from user where open_id = #{openId} </select> <insert parameterType='User'>insert into user (open_id,nick_name,avatar_url,gender,first_login_time,last_login_time)values( #{openId}, #{nickName}, #{avatarUrl}, #{gender}, #{firstLoginTime}, #{lastLoginTime} ) </insert> <update parameterType='User'>update user<set><if test='nickName != null'>`nick_name` = #{nickName},</if><if test='avatarUrl != null'>`avatar_url` = #{avatarUrl},</if><if test='gender != null'>`gender` = #{gender},</if><if test='lastLoginTime != null'>`last_login_time` = #{lastLoginTime}</if></set>where id = #{id} </update> </mapper>

控制器 UserController

package com.cxb.controller;import com.alibaba.fastjson.JSONObject;import com.cxb.pojo.User;import com.cxb.service.UserService;import com.cxb.utils.WeChatUtil;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Value;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.*;import java.util.Date;@Controller@RequestMapping(value = '/user')public class UserController { @Value('${wxMini.appId}') public String appId; @Value('${wxMini.secret}') public String secret; @Autowired private UserService userService; @RequestMapping(value = '/login',method = RequestMethod.POST) @ResponseBody public JSONObject login(@RequestBody User user){String code = user.getCode();JSONObject object=new JSONObject();if(code == '' || ''.equals(code)){ object.put('code',300); object.put('msg','code不能為空!'); return object;}else { //微信接口服務,通過調用微信接口服務中jscode2session接口獲取到openid和session_key String url = 'https://api.weixin.qq.com/sns/jscode2session?appid=' + appId + '&secret=' + secret + '&js_code=' + code + '&grant_type=authorization_code'; String str = WeChatUtil.httpRequest(url, 'GET', null); //調用工具類解密 JSONObject jsonObject=JSONObject.parseObject(str); String openid = (String) jsonObject.get('openid');if(openid != null && !''.equals(openid)){ //登錄成功 User userVo=new User(); userVo.setNickName(user.getNickName()); userVo.setAvatarUrl(user.getAvatarUrl()); userVo.setOpenId(openid); userVo.setGender(user.getGender()); userVo.setFirstLoginTime(new Date(System.currentTimeMillis())); userVo.setLastLoginTime(new Date(System.currentTimeMillis())); User us = userService.queryById(openid); if(us != null) {//不是首次登錄,更新用戶信息userVo.setId(us.getId());userService.updateUser(userVo); } else {//首次登錄,存儲用戶信息userService.insertUser(userVo); } object.put('code',200); object.put('msg','登錄成功!'); object.put('userInfo',userVo); return object;}else { object.put('code',400); object.put('msg','未知錯誤,請重試!'); return object;} }} }

啟動類 item

package com.cxb;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.context.annotation.Bean;import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;@SpringBootApplicationpublic class item { //讀取配置文件信息 @Bean public static PropertySourcesPlaceholderConfigurer placeholderConfigurer() {PropertySourcesPlaceholderConfigurer c = new PropertySourcesPlaceholderConfigurer();c.setIgnoreUnresolvablePlaceholders(true);return c; } public static void main(String[] args) {SpringApplication.run(item.class,args); }}

數據庫的部分應該就不用分享了吧,相信大家根據實體類能自己建出來,好啦,至此微信小程序的登錄功能就完成啦,希望能對大家有所幫助。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: 微信
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲高清激情| 日韩高清三区| 国产精品麻豆成人av电影艾秋 | 日韩一区二区三免费高清在线观看 | 亚洲精品少妇| 免费人成精品欧美精品| 亚洲在线免费| 欧美.日韩.国产.一区.二区| av资源亚洲| 精品国产鲁一鲁****| 精品捆绑调教一区二区三区| 999久久久国产精品| 日韩av成人高清| 欧美精品九九| 欧美日韩一二三四| 蜜桃91丨九色丨蝌蚪91桃色| 日韩在线欧美| 国产精品一级| 欧美91在线|欧美| 国产欧美日韩影院| 免费在线欧美黄色| 国产成人精品福利| 亚洲精品a级片| 蜜臀久久99精品久久久久宅男| 久久大逼视频| 久久精品一区| 美腿丝袜亚洲一区| 精品午夜久久| 麻豆国产在线| 日韩欧美一区二区三区在线视频| 国产激情综合| 日韩久久电影| 麻豆亚洲精品| 国产剧情在线观看一区| 久久久久久久久成人| 超碰99在线| 精品在线91| 成人午夜在线| 美女少妇全过程你懂的久久| 久久国产高清| 国产欧美日韩亚洲一区二区三区| 精品视频高潮| 鲁大师精品99久久久| 精品欧美久久| 视频福利一区| 成人污污视频| 亚洲欧美日韩在线观看a三区| 91p九色成人| 麻豆成全视频免费观看在线看| 亚洲激情黄色| 国产图片一区| 天堂中文av在线资源库| 国产精品毛片久久| 99热精品在线观看| 国产欧美视频在线| 日本在线高清| 亚洲欧洲日韩精品在线| 免费在线亚洲| 亚洲一区国产| 久久精品免费看| 午夜在线观看免费一区| 麻豆91精品视频| 老牛国产精品一区的观看方式| 国产乱码精品| 中文一区二区| 黑人精品一区| 日韩avvvv在线播放| 你懂的国产精品| 美女被久久久| 麻豆视频在线观看免费网站黄 | 日韩精品五月天| 九九精品调教| 国产精品.xx视频.xxtv| 亚洲精华国产欧美| 四季av一区二区凹凸精品| 在线一区二区三区视频| 国产一区三区在线播放| 亚洲视频国产| 国产精品久久久久av电视剧| 91精品美女| 午夜精品免费| 国产欧美一区二区三区精品酒店| 视频一区二区三区在线| 欧美不卡高清一区二区三区| 国产精品亚洲欧美一级在线| 亚洲综合电影一区二区三区| se01亚洲视频| 国产一区二区三区探花| 日韩av一二三| 亚洲专区欧美专区| 久久精品动漫| 国产精品中文| 91中文字幕精品永久在线| 欧美在线精品一区| 久久久一二三| 国产一区91| 亚洲伦乱视频| 成人国产精品一区二区网站| 日本不卡一区二区| 亚洲精品97| 99久久夜色精品国产亚洲狼| 国产一区丝袜| 国产一区二区三区日韩精品| 91免费精品国偷自产在线在线| 欧美亚洲专区| 在线综合欧美| 日本蜜桃在线观看视频| 久久久久伊人| 国产精品天天看天天狠| 午夜天堂精品久久久久| 亚洲视频www| 欧美精选一区二区三区| 亚洲电影有码| 日韩国产一区二区| 国产成人免费| 中文字幕在线看片| 激情国产在线| 国产不卡精品| 福利视频一区| 亚洲国产欧美日本视频| а√天堂8资源在线| 美日韩一区二区三区| 国产日韩一区二区三区在线| 欧美激情精品| 亚洲色图国产| 久久午夜精品| 蜜桃91丨九色丨蝌蚪91桃色| 亚洲欧美激情诱惑| 中文精品电影| 日本精品一区二区三区在线观看视频| 亚洲丝袜美腿一区| 日韩av黄色在线| 国产欧美激情| 欧美激情一区| 粉嫩av一区二区三区四区五区 | 六月婷婷一区| 在线精品一区二区| 亚州av一区| 久久精品97| 美女精品久久| 四虎成人av| 日韩精品一二区| 美女网站一区| 亚洲在线免费| 日韩精品乱码av一区二区| 91亚洲无吗| 久久99偷拍| xxxxx性欧美特大| 国产在线不卡| 亚洲一区成人| 青青国产91久久久久久| 麻豆精品久久| 91精品韩国| 午夜在线精品| 国产欧美69| 日韩不卡视频在线观看| 91久久黄色| 亚洲精品日本| 久久精品国产成人一区二区三区| 国产va免费精品观看精品视频| 成人va天堂| 鲁大师成人一区二区三区| 国产 日韩 欧美 综合 一区| 中文字幕日本一区| 亚洲一二三区视频| 国产欧美在线| 国产va免费精品观看精品视频| 日本美女一区| 99pao成人国产永久免费视频 | 激情亚洲影院在线观看| 日韩欧美少妇| 丝袜美腿亚洲一区二区图片| 欧美日韩亚洲一区在线观看| 国产aⅴ精品一区二区三区久久| 亚洲a在线视频| 一二三区精品| 久久久国产精品入口麻豆| 国产一区欧美| 久久国产三级| 久久久精品午夜少妇| 亚洲日本在线观看视频| 精品欧美日韩精品| 夜夜精品视频| 久久精品一区二区三区中文字幕| 另类中文字幕国产精品| 一区二区精彩视频| 国内自拍视频一区二区三区| 国产精品91一区二区三区| 日韩高清电影一区| 色一区二区三区| 日本在线不卡视频| 中文字幕在线高清| 亚洲精品大片| 日韩免费福利视频| 清纯唯美亚洲综合一区| 99精品网站| 欧美极品中文字幕| 亚洲资源av| 狠狠躁少妇一区二区三区| 一区二区三区午夜视频|