# 准备工作

### 客户端私钥准备

你将生成一组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类的几个方法（签名与验证）

�


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://dabank-1.gitbook.io/dabank/java_sdk/prepare.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
