Spring Boot 위 챗 애플 릿 로그 인 실현

Spring Boot 로 위 챗 애플 릿 로그 인 완료
위 챗 의 최근 버 전이 업데이트 되 었 기 때문에 wx.getUserInfo()의 이 인 터 페 이 스 는 곧 효력 을 잃 을 것 입 니 다.wx.getUserProfile()로 교 체 될 것 입 니 다.그래서 최근 에 저도 자신의 로그 인 을 업데이트 하고 배 운 지식 을 공 고 히 하기 위해 저 는 작은 demo 를 만 들 었 습 니 다.여기 서 여러분 께 도움 이 되 었 으 면 합 니 다.쓸데없는 말 은 그만 하고 코드 를 바로 달 아 라.
전단
.wxml

<button class="r" 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.code
                let 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) {
                //          
              }
            });
          }
        }
      })
    }
  },
프론트 데스크 의 부분 이 모두 여기에 있 습 니 다.상세 한 설명 은 주석 에 적 혀 있 습 니 다.여러 곳 에서 로그 인 을 사용 하거나 사용자 가 로그 인 했 는 지 확인 하려 면 봉인 을 해서 호출 하 는 것 을 권장 합 니 다.
백 스테이지
백 스테이지 부분 에서 저 는 spring boot 프레임 워 크 를 사 용 했 습 니 다.초보 자 들 의 학습 을 편리 하 게 하기 위해 저 는 전체 모듈 을 뒤에 붙 일 것 입 니 다.jar 가방 을 포함 합 니 다.
우선 프로젝트 목록 구 조 를 보 여 드 리 겠 습 니 다.

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/*.xml


spring:
  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: 123456

wxMini:
  appId:   #    appid,                
  secret:   #     
mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//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;

/**
 *         
 */
@Slf4j
public 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
@Repository
public interface UserDao {

    User queryById(String openId);

    void insertUser(User user);

    void updateUser(User user);

}
서비스 계층 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;

@Service
public 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);
    }
}
실체 클래스 사용자

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 mapper
        PUBLIC "-//mybatis.org//DTD Mapepr 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.cxb.dao.UserDao">
    <select id="queryById" resultType="User">
        select * from user where open_id = #{openId}
    </select>

    <insert id="insertUser" 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 id="updateUser" 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;

@SpringBootApplication
public 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);
    }
}
데이터 베 이 스 를 공유 하지 않 아 도 되 겠 죠?여러분 이 실체 류 에 따라 스스로 만 들 수 있 을 거 라 고 믿 습 니 다.자,이로써 위 챗 애플 릿 의 로그 인 기능 이 완성 되 었 습 니 다.여러분 에 게 도움 이 되 었 으 면 좋 겠 습 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기