整体流程

  1. 小程序端调用wx.login()获取临时code

  2. 小程序端code发送到Java后端

  3. Java后端向微信接口请求session_keyopenid

  4. Java后端创建自定义登录态(如Token)并返回给小程序

  5. 小程序端后续请求携带Token进行身份验证

 获取openid:

    //获取openid的访问路径地址
    private static final String URL="https://api.weixin.qq.com/sns/jscode2session";

    @Value("${wechat.appid}")
    private String appid;

    @Value("${wechat.secret}")
    private String secret;


    /**
     * 获取openid
     * @param code 登录凭证
     * @return 唯一标识
     * @throws IOException IO异常
     */
   @Override
public JSONObject getOpenid(String code) throws IOException {
    // 封装请求参数
    // 创建一个Map对象用于存储请求参数
    Map<String, Object> params = new HashMap<>();
    // 设置小程序的AppID
    params.put("appid", appid);
    // 设置小程序的AppSecret
    params.put("secret", secret);
    // 设置从前端接收到的临时登录凭证code
    params.put("js_code", code);
    // 设置授权类型,固定值为"authorization_code"
    params.put("grant_type", "authorization_code");

    // 发送HTTP GET请求到微信服务器
    // 使用HttpRequest工具类构造GET请求,并将封装好的参数以表单形式发送
    HttpResponse response = HttpRequest.get(URL).form(params).execute();

    // 解析微信服务器返回的结果
    if (response.isOk()) { // 检查响应是否成功(状态码200)
        String body = response.body(); // 获取响应体内容
        JSONObject jsonObject = JSONUtil.parseObj(body); // 将响应体解析为JSON对象

        // 检查返回结果中是否包含错误码字段
        // 如果存在errcode字段,说明调用失败,抛出自定义异常
        if (jsonObject.containsKey("errcode")) {
            throw new SLWebException(jsonObject.toString());
        }

        // 如果没有错误码,直接返回解析后的JSON对象,其中包含openid、session_key等信息
        return jsonObject;
    }

    // 如果响应状态不是200,构造错误信息并抛出异常
    String errMsg = StrUtil.format("调用微信登录接口出错! code = {}", code);
    throw new SLWebException(errMsg);
}

获取token:

//获取token的接口地址
   private static final String ACCESS_TOKEN_URL="https://api.weixin.qq.com/cgi-bin/token";

//获取token值
    private String accessToken(){
        Map<String,Object> params=new HashMap<>();
        params.put("grant_type","client_credential");
        params.put("appid",appid);
        params.put("secret",secret);
        //获取token
        HttpResponse response = HttpRequest.get(ACCESS_TOKEN_URL)
                .form(params)
                .execute();
        //解析数据
        if(response.isOk()){
            String body = response.body();
            JSONObject jsonObject = JSONUtil.parseObj(body);
            return jsonObject.getStr("access_token");
        }
        String errMsg = StrUtil.format("调用获取接口调用凭据接口出错!");
        throw new SLWebException(errMsg);
    }

获取手机号:

    //获取手机号的接口地址
    private static final String PHONE_URL="https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=";  

  /**
     * 获取手机号
     * @param code 手机号凭证
     * @return 唯一标识
     * @throws IOException IO异常
     */
    @Override
    public String getPhone(String code) throws IOException {
        //封装数据
        Map<String,Object> params=new HashMap<>();
        params.put("code",code);
        String paramBody = JSONUtil.toJsonStr(params);
        //获取手机号
        HttpResponse response = HttpRequest.post(PHONE_URL + this.accessToken())
                .body(paramBody)
                .execute();
        //解析结果
        if(response.isOk()){
            String body = response.body();
            JSONObject jsonObject = JSONUtil.parseObj(body);
            String phone = jsonObject.getByPath("phone_info.phoneNumber", String.class);
            return phone;
        }
        String errMsg = StrUtil.format("调用获取手机号接口出错!");
        throw new SLWebException(errMsg);
    }
返回结果:
  • 成功时返回:
{
  "openid": "用户唯一标识",
  "session_key": "会话密钥",
  "unionid": "用户在开放平台的唯一标识(仅在满足条件时返回)"
}
  • 失败时返回错误码和错误信息:
    {
      "errcode": 40029,
      "errmsg": "invalid code"
    }

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐