作者:浙江小雨
社群有狐友提问:如何在vfp中跟踪我在安能物流发出货物的实时状态数据?
查询和追踪快递单的流向有这么难吗?No,用猫框分分种搞定!
我们找来了快递鸟物流查询接口http://www.kdniao.com/。
第一步:注册新用户。
填入手机号,获取验证码,注册。
第二步,实名认证。
填写自己企业的名称,地址,联系电话,证照上传。
第三步,购买快递物流查询服务。
这里,我们选择免费的就可以了。有四家快递公司的单子是可以免费查询的。
第四步,取得调用的帐号和KEY。
第五步,按接口文档,对接数据传递。
从网站上下载接口文档。
看到以下说明:
- 我们可以看到这个一个http接口,使用POST传参的。网址如下:
lcUrl=[ https://api.kdniao.com/Ebusiness/EbusinessOrderHandle.aspx] - 请求的编码格式为:
“application/x-www-form-urlencoded;charset=utf-8”
这个就是我们POST请求前设置的请求头。 - 请求全部内容,有一定格式并进行密文的签名。
(1)内容为一串JSON字符串 {‘OrderCode’:‘’,‘ShipperCode’:‘SF’,‘LogisticCode’:‘118954907573’}
(2)密文签名的规则为:
把(jsonStr+APIKey)进行MD5加密, 然后Base64编码, 最后 进行URL(utf-8)编码
(3)最后发送的字符串为:
string PostStr = “RequestType=1002&EBusinessID= used &RequestData=jsonStr
&DataSign= datasign&DataType=DataType”
第六步,用猫框来写我们的VFP代码,进行对接。
有了上面的分析,我们可以直接写代码了。
- 先把需要的固定的参数定义一下。
lcid=[1774] &&填写用户ID
lcAPIkey=[e26ac096----31619b53322d] &&填入API KEY
lcurl = https://api.kdniao.com/Ebusiness/EbusinessOrderHandle.aspx &&调用的网址。
lcDataType = “2” &&返回的数据类型
lccharset = “UTF-8” &&charset的格式
**请求内容的字符串 ,一个圆通快递的单子,圆通简称代码:YTO ,快递单号: YTO118461988807
TEXT TO jsonStr NOSHOW TEXTMERGE PRETEXT 15
{“OrderCode”:“”,“ShipperCode”:“YTO”,“LogisticCode”:“YTO118461988807”}
ENDTEXT
- 计算出加密的签名。
我们知道签名格式为:
把(jsonStr+APIKey)进行MD5加密, 然后Base64编码, 最后 进行URL(utf-8)编码
lcdata=jsonStr+lcAPIkey &&这里注意,如果含有中文,需要进utf-8转码。
lcmd5data=md5string(lcdata) &&MD5加密
lcmd5data=LOWER(lcmd5data) &&特别注意,这里MD5需要小写。
lcbasedata=STRCONV(lcmd5data,13) &&base64编码
lcURLdata=URLEncode(lcbasedata) &&进行URL编码。
lcdatasign=lcURLdata &&最终形成签名。
我们这里一步一步,把加密过程都分解出来了。这样对初学者更容易看得懂一些。
-
请求内容的字符串,进行URL编码
lcURLjsonSTR=URLEncode(jsonStr) -
组织我们最终的发送字符串。
格式如下:RequestType=1002&EBusinessID= used &RequestData=jsonStr
&DataSign= datasign&DataType=DataType
TEXT TO lcPostStr NOSHOW TEXTMERGE PRETEXT 15
RequestType=1002&EBusinessID=<>&RequestData=<>&DataSign=<>&DataType=<>
ENDTEXT
- 最后就是发送了。
*建一个发送浏览器。
WebClient=Newobject(“Qiyu_HttpClient”,“Qiyu_HttpClient.prg”)
*设置POST发送
WebClient.method=“post”
*设置二个请求头。
WebClient.setHeader(“Content-type”,“application/x-www-form-urlencoded”)
WebClient.setHeader(“charset”,“utf-8”)
*发送
cData=WebClient.send(lcUrl,lcPostStr)
看一下,返回的结果。
If !Isnull(cData)
Messagebox(cData)
Else
Messagebox(WebClient.msg)
Endif
我传的单号是随意取的,他返回一个“暂无轨迹信息”,那就是成功了。
附:完整VFP源码
lcid=[17****74] &&填写用户ID
lcAPIkey=[e26ac096-****-****-****-31619b53322d] &&填入API KEY
lcurl ="https://api.kdniao.com/Ebusiness/EbusinessOrderHandle.aspx" &&调用的网址。
lcDataType = "2" &&返回的数据类型
lccharset = "UTF-8" &&charset的格式
**请求内容的字符串 ,一个圆通快递的单子,圆通简称代码:YTO ,快递单号: YTO118461988807
TEXT TO jsonStr NOSHOW TEXTMERGE PRETEXT 15
{"OrderCode":"","ShipperCode":"YTO","LogisticCode":"YTO118461988807"}
ENDTEXT
*把(jsonStr+APIKey)进行MD5加密, 然后Base64编码, 最后 进行URL(utf-8)编码
lcdata=jsonStr+lcAPIkey &&这里注意,如果含有中文,需要进utf-8转码。
lcmd5data=md5string(lcdata) &&MD5加密
lcmd5data=LOWER(lcmd5data) &&特别注意,这里MD5需要小写。
lcbasedata=STRCONV(lcmd5data,13) &&base64编码
lcURLdata=URLEncode(lcbasedata) &&进行URL编码。
lcdatasign=lcURLdata &&最终形成签名。
*jsonStr 进行URL(utf-8)编码
lcURLjsonSTR=URLEncode(jsonStr)
*最终的发送字符串
TEXT TO lcPostStr NOSHOW TEXTMERGE PRETEXT 15
RequestType=1002&EBusinessID=<<lcid>>&RequestData=<<lcURLjsonSTR>>&DataSign=<<lcdatasign>>&DataType=<<lcDataType>>
ENDTEXT
*建一个发送浏览器。
WebClient=Newobject("Qiyu_HttpClient","Qiyu_HttpClient.prg")
*设置POST发送
WebClient.method="post"
*设置二个请求头。
WebClient.setHeader("Content-type","application/x-www-form-urlencoded")
WebClient.setHeader("charset","utf-8")
*发送
cData=WebClient.send(lcUrl,lcPostStr)
If !Isnull(cData)
Messagebox(cData)
Else
Messagebox(WebClient.msg)
Endif