From 15e02d725cedcde4f62be4a2c1de84afcef5f6ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?jn=E8=80=81A?= Date: Sun, 25 Oct 2020 12:59:52 +0800 Subject: [PATCH] =?UTF-8?q?:art:=20#1820=20=E4=BC=98=E5=8C=96=E6=9B=B4?= =?UTF-8?q?=E6=96=B0getTicket=E6=96=B9=E6=B3=95=EF=BC=8C=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E9=94=81=E8=B0=83=E7=94=A8=E6=97=B6=E6=9C=BA=E9=81=BF=E5=85=8D?= =?UTF-8?q?=E5=B9=B6=E5=8F=91=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix:调整获取相关票据的锁处理时机 * Fix:更新票据,锁之后,再次检查是否有效,避免并发同时进入多次重置票据 Co-authored-by: weiwei.xing --- .../api/impl/WxMaJsapiServiceImpl.java | 31 +++++++++-------- .../mp/api/impl/BaseWxMpServiceImpl.java | 33 ++++++++++--------- .../mp/api/impl/WxMpCardServiceImpl.java | 32 +++++++++--------- 3 files changed, 52 insertions(+), 44 deletions(-) diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaJsapiServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaJsapiServiceImpl.java index 9177910e3..43d3c22d1 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaJsapiServiceImpl.java +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaJsapiServiceImpl.java @@ -32,22 +32,25 @@ public class WxMaJsapiServiceImpl implements WxMaJsapiService { @Override public String getCardApiTicket(boolean forceRefresh) throws WxErrorException { - Lock lock = this.wxMaService.getWxMaConfig().getCardApiTicketLock(); - lock.lock(); - try { - if (forceRefresh) { - this.wxMaService.getWxMaConfig().expireCardApiTicket(); - } - if (this.wxMaService.getWxMaConfig().isCardApiTicketExpired()) { - String responseContent = this.wxMaService.get(GET_JSAPI_TICKET_URL + "?type=wx_card", null); - JsonObject tmpJsonObject = GsonParser.parse(responseContent); - String jsapiTicket = tmpJsonObject.get("ticket").getAsString(); - int expiresInSeconds = tmpJsonObject.get("expires_in").getAsInt(); - this.wxMaService.getWxMaConfig().updateCardApiTicket(jsapiTicket, expiresInSeconds); + if (forceRefresh) { + this.wxMaService.getWxMaConfig().expireCardApiTicket(); + } + + if (this.wxMaService.getWxMaConfig().isCardApiTicketExpired()) { + Lock lock = this.wxMaService.getWxMaConfig().getCardApiTicketLock(); + lock.lock(); + try { + if (this.wxMaService.getWxMaConfig().isCardApiTicketExpired()) { + String responseContent = this.wxMaService.get(GET_JSAPI_TICKET_URL + "?type=wx_card", null); + JsonObject tmpJsonObject = GsonParser.parse(responseContent); + String jsapiTicket = tmpJsonObject.get("ticket").getAsString(); + int expiresInSeconds = tmpJsonObject.get("expires_in").getAsInt(); + this.wxMaService.getWxMaConfig().updateCardApiTicket(jsapiTicket, expiresInSeconds); + } + } finally { + lock.unlock(); } - } finally { - lock.unlock(); } return this.wxMaService.getWxMaConfig().getCardApiTicket(); } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/BaseWxMpServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/BaseWxMpServiceImpl.java index 555078db1..c2ecc475f 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/BaseWxMpServiceImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/BaseWxMpServiceImpl.java @@ -151,23 +151,26 @@ public abstract class BaseWxMpServiceImpl implements WxMpService, RequestH @Override public String getTicket(TicketType type, boolean forceRefresh) throws WxErrorException { - Lock lock = this.getWxMpConfigStorage().getTicketLock(type); - lock.lock(); - try { - if (forceRefresh) { - this.getWxMpConfigStorage().expireTicket(type); - } - if (this.getWxMpConfigStorage().isTicketExpired(type)) { - String responseContent = execute(SimpleGetRequestExecutor.create(this), - GET_TICKET_URL.getUrl(this.getWxMpConfigStorage()) + type.getCode(), null); - JsonObject tmpJsonObject = GsonParser.parse(responseContent); - String jsapiTicket = tmpJsonObject.get("ticket").getAsString(); - int expiresInSeconds = tmpJsonObject.get("expires_in").getAsInt(); - this.getWxMpConfigStorage().updateTicket(type, jsapiTicket, expiresInSeconds); + if (forceRefresh) { + this.getWxMpConfigStorage().expireTicket(type); + } + + if (this.getWxMpConfigStorage().isTicketExpired(type)) { + Lock lock = this.getWxMpConfigStorage().getTicketLock(type); + lock.lock(); + try { + if (this.getWxMpConfigStorage().isTicketExpired(type)) { + String responseContent = execute(SimpleGetRequestExecutor.create(this), + GET_TICKET_URL.getUrl(this.getWxMpConfigStorage()) + type.getCode(), null); + JsonObject tmpJsonObject = GsonParser.parse(responseContent); + String jsapiTicket = tmpJsonObject.get("ticket").getAsString(); + int expiresInSeconds = tmpJsonObject.get("expires_in").getAsInt(); + this.getWxMpConfigStorage().updateTicket(type, jsapiTicket, expiresInSeconds); + } + } finally { + lock.unlock(); } - } finally { - lock.unlock(); } return this.getWxMpConfigStorage().getTicket(type); diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImpl.java index 36f49acd3..cbfd5d8d0 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImpl.java @@ -48,24 +48,26 @@ public class WxMpCardServiceImpl implements WxMpCardService { @Override public String getCardApiTicket(boolean forceRefresh) throws WxErrorException { final TicketType type = TicketType.WX_CARD; - Lock lock = getWxMpService().getWxMpConfigStorage().getTicketLock(type); - lock.lock(); - try { - if (forceRefresh) { - this.getWxMpService().getWxMpConfigStorage().expireTicket(type); - } + if (forceRefresh) { + this.getWxMpService().getWxMpConfigStorage().expireTicket(type); + } - if (this.getWxMpService().getWxMpConfigStorage().isTicketExpired(type)) { - String responseContent = this.wxMpService.execute(SimpleGetRequestExecutor - .create(this.getWxMpService().getRequestHttp()), WxMpApiUrl.Card.CARD_GET_TICKET, null); - JsonObject tmpJsonObject = GsonParser.parse(responseContent); - String cardApiTicket = tmpJsonObject.get("ticket").getAsString(); - int expiresInSeconds = tmpJsonObject.get("expires_in").getAsInt(); - this.getWxMpService().getWxMpConfigStorage().updateTicket(type, cardApiTicket, expiresInSeconds); + if (this.getWxMpService().getWxMpConfigStorage().isTicketExpired(type)) { + Lock lock = getWxMpService().getWxMpConfigStorage().getTicketLock(type); + lock.lock(); + try { + if (this.getWxMpService().getWxMpConfigStorage().isTicketExpired(type)) { + String responseContent = this.wxMpService.execute(SimpleGetRequestExecutor + .create(this.getWxMpService().getRequestHttp()), WxMpApiUrl.Card.CARD_GET_TICKET, null); + JsonObject tmpJsonObject = GsonParser.parse(responseContent); + String cardApiTicket = tmpJsonObject.get("ticket").getAsString(); + int expiresInSeconds = tmpJsonObject.get("expires_in").getAsInt(); + this.getWxMpService().getWxMpConfigStorage().updateTicket(type, cardApiTicket, expiresInSeconds); + } + } finally { + lock.unlock(); } - } finally { - lock.unlock(); } return this.getWxMpService().getWxMpConfigStorage().getTicket(type); }