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

下一篇: 自定义菜单


相关文章
|
5天前
|
JSON 小程序 JavaScript
uni-app开发微信小程序的报错[渲染层错误]排查及解决
uni-app开发微信小程序的报错[渲染层错误]排查及解决
78 7
|
5天前
|
小程序 JavaScript 前端开发
uni-app开发微信小程序:四大解决方案,轻松应对主包与vendor.js过大打包难题
uni-app开发微信小程序:四大解决方案,轻松应对主包与vendor.js过大打包难题
59 1
|
10天前
|
JSON SpringCloudAlibaba Java
Springcloud Alibaba + jdk17+nacos 项目实践
本文基于 `Springcloud Alibaba + JDK17 + Nacos2.x` 介绍了一个微服务项目的搭建过程,包括项目依赖、配置文件、开发实践中的新特性(如文本块、NPE增强、模式匹配)以及常见的问题和解决方案。通过本文,读者可以了解如何高效地搭建和开发微服务项目,并解决一些常见的开发难题。项目代码已上传至 Gitee,欢迎交流学习。
Springcloud Alibaba + jdk17+nacos 项目实践
|
5天前
|
Dubbo Java 应用服务中间件
Dubbo学习圣经:从入门到精通 Dubbo3.0 + SpringCloud Alibaba 微服务基础框架
尼恩团队的15大技术圣经,旨在帮助开发者系统化、体系化地掌握核心技术,提升技术实力,从而在面试和工作中脱颖而出。本文介绍了如何使用Dubbo3.0与Spring Cloud Gateway进行整合,解决传统Dubbo架构缺乏HTTP入口的问题,实现高性能的微服务网关。
|
9天前
|
缓存 小程序 索引
uni-app开发微信小程序时vant组件van-tabs的使用陷阱及解决方案
uni-app开发微信小程序时vant组件van-tabs的使用陷阱及解决方案
51 1
|
14天前
|
小程序 前端开发 数据安全/隐私保护
微信小程序全栈开发中的身份认证与授权机制
【10月更文挑战第3天】随着移动互联网的发展,微信小程序凭借便捷的用户体验和强大的社交传播能力,成为企业拓展业务的新渠道。本文探讨了小程序全栈开发中的身份认证与授权机制,包括手机号码验证、微信登录、第三方登录及角色权限控制等方法,并强调了安全性、用户体验和合规性的重要性,帮助开发者更好地理解和应用这一关键技术。
39 5
|
14天前
|
小程序 前端开发 JavaScript
微信小程序全栈开发中的PWA技术应用
【10月更文挑战第3天】微信小程序作为新兴应用形态,凭借便捷体验与社交传播能力,成为企业拓展业务的新渠道。本文探讨了微信小程序全栈开发中的PWA技术应用,包括离线访问、后台运行、桌面图标及原生体验等方面,助力开发者提升小程序性能与用户体验。PWA技术在不同平台的兼容性、性能优化及用户体验是实践中需注意的关键点。
39 5
|
10天前
|
小程序 JavaScript API
微信小程序开发之:保存图片到手机,使用uni-app 开发小程序;还有微信原生保存图片到手机
这篇文章介绍了如何在uni-app和微信小程序中实现将图片保存到用户手机相册的功能。
111 0
微信小程序开发之:保存图片到手机,使用uni-app 开发小程序;还有微信原生保存图片到手机
|
5天前
|
JavaScript 小程序 开发者
uni-app开发实战:利用Vue混入(mixin)实现微信小程序全局分享功能,一键发送给朋友、分享到朋友圈、复制链接
uni-app开发实战:利用Vue混入(mixin)实现微信小程序全局分享功能,一键发送给朋友、分享到朋友圈、复制链接
25 0
|
9天前
|
小程序
uni-app开发微信小程序使用onPullDownRefresh(下拉刷新)总结
uni-app开发微信小程序使用onPullDownRefresh(下拉刷新)总结
94 0