严格来讲,这不是一个bug,只是我们应用的方式不对。微信发送模板消息的方法是:

HttpUtils.post(sendApiUrl + AccessTokenApi.getAccessTokenStr(), jsonStr);

在用这个方法时,多次调用的时候会出现无法收到消息的情况(尤其是停用好久没有调用的时候)。查日志返回值是40001,鉴权失败。

微信官方文档有说这个tokenl默认生成时间是7200秒也就是两个小时,在这两个小时能确保不过期你得自己做个定时器提交去刷新获取就成了。

这个问题,你应该是在本地access_token失效前提前去多远程服务器上获取access_token,这样就能确保你服务器的这个access_token是永久的生效,不然失效后你才去拿会造成访问access_token无效,访问中断的。

一种方法是再次调用,一种方法是启一个线程,定时更新。

再次调用的核心代码如下:

	private ApiResult sendSync(final String jsonStr) {
final ApiResult result = TemplateMsgApi.send(jsonStr);
LogKit.debug("**********发送模板消息**********");
LogKit.debug(jsonStr);
LogKit.debug("**********发送模板消息微信返回结果**********");
LogKit.debug(result.getJson());
return result;
} /**
* 异步发送
*/
private void sendAsync(final String jsonStr) {
if (this.executor == null) {
this.executor = new ThreadPoolExecutor(5, 8, 200, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
Future<ApiResult> future = this.executor.submit(new Callable<ApiResult>() {
@Override
public ApiResult call() {
LogKit.debug("模板消息异步发送...");
return sendSync(jsonStr);
}
});
try {
logger.info("send wechat msg result = " + future.get().getJson());
if (future.get().getErrorCode() != 0) {
logger.warn("send wechat msg failed, resend");
this.sendAsync(jsonStr);
}
} catch (InterruptedException | ExecutionException e) {
logger.error("", e);
}
}

应用jfinal发送微信模板消息的一个bug的更多相关文章

  1. ThinkPHP3.2.3发送微信模板消息

    一.开通模板消息功能 所有服务号都可以在功能->添加功能插件处看到申请模板消息功能的入口,但只有认证后的服务号才可以申请模板消息的使用权限并获得该权限:需要选择公众账号服务所处的2个行业,每月可 ...

  2. php 实现发送微信模板消息(转)

    <?php namespace Org\Weixin; /** * Created by PhpStorm. * User: StandOpen * Date: 15-1-7 * Time: 9 ...

  3. 【原创分享·微信支付】C# MVC 微信支付之微信模板消息推送

    微信支付之微信模板消息推送                    今天我要跟大家分享的是“模板消息”的推送,这玩意呢,你说用途嘛,那还是真真的牛逼呐.原因在哪?就是因为它是依赖微信生存的呀,所以他能不 ...

  4. C# MVC 微信支付之微信模板消息推送

    微信支付之微信模板消息推送                    今天我要跟大家分享的是"模板消息"的推送,这玩意呢,你说用途嘛,那还是真真的牛逼呐.原因在哪?就是因为它是依赖微信 ...

  5. 前后端分离djangorestframework—— 接入微信模板消息推送

    微信 什么是微信也不多说,跟前面的支付宝一样的 微信支付 微信支付也有个沙箱环境,沙箱环境官方文档 由文档中那句很显眼的话所得,即使是测试环境也需要真实的商户号,所以这个就没法想支付宝那样用沙箱账号来 ...

  6. java开发微信模板消息推送

    发布时间:2018-12-12   技术:springboot+maven   概述 该demo主要涉及微信模板消息推送功能, 详细 代码下载:http://www.demodashi.com/dem ...

  7. 5分钟连续出现某现象+微信模板消息提醒 PHP

    需求场景:用电插座电流连续出现5次电流过高(大于 3A)后停止用电服务,前四次发送电流过高提醒,最后一次发送结束用电服务提醒 思路: Redis  key 设为:插座编号+user户编号  value ...

  8. PHP实现微信模板消息发送给指定用户

    使用公众号的模板消息功能,必须是认证过的服务号,需要发送微信号的openid,同一微信号在不同公众号下的openid是不同的,在公众号下是唯一的,获取不到微信号 进入公众平台  功能->模板消息 ...

  9. PHP微信模板消息发送

    <?php class Wxtemplate extends Base { function __construct() { $this->appid = config('WXAPP_AP ...

随机推荐

  1. sqlserver结束和监视耗时的sql

    在对象资源管理器中右击服务器地址选择“活动和监视器”. 点击最近耗费大量资源的查询

  2. 浅谈Java中的Hashmap

    HashMap:   java.lang.Object ∟ java.util.AbstractMap<K,V> ∟ java.util.HashMap<K,V> 类型参数: ...

  3. 22_IO_第22天(File、递归)_讲义

    今日内容介绍 1.File 2.递归 xmind:下载地址: 链接:https://pan.baidu.com/s/1Eaj9yP5i0x4PiJsZA4StQg 密码:845a 01IO技术概述 * ...

  4. Sprint Boot入门(1):创建第一个Spring Boot应用

    搭建工程 注:建议使用eclipse的STS插件创建Spring项目,而不是下面的Gradle项目,否则会导致有一些Spring文件不存在. new Gradle Project,如下 点next,如 ...

  5. getResource()的使用总结 ;

    1.通过ClassLoader来加载getResource()时不需要加 "/" 因为source是从main开始的; Thread.currentThread().getCont ...

  6. Android Service执行unbind后再次执行bind的问题

    在执行了startService.bindService.unbindService之后,再次执行bindService.这时发现Service的onBind方法并没有执行,而是执行的onRebind ...

  7. Nginx负载均衡配置与负载策略

    原理 负载均衡的目的是为了解决单个节点压力过大,造成Web服务响应过慢,严重的情况下导致服务瘫痪,无法正常提供服务. 应用场景 春节期间在12306网站上买过火车票的朋友应该深有体会,有时查询一张火车 ...

  8. Caffe使用step by step:faster-rcnn目标检测matlab代码

    faster-rcnn是MSRA在物体检测最新的研究成果,该研究成果基于RCNN,fast rcnn以及SPPnet,对之前目标检测方法进行改进,faster-rcnn项目地址.首先,faster r ...

  9. Java并发编程之线程安全、线程通信

    Java多线程开发中最重要的一点就是线程安全的实现了.所谓Java线程安全,可以简单理解为当多个线程访问同一个共享资源时产生的数据不一致问题.为此,Java提供了一系列方法来解决线程安全问题. syn ...

  10. linux 关机、重启

    一.重启命令:1.reboot2.shutdown -r now 立刻重启(root用户使用)3.shutdown -r 10 过10分钟自动重启(root用户使用) 4.shutdown -r 20 ...