zoukankan      html  css  js  c++  java
  • 免费对接快递鸟api单号识别查询接口(python)

    由于自己网站需要对接一些物流查询快递,然后在网上搜了一圈发现快递鸟比较适合我

    之前写快递api的时候,官网上只有php和.net的示例,而我使用python封装的相关功能踩了许多坑,才搞出来,分享一下我的方法。

    技术文档请参考快递鸟官网api:https://www.kdniao.com/api-track 

    快递公司编码链接:https://www.kdniao.com/file/2019快递鸟接口支持快递公司编码.xlsx 

    【接入流程】

    1>.注册快递鸟账号,
        API_ID:XXXXXXX

    API_KEY:XXXXXXXXXXXXXXXXXX
    2>.服务申请 在个人中心里面申请需要的服务,即时查询功能有免费的服务 
    3>.对接服务 ***写自己的业务逻辑***----本文主体
    4>.测试代码
    5>.正式使用

    快递鸟物流单号查询api接口demo地址免费调用

    1、登录快递鸟官网注册页面注册快递鸟账号 

    2、登录快递鸟用户管理后台

    注:登录快递鸟用户管理后台后获得用户ID和APIKey,此用于保证应用来源的可靠性,避免应用伪造,被不法使用。

    使用说明:

    1.kdniao.php 不需要修改改任何东西

    2.example.php 按照说明使用

    3.如果有什么不清楚的地方,请到快递鸟的官网咨询

    4对接示例

    Demo由快递鸟写好,只需要下载就可以运行用上,(自己做简单的修改)

    下面是下载Demo的网站,根据自己需要下载 www.kdniao.com/api-all 

    (三)必传参数说明:

    请求内容: OrderCode:

    订单编号—非必须 ShipperCode:快递公司编码—必须 LogisticCode:物流单号—必须 系统参数 RequestData:

    将JSON格式请求内容进行URL(utf-8)编码; EBusinessID:API_ID; RequestType:1002; DataSign:

    请求内容(未编码)+AppKey)进行MD5加密,然后Base64编码,最后 进行URL(utf-8)编码

    (四)功能封装

    *省去了导包语句,根据自己情况添加

    # 请求数据处理
    def organize_request_data(shipper_code, logistic_code):
        """编码请求数据"""
        original_request_data = {
            "OrderCode": "",  # 默认设置为空
            "ShipperCode": shipper_code,
            "LogisticCode": logistic_code,
            "IsHandleInfo": "0"
        }
        # 数据转换为json格式
        data = json.dumps(original_request_data)
    
        # 进行url编码
        # 这里有个坑,有兴趣的可以试试
        #  request_data = quote(data),二者还是有区别的
        request_data = quote(data).replace("%20%", "%")
    
        return request_data
    
    def generate_data_sign(shipper_code, logistic_code):
        """生成datasign"""
        original_request_data = {
            'OrderCode': '',
            'ShipperCode': shipper_code,
            'LogisticCode': logistic_code,
            "IsHandleInfo": "0"
        }
        # APP_KEY = API_KEY_PRO
        APP_KEY = API_KEY_PRO
    
        # 请求内容(未编码) + AppKey
        # 此处有另一个坑,关于MD5加密,字典中存不存在空格,结果并不一样,而对于此接口,需要去除空格
        data = json.dumps(original_request_data).replace(": ", ":").replace(", ", ",") + APP_KEY
    
        # md5加密
        sign_md5 = hashlib.md5(data.encode("utf-8")).hexdigest()
    
        # Base64编码
        data_sign = base64.b64encode(sign_md5.encode("utf-8")).decode("utf-8")
    
        return data_sign

    /*MD5的空格效果 */

    (五)视图逻辑:

    class CompanyView(LoginRequiredView):
    """快递公司编码展示"""
    def get(self, request):
    company_qs = KDCompany.objects.all()
    company_list = []
    for company in company_qs:
    company_list.append({
    "name": company.name,
    "code": company.code
    })
    return http.JsonResponse({'code': RETCODE.OK, 'errmsg': 'OK', 'company_list': company_list})
    
    
    class KD(LoginRequiredView):
    """展示快递详情"""
    def post(self, request):
    shipper_codes = request.POST.get('shipper_code')
    # 由于前端代码的XX,此处需处理取得的数据,以取得所需的code
    shipper_code=shipper_codes.split(" ")[0]
    logistic_code = request.POST.get('logistic_code')
    request_data = organize_request_data(shipper_code, logistic_code)
    data_sign = generate_data_sign(shipper_code, logistic_code)
    API_ID = API_ID_PRO
    API_URL = API_URL_PRO
    data = {
    "RequestData": request_data,
    "DataSign": data_sign,
    "RequestType": "1002",
    "EBusinessID": API_ID,
    "ShipperCode": shipper_code,
    "LogisticCode": logistic_code,
    "DataType":"2"
    }
    # 按要求设置请求头信息
    headers = {'content-type': 'application/x-www-form-urlencoded','content-Encoding': 'charset=utf-8'}
    kd_response = requests.post(url=API_URL, data=data,headers=headers)
    kd_response.encoding="utf-8"
    trace_resp=json.loads(kd_response.content).get("Traces")
    trace_black = ""
    traces = trace_black if type(trace_resp) == "NoneType" else trace_resp
    context = {
    "ShipperCode": shipper_code,
    "LogisticCode": logistic_code,
    "kd_response":traces
    }
    return render(request, 'kd_trace.html', context)
  • 相关阅读:
    Java入门 第二季第三章 继承
    湖南长沙IOS(xcode swift) 开发交流群
    C++对象模型——"无继承"情况下的对象构造(第五章)
    算术与逻辑运算指令具体解释
    linux中man手冊的高级使用方法
    Swift 数组
    webservice Connection timed out
    创建SharePoint 2010 Timer Job
    指向函数的指针数组的使用方法
    修改Tomcat Connector运行模式,优化Tomcat运行性能
  • 原文地址:https://www.cnblogs.com/kdn2019/p/11558360.html
Copyright © 2011-2022 走看看