一文读懂-开放平台加密加签方式访问原创
金蝶云社区-金蝉子
金蝉子
11人赞赏了该文章 1,272次浏览 未经作者许可,禁止转载编辑于2021年08月19日 09:17:14

开放平台(openApi)是苍穹的外部可编程接口(API),让用户可以用与原本程序员所设想的不同之方式操作该软件,而不需要修改源代码。使用这些API时,第三方可以将额外的功能整合于苍穹上。

image.png

苍穹API支持表单操作服务、AI服务以及自定义服务。使用API服务时不仅能够携带自定义参数,而且可以注册自定义插件。苍穹API全面覆盖了各种开放接口的使用场景。

相信大家都有用过通过获取token的方式访问开放平台,但是我们的token是有时效性的,有没有不需要获取accessToken可以让第三方直接访问我们二开接口的方法呢?答案是肯定的。

案例一:使用获取accessToken的方式访问开放平台

相信这种通过获取accessToken的方式访问开放平台的模式大家一定不陌生,我们简单说明一下,如果有不了解的可以参考:生态门户视频中心中级开发工程师开放平台查看视频讲解并可下载视频文档

image.png

1获取appToken

[api访问地址前缀] /api/getAppToken.do [POST]

接口描述:允许第三方系统通过API得到应用Token 

appToken默认时效性为7200S可以通过在mc配置apptoken.timeout来控制时效性。

image.png

2根据appToken获取accessToken

[api访问地址前缀] /api/login.do [POST]

接口描述:允许第三方系统用户标识和标识类型登录到系统。

功能说明:根据用户标识和标识类登录到系统并返回后续API访问所需要的access_tokent字串。

image.png

 

3、调用相关操作

[api访问地址前缀] /api/XXX?access_token=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx [POST]

接口描述:访问苍穹具体的业务操作服务、ai服务、自定义服务等。注意:用户令牌的参数名为:accessToken,并且必须在请求头中传输

 

通过这三步,我们可以完成接口的访问。但是这种方式要考虑token的时效性,而且要发起三次调用,那有没有其他方式直接调用开发平台呢?

 

案例二:使用加密加签的方式访问开放平台

1、加密加签

第三方系统直接调用金蝶云苍穹的API的时候,需要在经历2个步骤:

1)获取第三方appId和第三方app对称加密秘钥

2API调用过程中加入验证信息

image.png

如果没有参数,也要加一个默认参数 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,而且通过对称加密的方式安全性比较高。 


    以上便是这次一文读懂的内容啦,欢迎大家点赞收藏。


图标赞 11
11人点赞
还没有人点赞,快来当第一个点赞的人吧!
图标打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!

您的鼓励与嘉奖将成为创作者们前进的动力,如果觉得本文还不错,可以给予作者创作打赏哦!

请选择打赏金币数 *

10金币20金币30金币40金币50金币60金币
可用金币: 0