GithubHelp home page GithubHelp logo

imhuzi / qiye-wechat Goto Github PK

View Code? Open in Web Editor NEW
23.0 3.0 13.0 522 KB

基于 Feign 实现的企业微信 JAVA SDK, 覆盖 企业微信 所有API,spring-boot-starter 支持 可快速接入

Home Page: https://qiye.chat

License: Apache License 2.0

Java 100.00%
sdk java-sdk qiye-wechat wecom

qiye-wechat's Introduction

介绍

争取 做最好用的 企业微信 SDK, 帮助开发者 以最方便 最省时间的方式接入企业微信。qiye-wechat-sdk 基于 Figen 封装, 覆盖 企业微信 所有API

Quick Start

Spring Boot 项目

Spring Boot 项目 使用步骤如下:

  1. 引入maven依赖
 <dependency>
    <groupId>chat.qiye.wechat</groupId>
    <artifactId>qiye-wechat-spring-boot-starter</artifactId>
    <version>1.0.0-SNAPSHOT</version>
 </dependency>
  1. 在 application.yaml 中加入 如下配置
qiye:
  wechat:
    corp-id: ww5f09c98e13dfce02
    apps:
      - app-id: 1000015
        agent-id: 1000015
        app-type: app
        secret: VYa3q7u-XkhQno-ROferY3mD16eFy_-h62pHJ0qM58I
      - app-id: contact
        agent-id: 88
        app-type: contact
        secret: okDLF2MXt3QRGfAQ2cENzNUxfLd3c-_vn60etURj0SY
  1. 使用 相关 Api Bean
@RestController
public class DeptController {

    @Resource
    ContactDeptApi contactDeptApi;

    @GetMapping("/list")
    public ContactDeptListResp list(@RequestParam(defaultValue = "0") Integer id) {
        return contactDeptApi.list(id);
    }
}

普通java项目 配置

普通 的Java 项目使用步骤如下:

  1. 引入maven依赖
  <dependency>
            <groupId>chat.qiye.wechat</groupId>
            <artifactId>qiye-wechat-sdk</artifactId>
            <version>1.0.0-SNAPSHOT</version>
        </dependency>

        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-1.2-api</artifactId>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
        </dependency>
  1. 在 resources 目录下 放一个 qiye-wechat.properties 配置文件
# 应用配置
qiye.wecaht.appId=1000015
qiye.wecaht.agentId=1000015
qiye.wecaht.secret=VYa3q7u-XkhQno-ROferY3mD16eFy_-h62pHJ0qM58I
qiye.wecaht.corpId=ww5f09c98e13dfce02
qiye.wecaht.homeUrl=http://baidu.com
qiye.wecaht.eventToken=ss
qiye.wecaht.eventEncodingAesKey=sddd

# 系统 应用配置格式, 系统应用ID参考 chat.qiye.wechat.sdk.constant.AppTypeEnum
# qiye.wecaht.系统应用ID.appId=contact
# qiye.wecaht.系统应用ID.agentId=88
# qiye.wecaht.系统应用ID.secret=okDLF2M1tkQRGfAQ2cENzNUxfLd3c-_vn60etURj0SY
# qiye.wecaht.系统应用ID.corpId=ww5f09c98e13dfce02   # 可选,未配置使用  qiye.wecaht.corpId
# qiye.wecaht.系统应用ID.homeUrl=http://baidu.com
# qiye.wecaht.系统应用ID.eventToken=ss
# qiye.wecaht.系统应用ID.eventEncodingAesKey=sddd

# 系统-通讯录应用
qiye.wecaht.contact.appId=contact
qiye.wecaht.contact.agentId=88
qiye.wecaht.contact.secret=okDLF2MXt3QRGfAQ2cENzNUxfLd3c-_vn60etURj0SY
qiye.wecaht.contact.corpId=ww5f09c98e13dfce02
qiye.wecaht.contact.homeUrl=http://baidu.com
qiye.wecaht.contact.eventToken=ss
qiye.wecaht.contact.eventEncodingAesKey=sddd
  1. API调用
public class MainClass {
    public static void main(String[] args) {
        // 获取Api实例, 所有封装的Api 都在 chat.qiye.wechat.sdk.api 包下,并以Api结尾
        ContactDeptApi contactDeptApi = ApiFactory.getApiBean(ContactDeptApi.class, new ApiConfigurationDefaultProvider());
        // 查询 通讯录 部门列表
        List<ContactDeptVo> deptVoList = contactDeptApi.list(0).getDepartment();
        System.out.println("DeptList:" + deptVoList);
        // 创建部门
        ContactDeptVo contactDeptVo = new ContactDeptVo();
        contactDeptVo.setId(2);
        contactDeptVo.setName("测试部");
        contactDeptVo.setNameEn("test");
        contactDeptVo.setParentid(1);
        ContactDeptCreateResp resp = contactDeptApi.create(contactDeptVo);

        if (resp.success()) {
            RespStatus ret = contactDeptApi.delete(resp.getId());
            System.out.println("delete result:" + ret);
        }
    }
}

进阶配置

多个企业微信内部应用

多个企业微信服务商应用

系统应用ID

系统应用 默认是 没有应用ID 但是 系统应用有单独的 secret,为了能够识别 系统应用的 secret 特此 对系统应用的id 进行统一定义,在配置文件中 配置时,需遵守如下名称

 DEFAULT("app", "自建应用"),
 APP_CONTACT("contact", "通讯录"),
 APP_CUSTOMER("customer", "客户关系"),
 APP_CUSTOMER_SERVICE("customer_service", "微信客服"),
 APP_MEETING("meeting", "会议"),
 APP_SCHEDULE("schedule", "日程"),
 APP_PUBLIC_PHONE("public_phone", "公费电话"),
 APP_WX_DRIVE("wx_drive", "微盘"),
 APP_LIVING("living", "直播"),
 APP_CHECK_IN("check_in", "打卡"),
 APP_APPROVAL("approval", "审批"),
 APP_REPORT("report", "汇报"),
 APP_MEETING_ROOM("meeting_room", "会议室"),
 APP_PSTNCC("pstncc", "紧急通知"),
 APP_SCHOOL_CONTACT("school_contact", "家校通讯录");

qiye-wechat's People

Contributors

imhuzi avatar sxqsfun avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

qiye-wechat's Issues

企业微信获取客户详情API json解析异常

问题复现

public class CustomerApiTest extends BaseJunitTest {
    @Resource
    private ContactDeptApi contactDeptApi;
    @Resource
    private ContactUserApi contactUserApi;
    @Resource
    private CustomerApi customerApi;

    @Test
    public void testGetCustomerAuto() {
        List<ContactDeptVo> departments = contactDeptApi.list(0).getDepartment();
        if (!CollectionUtils.isEmpty(departments)) {
            ContactUserListResp list = contactUserApi.list(departments.get(0).getId(), 0);
            if (!CollectionUtils.isEmpty(list.getUserlist())) {
                List<String> externalUserids = customerApi.list(list.getUserlist().get(1).getUserid()).getExternalUserid();
                List<CustomerGetResp.FollowUser> followUsers = customerApi.get(externalUserids.get(0), null).getFollowUser();
                if (!CollectionUtils.isEmpty(followUsers)) {
                    List<String> remarkMobiles = followUsers.get(0).getRemarkMobiles();
                    System.out.println("remarkMobiles:" + remarkMobiles.get(0));
                }
            }
        }
    }
}

异常内容:

[ContactUserApi#list] ---> GET https://qyapi.weixin.qq.com/cgi-bin/user/list?department_id=....... HTTP/1.1
[ContactUserApi#list] ---> END HTTP (0-byte body)
[ContactUserApi#list] <--- HTTP/1.1 200  (223ms)
[ContactUserApi#list] content-length: 1359
[ContactUserApi#list] content-type: application/json; charset=UTF-8
[ContactUserApi#list] date: Fri, 15 Apr 2022 02:00:02 GMT
[ContactUserApi#list] error-code: 0
[ContactUserApi#list] error-msg: ok. WARNING: field `fetch_child` expect type `uint32`.
[ContactUserApi#list] server: nginx
[ContactUserApi#list] 
[ContactUserApi#list] {"errcode":0,"errmsg":"ok. WARNING: field `fetch_child` expect type `uint32`. ","userlist":[{....下面给出结构...}]}
[ContactUserApi#list] <--- END HTTP (1359-byte body)
[ContactUserApi#list] <--- ERROR MismatchedInputException: Cannot deserialize value of type `java.lang.Integer` from Array value (token `JsonToken.START_ARRAY`)
 at [Source: (BufferedReader); line: 1, column: 404] (through reference chain: chat.qiye.wechat.sdk.api.contact.resp.ContactUserListResp["userlist"]->java.util.ArrayList[0]->chat.qiye.wechat.sdk.api.contact.resp.ContactUserGetResp["order"]) (223ms)
[ContactUserApi#list] com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize value of type `java.lang.Integer` from Array value (token `JsonToken.START_ARRAY`)
 at [Source: (BufferedReader); line: 1, column: 404] (through reference chain: chat.qiye.wechat.sdk.api.contact.resp.ContactUserListResp["userlist"]->java.util.ArrayList[0]->chat.qiye.wechat.sdk.api.contact.resp.ContactUserGetResp["order"])
	at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:59)
	at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1601)
	at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1375)
	at com.fasterxml.jackson.databind.deser.std.StdDeserializer._deserializeFromArray(StdDeserializer.java:222)
	at com.fasterxml.jackson.databind.deser.std.StdDeserializer._parseInteger(StdDeserializer.java:798)
	at com.fasterxml.jackson.databind.deser.std.NumberDeserializers$IntegerDeserializer.deserialize(NumberDeserializers.java:531)
	at com.fasterxml.jackson.databind.deser.std.NumberDeserializers$IntegerDeserializer.deserialize(NumberDeserializers.java:506)
	at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:129)
	at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:324)
	at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:187)
	at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer._deserializeFromArray(CollectionDeserializer.java:355)
	at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:244)
	at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:28)
	at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:129)
	at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:324)
	at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:187)
	at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:322)
	at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4593)
	at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3577)
	at feign.jackson.JacksonDecoder.decode(JacksonDecoder.java:63)
	at feign.AsyncResponseHandler.decode(AsyncResponseHandler.java:115)
	at feign.AsyncResponseHandler.handleResponse(AsyncResponseHandler.java:87)
	at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:138)
	at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:89)
	at feign.hystrix.HystrixInvocationHandler$1.run(HystrixInvocationHandler.java:109)
	at com.netflix.hystrix.HystrixCommand$2.call(HystrixCommand.java:302)
	at com.netflix.hystrix.HystrixCommand$2.call(HystrixCommand.java:298)
	at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:46)
	at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:35)
	at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)
	at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)
	at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)
	at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)
	at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)
	at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)
	at rx.Observable.unsafeSubscribe(Observable.java:10327)
	at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:51)
	at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:35)
	at rx.Observable.unsafeSubscribe(Observable.java:10327)
	at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:41)
	at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:30)
	at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)
	at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)
	at rx.Observable.unsafeSubscribe(Observable.java:10327)
	at rx.internal.operators.OperatorSubscribeOn$SubscribeOnSubscriber.call(OperatorSubscribeOn.java:100)
	at com.netflix.hystrix.strategy.concurrency.HystrixContexSchedulerAction$1.call(HystrixContexSchedulerAction.java:56)
	at com.netflix.hystrix.strategy.concurrency.HystrixContexSchedulerAction$1.call(HystrixContexSchedulerAction.java:47)
	at com.netflix.hystrix.strategy.concurrency.HystrixContexSchedulerAction.call(HystrixContexSchedulerAction.java:69)
	at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55)
	at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	at java.base/java.lang.Thread.run(Thread.java:829)

[ContactUserApi#list] <--- END ERROR

com.netflix.hystrix.exception.HystrixRuntimeException: ContactUserApi#list(Integer,Integer) failed and no fallback available.

	at com.netflix.hystrix.AbstractCommand$22.call(AbstractCommand.java:822)
	at com.netflix.hystrix.AbstractCommand$22.call(AbstractCommand.java:807)
	at rx.internal.operators.OperatorOnErrorResumeNextViaFunction$4.onError(OperatorOnErrorResumeNextViaFunction.java:140)
	at rx.internal.operators.OnSubscribeDoOnEach$DoOnEachSubscriber.onError(OnSubscribeDoOnEach.java:87)
	at rx.internal.operators.OnSubscribeDoOnEach$DoOnEachSubscriber.onError(OnSubscribeDoOnEach.java:87)
	at com.netflix.hystrix.AbstractCommand$DeprecatedOnFallbackHookApplication$1.onError(AbstractCommand.java:1472)
	at com.netflix.hystrix.AbstractCommand$FallbackHookApplication$1.onError(AbstractCommand.java:1397)
	at rx.internal.operators.OnSubscribeDoOnEach$DoOnEachSubscriber.onError(OnSubscribeDoOnEach.java:87)
	at rx.observers.Subscribers$5.onError(Subscribers.java:230)
	at rx.internal.operators.OnSubscribeThrow.call(OnSubscribeThrow.java:44)
	at rx.internal.operators.OnSubscribeThrow.call(OnSubscribeThrow.java:28)
	at rx.Observable.unsafeSubscribe(Observable.java:10327)
	at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:51)
	at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:35)
	at rx.Observable.unsafeSubscribe(Observable.java:10327)
	at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:41)
	at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:30)
	at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)
	at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)
	at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)
	at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)
	at rx.Observable.unsafeSubscribe(Observable.java:10327)
	at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:41)
	at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:30)
	at rx.Observable.unsafeSubscribe(Observable.java:10327)
	at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:41)
	at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:30)
	at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)
	at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)
	at rx.Observable.unsafeSubscribe(Observable.java:10327)
	at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:41)
	at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:30)
	at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)
	at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)
	at rx.Observable.unsafeSubscribe(Observable.java:10327)
	at rx.internal.operators.OperatorOnErrorResumeNextViaFunction$4.onError(OperatorOnErrorResumeNextViaFunction.java:142)
	at rx.internal.operators.OnSubscribeDoOnEach$DoOnEachSubscriber.onError(OnSubscribeDoOnEach.java:87)
	at rx.internal.operators.OnSubscribeDoOnEach$DoOnEachSubscriber.onError(OnSubscribeDoOnEach.java:87)
	at com.netflix.hystrix.AbstractCommand$HystrixObservableTimeoutOperator$3.onError(AbstractCommand.java:1194)
	at rx.internal.operators.OperatorSubscribeOn$SubscribeOnSubscriber.onError(OperatorSubscribeOn.java:80)
	at rx.observers.Subscribers$5.onError(Subscribers.java:230)
	at rx.internal.operators.OnSubscribeDoOnEach$DoOnEachSubscriber.onError(OnSubscribeDoOnEach.java:87)
	at rx.observers.Subscribers$5.onError(Subscribers.java:230)
	at com.netflix.hystrix.AbstractCommand$DeprecatedOnRunHookApplication$1.onError(AbstractCommand.java:1431)
	at com.netflix.hystrix.AbstractCommand$ExecutionHookApplication$1.onError(AbstractCommand.java:1362)
	at rx.observers.Subscribers$5.onError(Subscribers.java:230)
	at rx.observers.Subscribers$5.onError(Subscribers.java:230)
	at rx.internal.operators.OnSubscribeThrow.call(OnSubscribeThrow.java:44)
	at rx.internal.operators.OnSubscribeThrow.call(OnSubscribeThrow.java:28)
	at rx.Observable.unsafeSubscribe(Observable.java:10327)
	at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:51)
	at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:35)
	at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)
	at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)
	at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)
	at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)
	at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)
	at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)
	at rx.Observable.unsafeSubscribe(Observable.java:10327)
	at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:51)
	at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:35)
	at rx.Observable.unsafeSubscribe(Observable.java:10327)
	at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:41)
	at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:30)
	at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)
	at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)
	at rx.Observable.unsafeSubscribe(Observable.java:10327)
	at rx.internal.operators.OperatorSubscribeOn$SubscribeOnSubscriber.call(OperatorSubscribeOn.java:100)
	at com.netflix.hystrix.strategy.concurrency.HystrixContexSchedulerAction$1.call(HystrixContexSchedulerAction.java:56)
	at com.netflix.hystrix.strategy.concurrency.HystrixContexSchedulerAction$1.call(HystrixContexSchedulerAction.java:47)
	at com.netflix.hystrix.strategy.concurrency.HystrixContexSchedulerAction.call(HystrixContexSchedulerAction.java:69)
	at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55)
	at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	at java.base/java.lang.Thread.run(Thread.java:829)
Caused by: feign.FeignException: Cannot deserialize value of type `java.lang.Integer` from Array value (token `JsonToken.START_ARRAY`)
 at [Source: (BufferedReader); line: 1, column: 404] (through reference chain: chat.qiye.wechat.sdk.api.contact.resp.ContactUserListResp["userlist"]->java.util.ArrayList[0]->chat.qiye.wechat.sdk.api.contact.resp.ContactUserGetResp["order"]) reading GET https://qyapi.weixin.qq.com/cgi-bin/user/list?department_id=1&fetch_child=0&access_token=tY7aEM8xhwJAhfBL9Yv1njkDQItu6NhJhpxp3McxPOwQZDrWKY1XqvZqHKRfKcj_DR5PJw9gDDN7irpmDOmAKFVCMPoFM03X3gDK1Fc5clwgsi9d3sa8yD-UsZXd7AsKdkjwbzitUNHBCCDMeKllEI34JtyQoJfahAztRcOWhloovONNRozM45Rpsr5kBG-Rl72slVFgdUp75rD-I17vlg
	at feign.FeignException.errorReading(FeignException.java:151)
	at feign.AsyncResponseHandler.handleResponse(AsyncResponseHandler.java:102)
	at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:138)
	at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:89)
	at feign.hystrix.HystrixInvocationHandler$1.run(HystrixInvocationHandler.java:109)
	at com.netflix.hystrix.HystrixCommand$2.call(HystrixCommand.java:302)
	at com.netflix.hystrix.HystrixCommand$2.call(HystrixCommand.java:298)
	at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:46)
	... 26 more
Caused by: com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize value of type `java.lang.Integer` from Array value (token `JsonToken.START_ARRAY`)
 at [Source: (BufferedReader); line: 1, column: 404] (through reference chain: chat.qiye.wechat.sdk.api.contact.resp.ContactUserListResp["userlist"]->java.util.ArrayList[0]->chat.qiye.wechat.sdk.api.contact.resp.ContactUserGetResp["order"])
	at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:59)
	at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1601)
	at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1375)
	at com.fasterxml.jackson.databind.deser.std.StdDeserializer._deserializeFromArray(StdDeserializer.java:222)
	at com.fasterxml.jackson.databind.deser.std.StdDeserializer._parseInteger(StdDeserializer.java:798)
	at com.fasterxml.jackson.databind.deser.std.NumberDeserializers$IntegerDeserializer.deserialize(NumberDeserializers.java:531)
	at com.fasterxml.jackson.databind.deser.std.NumberDeserializers$IntegerDeserializer.deserialize(NumberDeserializers.java:506)
	at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:129)
	at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:324)
	at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:187)
	at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer._deserializeFromArray(CollectionDeserializer.java:355)
	at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:244)
	at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:28)
	at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:129)
	at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:324)
	at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:187)
	at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:322)
	at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4593)
	at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3577)
	at feign.jackson.JacksonDecoder.decode(JacksonDecoder.java:63)
	at feign.AsyncResponseHandler.decode(AsyncResponseHandler.java:115)
	at feign.AsyncResponseHandler.handleResponse(AsyncResponseHandler.java:87)
	... 32 more

问题产生原因

由于企业微信接口json对象字段和类型改了,导致解析失败
现json如下:

{
  "errcode": 0,
  "errmsg": " ",
  "userlist": [
    {
      "userid": "",
      "name": "",
      "department": [
        1
      ],
      "position": "",
      "mobile": "",
      "gender": "1",
      "email": "",
      "avatar": "",
      "status": 1,
      "enable": 1,
      "isleader": 0,
      "extattr": {
        "attrs": []
      },
      "hide_mobile": 0,
      "telephone": "",
      "order": [
        0
      ],
      "main_department": 1,
      "qr_code": "",
      "alias": "",
      "is_leader_in_dept": [
        0
      ],
      "thumb_avatar": "",
      "direct_leader": [],
      "biz_mail": ""
    },
    {
      "userid": "",
      "name": "",
      "department": [
        1
      ],
      "position": "",
      "mobile": "",
      "gender": "2",
      "email": "",
      "avatar": "",
      "status": 1,
      "enable": 1,
      "isleader": 1,
      "extattr": {
        "attrs": []
      },
      "hide_mobile": 0,
      "telephone": "",
      "order": [
        0
      ],
      "main_department": 1,
      "qr_code": "",
      "alias": "",
      "is_leader_in_dept": [
        1
      ],
      "thumb_avatar": "",
      "direct_leader": [],
      "biz_mail": ""
    }
  ]
}

相比目前main分支的对象
需要修改的字段有:

//  private Integer order;
  private Integer[] order;

需要新增的字段有:

private Integer enable;
  private Integer isleader;
  @JsonProperty("hide_mobile")
  private Integer hideMobile;
  @JsonProperty("direct_leader")
  private String[] directLeader;
  @JsonProperty("biz_mail")
  private String bizMail;

ps:额外提一下,可以完善一个提issue的模板。

加强接入企微配置的渠道

1.目前支持从spring文件、指定文件加载组织配置(针对密钥在文件中建议支持可加密的版本)
2.是否可以增加其他渠道,例如数据库、缓存、配置中心等

spring-boot-starter 支持 企业微信 事件通知极简接入

企业内部开发相关事件
通讯录回调通知: https://open.work.weixin.qq.com/api/doc/90000/90135/90966
客户关系客户变更事件通知: https://open.work.weixin.qq.com/api/doc/90000/90135/92128
客服消息事件通知: https://open.work.weixin.qq.com/api/doc/90000/90135/94667
(自建或者第三方)应用消息: https://open.work.weixin.qq.com/api/doc/90000/90135/90235
自建应用-审批流程引擎事件: https://open.work.weixin.qq.com/api/doc/90000/90135/90269
日程回调事件: https://open.work.weixin.qq.com/api/doc/90000/90135/93651
直播回调事件: https://open.work.weixin.qq.com/api/doc/90000/90135/94145
会话内容存档回调事件: https://open.work.weixin.qq.com/api/doc/90000/90135/95039
家校通讯录变更回调事件: https://open.work.weixin.qq.com/api/doc/90000/90135/92031

争取达到 针对以上事件都可以全面支持,并且接入简单

需求采集

企业 微信 SDK 和 快速开发的手脚架 正在开发中,大家有相关需求的 都可以在这里记录下来,我尽量完善满足

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.