Skip to content

Commit

Permalink
🆕 #2846 【企业微信】增加待开发应用获取带参授权链接的接口
Browse files Browse the repository at this point in the history
  • Loading branch information
freedom9 authored Oct 21, 2022
1 parent b085309 commit 9b78acd
Show file tree
Hide file tree
Showing 6 changed files with 152 additions and 0 deletions.
7 changes: 7 additions & 0 deletions weixin-java-cp/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,13 @@
<artifactId>moco-runner</artifactId>
<scope>test</scope>
</dependency>

<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.13.4</version>
<scope>test</scope>
</dependency>
</dependencies>

<build>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package me.chanjar.weixin.cp.bean;

import com.google.gson.annotations.SerializedName;
import lombok.Data;
import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder;

/**
* @author freedom
* @date 2022/10/20 16:36
*/
@Data
public class WxTpCustomizedAuthUrl extends WxCpBaseResp {

/**
* 可用来生成二维码的授权url,需要开发者自行生成为二维码
*/
@SerializedName("qrcode_url")
private String qrCodeURL;

/**
* 有效期(秒)。10天过期。
*/
@SerializedName("expires_in")
private Integer expiresIn;

/**
* From json wx cp tp customized auth url.
*
* @param json the json
* @return the wx cp tp customized auth url
*/
public static WxTpCustomizedAuthUrl fromJson(String json) {
return WxCpGsonBuilder.create().fromJson(json, WxTpCustomizedAuthUrl.class);
}

public String toJson() {
return WxCpGsonBuilder.create().toJson(this);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -781,6 +781,11 @@ interface Tp {
*/
String GET_LOGIN_INFO = "/cgi-bin/service/get_login_info";

/**
* The constant GET_CUSTOMIZED_AUTH_URL.
*/
String GET_CUSTOMIZED_AUTH_URL = "/cgi-bin/service/get_customized_auth_url";


/**
* The constant CONTACT_SEARCH.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,10 @@
import me.chanjar.weixin.cp.bean.*;
import me.chanjar.weixin.cp.config.WxCpTpConfigStorage;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import java.util.List;

/**
* 企业微信第三方应用API的Service.
*
Expand Down Expand Up @@ -389,6 +393,18 @@ public interface WxCpTpService {
*/
WxTpLoginInfo getLoginInfo(String authCode) throws WxErrorException;

/**
* 获取带参授权链接
* <p>
* 文档地址:https://developer.work.weixin.qq.com/document/path/95436
*
* @param state state
* @param templateIdList 代开发自建应用模版ID列表,数量不能超过9个
* @return customized auth url
* @throws WxErrorException the wx error exception
*/
WxTpCustomizedAuthUrl getCustomizedAuthUrl(@NotBlank String state, @NotEmpty List<String> templateIdList) throws WxErrorException;

/**
* 获取服务商providerToken
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,15 +22,19 @@
import me.chanjar.weixin.common.util.http.SimpleGetRequestExecutor;
import me.chanjar.weixin.common.util.http.SimplePostRequestExecutor;
import me.chanjar.weixin.common.util.json.GsonParser;
import me.chanjar.weixin.common.util.json.WxGsonBuilder;
import me.chanjar.weixin.cp.bean.*;
import me.chanjar.weixin.cp.config.WxCpTpConfigStorage;
import me.chanjar.weixin.cp.tp.service.*;
import org.apache.commons.lang3.StringUtils;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import java.io.File;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import static me.chanjar.weixin.cp.constant.WxCpApiPathConsts.Tp.*;
Expand Down Expand Up @@ -534,6 +538,16 @@ public WxTpLoginInfo getLoginInfo(String authCode) throws WxErrorException {
return WxTpLoginInfo.fromJson(responseText);
}

@Override
public WxTpCustomizedAuthUrl getCustomizedAuthUrl(@NotBlank String state, @NotEmpty List<String> templateIdList) throws WxErrorException {
JsonObject jsonObject = new JsonObject();
jsonObject.addProperty("state", state);
jsonObject.add("templateid_list", WxGsonBuilder.create().toJsonTree(templateIdList).getAsJsonArray());

String responseText = post(configStorage.getApiUrl(GET_CUSTOMIZED_AUTH_URL) + "?provider_access_token=" + getWxCpProviderToken(), jsonObject.toString(), true);
return WxTpCustomizedAuthUrl.fromJson(responseText);
}

@Override
public String getWxCpProviderToken() throws WxErrorException {
if (this.configStorage.isProviderTokenExpired()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,27 @@

import com.google.gson.JsonObject;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.common.redis.RedissonWxRedisOps;
import me.chanjar.weixin.cp.bean.WxCpTpAuthInfo;
import me.chanjar.weixin.cp.bean.WxCpTpCorp;
import me.chanjar.weixin.cp.bean.WxCpTpPermanentCodeInfo;
import me.chanjar.weixin.cp.bean.WxTpCustomizedAuthUrl;
import me.chanjar.weixin.cp.config.WxCpTpConfigStorage;
import me.chanjar.weixin.cp.config.impl.WxCpDefaultConfigImpl;
import me.chanjar.weixin.cp.config.impl.WxCpTpDefaultConfigImpl;
import me.chanjar.weixin.cp.config.impl.WxCpTpRedissonConfigImpl;
import me.chanjar.weixin.cp.tp.service.WxCpTpService;
import org.apache.http.util.Asserts;
import org.mockito.Mockito;
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.testng.Assert;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Objects;

Expand All @@ -27,6 +38,55 @@
public class BaseWxCpTpServiceImplTest {
private final WxCpTpService tpService = Mockito.spy(new WxCpTpServiceApacheHttpClientImpl());

/**
* The constant PROVIDER_CORP_ID.
*/
public static final String PROVIDER_CORP_ID = "xxxxxx";
/**
* The constant PROVIDER_SECRET.
*/
public static final String PROVIDER_SECRET = "xxxxxx";
/**
* The constant REDIS_ADDR.
*/
public static final String REDIS_ADDR = "redis://xxx.xxx.xxx.xxx:6379";
/**
* The constant REDIS_PASSWD.
*/
public static final String REDIS_PASSWD = "xxxxxx";

private WxCpTpService wxCpTpService;

/**
* Sets up.
*/
@BeforeMethod
public void setUp() {
wxCpTpService = new WxCpTpServiceApacheHttpClientImpl();
wxCpTpService.setWxCpTpConfigStorage(wxCpTpConfigStorage());
}

/**
* Wx cp tp config storage wx cp tp config storage.
*
* @return the wx cp tp config storage
*/
public WxCpTpConfigStorage wxCpTpConfigStorage() {
return WxCpTpRedissonConfigImpl.builder().corpId(PROVIDER_CORP_ID).providerSecret(PROVIDER_SECRET).wxRedisOps(new RedissonWxRedisOps(redissonClient())).build();
}

/**
* Redisson client redisson client.
*
* @return the redisson client
*/
public RedissonClient redissonClient() {
Config config = new Config();
config.useSingleServer().setAddress(REDIS_ADDR).setConnectTimeout(10 * 1000).setDatabase(6)
.setPassword(REDIS_PASSWD).setConnectionMinimumIdleSize(2).setConnectionPoolSize(2);
return Redisson.create(config);
}

/**
* Test check signature.
*/
Expand Down Expand Up @@ -444,4 +504,14 @@ public void testSetTmpDirFile() {
@Test
public void testGetRequestHttp() {
}

@Test
public void testGetCustomizedAuthUrl() throws WxErrorException {
String state = "test";
List<String> templateIdList = Arrays.asList("");

final WxTpCustomizedAuthUrl customizedAuthUrl = wxCpTpService.getCustomizedAuthUrl(state, templateIdList);
Assert.assertNotNull(customizedAuthUrl);
Assert.assertEquals((long) customizedAuthUrl.getErrcode(), 0);
}
}

0 comments on commit 9b78acd

Please sign in to comment.