# 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 # 天一分与第三方应用系统集成方案 ![总体流程](https://images.gitee.com/uploads/images/2020/0302/135158_4e9cfae2_1610191.png "天一分流程.png") ### 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); } } ```