崛起于Springboot2.X + 微信测试账号获取openid(63)

北城以北 提交于 2019-12-15 15:49:36

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

《SpringBoot2.X心法总纲》

目的:申请一个微信测试号,调用各种接口,如获取openid等简单使用。

1、准备微信测试账号

可以看下这个博客,如何申请微信号测试账号,进行微信开发

然后获取一个免费的外网,看下这个博客,Mac下NATAPP将内网映射到外网

2、启动natapp

环境配置好了,首先我们要确认我们项目的端口号,应该与natapp的端口号一样,因为我们的项目是8088,所以对应的如下:

上面的博客没有说明这一点,我们直接用http://9fvs5p.natappfree.cc代替localhost:8088测试接口成功就成功了。

3、测试token

我的配置token如图:

那么对应项目接口地址一样的,

@Controller
@RequestMapping(value = "/wx")
@Slf4j
public class WxController {

    @GetMapping("testToken.html")
    public void getToken(String signature, String timestamp, String nonce, String echostr, HttpServletResponse response) throws NoSuchAlgorithmException, IOException {
        // 将token、timestamp、nonce三个参数进行字典序排序
        log.info("signature:"+signature);
        log.info("timestamp:"+timestamp);
        log.info("nonce:"+nonce);
        log.info("echostr:"+echostr);
        log.info("TOKEN:"+"mdxlcj");
        String[] params = new String[] { "mdxlcj", timestamp, nonce };
        Arrays.sort(params);
        // 将三个参数字符串拼接成一个字符串进行sha1加密
        String clearText = params[0] + params[1] + params[2];
        String algorithm = "SHA-1";
        String sign = new String(org.apache.commons.codec.binary.Hex.encodeHex(MessageDigest.getInstance(algorithm).digest((clearText).getBytes())));
        // 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
        if (signature.equals(sign)) {
            response.getWriter().print(echostr);
        }
    }
}

多尝试几次,然后就会配置成功。

4、添加依赖

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-all</artifactId>
        <version>5.0.7</version>
    </dependency>

    <dependency>
        <groupId>net.sf.json-lib</groupId>
        <artifactId>json-lib</artifactId>
        <version>2.4</version>
        <classifier>jdk15</classifier>
    </dependency>

    <dependency>
        <groupId>commons-codec</groupId>
        <artifactId>commons-codec</artifactId>
        <version>1.10</version>
    </dependency>

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
</dependencies>

5、application.properties

server.port=8088

# wxae20f429f6db1950
wxpay.appId=wxcb9a5f499f9e0f6c
# appSecret 是 appId 对应的接口密码,微信公众号授权获取用户 openId 时使用
wxpay.appSecret=2d1079aad9a428a761d0b9d162720fc7



# thymeleaf 配置
spring.mvc.view.prefix=classpath:/templates/
spring.mvc.view.suffix=.html
spring.thymeleaf.cache=false
spring.mvc.static-path-pattern=/**
spring.resources.static-locations =classpath:/static/
spring.thymeleaf.mode=LEGACYHTML5

6、html页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
<h3>你好,程舰!</h3>
</body>
</html>

7、获取openid

最重要的一环

@Controller
@RequestMapping(value = "/wx")
@Slf4j
public class WxController {

    private WxBean wxBean = new WxBean();

    @GetMapping(value = "/getWxCode.html")
    public String getWxCode() throws UnsupportedEncodingException {

        // 1、redirect_uri设置
        String redict = URLEncoder.encode("http://9fvs5p.natappfree.cc/wx/getWxAccessToken.html", "UTF-8");

        // 2、获取code的url
        String url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid="+wxBean.getAppId()+"&redirect_uri="+redict+"&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect";

        // 3、重定向去微信获取code,之后去回掉接口/getWxAccessToken.html
        return "redirect:" + url;
    }

    @GetMapping(value = "/getWxAccessToken.html")
    public String getWxAccessToken(HttpServletRequest request){

        // 1、获取code
        String code = request.getParameter("code");

        // 2、拼接获取access_token的url
        String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="+wxBean.getAppId()+"&secret="+wxBean.getAppSecret()+"&code="+code+"&grant_type=authorization_code";

        // 3、调用获取access_token
        String result = HttpUtil.get(url);

        // 4、转换结果
        JSONObject jsonObject = JSONObject.fromObject(result);
        if (null == jsonObject || jsonObject.isEmpty() || jsonObject.get("access_token") == null || jsonObject.get("openid") == null) {
            return "/false";
        }

        // 5、取access_token
        String accessToken = jsonObject.get("access_token").toString();

        // 6、取openid
        String openId  = jsonObject.get("openid").toString();

        log.info("accessToken====="+accessToken);
        log.info("openId====="+openId);

        return "index";
    }

    @GetMapping("testToken.html")
    public void getToken(String signature, String timestamp, String nonce, String echostr, HttpServletResponse response) throws NoSuchAlgorithmException, IOException {
        // 将token、timestamp、nonce三个参数进行字典序排序
        log.info("signature:"+signature);
        log.info("timestamp:"+timestamp);
        log.info("nonce:"+nonce);
        log.info("echostr:"+echostr);
        log.info("TOKEN:"+"mdxlcj");
        String[] params = new String[] { "mdxlcj", timestamp, nonce };
        Arrays.sort(params);
        // 将三个参数字符串拼接成一个字符串进行sha1加密
        String clearText = params[0] + params[1] + params[2];
        String algorithm = "SHA-1";
        String sign = new String(org.apache.commons.codec.binary.Hex.encodeHex(MessageDigest.getInstance(algorithm).digest((clearText).getBytes())));
        // 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
        if (signature.equals(sign)) {
            response.getWriter().print(echostr);
        }
    }
}

成功之后,我们把域名发到微信上,如图:

点击之后,就会跳转,如下:

而我们控制台获取的openid等信息,如下:

最终成功,如果第一步第二步弄不出来私信我或者评论,就好了。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!