从零实现 Spring Boot 2.0 整合 weixin-java-mp(weixin-java-tools) 获取 openId,用于微信授权
**
步骤:**
一、*内网穿透申请二级域名(有服务器和域名者可略过)*
二、*申请微信公众平台测试号*(有已*认证的*微信服务号者可略过)**
三、搭建 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,用于微信授权相关推荐
- html页面授权码,spring boot 2.0 整合 oauth2 authorization code授权码模式
oauth2 authorization code 大致流程 用户打开客户端后,客户端要求用户给予授权. 用户同意给予客户端授权. 客户端使用授权得到的code,向认证服务器申请token令牌. 认证 ...
- InfoQ就Spring Boot 2.0 GA版发布采访了项目牵头人Phil Webb
\ 看新闻很累?看技术新闻更累?试试下载InfoQ手机客户端,每天上下班路上听新闻,有趣还有料! \ \\ 广受期待的Spring Boot 2.0近期由Spring的托管企业Pivotal发布.这是 ...
- Elasticsearch-06 Spring Boot 2.0.9整合ElasticSearch5.6.16
文章目录 概述 官方JAVA API文档 工程 pom.xml es配置文件 Es配置类 控制层 简单查询 新增数据 删除数据 更新数据 复合查询 其他 新建索引 删除索引 判断index中某个typ ...
- spring boot 2.0.3.RELEASE 整合 shiro bug 记录
spring boot 2.0.3.RELEASE 和 shiro 结合的 bug 纪要: 1.shiro 的过滤器 会出现在所有的过滤链中,尽管该请求不包含在shiro过滤规则中,尽管不会进入shi ...
- 从零搭建Spring Boot脚手架(2):增加通用的功能
1. 前言 上一篇说了我要一步步地搭建Spring Boot脚手架,首先会集成Spring MVC并进行定制化以满足日常开发的需要,我们先做一些刚性的需求定制,后续再补充细节.如果你看了本文有什么问题 ...
- 从零搭建Spring Boot脚手架(4):手写Mybatis通用Mapper
1. 前言 今天继续搭建我们的kono Spring Boot脚手架,上一文把国内最流行的ORM框架Mybatis也集成了进去.但是很多时候我们希望有一些开箱即用的通用Mapper来简化我们的开发.我 ...
- 从零搭建Spring Boot脚手架(2):增加通用的功能(转载)
前言 上一篇说了我要一步步地搭建Spring Boot脚手架,首先会集成Spring MVC并进行定制化以满足日常开发的需要,我们先做一些刚性的需求定制,后续再补充细节.如果你看了本文有什么问题可以留 ...
- 【译】Spring Boot 2.0 官方迁移指南
前提 希望本文档将帮助您把应用程序迁移到 Spring Boot 2.0. 在你开始之前 首先,Spring Boot 2.0 需要 Java 8 或更高版本.不再支持 Java 6 和 7 了. 在 ...
- Spring Boot 2.0正式发布,升还是不升呢?
Spring帝国 Spring几乎是每一位Java开发人员都耳熟能详的开发框架,不论您是一名初出茅庐的程序员还是经验丰富的老司机,都会对其有一定的了解或使用经验.在现代企业级应用架构中,Spring技 ...
- SpringBoot2.0(一):【重磅】Spring Boot 2.0权威发布
就在昨天Spring Boot2.0.0.RELEASE正式发布,今天早上在发布Spring Boot2.0的时候还出现一个小插曲,将Spring Boot2.0同步到Maven仓库的时候出现了错误, ...
最新文章
- 关于Windows 2003下开启防火墙后不能通过FTP问题解决
- RPC的超时设置,一不小心就是线上事故
- c语言结构体中的ps,练习结构体的时候出错,(ps有两个函数还没写)
- 集成学习(一)—预备知识:分类树和回归树
- Serverless 技术选型
- php支持cs吗,关于composer、phpmd和phpcs于windows中的安装与使用方法
- java for循环遍历解释,三种for循环遍历
- java listview颜色_[摘]android listview选中某一行,成选中状态颜色高亮显示
- linux 环境 安装nginx
- bagging算法_Bagging/Boosting傻傻分不清?来一探究竟吧~
- Windows 2000活动目录详解之基础篇
- python list 排序
- 键盘键码keyCode对照表
- CAD二维图导入UG草图
- Vue 数组/对象赋值,视图不更新问题
- QQ机器人{应用设计篇}
- 告别下载速度慢!Docker配置阿里云镜像仓库
- java G711 编码
- 计算机二级的考试c模板,计算机二级考试C语言知识
- ITPUB周年庆征文活动:今年我们18岁了!