1. 程式人生 > >順豐 豐橋介面 php版

順豐 豐橋介面 php版

<?php
/**
 * 順豐Bsf介面類
 * Created by PhpStorm.
 * Author: duyaqiong
 * Email:[email protected]
 * Date: 2018/6/8
 */

class Bsf
{
    //順豐介面配置
    protected $config = [
        'accesscode' => 'xxxxxxxxxx' ,                              //商戶號碼
        'checkword'  => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',        //商戶密匙
        'ssl'        => false,                                      //是否ssl
        'server'     => "http://bsp-oisp.sf-express.com/",          //http
        'uri'        => 'bsp-oisp/sfexpressService',                //介面地址
    ];
    //返回資訊
    protected $ret = array(
        'head' => "ERR",
        'message' => '系統錯誤',
        'code' => -1
    );


    public function __construct($params = null)
    {
        if (null != $params) {
            $this->config = array_merge($this->config, $params);
        }
    }

    /**
     * 順豐BSP介面主程式 已經已經整合驗證
     * @param $xml
     * @return bool|mixed
     */
    public function postXmlBodyWithVerify($xml,$server){
        $xml       = $this->buildXml($xml,$server);
        $verifyCode= $this->sign($xml, $this->config['checkword']);
        $post_data = "xml=$xml&verifyCode=$verifyCode";
        $response  = $this->postXmlCurl($post_data,$this->getPostUrl());
        return $response;
    }






    /**
     * 順豐BSP下訂單介面(含篩選)
     * 下訂單介面根據客戶需要,可提供以下三個功能:
     * 1) 客戶系統向順豐下發訂單。
     * 2) 為訂單分配運單號。
     * 3) 篩單(可選,具體商務溝通中雙方約定,由順豐內部為客戶配置)。
     * 此介面也用於路由推送註冊。客戶的順豐運單號不是通過此下訂單介面獲取,但卻需要獲取BSP的路由推送時,
     * 需要通過此介面對相應的順豐運單進行註冊以使用BSP的路由推送 介面。
     *
     * @param string $post['j_company'] //寄件方公司名稱
     * @param string $post['j_contact'] //寄件方聯絡人
     * @param string $post['j_tel']     //寄件方聯絡電話
     * @param string $post['j_address'] //寄件地址
     * @param string $post['j_province']//寄件方省份   (選填)
     * @param string $post['j_city']    //寄件方城市   (選填)
     * @param string $post['j_county']  //寄件方縣區   (選填)
     * @param string $post['orderid']   //客戶訂單號
     * @param string $post['d_company'] //到件方公司名稱(選填)
     * @param string $post['d_contact'] //收件方聯絡人
     * @param string $post['d_tel']     //收件方聯絡電話
     * @param string $post['d_address'] //收件方詳細地址,如果不傳輸 d_province/d_city 欄位,此詳細地址 需包含省市資訊,以提高地址識別的 成功率,示例:“廣東省深圳市福田 區新洲十一街萬基商務大廈 10樓”。
     * @param string $post['d_province']//收件方省份
     * @param string $post['d_city']    //收件方城市
     * @param string $post['d_county']  //收件方縣區
     * @param string $post['pay_method']//付款方式:1:寄方付2:收方付3:第三方付
     * @param string $post['express_type']//快件產品類別
     * @param string $post['is_docall'] //是否要求通過是否手持終端通知順豐收派員收件:1:要求 其它為不要求
     * @param string $post['d_county']  //收件方縣區
     * @param array $params             //可選引數的陣列
     * @param array $cargoes            //貨物名稱陣列【name:商品名稱count:商品數量】
     * @param array $cargoes['name']    //商品
     * @param array $cargoes['count']   //數量
     * @param array $addedServices      //增值服務
     * @param string $post['express_type']//*1順丰標快;2順豐特惠;3電商特惠;5順豐次晨;6順豐即日;7電商速配;
     * @param string $post['pay_method']  //*付款方式  1寄方付; 2收方付;3第三方付
     * @return string
     */
    public function Order($params = array(), $cargoes = array(), $addedServices = array())
    {

        $order_params = $this->paramsToString($params);
        $cargoes_str  = count($cargoes) > 0 ? $this->paramsToString($cargoes, 'Cargo') : '';
        $addedServices_str = count($addedServices) > 0 ? $this->paramsToString($addedServices, 'AddedService') : '';
        $xml_string   = "<Order$order_params>$cargoes_str$addedServices_str</Order>";
        $data         = $this->postXmlBodyWithVerify($xml_string,'OrderService');
        return  $this->OrderResponse($data,'OrderResponse');
    }

    /**
     * 順豐BSP查單介面
     * Created by PhpStorm.
     */
    public function OrderSearch($orderid) {
        $OrderSearch = '<OrderSearch orderid="'.$orderid.'" />';
        $data = $this->postXmlBodyWithVerify($OrderSearch,'OrderSearchService');
        return $this->OrderResponse($data,'OrderResponse');
    }




    /**
     * 順豐BSP查單介面,根據運單號或者訂單號【1.運單號,2.訂單號】
     * Created by PhpStorm.
     */
    public function OrderSearchByMailnoOrOrderid($orderid,$type=1) {
        $RouteService = "<RouteRequest tracking_type='".$type."' method_type='1' tracking_number='".$orderid."'/>";
        $data = $this->postXmlBodyWithVerify($RouteService,'RouteService');
        return $this->OrderResponse($data,'RouteResponse');
    }



    /**
     * 確認訂單
     * @param $orderid
     * @param $mailno
     * @param array $options
     * @return array|bool
     */
    public function OrderConfirm($orderid, $mailno, $options = array())
    {
        return $this->OrderConfirmRequest($orderid, $mailno, 1, $options);
    }



    /**
     * 取消訂單
     * @param $orderid
     * @param string $mailno
     * @param array $options
     * @return array|bool
     */
    public function OrderCancel($orderid, $mailno = '', $options = array())
    {
        return $this->OrderConfirmRequest($orderid, $mailno, 2, $options);
    }



    /**
     * 訂單確認與取消傳送
     * @param $orderid 客戶訂單號
     * @param $mailno  運單號
     * @param $dealtype  型別【1:確認;2:取消】
     * @param array $options 其他引數
     * @return array
     */
    public function OrderConfirmRequest($orderid, $mailno, $dealtype, $options = array())
    {
        $params = array();
        $params['dealtype'] = $dealtype;
        $params['orderid']  = $orderid;
        $params['mailno ']  = $mailno;

        $order_params = $this->paramsToString($params);
        $addedServices_str = count($options) > 0 ? $this->paramsToString($options, 'OrderConfirmOption') : '';
        $xml_string   = "<OrderConfirm$order_params>$addedServices_str</OrderConfirm>";
        $data         = $this->postXmlBodyWithVerify($xml_string,'OrderConfirmService');
        return $this->OrderResponse($data,'OrderConfirmResponse');
    }



    /**
     * 返回結果
     * @param $data
     * @return array
     */
    private function  OrderResponse($data,$type = '') {
        return $this->getResponse($data,$type);
    }



    /**
     * 獲取POSTURL地址
     * @return string
     */
    protected function getPostUrl(){
        if($this->config['ssl']){
            return   $this->config['server_ssl'].$this->config['uri'];
        } else {
            return   $this->config['server'].$this->config['uri'];
        }
    }


    /**
     * get request service name
     * 獲取請求伺服器名稱
     * @param null $class
     * @return string
     */
    public function getServiceName($class=null) {
        if (empty($class)) {
            return basename(str_replace('\\', '/', get_called_class()),'.php');
        }
        return basename(str_replace('\\', '/', $class),'.php');;
    }

    /**
     * 拼接XML字串
     * @param $bodyData
     * @return string
     */
    public function buildXml($bodyData,$server){
        $xml = '<Request service="'.$server.'" lang="zh-CN">' .
            '<Head>'.$this->config['accesscode'].'</Head>' .
            '<Body>' . $bodyData . '</Body>' .
            '</Request>';
        return $xml;
    }


    /**
     * 計算驗證碼
     * data 是拼接完整的報文XML
     * check_word 是順豐給的接入碼
     * @param string $data
     * @param string $check_word
     * @return string
     */
    public static function sign($data, $check_word) {
        $string = trim($data).trim($check_word);
        $md5    = md5(mb_convert_encoding($string, 'UTF-8', mb_detect_encoding($string)), true);
        $sign   = base64_encode($md5);
        return $sign;
    }


    /**
     * XML to 陣列.
     * @param string $xml XML string
     * @return array|\SimpleXMLElement
     */
    public static function parse($xml)
    {
        $data = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA | LIBXML_NOBLANKS);
        if (is_object($data) && get_class($data) === 'SimpleXMLElement') {
            $data = self::arrarval($data);
        }
        return $data;
    }


    /**
     * XML to 物件
     * @param $xml
     * @return \SimpleXMLElement
     */
    public static function parseRaw($xml)
    {
        $data = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA | LIBXML_NOBLANKS);
        return $data;
    }


    /**
     * 物件 to 陣列.
     * @param string $data
     * @return array
     */
    private static function arrarval($data)
    {
        if (is_object($data) && get_class($data) === 'SimpleXMLElement') {
            $data = (array) $data;
        }
        if (is_array($data)) {
            foreach ($data as $index => $value) {
                $data[$index] = self::arrarval($value);
            }
        }
        return $data;
    }


    /**
     * 轉換順豐返回XML
     * @param $data
     * @param $name
     * @return array
     */
    public function getResponse($data, $name) {
        $ret = array();
        $xml = @simplexml_load_string($data, 'SimpleXMLElement', LIBXML_NOCDATA | LIBXML_NOBLANKS);
        if ($xml){
            $ret['head'] = (string)$xml->Head;
            if ($xml->Head == 'OK'){
                $ret = array_merge($ret , $this->getData($xml, $name));
            }
            if ($xml->Head == 'ERR'){
                $ret = array_merge($ret , $this->getErrorMessage($xml));
            }
        }
        return $ret;
    }


    /**
     * 獲取錯誤資訊
     * @param $xml
     * @return array
     */
    public function getErrorMessage($xml) {
        $ret = array();
        $ret['message'] = (string)$xml->ERROR;
        if (isset($xml->ERROR[0])) {
            foreach ($xml->ERROR[0]->attributes() as $key => $val) {
                $ret[$key] = (string)$val;
            }
        }
        return $ret;
    }

    /**
     * 獲取xml欄位
     * @param $xml
     * @param $name
     * @return array
     */
    public function getData($xml, $name) {
        $ret = array();
        if (isset($xml->Body->$name)){
            foreach ($xml->Body->$name as $v) {
                foreach ($v->attributes() as $key => $val) {
                    $ret[$key] = (string)$val;
                }
            }
        }
        return $ret;
    }


    /**
     * 轉換屬性為XML字串
     * @param array $params
     * @param string $xml_Name
     * @return string
     */
    protected function paramsToString($params = [], $xml_Name = '')
    {
        $string = '';
        $return_string = '';
        if ($xml_Name && is_array($params)) {
            foreach ($params as $key => $value) {
                if ( is_array($value)){
                    $string = $this->paramsToString($value);
                }else{
                    $string .= " $key=\"$value\"";
                }
                $return_string .= "<$xml_Name$string></$xml_Name>";
            }
        } elseif (!$xml_Name && is_array($params)) {
            foreach ($params as $k => $v) {
                $string .= " $k=\"$v\"";
            }
            $return_string = $string;
        }

        return $return_string;
    }


    /**
     * 作用:以post方式提交xml到對應的介面url
     * @param $data
     * @param $url
     * @param int $second
     * @return bool|mixed
     */
    public function postXmlCurl($data,$url,$second=60)
    {
        try{
            header("Content-type: text/html; charset=utf-8");
            $ch = curl_init();//初始化curl
            curl_setopt($ch, CURLOPT_URL,$url);//抓取指定網頁
            curl_setopt($ch, CURLOPT_HEADER, 0);//設定header
            curl_setopt($ch, CURLOPT_TIMEOUT, $second);//超時設定
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//要求結果為字串且輸出到螢幕上
            curl_setopt($ch, CURLOPT_POST, 1);//post提交方式
            curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
            $data = curl_exec($ch);//執行curl
            curl_close($ch);
            return $data;
        }catch (\Exception $e) {
            return false;
        }
    }


}


相關推薦

介面 php

<?php /** * 順豐Bsf介面類 * Created by PhpStorm. * Author: duyaqiong * Email:[email protected] * Date: 2018/6/8 */ class Bsf {

微信公眾平臺訊息介面PHP

使用前提條件:擁有一個公網上的HTTP伺服器主機空間,具有建立目錄、上傳檔案等許可權。 首先請註冊微信公眾平臺的賬號,註冊地址:http://mp.weixin.qq.com/ 一、寫好介面程式 在你的伺服器上上傳好一個介面程式檔案,如http://www.yourdoma

微信公眾平臺訊息介面PHP開發教程

三、驗證介面 用自己的個人微信關注下你的公眾賬號,給這個賬號發一條訊息過去,收到原樣的訊息返回,即驗證成功了。 四、開始自定義回覆 註釋掉$wechatObj->valid(); 這行,同時去掉//$wechatObj->responseMsg();這行的註釋。 你

BSP介面PHP開發注意事項

1,xml報文不用附加"<?xml version="1.0" encoding="UTF-8" ?>",不支援,會報格式錯誤。 2,提交伺服器時要重點注意。     直接使用curl方式的,一定要把資料做http_build_query,千萬不要直接放數組裡提

接模式 - 設計模式 - PHP

bsp div new net abs 設計模式 public face trac 1 <?php 2 /* 3 * 橋接模式 4 * 5 * 參考:http://blog.csdn.net/jhq0113/article/details

快遞鳥查詢Api介面使用(PHP

前提 專案開發中,有些需求難免會用到關於快遞的一些Api介面;本篇主要介紹的是快遞的查詢Api及與其他各家的不同之處; 常用的提供快遞Api介面的有: 快遞鳥 快遞100 愛查快遞 等等

微信公眾平臺——基礎配置——務器配置:PHP

sort 文件 cti pre amp 提交 false pst 加解密 在自己的服務器上新建一個空白php文件,輸入以下任一版本的代碼,如下: 版本一: <?php $token = "dige1994"; $signature = $_GET["signatur

阿裏OSS存儲,phpdemo

異常 阿裏 amp spa this create str cti obj 最近項目移到雲服務器,所以需要處理一下 Step 1. 初始化OSSClient SDK與OSS後臺服務所有的交互都是通過OSSClient完成的。通過以下代碼,可以生成OSSClient的實例:

微信公眾平臺——token驗證php

head 一點 輸出 lean host ont 題解 開發 問題解決 這幾天開始接觸微信公眾號的開發,註冊這些就不說了,我是先弄了個測試號用著。進入正題 所謂token驗證,其實就是微信服務器向自己要用到的服務器url發送一段數據,其中有一個參數$_GET[‘ec

C語言經典實例 php(僅練習用)

技術分享 滿足 重復數 -s http for 語言 ++ tro 題目:有1、2、3、4個數字,能組成多少個互不相同且無重復數字的三位數?都是多少? 程序分析:可填在百位、十位、個位的數字都是1、2、3、4。組成所有的排列後再去 掉不滿足條件的排列。 代碼: 1 for

如何使用沙箱測試單筆轉賬到支付寶賬號(php) https://openclub.alipay.com/read.php?tid=1770&fid=28

cin docs 官方 functions cell content 余額 ons border 說明: 本帖是利用支付寶沙箱測試電腦網站支付接口 測試環境:Apache2.4.23 +php 5.6.25 沙箱環境測試正式環境請修改網關為下方值 復制代

命令模式 - 設計模式 - PHP

spa rec struct exe foo pre cti public his 1 <?php 2 /* 3 * 命令模式 4 * 5 */ 6 //聲明執行操作的接口(Command接口) 7 interface Cook

抽象工廠模式 - 設計模式 - PHP

ret white elf class 參考 工廠 bsp echo 抽象 1 <?php 2 /* 3 * 抽象工廠模式 4 * 5 * 參考:http://blog.csdn.net/zhaoxuejie/article/detail

適配器模式 - 設計模式 - PHP

www 適配器模式 code () inter implement sta nbsp 適配器 1 <?php 2 /* 3 * 適配器模式 4 * 5 * 參考:http://www.cnblogs.com/whoamme/p/33243

建造者模式 - 設計模式 - PHP

fun tail art lac 設計模式 http black color build 1 <?php 2 /* 3 * 建造者模式 4 * 5 * 參考:http://blog.csdn.net/jhq0113/article/det

職責鏈模式 - 設計模式 - PHP

sse man article manage pre 直接 nbsp eth protect 1 <?php 2 /* 3 * 職責鏈模式 4 * 5 * 參考:http://blog.csdn.net/jhq0113/arti

codeigniter框架使用筆記,查詢功能,搜索功能php。自己留個記錄

jquer 資源文件 導致 utf-8 base inline fail spa aop 控制器Zhaopin.php <?php session_start(); class Zhaopin extends CI_Controller { publi

桶排序 - 算法 - PHP

算法 默認值 arr div pre AR highlight ech 排序 <?php //初始化數組,默認值為0; $arr = array(); for ($i = 0; $i <= 10; $i++) { $arr[$i] = 0

用友T+ v2d對接,PHP

lose exe secret access acc etop username time field    <?php require_once dirname(__FILE__) . ‘/../extensions/vendor/vendor/autoload.

php網站站打包程序【配合webshell】(原創)

在線 arr bst 文件類型 ava checked length extra 分享圖片 因為大馬只能下載一些單文件,無法下載文件夾裏的文件,所以花費一些時間寫了一個PHP腳本,打包全站數據,在此分享!切勿做違法事情! 使用方法: 1、將該程序上傳到