Java-最新微信第三方平台公众号授权

在这里插入图片描述

第三方平台api地址
https://developers.weixin.qq.com/doc/oplatform/openApi/OpenApiDoc/预授权码获取之后调用接口获取授权方信息
https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/api/ThirdParty/token/authorization_info.html#%E6%8E%88%E6%9D%83%E4%BF%A1%E6%81%AF%E8%AF%B4%E6%98%8E

1.微信开放平台编辑开发配置
image.png

2.授权事件接受配置>获取令牌>获取预授权码>查询预授权码

        <!--            网络请求--><dependency><groupId>com.github.lianjiatech</groupId><artifactId>retrofit-spring-boot-starter</artifactId><version>2.3.5</version></dependency><dependency><groupId>com.squareup.retrofit2</groupId><artifactId>converter-simplexml</artifactId><version>2.9.0</version></dependency>
@RetrofitClient(baseUrl = "https://api.weixin.qq.com/")
public interface WeChatApi {/*** 令牌* 文档地址 https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/api/ThirdParty/token/component_access_token.html* 请求地址 https://api.weixin.qq.com/cgi-bin/component/api_component_token*/@POST("cgi-bin/component/api_component_token")JSONObject getComponentAccessToken(@Body GetComponentAccessTokenParam param);/*** 预授权码* <p>* 文档地址 https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/api/ThirdParty/token/pre_auth_code.html* 请求地址 https://api.weixin.qq.com/cgi-bin/component/api_create_preauthcode?component_access_token=COMPONENT_ACCESS_TOKEN*/@POST("/cgi-bin/component/api_create_preauthcode")JSONObject getPreAuthCode(@Query("component_access_token") String token, @Body GetPreAuthCodeParam param);/*** 查询授权方接口* https://api.weixin.qq.com/cgi-bin/component/api_query_auth?component_access_token=COMPONENT_ACCESS_TOKEN*/@POST("/cgi-bin/component/api_query_auth")JSONObject getApiQueryAuth(@Query("component_access_token") String accessToken,@Body GetApiQueryAuthParam param);
}

3.授权事件接收配置

    @ApiOperation("授权事件接收配置")@RequestMapping("/component_verify_ticket")@ResponseBodypublic String componentVerifyTicket(@RequestParam("timestamp") String timestamp, @RequestParam("nonce") String nonce, @RequestParam("msg_signature") String msgSignature,@RequestBody String postData) throws DocumentException, AesException {//https://sunuping.com/vt/api/wx/open/component_verify_ticketreturn this.memberWxService.componentVerifyTicket(postData, msgSignature, timestamp, nonce);}@Overridepublic String componentVerifyTicket(String data, String msgSignature, String timestamp, String nonce) throws DocumentException, AesException {if (log.isDebugEnabled()) {log.debug(data);}//这个类是微信官网提供的解密类,需要用到消息校验Token 消息加密Key和服务平台appidWXBizMsgCrypt pc = new WXBizMsgCrypt(WxConfigConstant.TOKEN, WxConfigConstant.KEY, WxConfigConstant.APPID);String xml = pc.decryptMsg(msgSignature, timestamp, nonce, data);Map<String, String> map = XmlTools.getMap(xml);final String d = map.get("ComponentVerifyTicket");if (log.isDebugEnabled()) {log.debug("获取微信验证票据:{}", d);}if (StringUtils.isNotBlank(d)) {//缓存11小时redisService.set(WxRedisKeyConstant.COMPONENT_VERIFY_TICKET, d, 39600);}return "success";}

4.获取第三方api授权token

    @Overridepublic String getComponentAccessToken() {String componentAccessToken = (String) redisService.get(WxRedisKeyConstant.COMPONENT_ACCESS_TOKEN);if (StringUtils.isBlank(componentAccessToken)) {final String ticket = Optional.ofNullable((String) redisService.get(WxRedisKeyConstant.COMPONENT_VERIFY_TICKET)).orElseThrow(() -> new ErrorException("验证凭据获取失败"));JSONObject tokenJson = Optional.ofNullable(weChatApi.getComponentAccessToken(new GetComponentAccessTokenParam(WxConfigConstant.APPID, WxConfigConstant.APP_SECRET, ticket)))//.orElseThrow(() -> new ErrorException("令牌获取失败"));if (log.isDebugEnabled()) {log.debug(tokenJson.toJSONString());}componentAccessToken = Optional.ofNullable(tokenJson.getString("component_access_token")).orElseThrow(() -> new ErrorException("令牌数据为空"));//缓存1小时50分钟redisService.set(WxRedisKeyConstant.COMPONENT_ACCESS_TOKEN, componentAccessToken, tokenJson.getIntValue("expires_in"));}return componentAccessToken;}

5.获取预授权码

@Overridepublic String getPreAuthCode() {final String componentAccessToken = this.getComponentAccessToken();String code = (String) this.redisService.get(WxRedisKeyConstant.PRE_AUTH_CODE);if (StringUtils.isBlank(code)) {JSONObject preAuthCodeJson = Optional.ofNullable(weChatApi.getPreAuthCode(componentAccessToken, new GetPreAuthCodeParam(WxConfigConstant.APPID)))//.orElseThrow(() -> new ErrorException("获取预授权码失败"));if (log.isDebugEnabled()) {log.debug(preAuthCodeJson.toJSONString());}code = Optional.ofNullable(preAuthCodeJson.getString("pre_auth_code")).orElseThrow(() -> new ErrorException("获取预授权码失败"));this.redisService.set(WxRedisKeyConstant.PRE_AUTH_CODE, code, preAuthCodeJson.getIntValue("expires_in"));}return this.generatePreAuthCodeUrl(code);}private String generatePreAuthCodeUrl(String code) {long mid = StpUtil.getLoginIdAsLong();//https://mp.weixin.qq.com/cgi-bin/componentloginpage?component_appid=xxxx&pre_auth_code=xxxxx&redirect_uri=xxxx&auth_type=xxxreturn "https://mp.weixin.qq.com/cgi-bin/componentloginpage?component_appid=" + WxConfigConstant.APPID + "&pre_auth_code=" + code//授权完回去的页面 授权回去的域名要去配置的域名一样+ "&redirect_uri=https://xxxx/x/bind_wx_public?mid=" + mid + "&auth_type=1";}

6.拉取授权方信息

    @GetMapping("/bind_wx_public")@ApiOperation("绑定微信公众号")public void bindWxPublic(@RequestParam("auth_code") String authCode, @RequestParam("expires_in") Integer expiresIn, @RequestParam("mid") Long mid) throws IOException {this.memberWxService.bindWxPublic(authCode, expiresIn, mid);}@Overridepublic void bindWxPublic(String authCode, Integer expiresIn, Long mid) throws IOException {log.debug("授权码:{},失效时间/秒:{}", authCode, expiresIn);final String componentAccessToken = this.getComponentAccessToken();JSONObject apiQueryAuthJson = this.weChatApi.getApiQueryAuth(componentAccessToken, new GetApiQueryAuthParam(WxConfigConstant.APPID, authCode));log.debug("授权方信息:{}", apiQueryAuthJson.toJSONString());JSONObject authorizationInfo = apiQueryAuthJson.getJSONObject("authorization_info");//授权方 appidString authorizerAppid = authorizationInfo.getString("authorizer_appid");//接口调用令牌String authorizerAccessToken = authorizationInfo.getString("authorizer_access_token");//authorizer_access_token 的有效期int authorizerAccessTokenExpiresIn = authorizationInfo.getIntValue("expires_in");//刷新令牌String authorizerRefreshToken = authorizationInfo.getString("authorizer_refresh_token");//授权给开发者的权限集列表JSONArray funcInfoJsonArr = authorizationInfo.getJSONArray("func_info");//业务处理完后 重定向到某个页面response.sendRedirect("https://xxxxx");}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/34565.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微软 Edge 浏览器怎样安装插件

微软 Edge 浏览器怎样安装插件 一、安装微软商店提供的插件二、安装第三方插件到Edge浏览器 之前安装插件就没有了解很深&#xff0c;放到浏览器里面就直接用了&#xff0c;最近再次想在微软的Edge浏览器安装插件的时候&#xff0c;发现没有之前的那么顺手&#xff0c;于是记录…

惊!最靠谱的谷歌与edge浏览器安装扩展插件方法

谷歌与edge浏览器安装扩展插件 谷歌浏览器安装扩展插件Edge浏览器安装扩展插件注意 谷歌浏览器安装扩展插件 1.在浏览器地址栏中输入: chrome://extensions/ 2.打开开发者模式&#xff0c;并点击加载已解压的扩展程序 3.选中下载好的文件夹feisou-assist导入即可&#xff…

电影解说文案开头模板

一个好的解说文案&#xff0c;开头几句必须精彩&#xff01;我们要解说一部影视作品&#xff0c;首先得自己先看一两遍&#xff0c;摸清故事情节&#xff0c;到底讲了一个什么故事&#xff0c;然后再结合我们对故事的理解&#xff0c;将故事讲给观众听。我们把文案分为开头、内…

修改Ubuntu国内镜像源地址

目录 方法一方法二方法三 方法一 Ubuntu可视化界面修改 在设置中的软件和更新中修改红框内容即可&#xff0c;修改后关闭会提示重启服务选择它即可 方法二 修改源文件 位置&#xff1a;/etc/apt/sources.list 首先备份以便出错后还原&#xff1a;sudo cp /etc/apt/sources.…

跟着GPT-4 从零完Python 爬虫

前言 先说个人情况&#xff1a;我作为产品经理自从 4 年前毕业很长时间都没有写过代码了&#xff0c;本科时候接触过一点 Python 的 慕课&#xff0c;但那个时候也是理论多于实操&#xff0c;为数不多跑通过的爬虫可能是豆瓣的电影 TOP 250&#xff1b;更多时候是被环境配置和…

Go 统计含 emoji 字符串字符数

1.背景 项目种需要统计用户昵称的字符数量进行限制&#xff0c;用户可以输入英文&#xff0c;中文&#xff0c;emoji 字符&#xff0c;当用户输入中英文和普通的 emoji 字符时&#xff0c;将字符串转为 []rune 进行统计没有问题。 func main() {s0 : "我爱中国" …

PostgreSQL中统计指定字符或者单词或者字符串在一个长字符串中出现总次数,PostgreSQL统计字符串中某字符出现次数

PostgreSQL中统计指定字符或者单词或者字符串在一个长字符串中出现总次数&#xff0c;PostgreSQL统计字符串中某字符出现次数 pg自带函数的方式另外一种思路方式&#xff0c;字符替换&#xff0c;统计被替换的字符数函数 translate(string text, from text, to text) pg自带函数…

PostgreSQL 字符串函数汇总

文章目录 前言拼接字符串填充字符串大小写转换获取字符串长度截取字符串裁剪字符串获取第一个字符的ASCII码计算string的MD5散列判断是否包含字符串null 和 的区别与判断以及COALESCE函数nullif函数合并字符串将字符串合并成一个数组分割字符串 总结 前言 本文基于 PostgreSQ…

婚礼视频mv短片制作,3分钟快速教程!教你制作婚礼开场创意视频

制作一个婚礼视频或婚礼MV短片,当下非常流行。用生活照、婚纱照片做成视频,在婚礼上当作开场或者生活中留给婚礼一个纪念,都是不错的选择。而且用照片做成视频,方法简单,但是创意依旧满满。 今天就教大家3分钟快速学会制作婚礼视频,利用生活照或婚纱照,配上数码大师里的…

SpringBoot+Redis实现接口限流

1.redis接口限流注解 定义一个注解标明需要使用限流的接口 Target(ElementType.METHOD) Retention(RetentionPolicy.RUNTIME) Documented public interface AccessLimit {/*** return 单位时间&#xff08;秒&#xff09;*/int seconds();/*** return 单位时间最大请求次数*/…

访问url图片并上传oss图片显示不完整问题解决

问题&#xff1a;在之前通过链接上传图片的时候&#xff0c;都是先获取inputStream流&#xff0c;然后通过available()方法获取文件大小。但是通过这种方法获取到的文件大小是不准确的&#xff0c;因为这个时候文件还没有读取完全&#xff0c;所以获取到的文件大小是不完全的。…

乱序执行的原理——减轻数据灾难的影响

文/Hisa Ando 处理器基本上会按照程序中书写的机器指令的顺序执行。按照书写顺序执行称为按序执行(In-Order )。按照书写顺序执行时&#xff0c;如果从内存读取数据的加载指令、除法运算指令等延迟(等待结果的时间)较长的指令后面紧跟着使用该指令结果的指令&#xff0c;就会陷…

倍福 ton_b%C3%A9ton野蛮或野蛮

倍福 ton Brutalism style mainly has emphasis on materials, textures and construction, producing highly expressive forms. Popular in the 1960s and 1970s brutalism originated post–World War II when the design of low-cost housing and government buildings wer…

每周分享第 55 期

这里记录过去一周&#xff0c;我看到的值得分享的东西&#xff0c;每周五发布。 欢迎投稿&#xff0c;或推荐你自己的项目&#xff0c;请前往 GitHub 的 ruanyf/weekly 提交 issue。 (题图&#xff1a;昆山火车站&#xff0c;苏州&#xff0c;2018) 关于 996 工作制&#xff0c…

每周分享第 34 期

这里记录过去一周&#xff0c;我看到的值得分享的东西&#xff0c;每周五发布。 欢迎投稿&#xff0c;或推荐你自己的项目&#xff0c;请前往 GitHub 的 ruanyf/weekly 提交 issue。 英国有一家叫做 BioTeq 的创业公司&#xff0c;主营业务是人体芯片&#xff0c;也就是在人的体…

OpenStack 环境配置

OpenStack 环境配置 虚拟机资源信息 1、控制节点ct CPU&#xff1a;双核双线程-CPU虚拟化开启 内存&#xff1a;8G 硬盘&#xff1a;300G 双网卡&#xff1a;VM1-&#xff08;局域网&#xff09;192.168.100.20 NAT-192.168.80.20 操作系统&#xff1a;Centos 7.6&#xff0…

那一年,我们在巴塞罗那找到的「ONES 图腾」

临近2021年岁末&#xff0c;「圣诞之星」被悬挂到圣家族大教堂第二高塔「圣母塔」之上&#xff0c;这意味着大教堂进入了最后的施工阶段。 圣家族大教堂&#xff08;简称「圣家堂」&#xff09;被称为世界上最著名的「烂尾楼」——从1882年开始修建&#xff0c;至今依然没有建成…

天正网络版修改服务器地址,修改天正网络版服务器地址

修改天正网络版服务器地址 内容精选 换一换 修改子网名称、DNS服务器地址等。当前在部分区域中,子网已从虚拟私有云中解耦,解耦后子网拥有独立入口。未解耦:在虚拟私有云详情页的“子网”页签,可对子网进行操作。本小节的操作步骤指导以此入口为例。已解耦:在进入“网络 &…

vba 怎么取得一个book中最右边的sheet名_在阴影中一心前进 | 安藤忠雄:艰难的日子里坚韧地活...

李乐贤&#xff1a;在我20岁的时候&#xff0c;对未来和专业充满了憧憬但又迷茫&#xff1b;安藤忠雄的讲座和书陪伴我度过了非常艰难的一段日子。在我们很多次想要放弃的时候&#xff0c;他人生中的求学实践经历为所有的年轻建筑师带来了启发和坚韧。很多时候 &#xff0c;我们…

计算机辅助设计还需要手绘吗,建筑设计师,还需要手绘吗?

原标题&#xff1a;建筑设计师&#xff0c;还需要手绘吗&#xff1f; 来源&#xff1a;城市建筑(ID&#xff1a;UA_2004) 本文已获授权 如今&#xff0c;你看到的建筑师的工作状态 大多是这样的 这样的 在未来还有可能是这样的 在这样一个科技越来越发达&#xff0c; 表现手法越…