JAVA后端通过微信getAccessToken接口获取access_token

小程序中Java后台调用接口(getAccessToken)获取调用凭据,调用接口(msgSecCheck)检测文本内容是否安全--最终版 小程序中Java后台调用接口(getAccessToken)获取调用凭据,调用接口(msgSecCheck)检测文本内容是否安全--最终版; 发送文本检测请求时,一定要把编码格式调成utf-8 如果不设置成utf-8 ,程序跑起来后,无论你输入的内容是否为敏感词汇 , 检测的结果会一直是** {“errcode”:0,“errmsg”:“ok”} ** 阅读详情
AI摘要

该项目在微信小程序端实现了快捷登录功能,通过定时调用微信getAccessToken接口获取access_token,并存储到Redis中以供后续接口使用。代码中配置了appid、secret和grant_type,使用HttpUtils工具类进行HTTP请求。同时,通过@Scheduled注解设置了定时任务,每7080秒(约1.18小时)更新一次access_token,确保其有效性。此外,还提供了错误处理和日志记录。

项目场景:

项目是微信小程序端,需要实现快捷登录功能,所以需要定时调用getAccessToken接口获取微信的access_token并存入redis,以供后续接口查询。

微信开发文档链接:微信getAccessToken开发文档

调用详情:

接口的调用地址:

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

其中需要传入三个参数:
grant_type:直接填写String类型的 client_credential
appid :小程序唯一凭证,即 AppID,可在「微信公众平台 - 设置 - 开发设置」页中获得。(需要已经成为开发者,且帐号没有异常状态)
secret :小程序唯一凭证密钥,即 AppSecret,获取方式同 appid

具体业务代码

 	private final static String ACCESS_TOKEN_KEY = "accessToken";

    Logger logger = LoggerFactory.getLogger(WxLonginServiceImpl.class);

    @Resource
    RedisUtil redisUtil;
    @ApiModelProperty("小程序 appId")
    @Value("${wx.appid}")
    private String appid;

    @ApiModelProperty("小程序 appSecret")
    @Value("${wx.secret}")
    private String secret;

    @ApiModelProperty("授权类型,此处只需填写 authorization_code")
    @Value("${wx.grant_type}")
    private String grant_type;
    /**
     * 获取微信token
     * @return
     */
    @Override
    public WxAccessToken getAccessToken() {
        String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appid + "&secret=" + secret;
        String loginJson = null;
        try {
            loginJson = HttpUtils.doGet(url);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return JsonUtils.parse(loginJson, WxAccessToken.class);
    }

/**
     *  微信accessToken接口得到的accessToken可以保存2小时,为了
     *  设置定时,将定时设置为 1小时55分钟 ~ 2小时之内
     *  access_token 的有效期目前为 2 个小时,需定时刷新,重复获取将导致上次获取的 access_token 失效;
     *  建议开发者使用中控服务器统一获取和刷新 access_token,其他业务逻辑服务器所使用的 access_token 均来自于该中控服务器,不应该各自去刷新,否则容易造成冲突,导致 access_token 覆盖而影响业务;
     *  access_token 的有效期通过返回的 expires_in 来传达,目前是7200秒之内的值,中控服务器需要根据这个有效时间提前去刷新。在刷新过程中,中控服务器可对外继续输出的老 access_token,此时公众平台后台会保证在5分钟内,新老 access_token 都可用,这保证了第三方业务的平滑过渡;
     *  access_token 的有效时间可能会在未来有调整,所以中控服务器不仅需要内部定时主动刷新,还需要提供被动刷新 access_token 的接口,这样便于业务服务器在API调用获知 access_token 已超时的情况下,可以触发 access_token 的刷新流程。
     */
    @Scheduled(fixedDelay = 7080000)
    @Override
    public void addAccessToken() {
        String accessToken = getAccessToken().getAccess_token();
        logger.info("定时任务启用===========" + accessToken);
        //微信token2小时过期,每小时重新获得一次,
        redisTemplate.opsForValue().set(ACCESS_TOKEN_KEY, accessToken, 7200, TimeUnit.SECONDS);
    }

启动类代码:

/**
 * @Author: 
 * @Description: 启动类
 * @Date: create in 2020/12/3 9:00
 */

@EnableTransactionManagement
@SpringBootApplication
@EnableScheduling
@EnableSwagger2
@MapperScan("com.test.back.mapper")
public class SpringBootMain {


    public static void main(String[] args) {
        SpringApplication.run(SpringBootMain.class, args);
    }

    /**
     * 解决获取request 空指针的问题
     * @return
     */
    @Bean
    public RequestContextListener requestContextListener() {
        return new RequestContextListener();
    }

}  

实体类

/**
 * @Author: 
 * @Description: 微信小程序获取
 * @Date: create in 2021/1/5 9:18
 */
@Configuration
@Data
public class WxAccessToken {

    @ApiModelProperty("获取到的凭证")
    private String access_token;

    @ApiModelProperty("凭证有效时间,单位:秒。目前是7200秒之内的值。")
    private String expires_in;

    @ApiModelProperty("错误码")
    private String errcode;

    @ApiModelProperty("错误信息")
    private String errmsg;


}

总结

为了项目的可维护性,我将使用的appid,secret,grant_type这三个参数配置在yml里面,方便修改,不喜欢可以自行设置在类中定时任务使用。有疑问可以提出。

2022-1-7日添加HttpUtils工具类


import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;

import java.io.IOException;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

public class HttpUtils {
    public static String doGet(String url, Map<String, String> param) {
        // 创建Httpclient对象
        CloseableHttpClient httpclient = HttpClients.createDefault();
        String resultString = "";
        CloseableHttpResponse response = null;
        try {
            // 创建uri
            URIBuilder builder = new URIBuilder(url);
            if (param != null) {
                for (String key : param.keySet()) {
                    builder.addParameter(key, param.get(key));
                }
            }
            URI uri = builder.build();

            // 创建http GET请求
            HttpGet httpGet = new HttpGet(uri);

            // 执行请求
            response = httpclient.execute(httpGet);
            // 判断返回状态是否为200
            if (response.getStatusLine().getStatusCode() == 200) {
                resultString = EntityUtils.toString(response.getEntity(), "UTF-8");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (response != null) {
                    response.close();
                }
                httpclient.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return resultString;
    }

    public static String doGet(String url) {
        return doGet(url, null);
    }

    public static String doPost(String url, Map<String, String> param) {
        // 创建Httpclient对象
        CloseableHttpClient httpClient = HttpClients.createDefault();
        CloseableHttpResponse response = null;
        String resultString = "";
        try {
            // 创建Http Post请求
            HttpPost httpPost = new HttpPost(url);
            // 创建参数列表
            if (param != null) {
                List<NameValuePair> paramList = new ArrayList<>();
                for (String key : param.keySet()) {
                    paramList.add(new BasicNameValuePair(key, param.get(key)));
                }
                // 模拟表单
                UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList, "utf-8");
                httpPost.setEntity(entity);
            }
            // 执行http请求
            response = httpClient.execute(httpPost);
            resultString = EntityUtils.toString(response.getEntity(), "utf-8");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                response.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return resultString;
    }

    public static String doPost(String url) {
        return doPost(url, null);
    }

    /**
     * 请求的参数类型为json
     * @param url
     * @param json
     * @return
     * {username:"",pass:""}
     */
    public static String doPostJson(String url, String json) {
        // 创建Httpclient对象
        CloseableHttpClient httpClient = HttpClients.createDefault();
        CloseableHttpResponse response = null;
        String resultString = "";
        try {
            // 创建Http Post请求
            HttpPost httpPost = new HttpPost(url);
            // 创建请求内容
            StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON);
            httpPost.setEntity(entity);
            // 执行http请求
            response = httpClient.execute(httpPost);
            resultString = EntityUtils.toString(response.getEntity(), "utf-8");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                response.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return resultString;
    }

}

基于微信小程序云函数的方式获取微信公众号access_token(一) 由于微信小程序不支持微信公众号获取access_token的域名配置,无法在小程序端通过wx.request()的方式来获取access_token,以下是获取微信公众号access_token的域名,经过几番折腾,终于实现了基于云开发中云函数的功能实现了access_token的获取,并存入云数据库中。 https://api.weixin.qq.com 首先在云数据库中新建集合名称"ac... 阅读详情

相关推荐

java微信获取access_token(java微信开发学习笔记4)

获取access_token是微信api最重要的一个部分,因为调用其他api很多都需要用到access_token。 access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的acce

银色木马的博客 1161

微信 getAccessToken()获取小程序的token

微信 getAccessToken() 获取小程序的token //获取小程序token public static String getAccessToken(){ //通过微信公众号的AppId和AppSecret(当前ip地址必须在微信公众号的白名单内)获取微信公众号的access_token(7200秒有效) String str1 = sendGet("https://api.weixin.qq.com/cgi-bin/token","grant_type

qq_42889895的博客 2145

微信公众号开发之获取access_token

微信公众号开发详细教程 官方文档 公众平台的API调用所需的access_token的使用及生成方式说明: 1、建议公众号开发者使用中控服务器统一获取和刷新access_token,其他业务逻辑服务器所使用的access_token均来自于该中控服务器,不应该各自去刷新,否则容易造成冲突,导致access_token覆盖而影响业务; 2、目前access_token的有效期通过返回的exp...

桃之夭夭_zll 4281

网络安全入门笔记(共327页),助你步入安全门槛

网络安全入门笔记(共327页),助你步入安全门槛

Spontaneous_0的博客 1486

微信扫码登录后端实战:OAuth2.0授权回调与用户信息获取全解析

OAuth2.0是一种开放授权标准协议,它定义了资源所有者、客户端、授权服务器和资源服务器四个角色,通过授权码模式实现安全的第三方应用授权。其核心原理是客户端引导用户至授权服务器,用户同意授权后,授权服务器通过回调地址返回一个短期有效的授权码,客户端再用此码换取访问令牌,最终凭令牌访问受保护的用户资源。这一机制在技术上的核心价值在于,它将用户凭证与第三方应用隔离,避免了密码泄露风险,同时实现了细粒度的权限控制。在工程实践中,OAuth2.0广泛应用于社交登录、API授权等场景,例如微信生态的扫码登录功能。本

weixin_30315905的博客 522

微信小程序怎么获取access_token

先直接说重点: 接口链接:https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=AppId&secret=AppSecret 一共三个参数. 参数1:grant_type:grant_type=client_credential,这是固定的不会变 参数2:appid:第三方用户...

Dove言和 9874

Java 微信公众号(二)——获取access_token

通过阅读微信开发者文档会发现——>access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。 在获取access_token时使用的是get请...

weixin_41690905的博客 2622

【微信开发3】获取access token优化 java+SpringBoot

文章目录前言获取Access token代码 前言 本系列教程采用java springboot框架开发,需要具备一定的基础知识。纯干货代码,自己遇到的一些问题and解决方案。 获取Access token 官方文档:https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Get_access_token.html 请求说明: https请求方式: GET https://api.weixin.qq.com/cgi-bin/tok

张小小凡 1363

微信-JAVA获取微信ACCESS_TOKEN

获取微信ACCESS_TOKEN

weixin_45673174的博客 1437

蓝桥杯单片机学习13——NE555方波发生器&频率测量

NE555详解、引脚图介绍、原理图及工作原理讲解、方波产生的原理、定时器测量频率的原理及使用方法、代码实现

weixin_67907028的博客 1万+

EtherCAT-7 从站代码移植-SPI

STM32F103 + AX58100,从站代码移植。

tianya_xuan的博客 3571

Java中微信小程序HTTP API的使用(一)获取ACCESS_TOKEN

最近在给小程序做一个管理的后台系统,使用的是小程序自带的云数据库,后台用SSM框架,不想使用本地数据库所以用小程序给的HTTP API来实现。 首先要获取自己微信小程序的ACCESS_TOKEN 小程序管网给的getAccessToken请求地址: GET https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credentia...

qq_40123835的博客 1921

华南理工大学电子与信息学院23年预推免复试面试经验贴

华南理工大学电子与信息学院23年预推免复试面试经验贴

Scut_Ty的博客 3299

微信开发获取access_token接口的详解

在微信开发中,就有一些接口会涉及到获取接口凭证的接口,开发文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&amp;id=mp1421140183 比如我们在微信公众号创建菜单中就会有获取接口凭证要去,还有就是微信小程序在做消息推送功能时也会有调用access_token获取微信接口凭证的要求 获取access_token:https:/...

码小呆的博客 1万+

Labelme AI-Polygon闪退排查与修复指南

本文详细介绍了Labelme AI-Polygon功能闪退问题的排查与修复方法,包括环境配置检查、模型路径设置、依赖库版本控制等关键步骤。通过系统性的解决方案和实用技巧,帮助用户快速解决闪退问题,确保数据标注工作的高效进行。

weixin_29311017的博客 140

基于QT+Halcon实现线序识别

一、线序识别算法步骤。 1.按照检测区域m_pItem1的外接矩形(rtBount)的大小, 截取感兴趣区域图像hRoi。 2.把截取出来的感兴趣区域图像hRoi, 分离出R、G、B三个通道hRed、hGreen、hBlue。 3.把hRed、hGreen、hBlue三个通道转换成cielab颜色空间, 得到hChannelL、hChannelA、hChannelB三个颜色图。 4.设m_pItem1的宽为iItemW, 高为iItemH. 分别申请大小为iItemW的pSumL、pSumA、pSumB内

专注现代C++实战,从核心语法到高性能编程,助力开发者深入掌握系统级编程精髓。 1748

java 获取access_token_获得长期有效的access_token

为了获得长期有效的access_token,不能每次都从服务器生成,本文采用存储在文件中,超过一定时间再定时刷新的方法,直接看代码。import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io...

weixin_33894886的博客 1816

GEE:连续变化检测 CCD 第一步(导出ee.Algorithms.TemporalSegmentation.Ccdc函数的结果)

连续变化检测与分类(Continuous Change Detection and Classification, CCDC)主要有两个组件,一个连续变化检测 CCD,另外一个分类。在 Google Earth Engine (GEE)平台上进行 CCD 时间序列变化检测的时候,为了防止内存超限问题,将代码分为2阶段执行。第一阶段是运行 `ee.Algorithms.TemporalSegmentation.Ccdc` 函数,本文将详细介绍 CCD 的第一阶段的代码。

养乐多的博客 2497

java微信小程序中获取access_token

java微信小程序中获取access_token

weixin_43652507的博客 2885

linux cma alloc fail 问题分析

摘要:日志显示CMA连续内存分配失败(错误码-ENOMEM),请求128页(512KB)内存时因CMA区域不足或内存碎片导致失败。分析发现系统CMA总内存131072KB,空闲65536KB。解决方案包括:1)手动触发内存碎片整理;2)修改设备树或内核配置增大CMA区域(如从16MB增至20MB)。通过调整CONFIG_CMA_SIZE_MBYTES或设备树中的size参数可解决该问题。

陌上花开缓缓归以的博客 800

【Unity】【Pico】【VR开发】为何PICO打包后真机运行闪退

由于并没有开版权验证,而且闪退后也并没有弹框说版权问题,所以还是怀疑环境有什么地方不对。设置步骤,项目配置都没问题,Build也成功,Unity版本是符合要求的2022LTS版本,但是一在真机上运行就闪退。

每日出拳老爷子的博客 3178

React-Native-Wechat-Lib 微信扫码授权登录功能实现:从原理到代码

🚀 在移动应用开发中,微信登录已成为提升用户体验的重要功能。React-Native-Wechat-Lib作为一款优秀的React Native微信SDK桥接库,为开发者提供了完整的微信扫码授权登录解决方案。本文将深入解析如何利用这个强大的工具快速实现微信扫码登录功能。 ## 📱 为什么选择微信扫码授权登录? 微信扫码登录相比传统的OAuth授权方式具有显著优势:**无需跳转微信应用**、

gitblog_00752的博客 618

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

微信公众平台 获取access_token

前言:access_token是微信公众平台接口的重要参数,很多接口都需要这个参数。微信公众平台文档地址:微信公众平台技术文档一、access_token说明access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时

小小布的程序世界 7844

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

小程序 java后台 如何获取access_token的示例方法

小程序 java后台 如何获取access token的示例方法,在微信小程序中获取access_token通常是通过向微信服务器发送HTTPS请求来完成的。

qq_39951524的博客 2768

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

java微信小程序获取ACCESS_TOKEN

这里是用java写的获取小程序的ACCESS_TOKEN的方法,获取之后可以用于给关注公众号或者使用小程序的人发送统一服务消息。 public static String getAccessToken() { // 小程序唯一标识 (在微信小程序管理后台获取) String wxspAppid = "小程序appid"; // 小程序的 app secret (在微信小程序管理后台获取) String wxspSecret = "小程序的 a

小四是个程序猿的博客 1701

wechat-0011,微信公众号,access_token的获取与管理

demo:https://github.com/wenrongyao/wechat-demo 摘要:access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token...

登峰小蚁 3883
上一篇: 工作问题记录:使用Lombok的@Accessors(chain = true)注解后BeanCopier后值为null问题
下一篇: 2021-07-16
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值