全部产品
弹性计算 会员服务 网络 安全 移动云 数加·大数据分析及展现 数加·大数据应用 管理与监控 云通信 阿里云办公 培训与认证 智能硬件
存储与CDN 数据库 域名与网站(万网) 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网 更多

示例及详细步骤

更新时间:2018-05-09 18:27:48

本文简要介绍如何把座席工作台Web组件嵌入到基于BS结构的自有系统中。座席工作台Web组件提供了所有和座席相关的功能,比如接打电话、电话保持等,通过把座席工作台Web组件集成到自有系统中,可以实现和自有系统的联动,比如来电弹屏,或者单击电话号码自动呼出等。为了达成这一目标,需要如下几个步骤:

  • 实现基于OAuth2的单点登录
  • 实现来自客户端(浏览器端)的请求的转发
  • 座席工作台Web组件和自有客户端的集成

如果您需要示例代码,请提交工单,请在工单里注明您的阿里云账户UID以及您所创建的阿里云呼叫中心示例的访问地址, 比如ccc.aliyun.com/workbench/demo。

基于OAuth2的单点登录

为了使用基于OAuth2的单点登录方案,请参考Oauth2集成应用注册获取相应的client_id和client_secret,比如https://crm.company.com/aliyun/auth/callback. 请注意云呼叫中心使用WebRTC协议进行语音传输,因此必须使用HTTPS协议。

获取授权码

当用户尚未获取到阿里云颁发的令牌时,请引导用户到https://signin.aliyun.com/oauth2/v1/auth 进行申请

  1. String state = UUID.randomUUID().toString();
  2. String nonce = randomString.nextString();
  3. storeStateInSession(httpServletRequest.getSession(), state, nonce);
  4. return "https://signin.aliyun.com/oauth2/v1/auth"
  5. + "?response_type=code&response_mode=form_post"
  6. + "&redirect_uri=" + URLEncoder.encode(callbackUrl, "UTF-8")
  7. + "&client_id=" + ClientId
  8. + "&state=" + state
  9. + "&codeChallenge=" + nonce
  10. + "&access_type=offline";

请注意nonce的长度必须是45位。

在申请的过程中,需要用户输入他/她在阿里云的子账户用户名和密码,阿里云验证成功后通过您注册的授权码的回调地址返回授权码。

通过授权码换取Access Token

接收到授权码后,需要通过授权码获取Access Token.

  1. List<NameValuePair> params = new ArrayList<NameValuePair>();
  2. params.add(new NameValuePair("client_id", aliyunClientId));
  3. params.add(new NameValuePair("grant_type", "authorization_code"));
  4. params.add(new NameValuePair("client_secret", aliyunClientSecret));
  5. params.add(new NameValuePair("code", authorizationCode.getValue()));
  6. params.add(new NameValuePair("redirect_uri", requestUrl));
  7. params.add(new NameValuePair("code_verifier", nonce));
  8. NameValuePair[] pairs = new NameValuePair[params.size()];
  9. return HttpRequester.post("https://oauth.aliyun.com/v1/token", params.toArray(pairs));

实现来自客户端(浏览器端)的请求的转发

获取到Access Token后,就可以通过它和阿里云呼叫中心提供的OpenAPI来访问呼叫中心的资源了。

首先引入以下Jar包

  1. <dependency>
  2. <groupId>com.aliyun</groupId>
  3. <artifactId>aliyun-java-sdk-core</artifactId>
  4. <version>3.7.1</version>
  5. </dependency>

相关代码如下:

  1. DefaultProfile profileBear = DefaultProfile.getProfile(REGION);
  2. profileBear.addEndpoint(ENDPOINT, REGION, PRODUCT, DOMAIN);
  3. BearerTokenCredentials bearerTokenCredentials =
  4. new BearerTokenCredentials(accessToken);
  5. DefaultAcsClient accessTokenClient = new DefaultAcsClient(profileBear, bearerTokenCredentials);
  6. accessTokenClient.setAutoRetry(false);
  7. /**
  8. * 使用CommonAPI调用POP API时,和使用传统产品SDK相比,请求和返回参数的格式都有所不同,因此需要进行一定的格式转换。
  9. */
  10. CommonRequest commonRequest = new CommonRequest();
  11. commonRequest.setDomain(DOMAIN);
  12. commonRequest.setVersion(VERSION);
  13. commonRequest.setAction(action);
  14. JSONObject jsonObject = JSONObject.parseObject(request);
  15. for (Entry<String, Object> entry : jsonObject.entrySet()) {
  16. String key = entry.getKey().trim();
  17. if (key.length() > 1) {
  18. key = key.substring(0, 1).toUpperCase() + key.substring(1);
  19. } else if (key.length() == 1) {
  20. key = key.toUpperCase();
  21. } else {
  22. continue;
  23. }
  24. commonRequest.putQueryParameter(key, entry.getValue().toString());
  25. }
  26. commonRequest.putQueryParameter("accessToken", accessToken);
  27. CommonResponse response = null;
  28. try {
  29. response = accessTokenClient.getCommonResponse(commonRequest);
  30. System.out.println(JSONObject.toJSONString(response.getData()));
  31. } catch (ClientException e) {
  32. logger.error("Failed to invoke open API, request=" + JSON.toJSONString(commonRequest), e);
  33. throw new CallCenterServiceException(e.getRequestId(), e.getErrCode(), e.getMessage());
  34. }

座席工作台Web组件和自有客户端的集成

请参考座席工作台Web组件一节的内容。

本文导读目录