diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpService.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpService.java index e25fd63c2..73776228e 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpService.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpService.java @@ -10,10 +10,12 @@ import me.chanjar.weixin.common.util.http.RequestHttp; import me.chanjar.weixin.cp.bean.WxCpMaJsCode2SessionResult; import me.chanjar.weixin.cp.bean.WxCpMessage; import me.chanjar.weixin.cp.bean.WxCpMessageSendResult; +import me.chanjar.weixin.cp.bean.WxCpProviderToken; import me.chanjar.weixin.cp.config.WxCpConfigStorage; /** * 微信API的Service. + * * @author chanjaster */ public interface WxCpService { @@ -72,9 +74,10 @@ public interface WxCpService { /** * 获得jsapi_ticket,不强制刷新jsapi_ticket * 应用的jsapi_ticket用于计算agentConfig(参见“通过agentConfig注入应用的权限”)的签名,签名计算方法与上述介绍的config的签名算法完全相同,但需要注意以下区别: - * + *

* 签名的jsapi_ticket必须使用以下接口获取。且必须用wx.agentConfig中的agentid对应的应用secret去获取access_token。 * 签名用的noncestr和timestamp必须与wx.agentConfig中的nonceStr和timestamp相同。 + * * @see #getJsapiTicket(boolean) */ String getAgentJsapiTicket() throws WxErrorException; @@ -134,6 +137,26 @@ public interface WxCpService { */ String[] getCallbackIp() throws WxErrorException; + /** + *

+   * 获取服务商凭证
+   * 文档地址:https://work.weixin.qq.com/api/doc#90001/90143/91200
+   * 请求方式:POST(HTTPS)
+   * 请求地址: https://qyapi.weixin.qq.com/cgi-bin/service/get_provider_token
+   * 
+ * + * @param corpId 服务商的corpid + * @param providerSecret 服务商的secret,在服务商管理后台可见 + * @return { + * "errcode":0 , + * "errmsg":"ok" , + * "provider_access_token":"enLSZ5xxxxxxJRL", + * "expires_in":7200 + * } + * @throws WxErrorException . + */ + WxCpProviderToken getProviderToken(String corpId, String providerSecret) throws WxErrorException; + /** * 当本Service没有实现某个API的时候,可以用这个,针对所有微信API中的GET请求 * @@ -206,7 +229,7 @@ public interface WxCpService { * @return WxSessionManager */ WxSessionManager getSessionManager(); - + /** *
    * 设置WxSessionManager,只有当需要使用个性化的WxSessionManager的时候才需要调用此方法,
@@ -289,7 +312,7 @@ public interface WxCpService {
 
   /**
    * 获取群聊服务
-   * 
+   *
    * @return 群聊服务
    */
   WxCpChatService getChatService();
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/BaseWxCpServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/BaseWxCpServiceImpl.java
index 52ccbf8e1..9c7396ab1 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/BaseWxCpServiceImpl.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/BaseWxCpServiceImpl.java
@@ -24,6 +24,7 @@ import me.chanjar.weixin.cp.api.*;
 import me.chanjar.weixin.cp.bean.WxCpMaJsCode2SessionResult;
 import me.chanjar.weixin.cp.bean.WxCpMessage;
 import me.chanjar.weixin.cp.bean.WxCpMessageSendResult;
+import me.chanjar.weixin.cp.bean.WxCpProviderToken;
 import me.chanjar.weixin.cp.config.WxCpConfigStorage;
 
 import java.io.File;
@@ -199,6 +200,14 @@ public abstract class BaseWxCpServiceImpl implements WxCpService, RequestH
     return ips;
   }
 
+  @Override
+  public WxCpProviderToken getProviderToken(String corpId, String providerSecret) throws WxErrorException {
+    JsonObject jsonObject = new JsonObject();
+    jsonObject.addProperty("corpid", corpId);
+    jsonObject.addProperty("provider_secret", providerSecret);
+    return WxCpProviderToken.fromJson(this.post(this.configStorage.getApiUrl(GET_PROVIDER_TOKEN), jsonObject.toString()));
+  }
+
   @Override
   public String get(String url, String queryParam) throws WxErrorException {
     return execute(SimpleGetRequestExecutor.create(this), url, queryParam);
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpProviderToken.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpProviderToken.java
new file mode 100644
index 000000000..2c98f8e3f
--- /dev/null
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpProviderToken.java
@@ -0,0 +1,30 @@
+package me.chanjar.weixin.cp.bean;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder;
+
+/**
+ * 服务商凭证.
+ *
+ * @author Binary Wang
+ * @date 2019-11-02
+ */
+@Data
+public class WxCpProviderToken {
+  /**
+   * 服务商的access_token,最长为512字节。
+   */
+  @SerializedName("provider_access_token")
+  private String providerAccessToken;
+
+  /**
+   * provider_access_token有效期(秒)
+   */
+  @SerializedName("expires_in")
+  private Integer expiresIn;
+
+  public static WxCpProviderToken fromJson(String json) {
+    return WxCpGsonBuilder.create().fromJson(json, WxCpProviderToken.class);
+  }
+}
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/constant/WxCpApiPathConsts.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/constant/WxCpApiPathConsts.java
index 6de1a63ac..468134645 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/constant/WxCpApiPathConsts.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/constant/WxCpApiPathConsts.java
@@ -20,7 +20,8 @@ public final class WxCpApiPathConsts {
   public static final String BATCH_REPLACE_USER = "/cgi-bin/batch/replaceuser";
   public static final String BATCH_GET_RESULT = "/cgi-bin/batch/getresult?jobid=";
   public static final String JSCODE_TO_SESSION = "/cgi-bin/miniprogram/jscode2session";
-  public static final String GET_TOKEN = "/cgi-bin/gettoken?&corpid=%s&corpsecret=%s";
+  public static final String GET_TOKEN = "/cgi-bin/gettoken?corpid=%s&corpsecret=%s";
+  public static final String GET_PROVIDER_TOKEN = "/cgi-bin/service/get_provider_token";
 
   public static class Agent {
     public static final String AGENT_GET = "/cgi-bin/agent/get?agentid=%d";
diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/BaseWxCpServiceImplTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/BaseWxCpServiceImplTest.java
index 69a6aa43d..f18f8b742 100644
--- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/BaseWxCpServiceImplTest.java
+++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/BaseWxCpServiceImplTest.java
@@ -33,4 +33,9 @@ public class BaseWxCpServiceImplTest {
   public void testJsCode2Session() throws WxErrorException {
     assertThat(this.wxService.jsCode2Session("111")).isNotNull();
   }
+
+  @Test
+  public void testGetProviderToken() throws WxErrorException {
+    assertThat(this.wxService.getProviderToken("111","123")).isNotNull();
+  }
 }