java微信开发获取openid

硅谷探秘者 1282 0 0

完整测试代码下载地址:http://www.jiajiajia.club/file/info/5SQzy7/120 

首先配置微信公众平台测试账号

位置:微信公众号->开发->开发者工具->微信公众平台测试账号

1.修改接口配置信息

url 填外网可以访问的接口(必须是80端口),如果是本地测试的话可以用外网穿透。     

        例:http://aaaa.com/call/back

Token 可以任意填写,但要和接口中的配置一致     

        例:123123

2.配置后端接口,保证接口可以被外网访问 上述修改接口配置信息才可以成功。

//检查微信接口配置
@RequestMapping("/call/back")
public String checkUrl(HttpServletRequest request){
    //获取参数配置
    String signature = request.getParameter("signature");
    //获取时间托
    String timestamp = request.getParameter("timestamp");
    String nonce = request.getParameter("nonce");
    //获取echostr 字符
    String echostr   = request.getParameter("echostr");
    // try ---- catch 捕捉异常
    try {
        //判断是否为空
        if (null != signature) {
            //声明一个存储数据字符数组
	String token = “123123”//和微信配置一致
            String[] ArrTmp = { token, timestamp, nonce };
            Arrays.sort(ArrTmp);
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i < ArrTmp.length; i++) {
                sb.append(ArrTmp[i]);
            }
            //获取消息对象
            MessageDigest md = MessageDigest.getInstance("SHA-1");
            //声明一个字节流数组;
            byte[] bytes = md.digest(new String(sb).getBytes());
            //声明一个字符流
            StringBuffer buf = new StringBuffer();
            for (int i = 0; i < bytes.length; i++) {
                if (((int) bytes[i] & 0xff) < 0x10) {
                    buf.append("0");
                }
                buf.append(Long.toString((int) bytes[i] & 0xff, 16));
            }
            if (signature.equals(buf.toString())) {
                return echostr;
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    //返回消息
    return null;
}
公众号配置完成以后就可以在代码中获取用户信息,一共分四步
  • 获取code
  • 通过code,appid和secret获取openid
  • 通过appid和secret获取access_token
  • 通过openid和access_token获取用户信息

1.获取code 

https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=URL&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect

appid是你的appid,redirect_uri是你的项目的回调地址,微信服务端会去调这个接口,给你传个code参数。

2.获取openid

获取完code以后,通过code,appid和secret获取openid,接口如下 

https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code

替换appid, secret, code参数

3.获取access_token

通过appid和secret获取access_token,接口如下 

https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

替换appid和secret参数

4.获取用户信息

https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN

替换上述获取的access_token,和openid,获取用户信息

整个过程大概就是这么多

部分测试代码  -》请求工具类
import com.alibaba.fastjson.JSONObject;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.security.MessageDigest;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

/**
 *  微信登录获取信息工具类
 */
public class WeChatGetInfoUtil {

    private static String appId = "12312312312312313213";//appId
    private static String appSecret = "4564564564654564646546546546";//appSecret
    private static String token = "789789";//此token跟需跟微信公众号的token一致;
    private static String redirect_uri="http://aaaaa.com/call/openid";//回调地址,获取code

    public static String getAppId(){
        return appId;
    }

    /**
     *  检查微信接口配置
     * @param request
     * @return
     */
    public static String checkUrl(HttpServletRequest request){
        //获取参数配置
        String signature = request.getParameter("signature");
        //获取时间托
        String timestamp = request.getParameter("timestamp");
        String nonce = request.getParameter("nonce");
        //获取echostr 字符
        String echostr   = request.getParameter("echostr");
        // try ---- catch 捕捉异常
        try {
            //判断是否为空
            if (null != signature) {
                //声明一个存储数据字符数组
                String[] ArrTmp = { token, timestamp, nonce };
                Arrays.sort(ArrTmp);
                StringBuffer sb = new StringBuffer();
                for (int i = 0; i < ArrTmp.length; i++) {
                    sb.append(ArrTmp[i]);
                }
                //获取消息对象
                MessageDigest md = MessageDigest.getInstance("SHA-1");
                //声明一个字节流数组;
                byte[] bytes = md.digest(new String(sb).getBytes());
                //声明一个字符流
                StringBuffer buf = new StringBuffer();
                for (int i = 0; i < bytes.length; i++) {
                    if (((int) bytes[i] & 0xff) < 0x10) {
                        buf.append("0");
                    }
                    buf.append(Long.toString((int) bytes[i] & 0xff, 16));
                }
                if (signature.equals(buf.toString())) {
                    return echostr;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        //返回消息
        return null;
    }

    /**
     * 请求微信跳转回调地址获取code
     * @param request
     * @param response
     */
    public static void toRedirectUri(HttpServletRequest request,HttpServletResponse response){
        try {
            response.setContentType("text/html");
            response.setCharacterEncoding("UTF-8");
            request.setCharacterEncoding("UTF-8");
             String uri= URLEncoder.encode(redirect_uri, "UTF-8");//回调地址,获取code
            StringBuffer url=new StringBuffer("https://open.weixin.qq.com/connect/oauth2/authorize?redirect_uri="+uri+
                    "&appid="+appId+"&response_type=code&scope=snsapi_base&state=1#wechat_redirect");//替换appid
            response.sendRedirect(url.toString());//这里请不要使用get请求单纯的将页面跳转到该url即可
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取openId
     * @param request
     * @param response
     * @return
     */
    public static WeChatMessage getOpenId(HttpServletRequest request, HttpServletResponse response){
        response.setContentType("text/html");
        try {
            request.setCharacterEncoding("UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        response.setCharacterEncoding("UTF-8");
        String code = request.getParameter("code");//获取code
        Map params = new HashMap();
        params.put("secret", appSecret);//你的secret
        params.put("appid", appId);//你的appid
        params.put("grant_type", "authorization_code");
        params.put("code", code);
        String result = HttpGetPostUtil.doGet("https://api.weixin.qq.com/sns/oauth2/access_token", params);
        WeChatMessage message = null;
        if(result != null){
            message = JSONObject.parseObject(result,WeChatMessage.class);
            message.setCode(code);
        }
        return message;
    }

    /**
     *  获取access_token
     * @return
     */
    public static WeChatMessage getAccessToken(){
        Map params = new HashMap();
        params.put("secret", appSecret);
        params.put("appid", appId);
        params.put("grant_type", "client_credential");
        String result = HttpGetPostUtil.doGet("https://api.weixin.qq.com/cgi-bin/token",params);
        WeChatMessage message = null;
        if(result != null){
            message = JSONObject.parseObject(result,WeChatMessage.class);
        }
        return message;
    }


    /**
     *  获取用户信息
     * @param openId
     * @param accessToken
     * @return
     */
    public static WeChatUserInfo getWeChatUserInfo(String openId,String accessToken){
        String result = HttpGetPostUtil.doGet("https://api.weixin.qq.com/cgi-bin/user/info?access_token="+accessToken+"&openid="+openId);
        WeChatUserInfo userInfo = null;
        if(result != null){
            userInfo = JSONObject.parseObject(result,WeChatUserInfo.class);
        }
        return userInfo;
    }
}
控制器
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@RestController
@RequestMapping("/call")
public class TestController {

    //配置微信的接口
    @RequestMapping("/back")
    public String test(HttpServletRequest request){
        //微信获取解析信息
        String str = WeChatGetInfoUtil.checkUrl(request);
        return str;
    }

    //微信需要访问的跳转地址
    @RequestMapping("/transfer")
    public void transfer(HttpServletRequest request, HttpServletResponse response) {
        WeChatGetInfoUtil.toRedirectUri(request,response);
    }

    /**
     * 获取openid,用户信息等
     * @param request
     * @param response
     * @return
     */
    @RequestMapping("/openid")
    public WeChatUserInfo huidiao(HttpServletRequest request,HttpServletResponse response){

        WeChatMessage open = WeChatGetInfoUtil.getOpenId(request,response);//获取openid

        String openId = open.getOpenid();

        System.out.println("得到的openid为:"+openId);

        if(openId!=null){

            WeChatMessage token = WeChatGetInfoUtil.getAccessToken();//获取access_token
            System.out.println("获取access_token: "+token);

            WeChatUserInfo userInfo = WeChatGetInfoUtil.getWeChatUserInfo(openId,token.getAccess_token());//获取用户信息
            System.out.println("获取用户信息:"+userInfo);
            return userInfo;
        }
        return null;//返回跳转页面
    }
}

其中还包括http工具类和一些其他的类,如需要,请下载测试源码:http://www.jiajiajia.club/file/info/5SQzy7/120

猜你喜欢
微信 java 692 自动登录openid和用户息 测试代码
工具 1170 完整测试代码下载地址:http://www.jiajiajia.club/file/info/5SQzy7/120首先配置公众平台测试账号位置:公众号--者工具-公众平台测试账号
框架 449 springboot项目中所有对外提供的接口息@ComponentpublicclassTestimplementsApplicationRunner
java 731 阿里巴巴Java手册-终极版.pdf
前端,java基础 311 一、pom依赖二、后端接口示例三、前端页面  有些场景需要生成带参数的小程序二维码,比如商城为每个商品生成小程序二维码,通过扫码直接跳转到该商品所在的展示页面。者们提供了相应接口
java基础 1487 一、系统临时文件目录二、java的系统属性有哪些File.createTempFile创建临时文件一、系统临时文件目录通过java的系统属性Stringtmpdir
weblog 1144 java使用原生jdbc连接数据库数据或执行sql语句(mysql) publicvoidtest2(){ try{ //加载MySql的驱动类 Class.forName
算法基础 1266 Pom依赖dependency groupIdcn.afterturn/groupId artifactIdeasypoi-base/artifactId version4.0.0/version /dependency dependency groupIdcn.afterturn/groupId artifactIdeasypoi-web/artifactId version4.0.0/ver
归档
2018年11月  12 2018年12月  33 2019年01月  28 2019年02月  28 2019年03月  32 2019年04月  27 2019年05月  33 2019年06月  6 2019年07月  12 2019年08月  12 2019年09月  21 2019年10月  8 2019年11月  15 2019年12月  25 2020年01月  9 2020年02月  5 2020年03月  16 2020年04月  4 2020年06月  1 2020年07月  7 2020年08月  13 2020年09月  9 2020年10月  5 2020年12月  3 2021年01月  1 2021年02月  5 2021年03月  7 2021年04月  4 2021年05月  4 2021年06月  1 2021年07月  7 2021年08月  2 2021年09月  8 2021年10月  9 2021年11月  16 2021年12月  14 2022年01月  7 2022年05月  1 2022年08月  1
标签
算法基础 linux 前端 c++ 数据结构 框架 数据库 计算机基础 储备知识 java基础 ASM 其他 深入理解java虚拟机 nginx git 消息中间件 搜索 maven redis docker dubbo vue 导入导出 软件使用 idea插件 协议 无聊的知识 jenkins springboot mqtt协议 keepalived minio
目录
祝愿神州十三飞行乘组平安归来