首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【项目日志|苍穹外卖】Day6:微信小程序登录认证与HTTPClient技术实战

【项目日志|苍穹外卖】Day6:微信小程序登录认证与HTTPClient技术实战

作者头像
超级苦力怕
发布2025-12-23 17:57:51
发布2025-12-23 17:57:51
2940
举报

本文记录了苍穹外卖项目第六天的学习内容,重点介绍了微信小程序登录认证流程的实现以及HTTPClient在Web服务开发中的应用技术。

请添加图片描述
请添加图片描述


完成任务清单

  • 学习HTTPClient技术原理
  • 掌握微信小程序开发流程
  • 实现微信登录接口

主要功能展示

1.HttpClient

HttpClient 是Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。

业务场景 在应用程序中访问如扫描支付获取验证码查看天气等服务,需要发送HTTP请求,并且接收响应数据,可通过HttpClient来实现。

核心API

HttpClient:Http客户端对象类型,使用该类型对象可发起Http请求。 HttpClients:可认为是构建器,可创建HttpClient对象。 CloseableHttpClient:实现类,实现了HttpClient接口。 HttpGet:Get方式请求类型。 HttpPost:Post方式请求类型。

实现流程

1.创建HttpClient对象 2.创建Http请求对象 3,调用HttpClient的execute方法发送请求

Get方式请求

代码语言:javascript
复制
@SpringBootTest
public class HttpClientTest {

    /**
     * 测试通过httpclient发送GET方式的请求
     */
    @Test
    public void testGET() throws Exception{
        //创建httpclient对象
        CloseableHttpClient httpClient = HttpClients.createDefault();

        //创建请求对象
        HttpGet httpGet = new HttpGet("http://localhost:8080/user/shop/status");

        //发送请求,接受响应结果
        CloseableHttpResponse response = httpClient.execute(httpGet);

        //获取服务端返回的状态码
        int statusCode = response.getStatusLine().getStatusCode();
        System.out.println("服务端返回的状态码为:" + statusCode);

        HttpEntity entity = response.getEntity();
        String body = EntityUtils.toString(entity);
        System.out.println("服务端返回的数据为:" + body);

        //关闭资源
        response.close();
        httpClient.close();
    }
}

POST方式请求

代码语言:javascript
复制
    @Test
    public void testPOST() throws Exception{
        // 创建httpclient对象
        CloseableHttpClient httpClient = HttpClients.createDefault();

        //创建请求对象
        HttpPost httpPost = new HttpPost("http://localhost:8080/admin/employee/login");

        JSONObject jsonObject = new JSONObject();
        jsonObject.put("username","admin");
        jsonObject.put("password","123456");

        StringEntity entity = new StringEntity(jsonObject.toString());
        //指定请求编码方式
        entity.setContentEncoding("utf-8");
        //数据格式
        entity.setContentType("application/json");
        httpPost.setEntity(entity);

        //发送请求
        CloseableHttpResponse response = httpClient.execute(httpPost);

        //解析返回结果
        int statusCode = response.getStatusLine().getStatusCode();
        System.out.println("响应码为:" + statusCode);

        HttpEntity entity1 = response.getEntity();
        String body = EntityUtils.toString(entity1);
        System.out.println("响应数据为:" + body);

        //关闭资源
        response.close();
        httpClient.close();
    }
2.微信登录接口
流程图
在这里插入图片描述
在这里插入图片描述
认证流程思路
  1. 小程序端:通过调用wx.login()获取临时登录凭证 code,调用wx.request()发送code授权码至开发者服务器
  2. 开发者服务器:携带必要参数(appid+appsecret+code)向微信接口服务请求,获取 session_keyopenid,并生成自定义登录态(token)返回给小程序存储
  3. 小程序端:收取自定义登录态,存储storage,并在后续业务请求中携带token便于身份校验
开发者服务器认证流程

Controller功能:

1.接收小程序端的请求,获得包含appid、appsecret和codeUserLoginDTO对象 2.调用Service层的wxLogin方法,触发微信登录逻辑,获得包含openid参数的用户对象 3.以用户ID作为载荷,生成JWT令牌 4.构建UserLoginVO对象,包含ID、openid与token,通过Result.success返回小程序端

代码语言:javascript
复制
@RestController
@RequestMapping("/user/user")
@Api(tags="C端用户相关端口")
@Slf4j
public class UserController {
    @Autowired
    private JwtProperties jwtProperties;
    @Autowired
    private UserService userService;

    @PostMapping("/login")
    @ApiOperation("微信登陆")
    public Result<UserLoginVO> login(@RequestBody UserLoginDTO userLoginDTO){
        log.info("微信用户登录{}",userLoginDTO.getCode());
        User user=userService.wxLogin(userLoginDTO);
        //生成JWT令牌
        Map<String, Object> claims = new HashMap<>();
        claims.put(JwtClaimsConstant.USER_ID,user.getId());
        String token = JwtUtil.createJWT(jwtProperties.getUserSecretKey(), jwtProperties.getUserTtl(), claims);

        UserLoginVO userLoginVO = UserLoginVO.builder()
                .id(user.getId())
                .openid(user.getOpenid())
                .token(token)
                .build();
        return Result.success(userLoginVO);
    }

}

Service层主要分为wxLogin与getOpenid方法构成

wxLogin方法功能:

1.调用getOpenid方法,获取openid这个重要参数(用户唯一标识) 2.通过openid查询数据库,若用户不存在,则通过mapper层创建用户并返回对象

代码语言:javascript
复制
    public User wxLogin(UserLoginDTO userLoginDTO) {
        String openid = getOpenid(userLoginDTO.getCode());
        if (openid==null){
            throw new LoginFailedException(MessageConstant.LOGIN_FAILED);
        }
        User user=userMapper.getByOpenId(openid);
        //用户是否新用户
        if (user==null){
            user = User.builder()
                    .openid(openid)
                    .createTime(LocalDateTime.now())
                    .build();
            userMapper.insert(user);
        }
        return user;
    }

getOpenid方法功能:通过调用微信接口服务,获取openid并返回。

代码语言:javascript
复制
    private String getOpenid(String code){
        //调用微信接口服务,获得当前微信用户的openid
        Map<String, String> map = new HashMap<>();
        map.put("appid",weChatProperties.getAppid());
        map.put("secret",weChatProperties.getSecret());
        map.put("js_code",code);
        map.put("grant_type","authorization_code");
        String json = HttpClientUtil.doGet(WX_LOGIN, map);

        JSONObject jsonObject = JSON.parseObject(json);
        String openid = jsonObject.getString("openid");
        return openid;
    }

拓充知识点

为什么当前项目只获取openid,不获取session_key

session_key是微信小程序登录微信服务器返回的会话密钥,他主要作用于数据解密签名验证,用于验证用户身份和数据完整性。

不使用session_key的原因

1.当前项目只需要用户身份识别 2.不需要解密用户数据 3.不需要验证数据签名 4.只需要openid作为用户唯一标识


本文为苍穹外卖项目学习笔记,持续更新中…

如果我的内容对你有帮助,希望可以收获你的点赞、评论、收藏。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-08-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 完成任务清单
  • 主要功能展示
    • 1.HttpClient
    • 2.微信登录接口
      • 流程图
      • 认证流程思路
      • 开发者服务器认证流程
  • 拓充知识点
    • 为什么当前项目只获取openid,不获取session_key
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档