ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 1397|回复: 5

[求助] 快递鸟API 电子面单出现405错误

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-9-1 09:21 | 显示全部楼层 |阅读模式
借用论坛 samuel1573 的代码,总是出现405错误,原代码和修改后的代码都是一样。

如果用EXCEL打印电子面单,对于我们公司的工作效率会有大幅提高,所以很想做这么一个东西。恳请论坛里各位大师赐教啊。

Sub KDNiao()
    Dim mysender As String                                                                                                            '发件人信息
    Dim myname As String
    Dim mytel As String
    Dim mymob As String
    myname = "昭"
    mytel = "0731-0000000"
    mymob = "13055550000"
    mysender = ""
    mysender = mysender & Chr(34) & "Company" & Chr(34) & Chr(58) & Chr(34) & "湖南莲港紧固件有限公司" & Chr(34) & Chr(44)             'Company
    mysender = mysender & Chr(34) & "Name" & Chr(34) & Chr(58) & Chr(34) & myname & Chr(34) & Chr(44)                                  'Name
    mysender = mysender & Chr(34) & "Tel" & Chr(34) & Chr(58) & Chr(34) & mytel & Chr(34) & Chr(44)                                    'Tel
    mysender = mysender & Chr(34) & "Mobile" & Chr(34) & Chr(58) & Chr(34) & mymob & Chr(34) & Chr(44)                                 'Mobile
    mysender = mysender & Chr(34) & "PostCode" & Chr(34) & Chr(58) & Chr(34) & "411228" & Chr(34) & Chr(44)                            'PostCode
    mysender = mysender & Chr(34) & "ProvinceName" & Chr(34) & Chr(58) & Chr(34) & "湖南省" & Chr(34) & Chr(44)                        'ProvinceName
    mysender = mysender & Chr(34) & "CityName" & Chr(34) & Chr(58) & Chr(34) & "湘潭市" & Chr(34) & Chr(44)                            'CityName
    mysender = mysender & Chr(34) & "ExpAreaName" & Chr(34) & Chr(58) & Chr(34) & "湘潭县" & Chr(34) & Chr(44)                         'ExpAreaName
    mysender = mysender & Chr(34) & "Address" & Chr(34) & Chr(58) & Chr(34) & "天易工业园杨柳中路" & Chr(34)                           'Address

    Dim myreceiver As String                                                                                                            '收件人信息
    Dim mycom_re As String
    Dim myname_re As String
    Dim mytel_re As String
    Dim mymob_re As String
    Dim mypro_re As String
    Dim myct_re As String
    Dim myean_re As String
    Dim myadr_re As String
    mycom_re = "KDNiao"
    myname_re = "Zhang San"
    mytel_re = "0755-0907283"
    mymob_re = "13709076789"
    mypro_re = "广东省"
    myct_re = "深圳市"
    myean_re = "福田区"
    myadr_re = "深南大道 2008号"
    myreceiver = ""
    myreceiver = myreceiver & Chr(34) & "Company" & Chr(34) & Chr(58) & Chr(34) & mycom_re & Chr(34) & Chr(44)                           'Company
    myreceiver = myreceiver & Chr(34) & "Name" & Chr(34) & Chr(58) & Chr(34) & myname_re & Chr(34) & Chr(44)                             'Name
    myreceiver = myreceiver & Chr(34) & "Tel" & Chr(34) & Chr(58) & Chr(34) & mytel_re & Chr(34) & Chr(44)                               'Tel
    myreceiver = myreceiver & Chr(34) & "Mobile" & Chr(34) & Chr(58) & Chr(34) & mymob_re & Chr(34) & Chr(44)                            'Mobile
    myreceiver = myreceiver & Chr(34) & "PostCode" & Chr(34) & Chr(58) & Chr(34) & "" & Chr(34) & Chr(44)                                'PostCode
    myreceiver = myreceiver & Chr(34) & "ProvinceName" & Chr(34) & Chr(58) & Chr(34) & mypro_re & Chr(34) & Chr(44)                      'ProvinceName
    myreceiver = myreceiver & Chr(34) & "CityName" & Chr(34) & Chr(58) & Chr(34) & myct_re & Chr(34) & Chr(44)                           'CityName
    myreceiver = myreceiver & Chr(34) & "ExpAreaName" & Chr(34) & Chr(58) & Chr(34) & myean_re & Chr(34) & Chr(44)                       'ExpAreaName
    myreceiver = myreceiver & Chr(34) & "Address" & Chr(34) & Chr(58) & Chr(34) & myadr_re & Chr(34)                                     'Address


    Dim mycommodity As String
    Dim mygoodsname As String
    mygoodsname = "铆螺母"
    mycommodity = mycommodity & Chr(34) & "GoodsName" & Chr(34) & Chr(58) & Chr(34) & mygoodsname & Chr(34) & Chr(44)                    '商品名称

    Dim myjson As String
    Dim myorder As String
    Dim myoc As String
    myoc = Int((1000 * Rnd) + 1)
    myorder = "1234563"
    myjson = Chr(123)
    myjson = myjson & Chr(34) & "MemberID" & Chr(34) & Chr(58) & Chr(34) & "945119" & Chr(34) & Chr(44)                                 '外部识别代码 非必要
    myjson = myjson & Chr(34) & "CustomerName" & Chr(34) & Chr(58) & Chr(34) & "testuc" & Chr(34) & Chr(44)                             '优速内部用户名 重要
    myjson = myjson & Chr(34) & "CustomerPwd" & Chr(34) & Chr(58) & Chr(34) & "testucpwd" & Chr(34) & Chr(44)                           '优速用户名密码 非必要
    myjson = myjson & Chr(34) & "SendSite" & Chr(34) & Chr(58) & Chr(34) & "" & Chr(34) & Chr(44)                                       '网点名称 非必要
    myjson = myjson & Chr(34) & "ShipperCode" & Chr(34) & Chr(58) & Chr(34) & "UC" & Chr(34) & Chr(44)                                  '快递公司 重要
    myjson = myjson & Chr(34) & "LogisticCode" & Chr(34) & Chr(58) & Chr(34) & myorder & Chr(34) & Chr(44)                              '快递单号 非必要
    myjson = myjson & Chr(34) & "ThrOrderCode" & Chr(34) & Chr(58) & Chr(34) & "" & Chr(34) & Chr(44)                                   '第三方订单号 非必要
    myjson = myjson & Chr(34) & "OrderCode" & Chr(34) & Chr(58) & Chr(34) & myoc & Chr(34) & Chr(44)                                    '订单编号,不可重复 重要
    myjson = myjson & Chr(34) & "PayType" & Chr(34) & Chr(58) & Chr(34) & "3" & Chr(34) & Chr(44)                                       '运费支付方式 重要
    myjson = myjson & Chr(34) & "MonthCode" & Chr(34) & Chr(58) & Chr(34) & "12345678" & Chr(34) & Chr(44)                              '月结账号 非必要
    myjson = myjson & Chr(34) & "ExpType" & Chr(34) & Chr(58) & Chr(34) & "1" & Chr(34) & Chr(44)                                       '快递类型 重要
    myjson = myjson & Chr(34) & "Cost" & Chr(34) & Chr(58) & "" & Chr(44)                                                               '运费
    myjson = myjson & Chr(34) & "OtherCost" & Chr(34) & Chr(58) & "" & Chr(44)                                                          '其它费用
    myjson = myjson & Chr(34) & "Receiver" & Chr(34) & Chr(58) & Chr(123) & myreceiver & Chr(125) & Chr(44)                             '收件人信息
    myjson = myjson & Chr(34) & "Sender" & Chr(34) & Chr(58) & Chr(123) & mysender & Chr(125) & Chr(44)                                 '发件人信息
    myjson = myjson & Chr(34) & "Quantity" & Chr(34) & Chr(58) & "1" & Chr(44)                                                          '包裹数量 重要
    myjson = myjson & Chr(34) & "Remark" & Chr(34) & Chr(58) & Chr(34) & "" & Chr(34) & Chr(44)                                         '备注信息
    myjson = myjson & Chr(34) & "Commodity" & Chr(34) & Chr(58) & Chr(91) & Chr(123) & mycommodity & Chr(125) & Chr(93) & Chr(44)       '商品信息
    myjson = myjson & Chr(34) & "IsReturnPrintTemplate" & Chr(34) & Chr(58) & "1" & Chr(44)                                             '是否需要电子面单模板
    myjson = myjson & Chr(34) & "TemplateSize" & Chr(34) & Chr(58) & "180" & Chr(44)                                                    '模板规格
    myjson = myjson & Chr(34) & "IsSendMessage" & Chr(34) & Chr(58) & "0" & Chr(125)                                                    '是否订阅短信

    Dim mypostdata As String
    Dim myurl As String
    Dim myid As String
    Dim myappkey As String
    Dim mydatasign As String
    myurl = "http://sandboxapi.kdniao.cc:8080/kdniaosandbox/gateway/exterfaceInvoke.json"                                             '快递鸟API 测试地址
    myid = "test1377341"                                                                                                              '用户 ID 重要
    myappkey = "2212d5b8-a400-4d52-8c46-24fcdd22d3a1"                                                                                 'API key 重要

    mydatasign = Base64Encode(MD5(myjson & myappkey, "32"), "utf-8")                                                                  '制作DataSign
    If InStr(1, mydatasign, "77u/", 1) > 0 Then                                                                                       '截取BOM头
        mydatasign = Right(mydatasign, Len(mydatasign) - 4)
    End If
    Debug.Print mydatasign

    mypostdata = "EBusinessID=" & myid & Chr(38)                                                                                      'User ID
    mypostdata = mypostdata & "DataType=2" & Chr(38)                                                                                  'Data Type 2 = JSON
    mypostdata = mypostdata & "RequestType=1007" & Chr(38)                                                                            'RequestType 1007 为电子面单接口
    mypostdata = mypostdata & "RequestData="                                                                                          'requestdata = JSON data set
    mypostdata = mypostdata & myjson & Chr(38) & "DataSign=" & Mid(mydatasign, 5)
    Debug.Print mypostdata

    Dim myresponse As String
    Dim mywinH As Object
    Set mywinH = CreateObject("WinHttp.WinHttpRequest.5.1")
    mywinH.Open "post", myurl
    mywinH.setRequestHeader "Content-Type", "application/x-www-form-urlencoded;charset=utf-8"
    mywinH.setRequestHeader "Accept-Language", "zh-CN"
    mywinH.send mypostdata
    myresponse = ByteToUTF16(mywinH.responseBody, "utf-8")
    Debug.Print myresponse
    Set mywinH = Nothing
End Sub


EXCEL 打电子面单.rar

85.99 KB, 下载次数: 20

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-9-1 14:21 | 显示全部楼层
为什么帖子列表里看不到。

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-9-1 14:23 | 显示全部楼层
发现原代码中UTF-8编码转换有问题,liucqa 的帖子我看不懂,唉,智商不够啊。

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-9-3 13:51 | 显示全部楼层
Sub CHAXUN()                '查询快递
    Dim xmlhttp As Object, str1$, str2$, str3$, str4$
    Dim i%, j%
    Dim myjson As Variant
    Dim mypostdata As String
   
    Application.ScreenUpdating = False
    Application.EnableEvents = False
   
   
    Dim mywinH As Object
    Set mywinH = CreateObject("WinHttp.WinHttpRequest.5.1")
    Dim myurl As String
    Dim myid As String
    Dim myappkey As String
    myurl = "http://api.kdniao.cc/Ebusiness/EbusinessOrderHandle.aspx"                                             '快递鸟API 测试地址
    myid = "1377341"                                                                                                                  '用户 ID 重要
    myappkey = "7a34d8a1-6b02-48e7-8036-90f5e833e02a"                                                                                 'API key 重要
   
   
    s = 3
    T = 96
    For j = s To T
        If Cells(j, 8) <> "已签收" And Cells(j, 5) <> "" Then                                                                    '查询签收状态(H列)
            If InStr(1, Cells(j, 4), "速尔", 1) > 0 Then                                                      '查询物流方式
                str1 = "SURE"
            '        ElseIf InStr(1, Cells(j, 4), "天天", 1) > 0 Then                                                  '查询物流方式
            '            str1 = "tiantian"
            ElseIf InStr(1, Cells(j, 4), "安能", 1) > 0 Then                                                  '查询物流方式
                str1 = "ANE"
            ElseIf InStr(1, Cells(j, 4), "顺丰", 1) > 0 Then                                                  '查询物流方式
                str1 = "SF"
            ElseIf InStr(1, Cells(j, 4), "优速", 1) > 0 Then                                                  '查询物流方式
                str1 = "UC"
            End If
         
         
            myjson = Chr(123)
            myjson = myjson & Chr(34) & "OrderCode" & Chr(34) & Chr(58) & Chr(34) & "" & Chr(34) & Chr(44)                                        '订单编号 非必要
            myjson = myjson & Chr(34) & "ShipperCode" & Chr(34) & Chr(58) & Chr(34) & str1 & Chr(34) & Chr(44)                                    '快递公司 必要
            myjson = myjson & Chr(34) & "LogisticCode" & Chr(34) & Chr(58) & Chr(34) & Trim(Cells(j, 5).Value & Chr(34)) & Chr(125)               '单号 必要
            Debug.Print myjson
        
            mydatasign = Base64Encode(MD5(myjson & myappkey, "32"), "utf-8")                                                                      '制作DataSign
            If InStr(1, mydatasign, "77u/", 1) > 0 Then                                                                                           '截取BOM头
                mydatasign = Right(mydatasign, Len(mydatasign) - 4)
            End If
   
   
            
            Dim WriteStream As Object
            Set WriteStream = CreateObject("ADODB.Stream")
            With WriteStream
                .Type = 2
                .Open
                .Charset = "utf-8"
                .WriteText myjson
                .Position = 0
                .Type = 2
                .Charset = "utf-8"
                .Position = 3                       'skip BOM
                .SaveToFile ThisWorkbook.Path & "\1.txt", 2
                myjson = .ReadText()
                .Close
            End With
'            myjson02 = WriteStream.ReadText()
            Set WriteStream = Nothing
            
'            Debug.Print myjson
'            myjson = ByteToUTF16(myjson, "utf-8")
            Debug.Print UTF8_Encode(myjson)
   
   
            mypostdata = "EBusinessID=" & myid & Chr(38)                                                                                      'User ID
            mypostdata = mypostdata & "DataType=2" & Chr(38)                                                                                  'Data Type 2 = JSON
            mypostdata = mypostdata & "RequestType=1002" & Chr(38)                                                                            'RequestType 1002 为物流查询接口
            mypostdata = mypostdata & "RequestData="                                                                                          'requestdata = JSON data set
            mypostdata = mypostdata & myjson & Chr(38) & "DataSign=" & Mid(mydatasign, 5)
            Debug.Print mypostdata
   
            mywinH.Open "post", "http://api.kdniao.cc/Ebusiness/EbusinessOrderHandle.aspx"
            mywinH.setRequestHeader "Content-Type", "application/x-www-form-urlencoded;charset=utf-8"
            mywinH.setRequestHeader "Accept-Language", "zh-CN"
            mywinH.send mypostdata
            myresponse = ByteToUTF16(mywinH.responseBody, "utf-8")
            Debug.Print myresponse
            Cells(j, 10).Value = myresponse
            Cells(j, 11).Value = mywinH.responsetext
    '        str2 = mywinH.responsetext  '取得物流数据
        End If
    Next
'    Columns("H:I").AutoFit                      '将区域中的列宽和行高调整为最适当的值。
    Application.ScreenUpdating = True
    Application.EnableEvents = True

End Sub



主贴可能太长了,大家看得麻烦,这个就是查询,只要传”快递公司名称"和“单号"就行简单多了。关键是UTF-8转码,MD5加密,Base64转码以前从未接触过,不知道怎么来判断步骤是否正确,求大师指点啊。

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-9-3 14:10 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
我的报文是
EBusinessID=1377341&DataType=2&RequestType=1002&RequestData={"OrderCode":"","ShipperCode":"UC","LogisticCode":"518455941582"}&DataSign=M2E2Yzc3ODI5NTNmZWYxY2VmYjY0ZmRlZWExMGI=
这样的


正确的应该是:
EBusinessID=test1377341&DataType=2&RequestType=1002&RequestData=%7b%22OrderCode%22%3a%22%22%2c%22ShipperCode%22%3a%22SF%22%2c%22LogisticCode%22%3a%221234561%22%2c%22IsHandleInfo%22%3a%220%22%7d&DataSign=MDNmNGIxZDFiZTAwZGRjNGUxMTAyYTRhYTU5NGJmOWY=
这样的


RequestData不同,搞不清楚是差别是怎么产生的。有老师能指点一下吗?

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-9-3 16:47 | 显示全部楼层
rivet_nuts 发表于 2018-9-3 14:10
我的报文是
EBusinessID=1377341&DataType=2&RequestType=1002&RequestData={"OrderCode":"","ShipperCode ...

这个问题已经找到原因,是URL编码的问题。

新的问题是MD5加密是随机的,还是相同数据加密出来的是内容肯定是一定的???
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2025-1-13 13:23 , Processed in 0.026819 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表