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完成

下一篇: 自定义菜单


相关文章
|
10天前
|
小程序 前端开发 测试技术
微信小程序的开发完整流程是什么?
微信小程序的开发完整流程是什么?
48 7
ly~
|
21天前
|
存储 供应链 小程序
除了微信小程序,PHP 还可以用于开发哪些类型的小程序?
除了微信小程序,PHP 还可用于开发多种类型的小程序,包括支付宝小程序、百度智能小程序、抖音小程序、企业内部小程序及行业特定小程序。在电商、生活服务、资讯、工具、娱乐、营销等领域,PHP 能有效管理商品信息、订单处理、支付接口、内容抓取、复杂计算、游戏数据、活动规则等多种业务。同时,在企业内部,PHP 可提升工作效率,实现审批流程、文件共享、生产计划等功能;在医疗和教育等行业,PHP 能管理患者信息、在线问诊、课程资源、成绩查询等重要数据。
ly~
60 6
|
23天前
|
SpringCloudAlibaba API 开发者
新版-SpringCloud+SpringCloud Alibaba
新版-SpringCloud+SpringCloud Alibaba
|
1天前
|
JSON SpringCloudAlibaba Java
Springcloud Alibaba + jdk17+nacos 项目实践
本文基于 `Springcloud Alibaba + JDK17 + Nacos2.x` 介绍了一个微服务项目的搭建过程,包括项目依赖、配置文件、开发实践中的新特性(如文本块、NPE增强、模式匹配)以及常见的问题和解决方案。通过本文,读者可以了解如何高效地搭建和开发微服务项目,并解决一些常见的开发难题。项目代码已上传至 Gitee,欢迎交流学习。
Springcloud Alibaba + jdk17+nacos 项目实践
|
5天前
|
小程序 前端开发 数据安全/隐私保护
微信小程序全栈开发中的身份认证与授权机制
【10月更文挑战第3天】随着移动互联网的发展,微信小程序凭借便捷的用户体验和强大的社交传播能力,成为企业拓展业务的新渠道。本文探讨了小程序全栈开发中的身份认证与授权机制,包括手机号码验证、微信登录、第三方登录及角色权限控制等方法,并强调了安全性、用户体验和合规性的重要性,帮助开发者更好地理解和应用这一关键技术。
26 5
|
5天前
|
小程序 前端开发 JavaScript
微信小程序全栈开发中的PWA技术应用
【10月更文挑战第3天】微信小程序作为新兴应用形态,凭借便捷体验与社交传播能力,成为企业拓展业务的新渠道。本文探讨了微信小程序全栈开发中的PWA技术应用,包括离线访问、后台运行、桌面图标及原生体验等方面,助力开发者提升小程序性能与用户体验。PWA技术在不同平台的兼容性、性能优化及用户体验是实践中需注意的关键点。
22 5
|
1天前
|
小程序 JavaScript API
微信小程序开发之:保存图片到手机,使用uni-app 开发小程序;还有微信原生保存图片到手机
这篇文章介绍了如何在uni-app和微信小程序中实现将图片保存到用户手机相册的功能。
微信小程序开发之:保存图片到手机,使用uni-app 开发小程序;还有微信原生保存图片到手机
|
21天前
|
小程序 JavaScript API
微信小程序开发学习之页面导航(声明式导航和编程式导航)
这篇文章介绍了微信小程序中页面导航的两种方式:声明式导航和编程式导航,包括如何导航到tabBar页面、非tabBar页面、后退导航,以及如何在导航过程中传递参数和获取传递的参数。
微信小程序开发学习之页面导航(声明式导航和编程式导航)
|
21天前
|
人工智能 前端开发 Java
Spring Cloud Alibaba AI,阿里AI这不得玩一下
🏀闪亮主角: 大家好,我是JavaDog程序狗。今天分享Spring Cloud Alibaba AI,基于Spring AI并提供阿里云通义大模型的Java AI应用。本狗用SpringBoot+uniapp+uview2对接Spring Cloud Alibaba AI,带你打造聊天小AI。 📘故事背景: 🎁获取源码: 关注公众号“JavaDog程序狗”,发送“alibaba-ai”即可获取源码。 🎯主要目标:
39 0
|
2月前
|
资源调度 Java 调度
Spring Cloud Alibaba 集成分布式定时任务调度功能
定时任务在企业应用中至关重要,常用于异步数据处理、自动化运维等场景。在单体应用中,利用Java的`java.util.Timer`或Spring的`@Scheduled`即可轻松实现。然而,进入微服务架构后,任务可能因多节点并发执行而重复。Spring Cloud Alibaba为此发布了Scheduling模块,提供轻量级、高可用的分布式定时任务解决方案,支持防重复执行、分片运行等功能,并可通过`spring-cloud-starter-alibaba-schedulerx`快速集成。用户可选择基于阿里云SchedulerX托管服务或采用本地开源方案(如ShedLock)