|
@@ -1,15 +1,15 @@
|
|
|
package com.dderp.webcore.servlet;
|
|
package com.dderp.webcore.servlet;
|
|
|
|
|
|
|
|
-import com.alibaba.fastjson2.JSON;
|
|
|
|
|
-import com.alibaba.fastjson2.JSONObject;
|
|
|
|
|
import com.dderp.common.api.flycat.ExpressOutService;
|
|
import com.dderp.common.api.flycat.ExpressOutService;
|
|
|
import com.dderp.common.datas.ERPHeader;
|
|
import com.dderp.common.datas.ERPHeader;
|
|
|
import com.dderp.common.entity.base.InvokeCallParams;
|
|
import com.dderp.common.entity.base.InvokeCallParams;
|
|
|
|
|
+import com.dderp.common.entity.base.InvokeCallResult;
|
|
|
import com.dderp.common.entity.express.ExpressCallResult;
|
|
import com.dderp.common.entity.express.ExpressCallResult;
|
|
|
import com.dderp.common.entity.site.ERPTokenUser;
|
|
import com.dderp.common.entity.site.ERPTokenUser;
|
|
|
import com.dderp.common.tool.ERPUtils;
|
|
import com.dderp.common.tool.ERPUtils;
|
|
|
import com.sweetfish.net.WorkThread;
|
|
import com.sweetfish.net.WorkThread;
|
|
|
import com.sweetfish.net.http.*;
|
|
import com.sweetfish.net.http.*;
|
|
|
|
|
+import com.sweetfish.service.RetResult;
|
|
|
import com.sweetfish.util.AnyValue;
|
|
import com.sweetfish.util.AnyValue;
|
|
|
import com.sweetfish.util.AutoLoad;
|
|
import com.sweetfish.util.AutoLoad;
|
|
|
import org.apache.commons.codec.binary.Base64;
|
|
import org.apache.commons.codec.binary.Base64;
|
|
@@ -81,6 +81,63 @@ public class ExpressCallServlet extends HttpServlet {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ @HttpMapping(url = "/express/call", methods = {"POST"}, comment = "回调入口")
|
|
|
|
|
+ public void expressCall(HttpRequest request, HttpResponse response) {
|
|
|
|
|
+ //如果是通用接口,如何区分是哪个平台传入的呢?
|
|
|
|
|
+ //查了顺丰同城、美团、达达、闪送、蜂鸟、UU跑腿,饿了么几个平台的开发文档,没有任何一个字段用于区分配送平台
|
|
|
|
|
+ //如果说用订单来查找,几个平台的订单字段也不一样,甚至有的是body传递过来,有的是form-data传递过来的数据
|
|
|
|
|
+ //感觉使用统一接口,调脚本的形式有些不行?
|
|
|
|
|
+ //想到有一个办法就是通过nginx做不同反向代理,添加header信息来区分,这样每个平台可以随便添加了,只需要重载一下nginx即可,无需重启服务端
|
|
|
|
|
+ logger.info(request);
|
|
|
|
|
+ logger.info(request.getBodyUTF8());
|
|
|
|
|
+
|
|
|
|
|
+ String platformCode = request.getHeader(ERPHeader.HTTPHEADER_EXPRESS_PLATFORM, "");
|
|
|
|
|
+ if (StringUtils.isEmpty(platformCode)) {
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ //转大写,找脚本
|
|
|
|
|
+ platformCode = platformCode.toUpperCase();
|
|
|
|
|
+
|
|
|
|
|
+ //验证签名,本来用body好好的,都可以统一成InvokeCallParams,结果UU跑腿非要用form-data方式传递,非json,太恶心了,不过都可以通过getBodyUTF8获取到,
|
|
|
|
|
+ //还有类似顺丰同城这种,签名参数是放在参数里面的,也就是request.getParameter("sign", "");
|
|
|
|
|
+ //验证签名的脚本必须为同步,
|
|
|
|
|
+ String dataSourceId = request.getHeader(ERPHeader.HTTPHEADER_DATASOURCE, "");
|
|
|
|
|
+ long supplierCode = request.getLongHeader(ERPHeader.HTTPHEADER_SUPPLIER, 0L);
|
|
|
|
|
+ String body = request.getBodyUTF8();
|
|
|
|
|
+
|
|
|
|
|
+ InvokeCallParams callSignParams = InvokeCallParams.newBuilder()
|
|
|
|
|
+ .businessMethod("Express_CallBack_VerifySign_" + platformCode)
|
|
|
|
|
+ .params(body)
|
|
|
|
|
+ .attach(request.getParameters())
|
|
|
|
|
+ .currentUser(ERPUtils.getSysTokenUser())
|
|
|
|
|
+ .dataSourceId(dataSourceId)
|
|
|
|
|
+ .supplierCode(supplierCode)
|
|
|
|
|
+ .build();
|
|
|
|
|
+ RetResult<InvokeCallResult> callSignResult = expressOutService.callExpress(callSignParams, ERPUtils.getSysTokenUser(), dataSourceId, supplierCode);
|
|
|
|
|
+ if (callSignResult.isSuccess()) {
|
|
|
|
|
+ //签名成功,调用回调业务代码
|
|
|
|
|
+ InvokeCallParams callInvokeParams = InvokeCallParams.newBuilder()
|
|
|
|
|
+ .businessMethod("Express_CallBack_Invoke_" + platformCode)
|
|
|
|
|
+ .params(body)
|
|
|
|
|
+ .currentUser(ERPUtils.getSysTokenUser())
|
|
|
|
|
+ .dataSourceId(dataSourceId)
|
|
|
|
|
+ .supplierCode(supplierCode)
|
|
|
|
|
+ .build();
|
|
|
|
|
+ //此脚本异步调用算了,统一返回配送平台需要的返回值
|
|
|
|
|
+ RetResult<InvokeCallResult> callInvokeResult = expressOutService.callExpress(callInvokeParams, ERPUtils.getSysTokenUser(), dataSourceId, supplierCode);
|
|
|
|
|
+ //每个平台需要返回的玩意也不同,
|
|
|
|
|
+ if (callInvokeResult.isSuccess()) {
|
|
|
|
|
+ response.finish(200, callSignResult.getResult().getData());
|
|
|
|
|
+ } else {
|
|
|
|
|
+ response.finish(200, callSignResult.getRetinfo());
|
|
|
|
|
+ }
|
|
|
|
|
+ } else {
|
|
|
|
|
+ response.finish(200, callSignResult.getRetinfo());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
//当前查看顺丰的回调,没有字段体现出顺丰的接口,大概每个快递平台需要不同的地址提供回调,顺丰的回调可以通过url_index来判断回调的业务
|
|
//当前查看顺丰的回调,没有字段体现出顺丰的接口,大概每个快递平台需要不同的地址提供回调,顺丰的回调可以通过url_index来判断回调的业务
|
|
|
|
|
|
|
|
@HttpMapping(url = "/express/sfCall", methods = {"POST", "GET"}, comment = "回调入口")
|
|
@HttpMapping(url = "/express/sfCall", methods = {"POST", "GET"}, comment = "回调入口")
|
|
@@ -108,7 +165,7 @@ public class ExpressCallServlet extends HttpServlet {
|
|
|
//其它平台看了两个,好像都只有一个回调,就顺丰有一堆回调,这里统一,让脚本里面分开处理,脚本大点就大点吧
|
|
//其它平台看了两个,好像都只有一个回调,就顺丰有一堆回调,这里统一,让脚本里面分开处理,脚本大点就大点吧
|
|
|
|
|
|
|
|
InvokeCallParams callParams = InvokeCallParams.newBuilder()
|
|
InvokeCallParams callParams = InvokeCallParams.newBuilder()
|
|
|
- .businessMethod("Express_OrderStatusInvoke_SFTC")
|
|
|
|
|
|
|
+ .businessMethod("Express_CallBack_Invoke_SFTC")
|
|
|
.params(body)
|
|
.params(body)
|
|
|
.currentUser(ERPUtils.getSysTokenUser())
|
|
.currentUser(ERPUtils.getSysTokenUser())
|
|
|
.dataSourceId(dataSourceId)
|
|
.dataSourceId(dataSourceId)
|