开放平台(openApi)是苍穹的外部可编程接口(API),让用户可以用与原本程序员所设想的不同之方式操作该软件,而不需要修改源代码。使用这些API时,第三方可以将额外的功能整合于苍穹上。
苍穹API支持表单操作服务、AI服务以及自定义服务。使用API服务时不仅能够携带自定义参数,而且可以注册自定义插件。苍穹API全面覆盖了各种开放接口的使用场景。
相信大家都有用过通过获取token的方式访问开放平台,但是我们的token是有时效性的,有没有不需要获取accessToken可以让第三方直接访问我们二开接口的方法呢?答案是肯定的。
案例一:使用获取accessToken的方式访问开放平台
相信这种通过获取accessToken的方式访问开放平台的模式大家一定不陌生,我们简单说明一下,如果有不了解的可以参考:生态门户在“视频中心–中级开发工程师–开放平台”查看视频讲解并可下载视频文档。
1、获取appToken
[api访问地址前缀] /api/getAppToken.do [POST]
接口描述:允许第三方系统通过API得到应用Token。
appToken默认时效性为7200S,可以通过在mc配置apptoken.timeout来控制时效性。
2、根据appToken获取accessToken
[api访问地址前缀] /api/login.do [POST]
接口描述:允许第三方系统用户标识和标识类型登录到系统。
功能说明:根据用户标识和标识类登录到系统并返回后续API访问所需要的access_tokent字串。
3、调用相关操作
[api访问地址前缀] /api/XXX?access_token=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx [POST]
接口描述:访问苍穹具体的业务操作服务、ai服务、自定义服务等。注意:用户令牌的参数名为:accessToken,并且必须在请求头中传输。
通过这三步,我们可以完成接口的访问。但是这种方式要考虑token的时效性,而且要发起三次调用,那有没有其他方式直接调用开发平台呢?
案例二:使用加密加签的方式访问开放平台
1、加密加签
第三方系统直接调用金蝶云苍穹的API的时候,需要在经历2个步骤:
(1)获取第三方appId和第三方app的对称加密秘钥。
(2)在API调用过程中加入验证信息。
如果没有参数,也要加一个默认参数 test=tt来完成认证数据
对于POST方式提交的API内容,所有的验证内容在HTTP header头中。
请求示例:
http://localhost:8080/ierp/api/test.do
请求Header参数
appId=test3rd
signature=ewrdgdfgfdgsdfgdrtererttrutuytuytuytuytuyt
timestamp=2020-08-19 15:31:59
signatureNonce=iksiertoidkwek;oitdwudysletwsues
user=1729999999
usertype= Mobile
对于GET方式提交的API内容,所有的验证内容在url的参数中。
请求示例:http://localhost:8080/ierp/api/test.do?appId=test3rd& signature=ewrdgdfgfdgsdfgdrtererttrutuytuytuytuytuyt¶meters=testA,testB&tesetA=tt&testB=tt2& timestamp=2020-08-19 15:31:59& signatureNonce= iksiertoidkwek;oitdwudysletwsues&user =17299999999& usertype= Mobile
工具类: import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; public class SignUtils { public static String SIGNATUR_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss"; /** * 实现HMACSHA256加密算法 * * @param data * @param key * @return * @throws Exception */ public static String HMACSHA256StrByKey(String data, String key) throws Exception { Mac sha256_HMAC = Mac.getInstance("HmacSHA256"); SecretKeySpec secret_key = new SecretKeySpec(key.getBytes("UTF-8"), "HmacSHA256"); sha256_HMAC.init(secret_key); byte[] array = sha256_HMAC.doFinal(data.getBytes("UTF-8")); StringBuilder sb = new StringBuilder(); for (byte item : array) { sb.append(Integer.toHexString((item & 0xFF) | 0x100).substring(1, 3)); } return sb.toString(); } }
2、调用相关操作
以post请求方式为例:
public static void testPost(){ //String url = "http://127.0.0.1:8080/ierp/api/login.do"; String url = "http://127.0.0.1:8080/ierp/kapi/app/bobo_apply/zjdctest"; Map<String, String> headerMap = new HashMap<>(); String appSecret="demo"; headerMap.put("appId", "demo"); headerMap.put("user", "18800110089"); String timestamp=DateUtils.getCustomDateString(new Date(), SignUtils.SIGNATUR_TIME_FORMAT); headerMap.put("timestamp", timestamp); String uuid=Uuid.create(); // testA=tt&testB=tt222020-08-28 18:03:59a92c3c338ba3adeda89ed24a0f32715f", "NL4q3FVH9x0i1UuplDaJ7A= headerMap.put("signatureNonce", uuid); System.out.println("signatureNonce="+uuid); headerMap.put("usertype", "Mobile"); String content="{\"testName\": "+System.getProperty("line.separator")+"\n\r\"test中国\",\"language\": \"zh_CN\",\"usertype\": \"Mobile1\"}"; String encyptString; try { StringBuilder sb=getSignatureString(timestamp,uuid,content); encyptString = SignUtils.HMACSHA256StrByKey(sb.toString(), appSecret); headerMap.put(APIHandlerFilter.SIGNATURE_NAME, encyptString); String responseString=HttpTools.postjson(url, headerMap, content); System.out.println("response--------------------------------------------="+responseString); Assert.assertNotNull(responseString); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); Assert.assertNotNull(e); } }
通过上述方式我们就可以完成一次加密加签形式调用开放平台,这种方式不依赖token,而且通过对称加密的方式安全性比较高。
以上便是这次一文读懂的内容啦,欢迎大家点赞收藏。
您的鼓励与嘉奖将成为创作者们前进的动力,如果觉得本文还不错,可以给予作者创作打赏哦!
请选择打赏金币数 *