快递100发送订阅请求并且回调改变物流状态

快递100官网地址:https://api.kuaidi100.com/document/5f0ffb5ebc8da837cbd8aefc

第一步:申请企业版的key(https://api.kuaidi100.com/register/enterprise/)

第二步:把得到的key相关数据放至application.yml文件中


第三步:首先先发起订阅请求,看需求是什么样的。可以在填快递单号时发送请求,也可以定时批量发送请求。

@Value("${kuaidi100.key}")

private String key;//第一步所申请的key

@Value("${kuaidi100.callbackurl}")

private String callbackurl;  //回调地址 ,配置在yml文件里,需要是外网地址,本地测的时候需要发布一个测试服务,可以现在postman上面调通。callbackurl就是第4步要介绍的回调接口。

private Stringfrom =""; //出发地城市

private Stringto =""; //目的地城市

private Stringsalt =""; //加密串

private int resultv2 =1; //行政区域解析

private int autoCom =0; //单号智能识别

private int interCom =0; //开启国际版

private StringdepartureCountry =""; //出发国

private StringdepartureCom =""; //出发国快递公司编码

private StringdestinationCountry =""; //目的国

private StringdestinationCom =""; //目的国快递公司编码

private Stringphone =""; //手机号



//订阅该订单,放在某一个方法里

//传快递公司编号(必填),订单号(必填),出发地城市,目的地城市,回调地址,请求快递100订阅请求接口(具体参数可参照快递100订阅请求接口的请求参数)

逻辑层:

SubscriptionRequest subscriptionRequest =new SubscriptionRequest(key);

String result = subscriptionRequest.subscribeData(address.getExpressNo(), address.getExpressNum(), from, to, callbackurl, salt, resultv2, autoCom, interCom, departureCountry, departureCom, destinationCountry, destinationCom, phone);

JSONObject jsonObject =JSONObject.parseObject(result);

Integer returnCode = jsonObject.getInteger("returnCode");//当returnCode 为200时表示订阅成功,在15到4个小时会回调接口,改状态

if(returnCode!=200){

logger.info("订阅失败",result);

}


//上面一个方法要调用的

/**

* 订阅请求方法

* @param company          快递公司编码

* @param number            快递单号

* @param from            出发地城市

* @param to              目的地城市

* @param callbackurl        回调地址URL

* @param salt            加密签名字符串

* @param resultv2          行政区域解析

* @param autoCom          智能判断单号归属快递公司

* @param interCom          开启国际版

* @param departureCountry    出发国编码

* @param departureCom      出发国快递公司编码

* @param destinationCountry  目的国编码

* @param destinationCom      目的国快递公司编码

* @param phone                手机号

* @return

*/

public StringsubscribeData(String company, String number, String from, String to, String callbackurl, String salt, int resultv2, int autoCom,

                            int interCom, String departureCountry, String departureCom, String destinationCountry, String destinationCom, String phone) {

StringBuilder param =new StringBuilder("{");

    param.append("\"company\":\"").append(company).append("\"");

    param.append(",\"number\":\"").append(number).append("\"");

    param.append(",\"from\":\"").append(from).append("\"");

    param.append(",\"to\":\"").append(to).append("\"");

    param.append(",\"key\":\"").append(this.key).append("\"");

    param.append(",\"parameters\":{");

    param.append("\"callbackurl\":\"").append(callbackurl).append("\"");

    param.append(",\"salt\":\"").append(salt).append("\"");

    if(1 == resultv2) {

param.append(",\"resultv2\":1");

    }else {

param.append(",\"resultv2\":0");

    }

if(1 == autoCom) {

param.append(",\"autoCom\":1");

    }else {

param.append(",\"autoCom\":0");

    }

if(1 == interCom) {

param.append(",\"interCom\":1");

    }else {

param.append(",\"interCom\":0");

    }

param.append(",\"departureCountry\":\"").append(departureCountry).append("\"");

    param.append(",\"departureCom\":\"").append(departureCom).append("\"");

    param.append(",\"destinationCountry\":\"").append(destinationCountry).append("\"");

    param.append(",\"destinationCom\":\"").append(destinationCom).append("\"");

    param.append(",\"phone\":\"").append(phone).append("\"");

    param.append("}");

    param.append("}");

    Map params =new HashMap();

    params.put("schema", "json");

    params.put("param", param.toString());

    System.out.println(params);

    return PostRequest.post(SUBSCRIBE_URL,params);

}

//上面一个方法要调用的

/**

* 发送post请求

*/

public static Stringpost(String path, Map params) {

StringBuffer response =new StringBuffer("");

    BufferedReader reader =null;

    try {

StringBuilder builder =new StringBuilder();

        for (Map.Entry param : params.entrySet()) {

if (builder.length() >0) {

builder.append('&');

            }

builder.append(URLEncoder.encode(param.getKey(), "UTF-8"));

            builder.append('=');

            builder.append(URLEncoder.encode(String.valueOf(param.getValue()), "UTF-8"));

        }

byte[] bytes = builder.toString().getBytes("UTF-8");

        URL url =new URL(path);

        HttpURLConnection conn = (HttpURLConnection) url.openConnection();

        conn.setConnectTimeout(3000);

        conn.setReadTimeout(3000);

        conn.setRequestMethod("POST");

        conn.setRequestProperty("accept", "*/*");

        conn.setRequestProperty("connection", "Keep-Alive");

        conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");

        conn.setRequestProperty("Content-Length", String.valueOf(bytes.length));

        conn.setDoOutput(true);

        conn.getOutputStream().write(bytes);

        reader =new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));

        String line ="";

        while ((line = reader.readLine()) !=null) {

response.append(line);

        }

}catch (Exception e) {

e.printStackTrace();

    }finally {

try {

if (null != reader) {

reader.close();

            }

}catch (IOException e) {

e.printStackTrace();

        }

}

return response.toString();

}


第四步:回调接口

controller层

@ApiOperation("快递100订阅事件回调")

@PostMapping("/callback")

@AnonymousAccess

public CallbackResponsecallback(HttpServletRequest request) {//

    String param = request.getParameter("param");

    Gson gson =new Gson();

    CallbackResponse response;

    try {

CallbackRequest callbackRequest = gson.fromJson(param, CallbackRequest.class);

        response =ordersService.expressCallback(callbackRequest);

    }catch (Exception ex) {

System.out.println("快递100回调错误---------------\n请求参数:\n"+param+ ex);

        response =new CallbackResponse();

        response.setResult(false);

        response.setMessage(ex.getMessage());

        response.setReturnCode("500");

    }

return response;

}


service层:

/**

* 快递100回调接口

*

* @param request 回调内容

* @return 回单返回内容

*/

CallbackResponseexpressCallback(CallbackRequest request);



serviceImpl层:

@Override

@Transactional

public CallbackResponseexpressCallback(CallbackRequest request) {

CallbackResponse response =new CallbackResponse();

    //最新查询结果,若在订阅报文中通过interCom字段开通了国际版,则此lastResult表示出发国的查询结果,全量,倒序(即时间最新的在最前)

    CallbackRequest.LastResult lastResult = request.getLastResult();

    if (lastResult !=null) {

//快递单当前签收状态,包括0在途,1揽收,2疑难,3签收,4退签,5派件,6退回,7转投,10待清关,11清关中,12已清关,13清关异常,14拒签

        String state = lastResult.getState();

        //快递单号

        String expressNo = lastResult.getNu();

        Orders order =addressRepository.findByExpressNo(expressNo);//查询订单号

        //如果订单存在

        if (order!=null) {

//更改运单的状态

            order.setStatus(state); //快递单当前状态,包括0在途,1揽收,2疑难,3签收,4退签,5派件,6退回,7转投,10待清关,11清关中,12已清关,13清关异常,14拒签

            addressRepository.save(order);

        }

}

return response;

}


第五步:回调接口可以现在postman里调通

Headers设置:

Body参数设置:

param参数要严格按照快递100回调地址上的参数文档来:

{

    "status": "polling",

    "billstatus": "got",

    "message": "",

    "autoCheck": "1",

    "comOld": "yuantong",

    "comNew": "ems",

    "lastResult": {

        "message": "ok",

        "state": "0",

        "status": "200",

        "condition": "F00",

        "ischeck": "0",

        "com": "yuantong",

        "nu": "SF1803778191716",

        "data": [

        {

                "context": "上海分拨中心/装件入车扫描 ",

                "time": "2012-08-28 16:33:19",

                "ftime": "2012-08-28 16:33:19",

                "status": "在途",

                "areaCode": "310000000000",

                "areaName": "上海市"

            },

            {

                "context": "上海分拨中心/下车扫描 ",

                "time": "2012-08-27 23:22:42",

                "ftime": "2012-08-27 23:22:42",

                "status": "在途",

                "areaCode": "310000000000",

                "areaName": "上海市"

            }

        ]

    },

    "destResult": {

        "message": "ok",

        "state": "0",

        "status": "200",

        "condition": "F00",

        "ischeck": "0"    ,

        "com": "speedpost",

        "nu": "EX015142583SG",

        "data": [

        {

                "context": "[01000]Final delivery Delivered to: SLOVESNOV",

                "time": "2016-05-24 14:00:00",

                "ftime": "2016-05-24 14:00:00",

                "status": "签收",

                "areaCode": null,

                "areaName": null

            }

        ]

    }

}


第6步:回调地址会根据不同的时间来处理订单物流状态。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,366评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,521评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,689评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,925评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,942评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,727评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,447评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,349评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,820评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,990评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,127评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,812评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,471评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,017评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,142评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,388评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,066评论 2 355

推荐阅读更多精彩内容