# 常见问题

## 请求或响应问题

### 1，参数值乱码或缺失

**检查是否UTF-8编码**

```
//以HttpClient为例
//a: 一般Get请求默认为此类型
import org.apache.http.client.methods.HttpGet;
httpGet.setHeader("Content-Type","application/x-www-form-urlencoded;charset=UTF-8");

//或者b: post方式设置body格式为json
import org.apache.http.client.methods.HttpPost;
httpPost.setHeader("Content-Type","application/json;charset=UTF-8");

//c: 同时设置可能会报错，本文档也并无Post方式接口同时传递query参数和body参数
```

**是否对请求参数进行encode**

当发送get请求（或类似post请求：url?key=中文和特殊符号），即本文档中所指的[query参数](https://asiabill.gitbook.io/api-explorer/shu-ju-qian-ming-guo-cheng#shu-ju-ding-yi)，由于参数实际是以拼接在url后方的方式进行参数传递的，如果不对中文或非ascii字符进行urlEncode，则会出现参数值乱码或丢失的情况。此时可对参数值进行urlEncode后，再进行参数设置并发送请求。

```
//以HttpClient为例
// 传入的query参数
Map<String,String> queryParamMap ...;
//开始设置http请求参数
List<NameValuePair> param = new ArrayList<>();
for (Map.Entry<String, String> entry : paramMap.entrySet()) {
    param.add(new BasicNameValuePair(entry.getKey(),entry.getValue()) );
}
httpPost.setEntity(new UrlEncodedFormEntity(param, StandardCharsets.UTF_8));

//当传入的是body参数时
httpPost.setEntity(
    new StringEntity(json, 
        ContentType.create("application/json", StandardCharsets.UTF_8)));

```

**结果解析时，是否设定为UTF-8编码**

收到服务端结果时，Header部分一般为数字或英文字符组成，不会出现乱码。body部分请使用UTF-8编码进行接收。

```
//http response
String result = EntityUtils.toString(response.getEntity(),StandardCharsets.UTF_8);
```

### 2，签名问题

1，打印或手工拼接出签名校验不通过的请求的签名内容字符串，使用工具进行HMAC-SHA256签名，比较和发送请求时的签名是否一致，核对签名算法本身

2，对照[签名步骤](https://asiabill.gitbook.io/api-explorer/shu-ju-qian-ming-guo-cheng#tong-yong-qian-ming-bu-zhou)，检查签名内容字符串是否拼接无误，是否多了空值或空对象：'' "" {} 之类的，又是否有换行符的差异，如：\n \r\n

2，检查是否存在上方参数值乱码或缺失的问题，导致发送端的签名内容和服务端接收到的报文内容有差异，注意如果是对参数值以及body数据体，不是encode转码后的值进行签名

3，签名key是否正确

## 异常提示
