# tianyifeng
**Repository Path**: yeah258258/tianyifeng
## Basic Information
- **Project Name**: tianyifeng
- **Description**: 天一分外部对接
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2020-03-02
- **Last Updated**: 2020-12-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 天一分与第三方应用系统集成方案

### 1. 集成步骤
集成方案中将甬派的app为平台主体,可以通过以下方式获取人员数据、推送用户行为,按以下步骤:
1. 第三方应用在天一分管理后台注册,获取对应`AppToken`。
天一分管理员可在后台应用管理中添加第三方应用,需要填入应用名称,上传应用图标,填写应用后台地址,设置IP白名单。后台会自动为应用生成应用唯一`AppToken`和`AppSecret`。
2. 第三方应用服务器通过`AppToken`调用天一分的API服务器的后续接口。
3. 用户通过天一分访问第三方H5网页时,天一分会对请求进行拦截和安全性过滤,同时在请求结尾以get请求的方式附带`openId`参数。(第三方应用收到`openId`时,需根据此`openId
`请求用户信息接口,此时天一分服务器会返回用户的具体信息。)
4. 发送用户行为事件时以`openId`作为用户的唯一标示。
### 2. 集成接口
* [2.1 获取用户信息](#userInfo)
* [2.2 推送用户行为](#postEvent)
* [2.3 接口签名校验标准](#secret)
正式环境地址: `https://xyf.cnnb.com.cn/api/
测试环境地址:` https://xyf.cnnb.com.cn/testapi/
#### 2.1 获取用户信息
##### 简要描述
- 获取用户信息
##### 请求URL
- /appstore/user
##### 请求方式
- GET
##### 参数
参数名 | 必选 |位置 | 类型 | 说明 |
--- | --- | --- | --- | ---
accessToken | 是| header | string | 应用的AppToken |
openId | 是| query | string |用户openId |
sign | 是| query | string |签名,获取方式见[2.3 接口签名校验标准](#secret) |
##### 请求示例
```
curl -X GET "https://xyf.cnnb.com.cn/api/appstore/user?openId=rrbNrdaadrbNddaa&sign=cae2ca3b9379f2a74b8960a40e3808311bd753df" -H "accept: */*" -H "accessToken: 3xhf9ofggf2oek0qlofeq0zuf9gvlwwf"
```
##### 返回示例
```
{
"code": 200,
"data": {
"openId": "rrbNrdaadrbNddaa",//用户OpenId
"nickname": "alan_uE6F",//用户昵称
"score": 750,//用户当前的信用分
"name": 张三, //用户真实姓名
"phone": "13112345678" //用户手机号
"idNumber": "330205197501011235" //用户身份证号码
}
}
```
#### 2.2 推送用户行为
##### 简要描述
- 发送用户行为事件
##### 请求URL
- /appstore/event
##### 请求方式
- POST
##### 参数
参数名 | 必选 |位置 | 类型 | 说明 |
--- | --- | --- | --- | ---
accessToken | 是| header | string | 凭证 |
openId | 是| body | string |用户ID |
feedbackCategoryCode | 是| body | string |反馈类别代码,1 授权(用户授权第三方通过甬派获取信用分) 2 激励 3 违约|
domainCode | 是| body | string |领域代码|
incentiveCode | 否| body | string |激励措施代码,反馈类别为激励时不能为空|
breachCode | 否| body | string |违约行为代码,反馈类别为违约时不能为空|
sceneCode | 是| body | string |场景代码|
timestamp | 是| body | long |发生时间 从格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数|
sign | 是| body | string |签名,获取方式见[2.3 接口签名校验标准](#secret) |
##### 请求示例
```
curl -X POST "https://xyf.cnnb.com.cn/api/appstore/event" -H "accept: */*" -H "accessToken: 3xhf9ofggf2oek0qlofeq0zuf9gvlwwf" -H "Content-Type: application/json" -d "{ \"domainCode\": \"005\", \"feedbackCategoryCode\": 2, \"incentiveCode\": \"2005001\", \"openId\": \"rrbNrdaadrbNddaa\", \"sceneCode\": \"0001\", \"sign\": \"e2b9f2e63ad4a0baa3c663c8577d091c4f4cd4c8\", \"timestamp\": 1515730332000}"
```
##### 返回示例
```
{
"code": 200
}
```
#### 2.3 接口加密校验标准
所有接口均需对参数按一下规则加密,天一分服务端根据签名校验合法性。签名生成规则如下:参与签名的字段包括除`sign`本身外的所有参数,再加上注册应用时分配的appSecret,对所有待签名参数按照字段名的ASCII码从小到大排序(字典序)后,使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串。对字符串作sha1加密得到`sign`签名,字段值如果包含特殊字符,需要自己进行URLencode编码。以获取用户信息接口为例,参数为
* accessToken=xxx
* openId=xxx
* 加上secret=xxx
按字典顺序排序得到字符串
accessToken=xxx&openId=xxx&secret=xxx 然后对字符串sha1加密得到`sign`签名
Java端sign方法样例
```
import cn.hutool.crypto.SecureUtil;
import org.apache.commons.lang3.StringUtils;
import java.util.*;
public class SignUtil {
public static void main(String[] args) {
String openId = "rrbNrdaadrbNddaa";
String accessToken = "3xhf9ofggf2oek0qlofeq0zuf9gvlwwf";
String appSecret = "x5atcke32zlv1gig09y8vpiul8asj4y7";
Map paramsMap = new HashMap<>();
paramsMap.put("openId", openId);
paramsMap.put("accessToken", accessToken);
paramsMap.put("secret", appSecret);
System.out.println(sign(paramsMap));
//输出结果为: cae2ca3b9379f2a74b8960a40e3808311bd753df
}
private static String sign(Map paramsMap) {
List params = new ArrayList();
for (Map.Entry entry : paramsMap.entrySet()) {
params.add(entry.getKey() + "=" + entry.getValue());
}
Collections.sort(params);
String paras = StringUtils.join(params, "&");
return SecureUtil.sha1(paras);
}
}
```