SpringCloud Alibaba 开发微信公众号 (获取Access token)

简介: SpringCloud Alibaba 开发微信公众号 (获取Access token)

上节写了配置地址到微信公众平台,这次写获取AccessToken

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

网络异常,图片无法展示
|

由接口文档可以看出获取Access token 需要GET请求并上送grant_type、appid、secret。 其中grant_type 上送默认值: client_credential 而appid、secret在公众平台首页

网络异常,图片无法展示
|

可以先通过微信公众平台接口调试工具进行调试,可以看到返回access_token(获取到的凭证)、以及expires_in (凭证有效时间,单位:秒)

网络异常,图片无法展示
|

网络异常,图片无法展示
|

创建 AccessTokenBean 对象

import lombok.Getter;
import java.io.Serializable;
import java.util.HashMap;
/**
 * @Author : lizzu
 * @create 2022/9/24 21:35
 * access token 对象
 */
@Getter
public class AccessTokenBean implements Serializable {
    /**
     * grant_type 固定值,直接填写client_credential
     */
    private String grant_type = "client_credential";
    /**
     * appID 用户的唯一标识
     */
    private String appid;
    /**
     * secret 用户唯一凭证密钥
     */
    private String secret;
    /**
     * 获取到的access token
     */
    private String accessToken;
    /**
     * access token 过期时间
     */
    private long expiresTime;
    private AccessTokenBean(String appid, String secret, String accessToken, long expiresTime) {
        this.appid = appid;
        this.secret = secret;
        this.accessToken = accessToken;
        //失效时间 返回单位:秒
        //判断失效处理时方便判断
        if (expiresTime>0){
            this.expiresTime = System.currentTimeMillis()+expiresTime*1000;
        }
    }
    /**
     * 构建获取access token 请求对象
     *
     * @param appId  用户唯一标识
     * @param secret 用户唯一标识密钥
     * @return {@link HashMap}
     */
    public static HashMap<String, String> requestOf(String appId, String secret) {
        HashMap<String, String> requestMap =new HashMap<>(16);//16为默认初始值
        requestMap.put("appid",appId);
        requestMap.put("secret",secret);
        requestMap.put("grant_type", "client_credential");
        return requestMap;
    }
    /**
     * 构建AccessToken 对象
     *
     * @param accessToken token
     * @param expiresTime 过期时间
     * @return {@link AccessTokenBean}
     */
    public static AccessTokenBean responseOf(String accessToken, long expiresTime) {
        return new AccessTokenBean("", "", accessToken, expiresTime);
    }
    /**
     * 判断token是否已经失效
     *
     * @return 是否失效 false 未失效 true 失效,需要重新申请
     */
    public boolean isExpired() {
        return System.currentTimeMillis() > expiresTime;
    }
}
复制代码

将appid、secret参数放到配置类中 WeCharConfig

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
 * @Author : lizzu
 * @create 2022/9/24 21:37
 */
@Component
@Data
@ConfigurationProperties(prefix = "we-char")
public class WeCharConfig {
    /**
     * 用户唯一标识
     */
    private String appId;
    /**
     * 用户密钥
     */
    private String secret;
    /**
     * 加密token
     */
    private String token;
}
复制代码

配置文件application.yml

application:
  name: my-spring-wechar
server:
  port: 8085
we-char:
  app-id: 你的app-id
  secret: 你的secret
  token: 你的token
复制代码

访问路径实体类WeCharConstant

/**
 * @Author : lizzu
 * @create 2022/9/25 15:15
 */
public class WeCharConstant {
    /**
     * 获取Token
     */
    public static final String GET_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token";
}
复制代码

AccessTokenService,在获取方法中判断accessTokenBean 是否已经生成或已过期。当未生成或已过期时调用重新生成Token方法

import cn.org.spring.common.util.HttpClientUtils;
import com.alibaba.fastjson.JSONObject;
import com.ctsi.sddx.bean.AccessTokenBean;
import com.ctsi.sddx.config.WeCharConfig;
import com.ctsi.sddx.constants.WeCharConstant;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.io.IOException;
/**
 * @Author : lizzu
 * @create 2022/9/24 21:51
 */
@Service
public class AccessTokenService {
    @Resource
    WeCharConfig weCharConfig;
    /**
     * access token 对象
     */
    private AccessTokenBean accessTokenBean;
    private static final String URL = WeCharConstant.GET_TOKEN_URL;
    /**
     * 获取access token
     *
     * @param appId
     * @param appSecret
     */
    private void refreshAccessToken(String appId, String appSecret) throws IOException {
        String s = HttpClientUtils.get(URL, AccessTokenBean.requestOf(appId, appSecret));
        JSONObject jsonObject = JSONObject.parseObject(s);
        long expiresIn = jsonObject.getLong("expires_in");
        String accessToken = jsonObject.getString("access_token");
        accessTokenBean = AccessTokenBean.responseOf(accessToken, expiresIn);
    }
    /**
     * 获取access token
     *
     * @return
     */
    public String getAccessToken() throws IOException {
        if (accessTokenBean==null||accessTokenBean.isExpired()){
            refreshAccessToken(weCharConfig.getAppId(), weCharConfig.getSecret());
        }
        return accessTokenBean.getAccessToken();
    }
}
复制代码

WeCharController 测试

import cn.org.spring.common.util.XmlUtils;
import com.ctsi.sddx.bean.message.TextMessage;
import com.ctsi.sddx.service.AccessTokenService;
import com.ctsi.sddx.utils.AccessAuthentication;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.io.IOException;
import java.util.Map;
/**
 * @Author : lizzu
 * @create 2022/9/24 20:26
 */
@RestController
@RequestMapping("/v1/weChart")
public class WeCharController {
    private String token = "lizzuabc123123";
    @Resource
    AccessTokenService accessTokenService;
    //接口测试
    @PostMapping("/info")
    public String getInfo(){
        return "hello word ! ";
    }
    @GetMapping
    public String getWeChar(@RequestParam String signature,
                            @RequestParam String timestamp,
                            @RequestParam String nonce,
                            @RequestParam String echostr) {
        System.out.println("signature :" + signature);
        System.out.println("timestamp :" + timestamp);
        System.out.println("nonce :" + nonce);
        System.out.println("echostr :" + echostr);
        if (AccessAuthentication.of(token, timestamp, nonce, signature).checkSignature()) {
            return echostr;
        }
        return null;
    }
    @GetMapping("/getAccessToken")
    public String getAccessToken () throws IOException {
        String accessToken = accessTokenService.getAccessToken();
        return accessToken;
    }
复制代码

网络异常,图片无法展示
|

到此获取Access token完成

下一篇: 自定义菜单


相关文章
|
1月前
|
人工智能 安全 Java
AI 时代:从 Spring Cloud Alibaba 到 Spring AI Alibaba
本次分享由阿里云智能集团云原生微服务技术负责人李艳林主讲,主题为“AI时代:从Spring Cloud Alibaba到Spring AI Alibaba”。内容涵盖应用架构演进、AI agent框架发展趋势及Spring AI Alibaba的重磅发布。分享介绍了AI原生架构与传统架构的融合,强调了API优先、事件驱动和AI运维的重要性。同时,详细解析了Spring AI Alibaba的三层抽象设计,包括模型支持、工作流智能体编排及生产可用性构建能力,确保安全合规、高效部署与可观测性。最后,结合实际案例展示了如何利用私域数据优化AI应用,提升业务价值。
140 4
|
1月前
|
监控 JavaScript 数据可视化
建筑施工一体化信息管理平台源码,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
智慧工地云平台是专为建筑施工领域打造的一体化信息管理平台,利用大数据、云计算、物联网等技术,实现施工区域各系统数据汇总与可视化管理。平台涵盖人员、设备、物料、环境等关键因素的实时监控与数据分析,提供远程指挥、决策支持等功能,提升工作效率,促进产业信息化发展。系统由PC端、APP移动端及项目、监管、数据屏三大平台组成,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
|
1月前
|
人工智能 自然语言处理 Java
Spring Cloud Alibaba AI 入门与实践
本文将介绍 Spring Cloud Alibaba AI 的基本概念、主要特性和功能,并演示如何完成一个在线聊天和在线画图的 AI 应用。
357 7
|
2月前
|
存储 SpringCloudAlibaba Java
【SpringCloud Alibaba系列】一文全面解析Zookeeper安装、常用命令、JavaAPI操作、Watch事件监听、分布式锁、集群搭建、核心理论
一文全面解析Zookeeper安装、常用命令、JavaAPI操作、Watch事件监听、分布式锁、集群搭建、核心理论。
【SpringCloud Alibaba系列】一文全面解析Zookeeper安装、常用命令、JavaAPI操作、Watch事件监听、分布式锁、集群搭建、核心理论
|
2月前
|
SpringCloudAlibaba 负载均衡 Dubbo
【SpringCloud Alibaba系列】Dubbo高级特性篇
本章我们介绍Dubbo的常用高级特性,包括序列化、地址缓存、超时与重试机制、多版本、负载均衡。集群容错、服务降级等。
【SpringCloud Alibaba系列】Dubbo高级特性篇
|
2月前
|
SpringCloudAlibaba JavaScript Dubbo
【SpringCloud Alibaba系列】Dubbo dubbo-admin安装教程篇
本文介绍了 Dubbo-Admin 的安装和使用步骤。Dubbo-Admin 是一个前后端分离的项目,前端基于 Vue,后端基于 Spring Boot。安装前需确保开发环境(Windows 10)已安装 JDK、Maven 和 Node.js,并在 Linux CentOS 7 上部署 Zookeeper 作为注册中心。
【SpringCloud Alibaba系列】Dubbo dubbo-admin安装教程篇
|
9天前
|
人工智能 开发框架 机器人
AstrBot:轻松将大模型接入QQ、微信等消息平台,打造多功能AI聊天机器人的开发框架,附详细教程
AstrBot 是一个开源的多平台聊天机器人及开发框架,支持多种大语言模型和消息平台,具备多轮对话、语音转文字等功能。
2168 13
AstrBot:轻松将大模型接入QQ、微信等消息平台,打造多功能AI聊天机器人的开发框架,附详细教程
|
4月前
|
存储 小程序 安全
微信的开发管理都需要配置什么?
【10月更文挑战第17天】微信的开发管理都需要配置什么?
68 0
|
4月前
|
小程序 JavaScript 前端开发
uni-app开发微信小程序:四大解决方案,轻松应对主包与vendor.js过大打包难题
uni-app开发微信小程序:四大解决方案,轻松应对主包与vendor.js过大打包难题
929 1
|
4月前
|
JavaScript 小程序 开发者
uni-app开发实战:利用Vue混入(mixin)实现微信小程序全局分享功能,一键发送给朋友、分享到朋友圈、复制链接
uni-app开发实战:利用Vue混入(mixin)实现微信小程序全局分享功能,一键发送给朋友、分享到朋友圈、复制链接
755 0