微信公众平台接入指南见 微信官方文档 :https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Access_Overview.html
access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。
公众平台的API调用所需的access_token的使用及生成方式说明:
1、建议公众号开发者使用中控服务器统一获取和刷新access_token,其他业务逻辑服务器所使用的access_token均来自于该中控服务器,不应该各自去刷新,否则容易造成冲突,导致access_token覆盖而影响业务;
2、目前access_token的有效期通过返回的expire_in来传达,目前是7200秒之内的值。中控服务器需要根据这个有效时间提前去刷新新access_token。在刷新过程中,中控服务器可对外继续输出的老access_token,此时公众平台后台会保证在5分钟内,新老access_token都可用,这保证了第三方业务的平滑过渡;
3、access_token的有效时间可能会在未来有调整,所以中控服务器不仅需要内部定时主动刷新,还需要提供被动刷新access_token的接口,这样便于业务服务器在API调用获知access_token已超时的情况下,可以触发access_token的刷新流程。
公众号和小程序均可以使用AppID和AppSecret调用本接口来获取access_token。AppID和AppSecret可在“微信公众平台-开发-基本配置”页中获得(需要已经成为开发者,且帐号没有异常状态)。**调用接口时,请登录“微信公众平台-开发-基本配置”提前将服务器IP地址添加到IP白名单中,点击查看设置方法,否则将无法调用成功。**小程序无需配置IP白名单。
接口调用请求说明
- https请求方式: GET https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
具体参数说明见微信开发文档:https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Get_access_token.html
不多说直接上代码
微信全局变量配置类
package com.gaode.wx.weixin.sdk.propertie; /** * @ClassName: WeixinGlobal * @Description: 微信全局变量配置 * @author lcoil * @date 2019年12月3日 下午1:52:34 * */ public interface WeixinGlobal { String APPID = "wx0dd1234567890123"; //对应微信服务号的appID 替换成自己的 String APPSECRET = "555f0642be5fa384ff59aac9a6406a99"; // 对应微信服务号APPSECRET 替换成自己的 String TOKEN = "weixin_new_token"; //微信服务号中自己设置的TOKEN /**业务中需要的消息模板,在自己的服务号中申请后将 串替换掉即可*/ //作业提醒的模板id String HOMEWORK_ASSIGN = "2oQc8ZnphKRIhr-j6iQxYGR0qK0wa3k4XFrlbJgCsFQ"; //作业批改完成通知的模板id String HOMEWORK_CORRECT = "d0g6x478Xu173ayjy5NluzBX_suGeanUueHIeqS0LXE"; //班级通知模板id String CLASS_NOTICE = "2YxppBHdz2qXRu_Elh6WxHzKAckWNcpHPjmJITi3MQc"; //成绩通知模板id String EXAM_SCORE = "oCMFUHGpTnb5Fov3x4VykrOcGw29HgsrqnmgoA4d3m0"; //关卡提醒的模板id 对应微信公众平台消息模板:发布学习任务通知 String GATE_ASSIGN = "4DB0CQ3Py-Ld6LoNepD_Gjw1cn1X1xjyTRISUtvnm20"; /**百度天气api url*/ String BAIDU_WEATHER_API = "http://api.map.baidu.com/telematics/v3/weather?"; /**百度天气api 秘钥*/ String BAIDU_WEATHER_AK = "Bxw1M40IDPbjheeyUZhCeRAiGODej7aR"; //********************************************************************************************************************************************************* /**PM25 API url*/ String PM25_API = "http://www.pm25.in/api/querys/pm2_5.json?"; /**PM25 API token*/ String PM25_TOKEN = "5j1znBVAsnSf5xQyNQyq"; //********************************************************************************************************************************************************* //获取全局Access Token请求模版 String ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET"; //获取openid的请求模版 String ACCESS_OPENID = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=APPSECRET&code=CODE&grant_type=authorization_code"; String ACCESS_USER = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID"; //********************************************************************************************************************************************************* //获取用户基本信息信息 String WECHAT_USER_INFO = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID"; //设置用户备注名 String WECHAT_UPDATE_REMAKE = "https://api.weixin.qq.com/cgi-bin/user/info/updateremark?access_token=ACCESS_TOKEN"; //获取关注列表 String WECHAT_USER_LIST = "https://api.weixin.qq.com/cgi-bin/user/get?access_token=ACCESS_TOKEN&next_openid=NEXT_OPENID"; //创建分组 String WECHAT_GROUPS_CREATE = "https://api.weixin.qq.com/cgi-bin/groups/create?access_token=ACCESS_TOKEN"; //查询分组 String WECHAT_GROUPS_LIST = "https://api.weixin.qq.com/cgi-bin/groups/get?access_token=ACCESS_TOKEN"; //查询用户所在的分组 String WECHAT_GROUPS_USER = "https://api.weixin.qq.com/cgi-bin/groups/getid?access_token=ACCESS_TOKEN"; //修改分组名称 String WECHAT_GROUPS_UPDATE = "https://api.weixin.qq.com/cgi-bin/groups/update?access_token=ACCESS_TOKEN"; //移动用户分组 String WECHAR_GROUPS_MEMBERS_UPDATA = "https://api.weixin.qq.com/cgi-bin/groups/members/update?access_token=ACCESS_TOKEN"; //向用户发送消息 String WECHAT_MESSAGE_CUSTOM_SEND = "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=ACCESS_TOKEN"; //根据分组id来群发消息 String WECHAT_MESSAGE_GROUP = "https://api.weixin.qq.com/cgi-bin/message/mass/sendall?access_token=ACCESS_TOKEN"; //********************************************************************************************************************************************************* //获取模板id String WECHAT_TEMPLATE_GET_ID = "https://api.weixin.qq.com/cgi-bin/template/api_add_template?access_token=ACCESS_TOKEN"; //发送模板消息 String WECHAT_TEMPLATE_SEND = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN"; // 创建菜单 String MENU_CREATE_URL = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN"; // 查询自定义菜单 String MENU_GET_URL = "https://api.weixin.qq.com/cgi-bin/menu/get?access_token=ACCESS_TOKEN"; // 删除自定义菜单 String MENU_DELTE_URL = "https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=ACCESS_TOKEN"; //票据 String jsapi_ticket_url="https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi";//GET方式请求获得jsapi_ticket String BASE_SERVER="http://xqpay.natapp1.cc";//服务地址 String PAY_KEY="CeTZ4VC2sm9OYmjMb5eCcmPGfZohpkp2";//微信支付秘钥 自己在商户平台设置的 String mchId="1562901001";//商户平台id }
获取 服务号的access_token
由一个线程定时去刷新,这样可以减少access_token生成的次数,微信服务器对access_token的生成次数有限制。
1 /** 2 * 3 */ 4 package com.xianquan.wx.weixin.sdk.util; 5 6 import com.xianquan.wx.aixuexiao.model.Token; 7 import com.alibaba.fastjson.JSONException; 8 import com.alibaba.fastjson.JSONObject; 9 import com.xianquan.wx.weixin.sdk.propertie.WeixinGlobal; 10 import org.slf4j.Logger; 11 import org.slf4j.LoggerFactory; 12 13 14 /** 15 * @ClassName: AccessTokenUtil 16 * @Description: 由一个线程定时去刷新,这样可以减少access_token生成的次数,微信服务器对access_token的生成次数有限制。 17 * @author lcoil 18 * @date 2019年12月2日 上午11:01:48 19 * 20 */ 21 public class AccessTokenUtil { 22 private static Logger log = LoggerFactory.getLogger(AccessTokenUtil.class); 23 24 public static String queryAccessToken() { 25 Token token = null; 26 String tokenValue = SimpleEHCache.getAccessTokenValue(); 27 if (tokenValue != null){ 28 token = new Token(); 29 token.setAccessToken(tokenValue); 30 return token.getAccessToken(); 31 } 32 33 String requestUrl = WeixinGlobal.ACCESS_TOKEN_URL.replace("APPID", WeixinGlobal.APPID).replace("APPSECRET", WeixinGlobal.APPSECRET); 34 // 发起GET请求获取凭证 35 JSONObject jsonObject = WeixinHttpUtil.httpsRequest(requestUrl, "GET", null); 36 37 if (null != jsonObject) { 38 try { 39 token = new Token(); 40 token.setAccessToken(jsonObject.getString("access_token")); 41 //token.setAccessToken("14_ecAhZacj_RKfBxFWlg_57s2RXXnPXfzwBVjFDJ8UlA4m70npKnQerH9Ki6G3ybKpPLH7pjMm0vF6FwIY-yrSvfEGkqCjiy1CwrVXXKLS6KOE6Sa5h8Zgnjp46OM4zhRlcaFoPjQ0u5nO97SXMBXfAGAYNJ"); 42 token.setExpiresIn(jsonObject.getInteger("expires_in")); 43 // token.setExpiresIn(36000); 44 SimpleEHCache.pubAccessToken(jsonObject.getString("access_token")); 45 } catch (JSONException e) { 46 token = null; 47 // 获取token失败 48 log.error("获取token失败 errcode:{} errmsg:{}", jsonObject.getInteger("errcode"), jsonObject.getString("errmsg")); 49 } 50 } 51 return token.getAccessToken(); 52 } 53 public static void main(String[] args) { 54 System.out.println(queryAccessToken()); 55 } 56 }