天天看点

微信开发:网页授权获取用户 openID

前几天开发微信的项目,一直比较忙,也没有时间记录一下经验,今天静下来想了一下,准备把自己工作中踩到的一些坑给大家分享一下,本篇文章主要是自我记录,如果有不足的地方,请留言多多指教,下边进入正题。

这次做得是一个微信公众号类型的,这里我们需要申请一个测试公众号。

申请测试公众号的链接:点击跳转

测试接口地址:https://mp.weixin.qq.com/debug/

网页授权文档说明:点击跳转

第一步

     嗯,看文档,其实文档写的已经很清晰了,反正我个人觉得很清晰了,申请一个微信测试公众号,下边是我已经申请好的一个测试公众号,可以获取到 AppID 和 AppSercret 信息,这两个信息很重要,一定要保存下来!!!

微信开发:网页授权获取用户 openID

第二步

     然后配置 Js 安全域名,这个相当于你的回调域名,用来获取 Code 信息

微信开发:网页授权获取用户 openID

第三步

     开始开发网页授权获取 OpenId ,配置完这个 Js 安全域名,就可以进行下一步的开发了,创建一个 Controller ,这个地方我们就叫 WxLogin(叫啥不重要重要的是内容),下边说一下详细的步骤

首先进入的方法一定是 login 方法,然后通过 login 方法 redirect 重定向到 getRedireceUrl() 方法中(其实这个地方,你也可以不用做重定向跳转,直接进来就可以获取值,主要核心的代码还是下方获取 code 信息 和 根据 code 信息获取 openID 的那一部分)

微信开发:网页授权获取用户 openID

然后去获取 Code 的信息,也就是我们的第二个方法

微信开发:网页授权获取用户 openID

通过我们设置的回调地址,拿到我们所需要的 code 的信息,然后用我们的 code 信息去获取 openID 

微信开发:网页授权获取用户 openID
package org.ry.demo;

import com.alibaba.fastjson.JSONObject;
import org.apache.log4j.Logger;
import org.ry.utils.HttpUtil;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.HashMap;

/**
 * @ClassName:WxLogin
 * @Description:TODO 微信登录,授权,详细文档说明请查看 instructions/wx_login_txt 文件
 * @Author LinLuoChen
 * @Date 2019/11/25/17:25
 * @Version V1.0
 **/
@Controller
@RequestMapping("wxLogin")
public class WxLogin {

    // 引入日志文件
    static Logger log = Logger.getLogger(WxLogin.class.getClass());

    // 获取定义的 appId
    @Value("${appId}")
    private String appId;

    // 获取定义的 appSecret
    @Value("${appSecret}")
    private String appSecret;

    /**
     * 微信登录地址
     * @param response
     * @throws IOException
     */
    @RequestMapping(value = "login", method = {RequestMethod.POST,RequestMethod.GET})
    public String login(HttpServletResponse response, HttpServletRequest request) throws IOException {
        String wxurl = getRedirectUrl(request);
        return "redirect:"+wxurl;
    }

    /**
     * @Description 获取 code 信息,网页授权不需要 token
     * @Author LinLuoChen
     * @Date  17:32
     **/
    private String getRedirectUrl(HttpServletRequest request){
        // 获取 Code 信息
        String wxurl = "https://open.weixin.qq.com/connect/oauth2/authorize?appid="+appId+"&redirect_uri=REDIRECT_URI&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect";
        log.info(wxurl);
        // 拼接回调地址,必须是微信白名单才可以!!!
        String ecodeurl = URLEncoder.encode("https://填写你配置的回调域名/rescue/wechatlogin/getUsercode");
        wxurl=wxurl.replaceAll("REDIRECT_URI",ecodeurl);
        log.info("Code:"+wxurl);
        return wxurl;
    }

    /**
     * @Description 获取到 openID
     * @Author LinLuoChen
     * @Date  9:38
     * @Param [code]
     * @return java.lang.String
     *  code 值是根据回调地址从微信获取的参数信息
     **/
    @RequestMapping("getUsercode")
    public String getUsercode(String code, HttpSession session){
        String url ="https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
        // 替换 appid 和 secret
        // 转换连接请求为 GET 方式
        url = url.replace("APPID",appId).replace("SECRET",appSecret).replace("CODE",code);
        String json = HttpUtil.doGet(url,new HashMap<String,Object>(),"");
        // 根据 Code 拿到 OpenId
        JSONObject obj = JSONObject.parseObject(json);
        // 在日志打印出报文
        log.info(obj.toJSONString());
        // 拿到 openid
        String openId = obj.getString("openid");
        return openId;
    }


}
           

由于写本文的时候没有连贯起来,所以导致可能后边有些简陋,不过这也是获取 openID 的核心代码

主要注意的点也是就配置回调域名,然后获取 code 的值,其余的其实都是一样写的

博主 QQ :3044793043 ,有疑惑的地方欢迎私信或者评论

继续阅读