微信小程序开发 教程太老了...... 而且是直接导入 哈哈哈 白学家


微信登录

主要逻辑是用HttpClients工具 对项目中DTO封装和VO封装的数据进行存储 说实话没有完全看懂逻辑 自己也没办法复述出来 kimi 1.5助我!

微信小程序开发微信登录流程

  1. 小程序端获取 code

    • 调用 wx.login() 接口获取临时登录凭证 code

    • 示例代码:

      wx.login({
        success(res) {
          if (res.code) {
            console.log("登录成功,code:", res.code);
            // 将 code 发送到开发者服务器
          } else {
            console.error("登录失败:", res.errMsg);
          }
        }
      });
  2. 小程序端发送 code 到后端服务器

    • 使用 wx.request()code 发送到开发者服务器。

    • 示例代码:

      wx.request({
        url: 'https://your-backend-server.com/login', // 替换为你的后端接口地址
        method: 'POST',
        data: {
          code: res.code
        },
        success(res) {
          console.log("后端返回的数据:", res.data);
        }
      });
  3. 后端服务器调用微信接口获取 openidsession_key

    • 使用 HttpClient 或其他 HTTP 客户端工具,向微信接口服务发送请求,携带 appIdappSecretcode

    • 示例代码(Java):

      public String getOpenid(String code) {
          String url = "https://api.weixin.qq.com/sns/jscode2session?appid=" + appId + "&secret=" + appSecret + "&js_code=" + code + "&grant_type=authorization_code";
        CloseableHttpClient httpClient = HttpClients.createDefault();
        HttpGet httpGet = new HttpGet(url);
        CloseableHttpResponse response = httpClient.execute(httpGet);
        HttpEntity entity = response.getEntity();
        String result = EntityUtils.toString(entity);
        JSONObject jsonObject = JSON.parseObject(result);
        return jsonObject.getString("openid");
      }
  4. 后端服务器生成自定义登录态(如 token

    • 根据业务需求生成自定义登录态,如 token,并返回给小程序

    • public UserLoginVO wxLogin(UserLoginDTO userLoginDTO) {
        String openid = getOpenid(userLoginDTO.getCode());
        if (openid == null) {
          throw new LoginFailedException("登录失败");
        }
        User user = userMapper.getByOpenid(openid);
        if (user == null) {
          user = User.builder().openid(openid).createTime(LocalDateTime.now()).build();
          userMapper.insert(user);
        }
        Map<String, Object> claims = new HashMap<>();
        claims.put("userId", user.getId());
        String token = JwtUtil.createJWT(jwtProperties.getUserSecretKey(), jwtProperties.getUserTtl(), claims);
        return UserLoginVO.builder().id(user.getId()).openid(openid).token(token).build();
      }
  5. 小程序端存储登录态

    • 将后端返回的 token 存储到本地存储中。

    • 示例代码:

      wx.setStorageSync('token', res.data.token);
  6. 小程序端后续请求携带 token

    • 在后续的业务请求中,携带 token 进行身份校验。

    • 示例代码:

      wx.request({
        url: 'https://your-backend-server.com/data',
        method: 'GET',
        header: {
          'Authorization': 'Bearer ' + wx.getStorageSync('token')
        },
        success(res) {
          console.log("返回的数据:", res.data);
        }
      });

后端服务实现思路

控制层(Controller)
  • 功能:接收小程序端的请求,调用业务层方法处理业务逻辑,返回结果。

  • 实现示例(Java)

    @RestController
    @RequestMapping("/user")
    public class UserController {
      @Autowired
      private UserService userService;
    
      @PostMapping("/login")
      public Result<UserLoginVO> login(@RequestBody UserLoginDTO userLoginDTO) {
        UserLoginVO userLoginVO = userService.wxLogin(userLoginDTO);
        return Result.success(userLoginVO);
      }
    }
业务层(Service)
  • 功能:处理具体的业务逻辑,如调用微信接口获取 openid,生成 token,处理用户注册等。

  • 实现示例(Java)

    @Service
    public class UserServiceImpl implements UserService {
      @Autowired
      private WeChatProperties weChatProperties;
      @Autowired
      private UserMapper userMapper;
      @Autowired
      private JwtProperties jwtProperties;
    
      @Override
      public UserLoginVO wxLogin(UserLoginDTO userLoginDTO) {
        String openid = getOpenid(userLoginDTO.getCode());
        if (openid == null) {
          throw new LoginFailedException("登录失败");
        }
        User user = userMapper.getByOpenid(openid);
        if (user == null) {
          user = User.builder().openid(openid).createTime(LocalDateTime.now()).build();
          userMapper.insert(user);
        }
        Map<String, Object> claims = new HashMap<>();
        claims.put("userId", user.getId());
        String token = JwtUtil.createJWT(jwtProperties.getUserSecretKey(), jwtProperties.getUserTtl(), claims);
        return UserLoginVO.builder().id(user.getId()).openid(openid).token(token).build();
      }
    
      private String getOpenid(String code) {
        String url = "https://api.weixin.qq.com/sns/jscode2session?appid=" + weChatProperties.getAppid() + "&secret=" + weChatProperties.getSecret() + "&js_code=" + code + "&grant_type=authorization_code";
        CloseableHttpClient httpClient = HttpClients.createDefault();
        HttpGet httpGet = new HttpGet(url);
        CloseableHttpResponse response = httpClient.execute(httpGet);
        HttpEntity entity = response.getEntity();
        String result = EntityUtils.toString(entity);
        JSONObject jsonObject = JSON.parseObject(result);
        return jsonObject.getString("openid");
      }
    }
数据访问层(Mapper)
  • 功能:与数据库交互,执行增删改查操作。

  • 实现示例(Java)

    @Mapper
    public interface UserMapper {
      @Select("SELECT * FROM user WHERE openid = #{openid}")
      User getByOpenid(String openid);
    
      @Insert("INSERT INTO user (openid, create_time) VALUES (#{openid}, #{createTime})")
      int insert(User user);
    }

 导入商品浏览

 

结果到这里发现 他要要求前面很多的内容我没实现 还得从管理端和用户端分别做controller service servicelmpl mapper 以及mapperxml。。。 做了一下午 总算是学会流程了 而且也明白从哪发现错误和问题 优先看开发文档是最正确的选择 通过开发文档的需求一步步看 需要什么参数 返回什么类型 这个方法是post还是put还是get还是delete 每天都是收获 但是还是得快点 好好学 

主要内容还是微信登录

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐