蚂蚁金服零号云客服遇到爬坑

  • 一、准备
  • 二、代码
    • 2.1、背景
    • 2.2、依赖
    • 2.3、代码
  • 三、配置回调地址
  • 四、测试

最近接一个sdk,也就是蚂蚁金服零号云客服的一个自定义卡片的功能

一、准备

  • 官方文档
  • 加密解密
  • jar依赖

二、代码

2.1、背景

卡片信息有两种展示,这里使用自带的接口方式展示吧

  • 客户端窗口
  • 客服这边

    此时自定义信息那边都是默认的信息,现在我们想要加上玩家id,玩家姓名和等级

步骤:出于安全考虑,阿里云那边采用加密的方式来传输用户信息。首先由后端java对访客的真实信息进行加密,然后将加密后的信息传给阿里云,再进行解密,最后再展示出解密后的访客信息。

相关依赖以及官方文档在 [这里]

https://help.aliyun.com/document_detail/68241.html?spm=a2c4g.11186623.6.585.1471525cV9FlSF

2.2、依赖

<!-- 这里是引入了本地的jar包 这个jar包可以联系云客服索要 --><dependency><groupId>com.alipay.fc.csplatform</groupId><artifactId>fccsplatform-common-crypto</artifactId><version>1.0.0.20161108</version><scope>system</scope><systemPath>${pom.basedir}/lib/fccsplatform-common-crypto-1.0.0.20161108.jar</systemPath></dependency><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>19.0</version></dependency>

pom.xml中再加上这个,免得打包的时候不能同时带上jar包

<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-dependency-plugin</artifactId><executions><execution><id>copy-dependencies</id><phase>prepare-package</phase><goals><goal>copy-dependencies</goal></goals><configuration><outputDirectory>${project.build.directory}/classes/lib</outputDirectory><includeScope>compile</includeScope></configuration></execution></executions>
</plugin>

2.3、代码

@CrossOrigin
@Controller
@RequestMapping("/api")
@Slf4j
public class GmExclusiveCustomerServicePopupApiController extends BaseController {// 公钥
//    @Value("${business_card_key}")private static String pub_key = "MIIBIjANBgkqhkiG9w********************* ";/*** 阿里云云客服URL*/private static final String HOST_URL = "https://cschat.antcloud.com.cn/index.htm";/*** 租户 ID,由零号云客服提供*/private static final String tntInstId = "*************";/*** 聊天窗编码,由零号云客服提供。(天天)*/private static final String scene = "*************";/*** 对访客信息进行加密, 聊天窗埋点的时候, 生成埋点URL中的cinfo和key参数 使用此方法.** @param request  用户名、用户信息* @param response url地址* @return*/@ResponseBody@RequestMapping(value = "/encryptCard", method = RequestMethod.GET)public R encryptCard(HttpServletRequest request, HttpServletResponse response) {try {String userId = request.getParameter("userId") == null ? "" : request.getParameter("userId");String userName = request.getParameter("userName") == null ? "游客" : request.getParameter("userName");String vip = request.getParameter("vip") == null ? "" : request.getParameter("vip");log.info("userName玩家名称:" + userName);// 个人信息JSONObject extInfo = new JSONObject();extInfo.put("userId", userId);extInfo.put("userName", userName);extInfo.put("vip", vip);JSONObject cinfo = new JSONObject();cinfo.put("tel", "");cinfo.put("extInfo", extInfo);cinfo.put("userId", userId);cinfo.put("cardId", "");cinfo.put("timestamp", System.currentTimeMillis());//生成公钥和私钥,公钥加密,私钥解密log.info("1cinfo:" + cinfo);PublicKey publicKey = getPubKey();log.info("2publicKey:" + publicKey);Map<String, String> map = CustomerInfoCryptoUtil.encryptByPublicKey(cinfo.toString(), publicKey);log.info(cinfo.toString() + "\t加密后的字符串为:" + map);//样例输出, 由于加密含有随机内容, 每次输入不会相同StringBuilder stringBuilder = new StringBuilder(HOST_URL);stringBuilder.append("?tntInstId=" + tntInstId);stringBuilder.append("&scene=" + scene);stringBuilder.append("&key=" + map.get("key"));stringBuilder.append("&cinfo=" + map.get("text"));String url = stringBuilder.toString();log.info("url地址:" + url);return R.ok(url);} catch (Exception e) {log.error(e.toString());return R.error("服务器异常:"+e.toString());}}/*** 通过外部接口方式接入访客名片.* 工作台显示访客信息, 请使用此方法.* note : 本接口必须支持跨域访问.** @param request  params消息体 和 key 公钥* @param response* @return*/@ResponseBody@RequestMapping(value = "/decryptCard")public JSONObject decryptCard(HttpServletRequest request, HttpServletResponse response) {try {//这两个参数是云客服工作台调用该接口 post body带入的参数.String params = request.getParameter("params");String key = request.getParameter("key");log.error("1、回调参数params:"+ params + "key:" + key);log.error("2、回调参数key:"+ key);if (org.springframework.util.StringUtils.isEmpty(params) && org.springframework.util.StringUtils.isEmpty(key)) {log.error("名片参数为空!");}//还原出RSA公钥对象PublicKey publicKey = getPubKey();String cinfo = CustomerInfoCryptoUtil.decryptByPublicKey(URLEncoder.encode(params, "UTF-8"), URLEncoder.encode(key,"UTF-8"), publicKey);log.error("3、还原后的字符串为:" + cinfo);JSONObject jsonObject = JSONObject.parseObject(cinfo);JSONObject extInfo = jsonObject.getJSONObject("extInfo");String userId = extInfo.getString("userId");String userName = extInfo.getString("userName");String vip = extInfo.getString("vip");log.error("3、还原后的字符串为:" + cinfo);//查询到的用户信息按照下面格式拼凑成一个json格式内容, 返回. 请严格按照下面结构形态。note : 自定义参数要在schema中和result下面一一对应.String mockResult = "{\n" +"  \"message\": \"查询成功\", //成功的消息\n" +"  \"success\": true, //表示查询成功\n" +"  \"result\": { //下面是自定义用户信息内容\n" +"    \"userId\": \""+userName+"\",\n" +"    \"userName\": \""+userId+"\",\n" +"    \"vip\": \""+vip+"\",\n" +"    \"schema\": { //会按照 schema 的结构来展示用户信息\n" +"      \"properties\": {\n" +"        \"userId\": {\n" +"          \"name\": \"userId\",\n" +"          \"type\": \"text\"\n" +"        },\n" +"        \"userName\": {\n" +"          \"name\": \"userName\",\n" +"          \"type\": \"text\"\n" +"        },\n" +"        \"vip\": {\n" +"          \"name\": \"vip\",\n" +"          \"type\": \"text\"\n" +"        },\n" +"      }\n" +"    }\n" +"  }\n" +"}";log.error("返回的信息:"+mockResult);return JSONObject.parseObject(mockResult);} catch (Exception e) {//这里建议使用log记录错误. 减少干扰信息, DEMO里不使用LOGe.printStackTrace();return null;}}//还原出 RSA 公钥对象private static PublicKey getPubKey() throws Exception {X509EncodedKeySpec keySpec = new X509EncodedKeySpec(Base64Util.decode(pub_key));KeyFactory keyFactory;keyFactory = KeyFactory.getInstance("RSA");PublicKey key = keyFactory.generatePublic(keySpec);return key;}}

注意:该Controller中的第二个接口必须POST
该接口必须支持跨域请求。
接口协议必须是https。
响应头中 Content-Type 为 application/json; charset=utf-8。

另外:第一个解密信息放在cinfo,然后回调的时候必须用https并且post请求和网址形式。还有在回调的时候你获取的这个key实则他经过转换成私钥了,保证了公钥加密,私钥解密的原则

三、配置回调地址


四、测试

基金网址:xiu.idearyou.cn
后言
本文章来自自己的博客:纯洁的麦田
公众号:纯洁的麦田
百度:纯洁的麦田
新鲜的面试宝典和技术分享和教你玩基金赚钱
欢迎收藏访问

蚂蚁金服零号云客服遇到爬坑相关推荐

  1. 逸创云客服获“金耳唛杯”年度中国最佳客户中心技术产品奖

    2016年10月18日,由客户世界机构.CC-CMM国际标准组织共同主办的第十二届客户世界年度大会在民航国家会议中心举办.在本届大会举办的"金耳唛杯"中国最佳客户中心评选颁奖典礼上 ...

  2. 容联七陌云客服通话超强稳定,今通国际客户服务更加便捷

    今通国际,是从2009年开始上线运营的,业内第一个具备国际票价自动计算能力的B2B机票交易平台.目前已汇集了全球一千多家供应商,为客户提供最合理的飞行线路及最优惠的票价.今通国际在降低团队机票购买成本 ...

  3. 揭秘阿里百亿级云客服实时分析架构是怎么炼成的?

    揭秘阿里百亿级云客服实时分析架构是怎么炼成的? 淘宝.天猫每天有上亿个不同的买卖家进行对话,产生百亿条聊天记录.对客服聊天记录的实时分析是实现智能客服的基础.本文主要分享云客服的整体架构,包括实时分析 ...

  4. 巨头切入,或将改变云客服市场

    随着相关部门的支持,企业的重视,云计算开始进入高速发展期.曾经虚无缥缈令人不知所措的"云"如今切实的摆在了企业和用户的眼前,大众对于云计算的认知也从基础逐渐向熟识过渡.对于云计算而 ...

  5. 在线云客服管理系统、会话管理、访客管理、客户管理、工单管理、会话记录、考勤统计、数据报表、工单设置、全局设置、转人工服务、自动回复、客户标签、客服监控、客服系统、前端会话、客服管理、在线客服、人工客服

    在线云客服管理系统.会话管理.访客管理.客户管理.工单管理.会话记录.考勤统计.数据报表.工单设置.全局设置.转人工服务.自动回复.客户标签.客服监控.客服系统.前端会话.客服管理.在线客服 .人工客 ...

  6. 阿里云推出企业级智能协同办公方案 云桌面、云AP、云客服一应俱全

    6月10日,云栖大会·上海峰会上,阿里云推出了基于云计算的企业办公解决方案------阿里云办公,该方案涵盖了阿里邮箱.云AP.云投屏.音视频会议系统.云桌面.审批.设备安全.云客服等产品和服务,帮助 ...

  7. 云客服让每一个企业客户都成为座上宾

    有的时候你会为客服电话而感到烦扰,有的时候你又急切的需要客服的应答,客服就是这样一个让人又爱又恨的存在. 早年呼叫中心在传统企业中几乎是标配,在20年间呼叫中心不但没有消失,反而迅速的成长,随着整个通 ...

  8. 合力亿捷云客服3.0 开启“全员客服”新时代

    云计算细分市场的竞争号角从很早之前就已经打响,尤其在云通讯领域更是有大量的公司涌入.作为2008年就开启云客服的合力亿捷来讲无疑是行业中的先行者. 2016年7月7日,北京合力亿捷科技股份有限公司(简 ...

  9. 合力亿捷发布云客服3.0,开启全员客服新时代

    近日,北京合力亿捷科技股份有限公司,正式发布2016云客服3.0产品,帮助企业提升移动接入和内部协同能力,开启"全员客服"新时代.合力亿捷的数百家重量级客户嘉宾受邀出席了此次发布会 ...

最新文章

  1. php作为文本进行处理,PHP处理文本和爬虫技巧
  2. 中国信通院:2019年Q1全球人工智能产业数据报告
  3. Compmgmtlauncher.exe问题解决方法
  4. 简单超级组计划 打造强悍手臂
  5. 【收藏】在QGIS中添加Google Maps地图和卫星影像
  6. IntelliJ IDEA for Mac 在eclipse(MacOS)模式下的快捷键
  7. 让LwIP拥有PING其他设备的能力
  8. 大数据技术之Hadoop3.1.2版本完全分布式部署搭建
  9. 将一正整数序列{K1,K2,…,K9}重新排成一个新的序列。新序列中,比K1小的数都在K1的左面(后续的再向左存放),比K1大的数都在K1的右面(后续的再向右存放),从K1向右扫描
  10. MongoDB 复制集的结构以及基本概念
  11. 原生Servlet文件上传和下载Servlet多个文件上传
  12. 离散数学与c语言程序设计,2016年中山大学数据科学与计算机学院S6705002离散数学与C程序设计)之C程序设计复试笔试最后押题五套卷...
  13. 电脑计算机稳定删除垃圾游戏,电脑卡怎么办简单步骤_如何清理电脑垃圾
  14. JavaCV开发详解之27补充篇1:使用javacv把音视频切割成多个音频分片文件,以mp3为例,把视频切割成MP3分片文件
  15. 从零开始学python第八篇
  16. 释放租赁红利,中国长租公寓行业创新模式探讨和分析
  17. 《联邦学习实战》杨强 读书笔记十七——联邦学习加速方法
  18. oracle取上行数据进行填充
  19. AURIX Development Studio 使用
  20. 好用计算机,六款让你电脑更好用的软件

热门文章

  1. Video size 视频尺寸和名称
  2. Linux中rm命令介绍
  3. 大学生课程设计-基于SSM的物业管理系统-智能小区物业系统代码java-社区物业水电缴费系统代码jsp
  4. Gulp编译、合并、压缩,以及Browsersync实时刷新教程
  5. php判断单选框是否被选中,JQuery form验证单选框是否选中经验总结
  6. w ndows哪个版本好用2019年,关于高通骁龙8cx PC平台的11个问题
  7. 魔兽怀旧卓越服务器微信,魔兽怀旧服玩家吐槽:没有了工作室后,永久60级服务器一地鸡毛...
  8. 计算机系应届生求职指北
  9. JAVA2实验3分支与循环语句,实验3控制语句:分支、循环.doc
  10. java抽象类创建_Java抽象类