接口调用


一、线上学习资料

描述 地址
线上接口文档 https://open.diwork.com/#/doc-center
线上测试代码 https://gitee.com/ecological-technology_admin/isv-api-demo.git
用友云市场地址 https://market.yonyoucloud.com/

二、代码demo讲解

1.修改配置文件

下载下来代码,需要修改两个点:

2.修改授权回调URL

修改应用授权回调地址URL为外网可以访问的 图1.1

图1.1

注:该回调URL很重要,若不对的话,会影响ticket推送失败;若是正式应用的,不但影响ticket推送,还会导致用户购买下单开通异常!(需要修改正确回调URL后,服务商手动点击重新开通)

3.代码获取ticket和租户id

1)页面手动推送ticket
图1.1
后台获取到了ticket,demo里已写了相关代码会把它存储到redis中。(正式应用一般会采用第一种方式自动推送ticket,然而平台是定期20分钟推送一次,所以建议服务商写的代码中也通过redis设置有效期为20分钟)

请求到了后台类:PushAuthController类的 authCallbackHandler方法,获取到ticket

图1.1

2)授权获取租户id
授权步骤:

  • 生态应用-沙箱环境
  • 授权
  • 选择 ‘领域’,‘移动分类’
    图1.1
    图1.1
    然后后台就会收到一条订单信息 也是请求的后台类:PushAuthController类的 authCallbackHandler方法,获取到租户id
    图1.1
    上一步的授权行为,模拟了用户的购买行为,
    并收到一个订单信息,其中就包含租户id, authTenantId: jar*qo

然后在demo项目里设置对应的该租户id 图1.1
服务商可以通过表来储存租户id,因为可能对多租户提供服务(租户之间是数据隔离)

authCallbackHandler方法体:

    /**
     * @param holder 加密后的消息载体
     * @return success
     * @throws IOException
     */
    @PostMapping("/auth/push")
    public String authCallbackHandler(@RequestBody EncryptionHolder holder) throws IOException {

        // 构建解密验签处理对象
        IsvEventCrypto crypto = new IsvEventCrypto(suiteSecret, EncodingAESKey, suiteKey);
        // 验签解密后的消息体
        String decryptMessage = crypto.decryptMsg(holder);
        // 反序列化后的消息内容对象
        EventContent content = mapper.readValue(decryptMessage, EventContent.class);

        // 套件票据推送事件
        if (content.getType() == IsvEventType.SUITE_TICKET) {
            LOGGER.info("新的票据推送事件, suitekey: {}, suiteTicket: {}", content.getSuiteKey(), content.getSuiteTicket());
            redis.set(cacheSuiteTicket,content.getSuiteTicket(),cacheSuiteTicketTime);
            handleTicketPush(content);
        }

        // 套件租户授权事件
        if (content.getType() == IsvEventType.SUITE_AUTH) {
            LOGGER.info("新的授权事件, suitekey: {}, authTenantId: {}", content.getSuiteKey(), content.getAuthTenantId());
            LOGGER.info("order id: {}", content.getOrder());
            handleAuthPush(content);
        }
        // 处理成功,回复 "success" 告知开放平台,否则开放平台会重试推送,每分钟一次,重试 60 次
        return "success";
    }

4.测试接口 (根据手机号邮箱用户名分页查询租户下用户)

注:调用的接口需要授权了,才可以调用,授权方式查看 第三节 API授权的最后一部分
接口调用的url、方式、入参及返回值,可以查看开发平台接口的具体调用调用文档

/**
 * 员工信息测试类
 */
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserInfoTest{

    @Autowired
    private UserInfoService userInfo;

    /**
     * 根据手机号邮箱用户名分页查询租户下用户
     {
        "index":"1",
        "size":"10",
        "sortType":"userName",
        "searchcode":"18210666666"
     }
     */
    @Test
    public void getUserInfoDetailByPhone() throws Exception {
        JSONObject jsonObject = userInfo.detail2("17600888888");
        System.out.println(jsonObject.toJSONString());
    }

}

service层代码调用openAPI接口:


/**
 * 员工信息接口
 */
@Component
public class UserInfoService extends BaseApi{

    @Value("${api.user.info2}")
    private String detail_uri2;

    /*
     {
     "index":"1",
     "size":"10",
     "sortType":"userName",
     "searchcode":"18210885020"
     }
     */
    public JSONObject detail2(String searchcode) throws Exception {
        Map<String, Object> params  = new HashMap<String, Object>();
        params.put("index","1");
        params.put("size","10");
        params.put("sortType","userName");
        params.put("searchcode",searchcode);
        JSONObject jsonObject = doPost(detail_uri2, params, JSONObject.class);
        return jsonObject;
    }

}

图1.1

Copyright © 用友 -【生态技术部】 2021 all right reserved,powered by Gitbook修订时间: 2021-09-29 17:44:21

results matching ""

    No results matching ""