**
步骤:**

一、*内网穿透申请二级域名(有服务器和域名者可略过)*

二、*申请微信公众平台测试号*(有已*认证的*微信服务号者可略过)**

三、搭建 Spring Boot 2.0 项目实现获取openId

一、内网穿透:

因为要直接用内网本机开发调试,微信网页授权在回调时要访问本机,所以直接做个内网穿透,可以直接在外网访问到本机,做法如下:

1、登录 https://natapp.cn/ (我用的natapp.cn,你可以用其他类似的,个人感觉这个不错)

2、购买隧道:

购买前需要认证一下,不要用免费的,因为免费的是随机分配域名的,每次都会变,之前VIP_1型是5元,现在涨到9元了,自行选择(官方9折优惠码709ABD4F),我买的是VIP_2型,购买后如下图:

购买后使用方式:https://natapp.cn/article/natapp_newbie

使用后会得到natapp分配的网址,如 xxx.natapp.cn,这个地址就可以访问到开发本机。

二、申请微信公众平台测试号:

微信公众平台测试申请地址: https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login

打开后点击“登录”出来个二维码,直接微信扫一扫即可,登录后如下:

上面的appID 和 appsecret 就是后面我们要用到的。然后扫下面的测试号二维码关注:

最后绑定授权回调页面域名即可:

上面的 xxx.natapp.cn 填写你上面获取到的域名

三、搭建 Spring Boot 2.0 项目

IDEA新建项目:

为方便,选了 Lombok

搭建后如下:

pom.xml (依赖了 weixin-java-mp 2.9.0)

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.wechat</groupId><artifactId>auth</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><name>auth</name><description>Demo project for Spring Boot</description><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.0.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>com.github.binarywang</groupId><artifactId>weixin-java-mp</artifactId><version>2.9.0</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

application.yml (原为 application.properties,直接改为 .yml,简洁方便)

里面两个值就填写上面获取到的 mpAppId 和 mpAppSecret

wechat:mpAppId: xxxxxxxxxxxxmpAppSecret: xxxxxxxxxxxxxxxxxxxxxxxxxxx

WechatAccountConfig.java (将上面的配置转换为Bean)

package com.wechat.config;import lombok.Data;import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.stereotype.Component;@Data@Component@ConfigurationProperties(prefix = "wechat")public class WechatAccountConfig {private String mpAppId;private String mpAppSecret;}

WeChatMpConfig.java (配置WxMpService Bean)

package com.wechat.config;import me.chanjar.weixin.mp.api.WxMpConfigStorage;import me.chanjar.weixin.mp.api.WxMpInMemoryConfigStorage;import me.chanjar.weixin.mp.api.WxMpService;import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.annotation.Bean;import org.springframework.stereotype.Component;@Componentpublic class WeChatMpConfig {@Autowiredprivate WechatAccountConfig wechatAccountConfig;@Beanpublic WxMpService wxMpService(){WxMpService wxMpService = new WxMpServiceImpl();wxMpService.setWxMpConfigStorage(wxMpConfigStorage());return wxMpService;}@Beanpublic WxMpConfigStorage wxMpConfigStorage(){WxMpInMemoryConfigStorage wxMpConfigStorage = new WxMpInMemoryConfigStorage();wxMpConfigStorage.setAppId(wechatAccountConfig.getMpAppId());wxMpConfigStorage.setSecret(wechatAccountConfig.getMpAppSecret());return wxMpConfigStorage;}}

WechatController.java (将xxx.natapp.cn改为用natapp获取到的域名)

package com.wechat.controller;import lombok.extern.slf4j.Slf4j;import me.chanjar.weixin.common.api.WxConsts;import me.chanjar.weixin.common.exception.WxErrorException;import me.chanjar.weixin.mp.api.WxMpService;import me.chanjar.weixin.mp.bean.result.WxMpOAuth2AccessToken;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestParam;import java.net.URLEncoder;@Controller@RequestMapping("/wechat")@Slf4jpublic class WechatController {@Autowiredprivate WxMpService wxMpService;@GetMapping("/authorize")public String authorize(@RequestParam("returnUrl") String returnUrl){String url = "http://xxx.natapp.cn/wechat/userInfo";String redirectURL = wxMpService.oauth2buildAuthorizationUrl(url, WxConsts.OAuth2Scope.SNSAPI_USERINFO, URLEncoder.encode(returnUrl));log.info("【微信网页授权】获取code,redirectURL={}", redirectURL);return "redirect:" + redirectURL;}@GetMapping("/userInfo")public String userInfo(@RequestParam("code") String code,@RequestParam("state") String returnUrl) throws Exception {log.info("【微信网页授权】code={}", code);log.info("【微信网页授权】state={}", returnUrl);WxMpOAuth2AccessToken wxMpOAuth2AccessToken;try {wxMpOAuth2AccessToken = wxMpService.oauth2getAccessToken(code);} catch (WxErrorException e) {log.info("【微信网页授权】{}", e);throw new Exception(e.getError().getErrorMsg());}String openId = wxMpOAuth2AccessToken.getOpenId();log.info("【微信网页授权】openId={}", openId);return "redirect:" + returnUrl + "?openid=" + openId;}}

启动Spring Boot 工程:

用微信访问 xxx.natapp.cn/wechat/authorize?returnUrl=‘回调的地址’ 即可看到控制台打印出了 openId,回调后操作自己的业务即可。

微信网页授权】state={}", returnUrl);

    WxMpOAuth2AccessToken wxMpOAuth2AccessToken;try {wxMpOAuth2AccessToken = wxMpService.oauth2getAccessToken(code);} catch (WxErrorException e) {log.info("【微信网页授权】{}", e);throw new Exception(e.getError().getErrorMsg());}String openId = wxMpOAuth2AccessToken.getOpenId();log.info("【微信网页授权】openId={}", openId);return "redirect:" + returnUrl + "?openid=" + openId;}

}

启动Spring Boot 工程:[外链图片转存中...(img-nruVUCuM-1621151172831)]用微信访问 xxx.natapp.cn/wechat/authorize?returnUrl='回调的地址' 即可看到控制台打印出了 openId,回调后操作自己的业务即可。应要求放到Gitee上了:https://gitee.com/antma/SpringBootGetOpenId.git

从零实现 Spring Boot 2.0 整合 weixin-java-mp(weixin-java-tools) 获取 openId,用于微信授权相关推荐

  1. html页面授权码,spring boot 2.0 整合 oauth2 authorization code授权码模式

    oauth2 authorization code 大致流程 用户打开客户端后,客户端要求用户给予授权. 用户同意给予客户端授权. 客户端使用授权得到的code,向认证服务器申请token令牌. 认证 ...

  2. InfoQ就Spring Boot 2.0 GA版发布采访了项目牵头人Phil Webb

    \ 看新闻很累?看技术新闻更累?试试下载InfoQ手机客户端,每天上下班路上听新闻,有趣还有料! \ \\ 广受期待的Spring Boot 2.0近期由Spring的托管企业Pivotal发布.这是 ...

  3. Elasticsearch-06 Spring Boot 2.0.9整合ElasticSearch5.6.16

    文章目录 概述 官方JAVA API文档 工程 pom.xml es配置文件 Es配置类 控制层 简单查询 新增数据 删除数据 更新数据 复合查询 其他 新建索引 删除索引 判断index中某个typ ...

  4. spring boot 2.0.3.RELEASE 整合 shiro bug 记录

    spring boot 2.0.3.RELEASE 和 shiro 结合的 bug 纪要: 1.shiro 的过滤器 会出现在所有的过滤链中,尽管该请求不包含在shiro过滤规则中,尽管不会进入shi ...

  5. 从零搭建Spring Boot脚手架(2):增加通用的功能

    1. 前言 上一篇说了我要一步步地搭建Spring Boot脚手架,首先会集成Spring MVC并进行定制化以满足日常开发的需要,我们先做一些刚性的需求定制,后续再补充细节.如果你看了本文有什么问题 ...

  6. 从零搭建Spring Boot脚手架(4):手写Mybatis通用Mapper

    1. 前言 今天继续搭建我们的kono Spring Boot脚手架,上一文把国内最流行的ORM框架Mybatis也集成了进去.但是很多时候我们希望有一些开箱即用的通用Mapper来简化我们的开发.我 ...

  7. 从零搭建Spring Boot脚手架(2):增加通用的功能(转载)

    前言 上一篇说了我要一步步地搭建Spring Boot脚手架,首先会集成Spring MVC并进行定制化以满足日常开发的需要,我们先做一些刚性的需求定制,后续再补充细节.如果你看了本文有什么问题可以留 ...

  8. 【译】Spring Boot 2.0 官方迁移指南

    前提 希望本文档将帮助您把应用程序迁移到 Spring Boot 2.0. 在你开始之前 首先,Spring Boot 2.0 需要 Java 8 或更高版本.不再支持 Java 6 和 7 了. 在 ...

  9. Spring Boot 2.0正式发布,升还是不升呢?

    Spring帝国 Spring几乎是每一位Java开发人员都耳熟能详的开发框架,不论您是一名初出茅庐的程序员还是经验丰富的老司机,都会对其有一定的了解或使用经验.在现代企业级应用架构中,Spring技 ...

  10. SpringBoot2.0(一):【重磅】Spring Boot 2.0权威发布

    就在昨天Spring Boot2.0.0.RELEASE正式发布,今天早上在发布Spring Boot2.0的时候还出现一个小插曲,将Spring Boot2.0同步到Maven仓库的时候出现了错误, ...

最新文章

  1. 关于Windows 2003下开启防火墙后不能通过FTP问题解决
  2. RPC的超时设置,一不小心就是线上事故
  3. c语言结构体中的ps,练习结构体的时候出错,(ps有两个函数还没写)
  4. 集成学习(一)—预备知识:分类树和回归树
  5. Serverless 技术选型
  6. php支持cs吗,关于composer、phpmd和phpcs于windows中的安装与使用方法
  7. java for循环遍历解释,三种for循环遍历
  8. java listview颜色_[摘]android listview选中某一行,成选中状态颜色高亮显示
  9. linux 环境 安装nginx
  10. bagging算法_Bagging/Boosting傻傻分不清?来一探究竟吧~
  11. Windows 2000活动目录详解之基础篇
  12. python list 排序
  13. 键盘键码keyCode对照表
  14. CAD二维图导入UG草图
  15. Vue 数组/对象赋值,视图不更新问题
  16. QQ机器人{应用设计篇}
  17. 告别下载速度慢!Docker配置阿里云镜像仓库
  18. java G711 编码
  19. 计算机二级的考试c模板,计算机二级考试C语言知识
  20. ITPUB周年庆征文活动:今年我们18岁了!

热门文章

  1. 回溯法2——和尚挑水
  2. 数据冲突Statspack ORA-00001 unique constraint violated错误的解决
  3. 滚动吸顶效果--四种方式实现
  4. 避免内存泄露及内存的规范化使用
  5. OLEDB SqlHelper
  6. HTML contenteditable 属性
  7. 19.高性能MySQL --- 锁的调试
  8. 123.PHP 周边性能优化
  9. 25. Location hash 属性
  10. 一个奇怪的发现:html与body,body的margin对html不起作用,html的padding对body却起作用