事件订阅

灰度功能,有需请联系集成平台当周值班研发申请灰度

背景

    我们定义的推送接口,无法满足客户方系统要求。包括:
  • 对方系统对于推送数据,有自己的安全验证要求
  • 对方系统无法按我们的要求传输数据
  • 对方系统推送数据时,需要按一定的格式返回

事件订阅

原来的推送接口升级为事件订阅,其中,标准格式推送保留了原接口所有功能。但是,如果是非标准格式推送,推荐使用新的事件订阅接口

解析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']]         ]       ]     }   } }
2025-01-02
0 0