背景
我们定义的推送接口,无法满足客户方系统要求。包括:
- 对方系统对于推送数据,有自己的安全验证要求
- 对方系统无法按我们的要求传输数据
- 对方系统推送数据时,需要按一定的格式返回
事件订阅
原来的推送接口升级为事件订阅,其中,标准格式推送保留了原接口所有功能。但是,如果是非标准格式推送,推荐使用新的事件订阅接口
解析APL说明
主要需要实现两个方法:
- webhookProcessRequest,实现对接收到的原始请求(request)解析为标准数据
- webhookProcessResponse,实现 根据集成平台对标准数据的处理结果,转换为对方系统要求的响应体(response)
APL示例
如下,当前先使用Map传参和返回,后续在APL更新类定义,以及APL模板。
class ERPIntWebhookUrl {
//debug 时候的入口方法
void debug(FunctionContext context, Map arg) {
def argJson = '''
{"body":null,"headers":{"x-forwarded-for":["10.22.0.41"]},"params":{}}
'''
arg = Fx.json.parse(argJson);
def res = webhookProcessRequest(context, arg)
log.info(res)
}
Map webhookProcessRequest(FunctionContext context, Map arg) {
log.info("webhookProcessRequest arg:" + arg);
// 读取header
def headers = arg['headers']
// 读取数据
def body = Fx.json.parse(arg['body'] as String)
//根据推送数据判断事件类型
String eventType = "UPDATE"
def operationType = (headers['operationtype'] as List)?.first()
if (operationType == "3") {
//作废
eventType = "INVALID"
} else if (operationType == '10086') {
//验证请求,直接返回空结果不做后续处理
return [
"code": "0", // 返回结果状态 0为正常,其他都是失败
"data": [:]
]
}
def directSyncStr = (headers['directsync'] as List)?.first()
def destObjApiName = (headers['dest'] as List)?.first()
def directSync = directSyncStr == 'true' || directSyncStr == '1'
//转换数据格式
def stdData = [
"objAPIName": body['formId'],
"masterFieldVal": body['mainObjData'],
"detailFieldVals": body['detailObjData']
]
def dataMap = [:]
dataMap.put(eventType, [stdData])
return [
"code": "0", // 返回结果状态 0为正常,其他都是失败
"data": [
// 待同步的数据
"dataMap": dataMap,
// 是否直接同步,直接同步则会再同步完成后才返回结果
"directSync": directSync,
// 非必填,但是如果是直接同步,则是必填
"destObjApiName": destObjApiName
]
]
}
Map webhookProcessResponse(FunctionContext context, Map pushResult) {
log.info("webhookProcessResponse pushResult: " + pushResult);
//判断结果
if (pushResult['errCode'] == 's106240000') {
return [
"code": "0", // 返回结果状态 0为正常,其他都是失败
"data": [
//默认会返回状态码200,按对方系统要求返回body
"body": ["code": 0, "msg": "success"]
]
]
} else {
return [
"code": "0", // 返回结果状态 0为正常,其他都是失败
"data": [
"status": 500, // 返回500状态吗
"body": ["code": -1, "msg": pushResult['errMsg']]
]
]
}
}
}