皇家邮件装运API(SOAP)

时间:2017-09-06 08:03:53

标签: php api soap

我一直在与皇家邮件运输肥皂api争斗一段时间,我没有到达任何地方。我得到的错误是验证错误,但它并没有告诉我什么是不对的。

我尝试了皇家邮政提供的示例代码,但似乎也没有正常工作。

有没有人有一个真正基本的xml示例来创建货件?

由于

1 个答案:

答案 0 :(得分:0)

    <?php
ini_set('soap.wsdl_cache_enabled', 1);
ini_set('soap.wsdl_cache_ttl', 1);
class royalmaillabelRequest
{  
    private $apiapplicationid = "application id";
    private $api_password = "password ";
    private $api_username = ""; //"rxxxxxAPI"
    private $locationforrequest = 'https://api.royalmail.net/shipping/v2'; 
    private $api_service_enhancements = "";

    private function preparerequest()
    {

        //PASSWORD DIGEST
        $api_password = "";
        $clientId     = ""; //royal mail credentials        
        $clientSecret = "";
        $time         = gmdate('Y-m-d\TH:i:s');
        $created      = gmdate('Y-m-d\TH:i:s\Z');
        $creationDate = gmdate('Y-m-d\TH:i:s\Z');

        $nonce          = mt_rand();
        $nonce_date_pwd = $nonce . $creationDate . base64_encode(sha1($api_password, TRUE));
        $passwordDigest = base64_encode(sha1($nonce_date_pwd, TRUE));
        $ENCODEDNONCE   = base64_encode($nonce);

        //SET CONNECTION DETAILS

        $soapclient_options                   = array();
        $soapclient_options['cache_wsdl']     = 'WSDL_CACHE_NONE';
        $soapclient_options['stream_context'] = stream_context_create(array(
            'http' => array(
                'header' => implode("\r\n", array(
                    'Accept: application/soap+xml',
                    'X-IBM-Client-Id: ' . $clientId,
                    'X-IBM-Client-Secret: ' . $clientSecret
                ))
            )
        ));
        $soapclient_options['trace']          = true;
        $soapclient_options['ssl_method']     = 'SOAP_SSL_METHOD_SSLv3';
        $soapclient_options['location']       = $this->locationforrequest;
        $soapclient_options['soap_version']   = 'SOAP_1_1';

        //launch soap client
        $client = new SoapClient(dirname(__FILE__) . "/SAPI/ShippingAPI_V2_0_9.wsdl", $soapclient_options);
        $client->__setLocation($soapclient_options['location']);

        //headers needed for royal mail//D8D094Fd2716E3Es142588808s317
        $HeaderObjectXML = '<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
                                          xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
                               <wsse:UsernameToken wsu:Id="UsernameToken-D8D094FC22716E3EDE14258880881317">
                                  <wsse:Username>' . $this->api_username . '</wsse:Username>
                                  <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">' . $passwordDigest . '</wsse:Password>
                                  <wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">' . $ENCODEDNONCE . '</wsse:Nonce>
                                  <wsu:Created>' . $created . '</wsu:Created>
                               </wsse:UsernameToken>
                           </wsse:Security>';
        //push the header into soap
        $HeaderObject    = new SoapVar($HeaderObjectXML, XSD_ANYXML);
        //push soap header
        $header          = new SoapHeader('http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd', 'Security', $HeaderObject);
        $client->__setSoapHeaders($header);
        return $client;

    }

    public function CreateShippiment($data)
    {

        $request = $this->buildCreateshippiment($data);
        $type = 'createShipment';     
        return $this->makerequest($type, $request);


    }
    public function PrintLabel($shipmentNumber, $order_tracking_id)
    {

        $time     = gmdate('Y-m-d\TH:i:s');
        $request  = array(
            'integrationHeader' => array(
                'dateTime' => $time,
                'version' => '2',
                'identification' => array(
                    'applicationId' => $this->apiapplicationid,
                    'transactionId' => $order_tracking_id
                )
            ),
            'shipmentNumber' => $shipmentNumber,
            'outputFormat' => 'PDF'
        );
        $type     = 'printLabel';
        $response = $this->makerequest($type, $request);
        return $response->label;

    }

    public function PrintDocument($shipmentNumber, $order_tracking_id)
    {       
        $time     = gmdate('Y-m-d\TH:i:s');
        $request  = array(
            'integrationHeader' => array(
                'dateTime' => $time,
                'version' => '2',
                'identification' => array(
                    'applicationId' => $this->apiapplicationid,
                    'transactionId' => $order_tracking_id
                )
            ),
            'shipmentNumber' => $shipmentNumber,
            'documentName' => 'CN22',
            'documentCopies' => '1',
            'documentFormat' => 'PDF'
        );
        $type     = 'printDocument';
        $response = $this->makerequest($type, $request);
        return $response->internationalDocument;

    }

    private function makerequest($type, $request)
    {    
        $client   = $this->preparerequest();
        $response = false;
        $times    = 1;

        while (true) {

            try {
                $response = $client->__soapCall($type, array(
                    $request
                ), array(
                    'soapaction' => $this->locationforrequest
                ));

                //  echo "REQUEST:\n" . htmlentities($client->__getLastResponse()) . "\n";
                break;

            }
            catch (Exception $e) {

                print_r($e);
                if ($e->detail->exceptionDetails->exceptionCode == "E0010" && $times <= 25) {

                    sleep(1.5);
                    $times++;
                    continue;

                } else {
                    echo $e->getMessage();
                    echo "<pre>";
                    print_r($e->detail);
                    echo $client->__getLastResponse();
                    echo "REQUEST:\n" . htmlentities($client->__getLastResponse()) . "\n";
                    break;

                }

            }

            break;
        }
        return $response;
    }

    private function buildCreateshippiment($data2)
    {    
        $time = gmdate('Y-m-d\TH:i:s');
        $data = new ArrayObject();
        foreach ($data2 as $key => $value) {
            $data->$key = $value;
        }      
        $request = array(
            'integrationHeader' => array(
                'dateTime' => $time,
                'version' => '2',
                'identification' => array(
                    'applicationId' => $this->apiapplicationid,
                    'transactionId' => $data->order_tracking_id
                )
            ),
            'requestedShipment' => array(
                'shipmentType' => array(
                    'code' => 'Delivery'
                ),
                'serviceOccurrence' => 1,
                'serviceType' => array(
                    'code' => $data->api_service_type
                ),
                'serviceOffering' => array(
                    'serviceOfferingCode' => array(
                        'code' => $data->api_service_code
                    )
                ),
                'serviceFormat' => array(
                    'serviceFormatCode' => array(
                        'code' => $data->api_service_format
                    )
                ),
                'shippingDate' => date('Y-m-d'),
                'recipientContact' => array(
                    'name' => $data->shipping_name,
                    'complementaryName' => $data->shipping_company
                ),
                'recipientAddress' => array(
                    'addressLine1' => $data->shipping_address1,
                    'addressLine2' => $data->shipping_address2,
                    'addressLine3' => $data->shipping_county,
                    'stateOrProvince' => array(
                        stateOrProvinceCode => array(
                            name => $data->shipping_county
                        )
                    ),
                    'postTown' => $data->shipping_town,
                    'postcode' => $data->shipping_postcode,
                    'country' => array(
                        'countryCode' => array(
                            'code' => 'US'
                        )
                    )
                ),          
                'items' => array(
                    'item' => array(
                        'numberOfItems' => $data->order_tracking_boxes,
                        'weight' => array(
                            'unitOfMeasure' => array(
                                'unitOfMeasureCode' => array(
                                    'code' => 'g'
                                )
                            ),
                            'value' => $data->order_tracking_weight
                        )
                    )
                ),
                // 'internationalInfo' =>  array('parcels' => array('parcel' => array(                       'weight' => array( 'unitOfMeasure' => array('unitOfMeasureCode' => array('code' => 'g')),
                // 'value' => $data->parcel_weight)),
                // 'purposeOfShipment'=> '999',
                // 'contentDetails'  => $data->content    
                // )
                // ),
                'senderReference' => $data->sendersReference
                //'signature' => 0,

            )
        );

        if ($data->api_service_enhancements == 6 && $data->api_service_type == 1) {
            $request['requestedShipment']['serviceEnhancements'] = array(
                'enhancementType' => array(
                    'serviceEnhancementCode' => array(
                        'code' => $data->api_service_enhancements
                    )
                )
            );
        }

        return $request;

    }
}

// $new= new royalmaillabelRequest();
// $data['order_tracking_id']="";
// $data['api_service_type']="";
// echo $data['api_service_code']="";
// $data['api_service_format']="";
// $data['shipping_name']="";
// $data['shipping_company']="";
// $data['shipping_address1']="";
// $data['shipping_address2']="";
// $data['shipping_town']="";
// $data['shipping_postcode']="";
// $data['order_tracking_boxes']="";
// $data['order_tracking_weight']="";
// $data['api_service_enhancements']="";

// $data['value']="600";
// $data['shipping_postcode']="123456";
// $data['serviceEnhancementCode']="";

// $new->CreateShippiment($data);
?>