网上关于顺丰快递API的开发资料很少,特别是PHP的,而顺丰快递的SDK包只有java和c#的,截止目前也没有php的。PHPER们操作顺风快递API是不是会碰到些问题啊。 本文地址:http://www.04007.cn/article/21.html,未经许可,不得转载.
顺丰的API步骤不多说了,去顺丰官网注册申请个ID和KEY,就可以开始下面的第一步申请TOKEN的程序开发。 本文地址:http://www.04007.cn/article/21.html,未经许可,不得转载.
TOKEN授权的请求URL格式:https://open-sbox.sf-express.com/public/v1.0/security/access_token/sf_appid/99999999/sf_appkey/691EF6B3E08FB629E1BBFE1DA596986E,appid和appkey后面跟的值就是通过顺丰开发者申请后所获得的授权数据。一开始我使用CURL方法来取TOKEN,采用post方式向上方的URL提交数据,一直返回: 本文地址:http://www.04007.cn/article/21.html,未经许可,不得转载.
HTTP/1.1 411 Length Required Server: nginx Date: Thu, 14 May 2015 12:36:35 GMT Content-Type: text/html Content-Length: 174 Connection: close返回411错误,说明没有指明content-length值。后加上length为0后,报415错误。然后到网上找了415的相关资料,尝试使用stream_context_create结合file_get_contents的方法以及fsockopen仍未解决后,再回头认真看顺丰的API介绍,看到顺丰接口还有一个:
请求报文体数据:{"head":{"transType":"301","transMessageId":"201408192052000001"}} 本文地址:http://www.04007.cn/article/21.html,未经许可,不得转载.
在顺丰的API规范里面:https://open.sf-express.com/document/apinorm.html 有对报文体值意义的解释。如下图: 本文地址:http://www.04007.cn/article/21.html,未经许可,不得转载.
本文地址:http://www.04007.cn/article/21.html,未经许可,不得转载.
现在就清楚了,缺少发送这个报文体,那这个报文体怎么发送呢,可以看到它并不是像post提交一个数组那样。而是一个字符串。而且通过411报错可确定,数据发送时要求带上content-length值。那么就使用CURL就可以用以下方法了: 本文地址:http://www.04007.cn/article/21.html,未经许可,不得转载.
本文地址:http://www.04007.cn/article/21.html,未经许可,不得转载.
function doCurl($url){ $ch=curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt($ch, CURLOPT_HEADER,1); curl_setopt($ch, CURLOPT_TIMEOUT,5); $data='{"head":{"transType":"301","transMessageId":"201505141933000001"}}'; curl_setopt($ch,CURLOPT_POST, true); $header = $this->FormatHeader($url,$data); curl_setopt($ch, CURLOPT_HTTPHEADER,$header); curl_setopt($ch, CURLOPT_POSTFIELDS,$data); $rs=curl_exec($ch); }另外一个formatheader格式方请求头信息的方法:
function FormatHeader($url,$data){ $temp = parse_url($url); $query = isset($temp['query']) ? $temp['query'] : ''; $path = isset($temp['path']) ? $temp['path'] : '/'; $header = array ( "POST {$path}?{$query} HTTP/1.1", "Host: {$temp['host']}", "Content-Type: application/json", "Content-length: ".strlen($data), "Connection: Close" ); return $header; }注意发送的格式:Content-Type值是json格式,如果这个地方写错,则服务器会返回415,这样就能正确取回TOKEN值了。如果不想使用CURL(需要curl扩展),也可以使用fsockopen方法.
$post_string='{"head":{"transType":"301","transMessageId":"201505141933000001"}}'; $http_entity_body = $post_string; $http_entity_type = 'application/json'; $http_entity_length = strlen($http_entity_body); $host = 'open-sbox.sf-express.com';#'119.147.212.106'; $port = 443; $path = '/public/v1.0/security/access_token/sf_appid/0000key9/sf_appkey/71FCkeyA2B8'; $fp = fsockopen('ssl://'.$host, $port); if ($fp) { fputs($fp, "POST {$path} HTTP/1.1rn"); fputs($fp, "Host: {$host}rn"); fputs($fp, "Content-Type: {$http_entity_type}rn"); fputs($fp, "Content-Length: {$http_entity_length}rn"); fputs($fp, "Connection: closernrn"); fputs($fp, $http_entity_body . "rnrn"); $d=''; while (!feof($fp)) { $d .= fgets($fp, 4096); } fclose($fp); echo $d; }上面的两种方法我都成功实现取回TOKEN。至于file_get_contents方法我就没再去尝试,我想也有办法实现的。成功获取token时截图:(本站文章均为原创:转载本站文章请注明来源:04007.cn)
本文地址:http://www.04007.cn/article/21.html,未经许可,不得转载.
本文地址:http://www.04007.cn/article/21.html,未经许可,不得转载.
本文地址:http://www.04007.cn/article/21.html 未经许可,不得转载. 手机访问本页请扫描下方二维码: