精华内容
下载资源
问答
  • API对接是怎么处理的API对接是怎么处理的API对接是怎么处理的API对接是怎么处理的
  • API对接文档-模板文档

    2020-12-22 22:37:41
    免费API对接文档,服务器接口开发,模板规范
  • 平台api对接

    千次阅读 2019-02-14 20:11:05
    在工作日常中,跨平台api对接是再正常不过的事情了,例如,需要调用api,这个api:免费api ,这是个免费的获取天气信息Get Api。 为了调用这个api,我们需要使用Apache的网络通信java包:org.apache....

    在工作日常中,跨平台api对接是再正常不过的事情了,例如,需要调用api,这个api:免费api ,这是个免费的获取天气信息Get Api。
    为了调用这个api,我们需要使用Apache的网络通信java包:org.apache.http.client.fluent,通常我们建立一个网络请求的话,我们需要做如下事情:

    • 指定请求协议,http 或者https
    • 指定host
    • 指定path
    • 指定代理
    • 指定超时规定
    • 指定参数
    • 指定方法的类型,get/post/delete/put等等

    但是为了简化我们的开发,我们一般会使用默认的,上面只是为了说明基本的请求需要做什么!

    1. 创建一个客户端模拟对象

        /**
           * 模拟请求客户端
           */
          private static final HttpClient client = HttpClients.createDefault();
      
    2. 为了避免网络请求资源过多,我们需要使用执行器,就像多线程一样

         private static final Executor executor = Executor.newInstance(client);
      

      官方文档链接是这么说的官方文档链接是这么说的

      An Executor for fluent requests.
      A PoolingHttpClientConnectionManager with maximum 100 connections per route and a total maximum of 200 connections is used internally.

      大概意思就是一个带有最大200的网络链接的限制的执行者。

    好了,基本的辅助类,我们引入了,那么我们需要开始分析请求了,请求的全部地址为:

    https://www.apiopen.top/addStatistics?appKey=00d91e8e0cca2b76f515926a36db68f5&type=点击统计&typeId=1&count=2
    

    分析结果为:

    属性
    协议 https
    dns域名(可以说是地址了) www.apiopen.top
    path addStatistics
    请求类型 get
    请求参数1 appKey=00d91e8e0cca2b76f515926a36db68f5
    请求参数2 type=点击统计
    请求参数3 typeId=1
    请求参数4 count=2

    url = 协议+dns:https://www.apiopen.top/addStatistics

    Get Api的调用
    1. 因为是Get方法,所以我们需要建立一个Get的基本请求:
          Request request = Request.Get(url);
      
    2. 因为要传递参数,同时避免参数值url中不合法,我们需要使用一个辅助类来转码:
        List<BasicNameValuePair> params = getParams();
         String paramByString = URLEncodedUtils.format(params, "UTF-8");
      
    3. 使用执行器来发送请求,获取结果
      代码如下:
      	   //执行网络请求
                  Response response = executor.execute(request);
                  HttpResponse returnResponse = response.returnResponse();
                  String respJson = EntityUtils.toString(returnResponse.getEntity());
      //            判断返回结果的http status值,可以根据自己的需求来写
                  int statusCode = returnResponse.getStatusLine().getStatusCode();
                  //定义合理的状态值
                  if (statusCode < HttpStatus.SC_OK || statusCode > HttpStatus.SC_MULTIPLE_CHOICES) {
                      throw new RuntimeException("调用api结果返回状态码不对!值为:" + statusCode);
                  }
                  System.out.println("------------调用api返回结果为:" + respJson);
      
    Post Api的调用

    然而在post的Api中,可能会有些许不同(但是上面的模拟客户端和创建执行者,解析url的步骤是一样的),因为在post中,参数不是拼接在url后面用“?”相加起来的,我们需要把参数用另外一种方式来放在Request中,基于如下接口信息

    /**
         * 基于post接口 http://httpbin.org/post
         * request参数:
         * {
         * "username": "vip",
         * "password": "secret"
         * }
         * 返回结果:
         * {
         * "args": {},
         * "data": "{\"username\":\"vip\",\"password\":\"secret\"}",
         * "files": {},
         * "form": {},
         * "headers": {
         * "Accept": "application/json",
         * "Connection": "close",
         * "Content-Length": "38",
         * "Content-Type": "application/json",
         * "Encoding": "UTF-8",
         * "Host": "httpbin.org"
         * },
         * "json": {
         * "password": "secret",
         * "username": "vip"
         * },
         * "origin": "222.73.202.154",
         * "url": "http://httpbin.org/post"
         * }
         */
    
    1. 建立post的基本请求

       String url = "http://httpbin.org/post";
          Request postReq = Request.Post(url);
          PostParam postParam = new PostParam("vip", "secret");
          //设置bodyString
          postReq.bodyString(JacksonUtils.bean2JsonNotNull(postParam), 		ContentType.APPLICATION_JSON.withCharset(Charsets.UTF_8));
          return postReq;
      

      设置bodyString

       postReq.bodyString(JacksonUtils.bean2JsonNotNull(postParam), 		ContentType.APPLICATION_JSON.withCharset(Charsets.UTF_8));
      

      bodyString的参数根据需求有不同的设值

      post类型 第一个值 第二个值
      application/x-www-form-urlencoded username=vip&password=secret ContentType.APPLICATION_FORM_URLENCODED.withCharset(Charsets.UTF_8)
      application/json {“username”:“vip”,“password”:“secret”} ContentType.APPLICATION_JSON.withCharset(Charsets.UTF_8)
    2. 执行上面的第三步
      当post类型为application/json时运行结果如下:

    ------------调用api返回结果为:{
      "args": {}, 
      "data": "{\"username\":\"vip\",\"password\":\"secret\"}", 
      "files": {}, 
      "form": {}, 
      "headers": {
        "Accept-Encoding": "gzip,deflate", 
        "Connection": "close", 
        "Content-Length": "38", 
        "Content-Type": "application/json; charset=UTF-8", 
        "Host": "httpbin.org", 
        "User-Agent": "Apache-HttpClient/4.5.5 (Java/1.8.0_101)"
      }, 
      "json": {
        "password": "secret", 
        "username": "vip"
      }, 
      "origin": "222.73.202.154", 
      "url": "http://httpbin.org/post"
    }
    

    当post类型是 application/x-www-form-urlencoded,运行结果为:

    {
      "args": {}, 
      "data": "", 
      "files": {}, 
      "form": {
        "password": "secret", 
        "username": "vip"
      }, 
      "headers": {
        "Accept-Encoding": "gzip,deflate", 
        "Connection": "close", 
        "Content-Length": "28", 
        "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", 
        "Host": "httpbin.org", 
        "User-Agent": "Apache-HttpClient/4.5.5 (Java/1.8.0_101)"
      }, 
      "json": null, 
      "origin": "222.73.202.154", 
      "url": "http://httpbin.org/post"
    }
    

    最后代码:
    https://github.com/GitHubsteven/building-block/blob/master/net-connection/src/main/java/basic/ApiCallProcess.java

    展开全文
  • Wish API 对接

    千次阅读 2019-03-07 17:46:03
    Wish API 对接 我们可以先在 sandbox 中操作,https://sandbox.merchant.wish.com/ ,这里注册一个账号。 新创建的账号是有数据记录。 在 账户/设置/API设置 创建一个应用. 注意,创建成功这里有 Redirect URI...

    Wish API 对接

    我们可以先在 sandbox 中操作,https://sandbox.merchant.wish.com/ ,这里注册一个账号。

    新创建的账号是有数据记录。

     

    在 账户/设置/API设置  创建一个应用.

    注意,创建成功这里有 Redirect URI 项需要填写,这是一个回调地址,需要 Https 协议的。

     

    先获取 access_token ,来获取应用中的数据。

    查看文档中授权生成 access_token文档

    https://sandbox.merchant.wish.com/documentation/oauth

     

     

    WishPost 对接

    注册一个 WishPost 账号,在 sandbox 中注册成功后的实名验证一直通过不了,不知为什么。

    Wishpost 文档还是不错的,都有中文,条理也比较清楚

    可以先看看操作的过程

    https://s3.cn-north-1.amazonaws.com.cn/wishpost-production-wishpost-announcement/wishpost_chinapost_handbook.pdf

    https://s3.cn-north-1.amazonaws.com.cn/wishpost-production-wishpost-announcement/EUB_shouce.PDF

     

    对接我们自己的 ERP需要在,

    API设置 -> 创建应用程序

     

    查看官方文档

    https://sandbox.wishpost.wish.com/documentation/priv-app

    https://sandbox.wishpost.wish.com/documentation/oauth_v3

    注意:

    这里重定向URI ,必须使用https 协议的。

    展开全文
  • 快递路由API对接

    2019-09-05 08:36:52
    快递路由API对接 快递接口API 在很多产品上,都会涉及到快递接口的应用,用户希望我们的产品可以及时的展示出他们买的东西现在到哪里了?什么时候可以收到?再加上,现在的快递公司都直接将快递放在了代收点,用户...

    快递路由API对接

    • 快递接口API

    在很多产品上,都会涉及到快递接口的应用,用户希望我们的产品可以及时的展示出他们买的东西现在到哪里了?什么时候可以收到?再加上,现在的快递公司都直接将快递放在了代收点,用户更需要实时关注快递路由信息,知道自己何时才能去代收点取快递。

    这时,我们的产品就会涉及到使用快递接口,来获取各大快递公司的路由信息。

    • 如何选择快递接口?

    现在主流的快递对接方式有2种:

    需要分别与多家快递公司对接,适合选择固定几家快递公司的用户(图1);
    与快递平台对接,可一次性接入几乎所有的快递公司(图2)。
    图1
    在这里插入图片描述
    图2
    在这里插入图片描述

    如果存在需与多家快递公司对接的情况,多会选择第二种对接方式。本文重点说说如何使用快递平台进行API接口对接。

    目前主流的快递对接平台有:快递100、快递网、快递鸟…等。

    总结以上快递平台提供的接入方式进行分析,如下:

    页面嵌入(跳转API)
    优点:这种接入方式,一般都是免费的,无需注册,且不限查询次数,只需要到快递平台的官网上下载相关的技术文档即可接入。

    缺点:需要跳转到快递平台的网站来展示相关的路由查询结果,这些跳转的页面一般都会有快递平台的logo,用来给快递平台做宣传。

    总结:如果考虑节约产品的成本,这是个不错的选择。

    标准快递API接口
    优点:通过注册即可获得免费版key(有些快递平台注册时,需要提供网站的友情链接),通过接口直接返回JSON、XML等格式的结果,可以对页面的展示效果进行自定义设计。

    缺点:免费版每天的总查询次数有限,或者每单的查询次数有限;付费版按年收费,或者按查询的单数收费。

    总结:需要跟进查询次数或者单数的预期进行评估,选择合适的方案。

    有的快递平台的API接口还提供下单、打印、预约取件、代收货款等功能,如果电商的业务量比较大,使用的快递公司比较多,可以将这些业务交给快递平台进行管理。

    展开全文
  • API对接实战

    千次阅读 2020-09-26 21:23:00
    在平时工作中,经常会遇到的一种场景是:A公司要对接B公司的API方法,这时,A公司就要阅读B公司的接口文档,从接口文档中找到自己需要对接API,并根据接口文档的要求,完成编码工作,最终完成对接工作。...

    目录

    一 背景

    二 了解B公司接口的基础约定

    三 基础域名

    四 请求及相应格式说明

    五 确定要对接哪些API

    六 根据API文档,编写一些基础工具类。

    七 根据API文档,编写必要的DTO

    八 针对每个API方法,进行对接

    九 对接代码结构

    十 一些对接技巧


    一 背景

    在平时工作中,经常会遇到的一种场景是:A公司要对接B公司的API方法,这时,A公司就要阅读B公司的接口文档,从接口文档中找到自己需要对接的API,并根据接口文档的要求,完成编码工作,最终完成对接工作。

    本篇是站在A公司的角度,去对接B公司API接口的实战。

    二 了解B公司接口的基础约定

    一般情况下,B公司都会给出以下类似约定来满足基础对接,并且会提供测试环境和正式环境的两套信息。

    appkey:A公司商户平台 id

    appsecret:A公司商户平台 secret

    三 基础域名

    一般情况下,B公司会提供测试环境和生产环境两个基础域名。

    例如

    测试环境 : https://api-b-dev.com.cn

    生产环境 : https://api-b-prod.com.cn

    四 请求及相应格式说明

    一般情况下,B公司会提供请求及相应的基础格式说明。

    例如:

    1 请求方式

    post

    2 请求消息格式

    application/json

    3 响应消息格式

    application/json

    4 请求公共参数

    例如,B公司有以下要求

    所有接口均需要以 Http Header 方式传递以下参数;

    参数名

    描述

    必填

    appkey

    商户平台 id

    request_id

    请求标识 ,每次请求唯一

    sign_type

    签名方法,固定为 sha256

    signature

    签名,算法为 HMACSHA256(appkey+timestamp+appsecret,appsecret)

    version

    版本, 固定为 2.0

    callback_url

    回调地址, 以 https://或者 http://开头并进行 base64 编码

    是(同步响应的接口可不必填写)

    timestamp

    时间戳(秒), 30 分钟过期

    当然,不同的公司提供的参数各不相同,因公司而异。

    5 响应/回调参数说明

    例如:B公司所有API都有响应,并且有的API还有回调响应,不论是响应还是回调响应,它们的参数格式都一样。

    参数

    类型

    描述

    code

    int

    状态码

    msg

    String

    消息

    request_id

    String

    请求时的 request_id

    data

    Object

    数据

    appkey

    String

    商户平台id

    6 针对异步回调的说明

    例如:B公司对异步回调说明如下:

    异步回调:

    某些特定的接口需要异步返回结果,因此需商户A提供一个回调地址,将其进行base64 编码后,配置在 Http 请求 Header 中的 callback_url 里。

    应答机制:

    应答机制是指当商户A收到B公司数据通知时,必须回写 success 字符串,不区分大小写,B公司收到该“ success”,便认为商户A已收到通知; 否则会继续重复请求回调接口 3 次, 时间间隔为 1s, 5s, 30s。如果 4 次都访问不通,则会间隔 3h 继续轮询回调。

    回调解密:

    回调使用 aes 加密,需解密后使用。为避免由于网络波动造成回调失败,长时间未收到回调,请主动查询。

    7 请求体加密说明及示例

    数据采用AES加密,加密后作为data的值。

    示例:

    加密前:

    {"settlement_code":["JS19BUB14F5D8D4C"],"random_code":["19BUB14F5D8D4C","19BUAD0E89D780"]}

    加密后:

    {"data":"236agZcupcSsMZghtlmzhb7lEWzGZc3FO5GWQyrSB5kP/y1ESvd+CuBgQiWU/fwAICY/s0mideku/rXSKEb8In41F4SkUVLyLzYoYGed4QTjsqohTM0T6wmbkOiT1TH3"}

    对 {"settlement_code":["JS19BUB14F5D8D4C"],"random_code":["19BUB14F5D8D4C","19BUAD0E89D780"]} 进行AES加密,结果为:

    236agZcupcSsMZghtlmzhb7lEWzGZc3FO5GWQyrSB5kP/y1ESvd+CuBgQiWU/fwAICY/s0mideku/rXSKEb8In41F4SkUVLyLzYoYGed4QTjsqohTM0T6wmbkOiT1TH3

    8 回调解密说明以及示例

    数据采用AES解密,解密data值部分,解密后是json字符串

    解密前:

    {
        "code":0,"
        "msg":"处理成功",
        "request_id":"47fbb4ce-ae8e-4276-9d4a-4d279c9dfa78",
        "data":"TI6H4Zx7YeWM0dSiial6L+nCvrEv8Oqk1ZFhWXqYZcRzzZyy/xECQW0nf
                DszpNDmRMlSmsWkBJMmu4a/PmBivUBoNJwFBzAnOfn8gtYKdxDU16lDFwN5d/I
                W1UJijJ2lU5YkDs/rMTyRN1NTR+0vJ1So0lmeZQiGQWEwE5t4wZykSC3cMQZyvJ95
                2J7KU6aBXv1ZUGncZbWHQQaLw4UxFaBWIO8bVlkBIAqzolswI4dhtqBzFwmdEx+7
                hzHSeidOVbIja5adgKMAjvIUTdtUEb/cO0ipO6QbK8wglk6dQ8+7rFTchBYIoaaqM9Sf
                hcdvAYuSGk6yHIyN4GEtLBA5Zw==",
        "appkey":"47fbb4ce-ae8e-4276-9d4a-4d279c9dfa78"
    }

    解密后:

    {
        "code":0,"
        "msg":"处理成功",
        "request_id":"47fbb4ce-ae8e-4276-9d4a-4d279c9dfa78",
        "data":
        {
            "settlement_code":"JS19BR19A690E9F9",
            "order_random_code":"09708757-7ea1-4fda",
            "refund_merchant_amount":54736.84,
            "refund_service_amount":263.16,
            "change_code":"FW19BRAA9A200255",
            "change_merchant_amount":4263.16,
            "change_service_amount":236.84
        },
        "appkey":"47fbb4ce-ae8e-4276-9d4a-4d279c9dfa78"
    }

    9 一般公司B还会对code值进行说明。

    五 确定要对接哪些API

    一般情况下,公司B会针对某个项目提供必要的API,我们往往只需要对接少部分API接口,因此,首先确认要对接哪些API方法。我们只需要按照API的要求进行对接即可。

    六 根据API文档,编写一些基础工具类。

    工具类分两类。一类工具类,公司B会提供DEMO,我们拿来用即可。另外一类就需要自己根据API要求自己编写了。

    1 公司B提供的基础工具类

    例如,公司B提供了AES加解密以及签名的工具类

    import org.apache.commons.codec.binary.Base64;
    
    import javax.crypto.Cipher;
    import javax.crypto.Mac;
    import javax.crypto.spec.IvParameterSpec;
    import javax.crypto.spec.SecretKeySpec;
    import java.security.Security;
    
    /**
    * AES加解密工具
    */
    public class EncryptUtil {
        private static final String CipherMode="AES/CBC/PKCS7Padding";
    
        private static final String EncryptAlg ="AES";
    
        private static final String Encode="UTF-8";
    
        private static final String APPSECRET = "7da8046aa2da46bfb08429058e910081";
    
        private static final String AESIV = "ff465fdecc764337";
        /**
         * 加密:有向量16位,结果转base64
         * @param context
         * @return
         */
        public static String encrypt(String context) {
            try { //下面这行在进行PKCS7Padding加密时必须加上,否则报错
                Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
                byte[] content=context.getBytes(Encode);
                Cipher cipher = Cipher.getInstance(CipherMode);
                cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(APPSECRET.getBytes(Encode), EncryptAlg), new IvParameterSpec(AESIV.getBytes(Encode)));
                byte[] data = cipher.doFinal(content);
                String result= Base64.encodeBase64String(data);
                return result;
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }
    
        /**
         * 解密
         * @param context
         * @return
         */
        public static String decrypt(String context) {
            try {
                byte[] data=Base64.decodeBase64(context);
                Cipher cipher = Cipher.getInstance(CipherMode);
                cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(APPSECRET.getBytes(Encode), EncryptAlg), new IvParameterSpec(AESIV.getBytes(Encode)));
                byte[] content = cipher.doFinal(data);
                String result=new String(content,Encode);
                return result;
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }
    
        /**
         * 生成 HMACSHA256
         * @param data 待处理数据
         * @param key 密钥
         * @return 加密结果
         * @throws Exception
         */
        public static String HMACSHA256(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();
        }
    
        public static void main(String[] args) {
            //test256();
            testEncrypt();
            //testdecrypt();
        }
    
        private static void testdecrypt() {
            String s1 = "TI6H4Zx7YeWM0dSiial6L+nCvrEv8Oqk1ZFhWXqYZcRzzZyy/xECQW0nf" +
                    "DszpNDmRMlSmsWkBJMmu4a/PmBivUBoNJwFBzAnOfn8gtYKdxDU16lDFwN5d/I" +
                    "W1UJijJ2lU5YkDs/rMTyRN1NTR+0vJ1So0lmeZQiGQWEwE5t4wZykSC3cMQZyvJ95" +
                    "2J7KU6aBXv1ZUGncZbWHQQaLw4UxFaBWIO8bVlkBIAqzolswI4dhtqBzFwmdEx+7hzHSeid" +
                    "OVbIja5adgKMAjvIUTdtUEb/cO0ipO6QbK8wglk6dQ8+7rFTchBYIoaaqM9Sf" +
                    "hcdvAYuSGk6yHIyN4GEtLBA5Zw==";
            System.out.println(decrypt(s1));
        }
    
        private static void testEncrypt() {
            String s = "{\"name\":\"小明\",\"certificate_num\":\"451121196209260032\",\"certificate_type\":1,\"phone_num\":\"1388888888\",\"merchant_id\":\"c7c114d5da444df2b5d47a66c9c11111\"}";
            String afterEncrypt  = encrypt(s);
            System.out.println(afterEncrypt);
        }
    
        private static void test256() {
            // 签名算法
            String s2 = "c7c114d5da444df2b5d47a66c9cbd3fc16010271967da8046aa2da46bfb08429058e910081";
            String key = "7da8046aa2da46bfb08429058e911111";
            try {
                String s1 = HMACSHA256(s2,key);
                System.out.println(s1);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    2 根据API要求自己编写的工具类

    例如:根据公司B的要求,编写特定的post方法

    // 满足公司B的post方法
    public static String sendPostByJsonWithHeader(String url, String body, Map<String, String> headers) throws Exception {
        CloseableHttpClient httpclient = HttpClients.custom().build();
        HttpPost post = null;
        String resData = null;
        CloseableHttpResponse result = null;
        try {
            // 封装 url,并且是 post 请求。
            post = new HttpPost(url);
            HttpEntity entity = new StringEntity(body, Consts.UTF_8);
            // 基本配置
            post.setConfig(RequestConfig.custom().setConnectTimeout(30000).setSocketTimeout(30000).build());
            // 封装消息头
            if (null != headers && !headers.isEmpty()) {
                for (Entry<String, String> entry : headers.entrySet()) {
                    post.setHeader(entry.getKey(), entry.getValue());
                }
            }
            // 消息头支持 json
            post.setHeader("Content-Type", "application/json");
            // 封装数据
            post.setEntity(entity);
            // 发送请求
            result = httpclient.execute(post);
            if (HttpStatus.SC_OK == result.getStatusLine().getStatusCode()) {
                // 返回结果
                resData = EntityUtils.toString(result.getEntity());
            }
        } finally {
            if (result != null) {
                result.close();
            }
            if (post != null) {
                post.releaseConnection();
            }
            httpclient.close();
        }
        return resData;
    }
    
    // 生成header的方法
    private static Map<String, String> generateHeader(String callbackUrlParam) {
        Map<String, String> headers = new HashMap<>();
        // 商户结算平台 id,固定
        headers.put("appkey", Constant.appkey);
        // 请求标识 ,每次请求唯一,动态数据
        String requestID = UUID.randomUUID().toString();
        headers.put("request_id", requestID);
        // 时间戳(秒),30 分钟过期,动态数据
        Date date = new Date();
        String timestamp = String.valueOf(date.getTime() / 1000);
        headers.put("timestamp", timestamp);
        // 签名方法 ,暂支持 sha256
        headers.put("sign_type", "sha256");
        // 签名,算法为 HMACSHA256(appkey+timestamp+appsecret),动态生成
        String signatureStr = Constant.appkey + timestamp + Constant.appsecret;
        String signature = null;
        try {
            signature = EncryptUtil.HMACSHA256(signatureStr, Constant.appsecret);
        } catch (Exception e) {
            e.printStackTrace();
        }
        headers.put("signature", signature);
        // 版本, 本文档为 2.0
        headers.put("version", "2.0");
        // 回调地址, 以 https://或者 http://开头并进行 base64 编码
        String callbackUrl = callbackUrlParam;
        if (callbackUrl != null) {
            // 需要对callbackUrlParam进行base64 编码,然后赋值给 callbackUrl
            Base64.Encoder encoder = Base64.getEncoder();
            byte[] textByte;
            try {
                textByte = callbackUrlParam.getBytes("UTF-8");
                callbackUrl = encoder.encodeToString(textByte);
                headers.put("callback_url", callbackUrl);
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        }
    
    
        // 项目编号,暂不支持
        headers.put("project_code", null);
        return headers;
    }

    七 根据API文档,编写必要的DTO

    针对每个API,主要包含请求DTO,响应DTO,回调响应DTO,这个就要跟踪API要求,编写满足要求的DTO。

    当然有些DTO是可以抽象成一个类,例如一般响应DTO和回调响应DTO都是一样的,这个时候就可以抽象为一个DTO了。

    例如:

    package GDDto;
    
    /**
    * @className: GDCommonRes
    * @description: 共同响应结果
    * @date: 2020/9/24
    * @author: cakin
    */
    public class GDCommonRes {
        /**
         * 状态码
         */
        private int code;
        /**
         * 消息
         */
        private String msg;
        /**
         * 请求时的 request_id
         */
        private String request_id;
        /**
         * 数据
         */
        private String data;
        /**
         * appkey
         */
        private String appkey;
    
        public int getCode() {
            return code;
        }
    
        public void setCode(int code) {
            this.code = code;
        }
    
        public String getMsg() {
            return msg;
        }
    
        public void setMsg(String msg) {
            this.msg = msg;
        }
    
        public String getRequest_id() {
            return request_id;
        }
    
        public void setRequest_id(String request_id) {
            this.request_id = request_id;
        }
    
        public String getData() {
            return data;
        }
    
        public void setData(String data) {
            this.data = data;
        }
    
        public String getAppkey() {
            return appkey;
        }
    
        public void setAppkey(String appkey) {
            this.appkey = appkey;
        }
    }

    八 针对每个API方法,进行对接

    做好以上准备工作,就可以一个个接口进行对接了。可采用下面方式一个一个接口进行对接。

    public static void main(String[] args) {
        // 1. 批量创建结算单    回调接口。
        // batchSettlement();
        // 2. 查询结算单       非回调接口。
        //querySettlement();
        // 3. 结算单退款       回调接口。
        refundSettlement();
        // 4. 授权签约      非回调接口。
        // authorizSigned();
        // 5. 获取签约结果     非回调接口。
        // querySigned();
    }

    九 对接代码结构

    十 一些对接技巧

    1 遇到问题,如果需要公司B的帮助,需要主动和公司B的对接人员交流,尽快找到问题所在。

    2 有些基础代码,如果公司B能提供,主动要一下,如果确实因为信息安全问题,公司B不方面提供,那就得自己写了,写完后,如果不确定代码是否符合B的要求,可以发给公司B的对接人员看看,以确定代码的正确性。

    3 学习公司B的接口文档中好的地方,应用到自己的工作中。

    4 委婉指出接口文档中的错误和不足,帮助公司B文档质量改进,这样在对接时,公司B的对接人员也会更热心的帮助你。

    5 公司A的对接代码,放到正式代码的test目录中,一来可以方便调用正式代码中的工具类,二来方便将对接代码移植到正式代码中。

    展开全文
  • 钉钉开放平台API对接第一讲

    千次阅读 2019-08-31 14:51:15
    DING日程-API对接: 官方API:https://ding-doc.dingtalk.com/doc#/serverapi2/iqel76 对接评语: 优点:钉钉API对接相对于微信API对接比较简单顺畅 缺点:1、官方DING日程API文档太缺乏具体描述,没有一定的界内...
  • 最新当当网api对接文档 当当网文档每期都会改动 本文当为最新 我们使用也是该文档
  • Java 快递物流查询 api对接

    千次阅读 2018-09-28 17:24:08
    Java 快递物流查询 api对接 2018年08月24日 09:44:41 我跟吴彦祖四六开 阅读数:73 标签: java 物流查询 更多 个人分类: Java 这里只是记录一下。第三方都会提供很详细的demo和技术文档,或者安排专业人员...
  • .NET WEB API 对接支付宝支付 转载请注明出处:http://leejunhui.com/2017/02/09/AliPayWithWebAPI/ 最近一个项目中需要自己前后台全栈,几经权衡之后,在还是选择了自己最为熟悉的.NET WEB API技术来实现服务器端。...
  • 压缩包分为三块,1.数据字典查看每一个模块流程及相对应的表,2.webapi对接文档V3版本,网上都说是V4目前一个没找到V4版本的,3.开发需要的一个引用金蝶资源的jar
  • JIRA API 对接

    2019-04-04 10:34:00
    系统要跟JIRA对接,将本系统数据发送给jira,jira数据返回给本系统。 开始一头雾水怎么让数据传过去已什么形式存在,是存数据库呢还是怎么显示呢。研究半天发现其实只要将原数据作为json数据提供给jira接口,jira...
  • apollo配置中心open api对接及常见问题 1. pom引入 <dependency> <groupId>com.ctrip.framework.apollo</groupId> <artifactId>apollo-client</artifactId> <version>1.7.0&...
  • 作者:PM火山全文共 2175 字,阅读需要 5 分钟———— / BEGIN / ————笔者曾经从0到1独立负责过一个与国内一线OTA平台之间的API对接,踩过不少坑,也有不少收获。今天跟大家分享一下API对接的需求调研。分享...
  • 100API对接的代码示例分享: 快递100注册了GitHub官方号(kuaidi100-api)及gitee官方号(kuaidi100API),由快递100官方提供sdk方便开发者调试及使用,欢迎各位开发者关注及使用。 由于平台刚刚建立,现在demo主要...
  • Amazon各个Api对接地址

    千次阅读 2019-07-16 10:30:32
    整理了一份关于amazon的对接相关地址,具体的api接口调整地址以amazon官方的开发者为准,以下仅供参考 主要API地址 http://docs.developer.amazonservices.com/zh_CN/orders/2013-09-01/Orders_ListOrders...
  • 最近一个项目有幸与Visa公司进行API对接,让自己在 外部 Http API对接方面又有了新的认识,之前通常的对接方式无外乎有如下几种: 对请求参数 a + b + c + d + 时间戳 + 密钥 进行md5 加密,进行消息摘要的校验; ...
  • 企业微信api对接

    2020-12-19 16:13:55
    用的是wxJava,但是wxJava文档真滴不清楚,都是jar全局搜索url/看...这个api不说,我哪知道啊,是强转失败,想试试".get",没想到还真出来了个getOAService private WxCpService wxCpService = WxCpConfiguration.g
  • 前几天写了美团api的对接,最近一直在忙,没有怎么更新博客,今天写一个饿了么api对接!就想做个对应分享出来,跟美团做个对比,其实也挺容易的!!请看: 一,查看饿了么提供得文档,所需要得需求 1. 进入饿了么...
  • 百度翻译API对接

    千次阅读 2018-12-19 10:28:44
    百度翻译开发平台:http://api.fanyi.baidu.com/api/trans/product/index 打开如上链接: 下载SDK 导入SDK 新建一个工程(zyq-translate),并新建包(com.zyq.translate) 解压SDK,得到如下两个文件夹 ...
  • DSP对接文档。。广告接入DSP中的广告同步,审核查询,广告上下线等。
  • 这是一个第三方支付的一些资源文档,里面有开发的api文档和源码,希望对朋友们有帮助,也可以希望大家有所改进,一起分享
  • API(Application Programming Interface,应用编程接口),简单来说就是把不同的系统通过统一的接口协同一起来完成需求任务,就像像USB数据线一样不管两端连的是什么,都就可以使用。
  • LittleVGL (LVGL)干货入门教程三之LVGL的文件系统(fs)API对接。 前言: 阅读前,请确保你拥有以下条件: 你的项目已经完成“FatFS”的移植(例如你可以用FatFS进行SD卡的文件读写等)。 你已经完成“显示API”的...
  • LittleVGL (LVGL)干货入门教程二之LVGL的输入设备(indev)API对接 前言: 阅读前,请确保你拥有以下条件: 你已经完成“显示API”的移植。 你已经实现了一个屏幕的触摸驱动 (如果你使用外部物理按键进行操作,...
  • 教你一键开启积分商城API对接上线,积分商城搭建如此简单 首先确定你已经有积分管理系统,给用户发放积分及用户信息存储。 然后又有使用第三方积分商城的意愿,则可以考虑用API接口打通的方式上线积分商城。 用第三...
  • 荟聚营销云可以集成全渠道的客户线索,本文介绍如果对接荟聚API获取到线索数据。 依旧是在白码低代码开发平台。 官方API文档:http://apidocsv2.huiju.cool/restapi/overview 1、获取token 荟聚 REST API使用OAuth v...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,243
精华内容 1,697
关键字:

api对接