# 准备工作

### 客户端私钥准备

你将生成一组RSA私钥/公钥，后续的文档中使用【客户端App私钥】+【客户端App公钥】作为称呼，客户端App公钥需要上传到DABank服务器，你的所有请求都将使用这个客户端App私钥签名，DABank服务器使用你的客户端App公钥对签名进行验证，确保请求没有被篡改或者伪造。

额外说明的是，openssl生成的私钥默认使用pkcs1格式，为了减少sdk解析私钥的依赖，你需要将私钥转换为PKCS8格式后使用，使用下述的代码生成私钥+公钥：

```bash
#生成私钥（PKCS1格式）
openssl genrsa -out app_private_key.pem 2048
#生成公钥，公钥需要上传到DABank服务器
openssl rsa -in app_private_key.pem -pubout -out app_public_key.pem

#将私钥转换为PKCS8格式，这个是你的SDK实际使用的内容
openssl pkcs8 -topk8 -inform PEM -outform PEM -in app_private_key.pem -out priv8.pem -nocrypt
```

### AppID与服务器公钥

你的app有一个appId，所有的请求中都需要携带这个appId，对应字段`key` 。

DABank服务器为每个app 生成了一组RSA私钥+公钥，后续的文档中使用【服务器端App私钥】【服务器端App公钥】作为称呼你需要下载这个服务器端App公钥。在必要的时机，DABank向你的服务器发起回调请求，DABank使用服务器端App私钥对回调请求进行签名，你需要使用下载的服务器端App公钥对请求进行验证，确保请求没有被篡改或者伪造。

### Java SDK

你可以从open平台登录后下载Java SDK jar文件，目前暂时没有提供maven依赖，如果你使用了maven或其他依赖管理工具，建议的做法是将jar文件放到工程目录中并上传到版本管理工具，使用脚本安装到本地依赖仓库。

由于SDK使用了Base64和lamda特性，使用SDK需要至少JDK 8，出于一些考虑，你无法获得SDK的源代码，如果你需要在JDK 6/7环境下使用，我建议你反编译我们的sdk后参考改动。

为了实现0依赖和尽可能小的体积，SDK没有直接包含或依赖JSON库和http库，我们定义了JsonProvider（json parser/serializer）和HttpProvider接口， 你至少需要提供一个JsonProvider 实现才可以使用。如果没有提供http实现，SDK默认使用`HttpURLConnection` 发起http请求，我们建议你提供一个自己的实现，以方便更细粒度的控制http请求，比如连接池、超时、日志等。

下面是JsonProvider的定义：

```java
package io.dabank.sdk.providers;

/** 提供json支持 */
public interface JsonProvider {
    /** json序列化对象 */
    String toJson(Object o);
    /** 解析json到对象 */
    <T> T fromJson(String json, Class<T> clazz);
}
```

需要说明，字段需要处理为snake\_case (lower\_case\_underscore), 下面的代码列举了gson和jackson的实现：

```java
//gson实现
public static final JsonProvider GSON = new JsonProvider() {
    private Gson _gson;
    private Gson gson() {
        if (_gson == null) {
            _gson = new GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create();
        }
        return _gson;
    }
    @Override
    public String toJson(Object o) {
        return gson().toJson(o);
    }
    @Override
    public <T> T fromJson(String json, Class<T> clazz) {
        return gson().fromJson(json, clazz);
    }
};

//jackson实现
public static final JsonProvider JACKSON = new JsonProvider() {
    private ObjectMapper _mapper;
    private ObjectMapper mapper() {
        if (_mapper == null) {
            _mapper = new ObjectMapper();
            _mapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
        }
        return _mapper;
    }
    @Override
    public String toJson(Object o) {
        try {
            return mapper().writeValueAsString(o);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
            return "error: json write failed -> " + e.getMessage();
        }
    }
    @Override
    public <T> T fromJson(String json, Class<T> clazz) {
        try {
            return mapper().readValue(json, clazz);
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }
};

```

�下面是HttpProvider的定义：

```java
package io.dabank.sdk.providers;

import java.io.IOException;
import java.net.URL;
import java.util.Map;

public interface HttpProvider {
    /** 在 200 的情况下要求可以返回http response字符串，其他情况下可自行决定返回值 */
    String post(URL url, Map<String, String> headers, String body) throws IOException;
}
```

�

### Java SDK api 学习建议

* [https://doc.dabank.io](https://doc.dabank.io/#/) 了解http接口，SDK实现了这些接口
* 从DabankClient 入手，了解每一个函数，及其对应参数
* 参考下载的javadoc, 了解每个函数的注释
* 额外的了解Rsa类的几个方法（签名与验证）

�
