无法连接到主机Royal邮件发送api SOAP


Couldnt connect to host Royal mail shipping api SOAP

你好,我试图连接到royalmail运输api,但getting每次都无法连接到主机。我正试图联系皇家邮政,但没有得到正确的答复。

这是我的代码:

ini_set('default_socket_timeout', 120);
ini_set('soap.wsdl_cache_enabled',1);
ini_set('soap.wsdl_cache_ttl',1);
$api_password = "xxxxx";
$api_username = "xxxxxxAPI";
$api_application_id = "xxxxx";
$api_service_type = "D";
$api_service_code = "SD1";
$api_service_format = "";
$clientId='xxxxx';
$clientSecret='xxxxxx';
$api_service_enhancements = "";
$data = new ArrayObject();
$data->order_tracking_id = "";
$data->shipping_name = "Jon Doe";
$data->shipping_company = "SS";
$data->shipping_address1 = "23, Some Road"; 
$data->shipping_address2 = "";
$data->shipping_town = "London";
$data->shipping_postcode = "E1";
$data->order_tracking_boxes = "0";
$data->order_tracking_weight = "1000";    
$time = gmdate('Y-m-d'TH:i:s');
$created = gmdate('Y-m-d'TH:i:s'Z');
$nonce = mt_rand();
$nonce_date_pwd = pack("A*",$nonce) . pack("A*",$created) . pack("H*", sha1($api_password));
$passwordDigest = base64_encode(pack('H*',sha1($nonce_date_pwd)));
$ENCODEDNONCE = base64_encode($nonce);

$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['exceptions'] = true;
$soapclient_options['location'] = 'https://api.royalmail.com/shipping/onboarding';
//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
$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-000">
              <wsse:Username>'.$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);
//build the request
$request = array(
    'integrationHeader' => array(
        'dateTime' => $time,
        'version' => '1.0',
        'identification' => array(
            'applicationId' => $api_application_id,
            'transactionId' => $data->order_tracking_id
        )
    ),
    'requestedShipment' => array(
                                'shipmentType' => array('code' => 'Delivery'),
                                'serviceOccurence' => '1',
                                'serviceType' => array('code' => $api_service_type),
                                'serviceOffering' => array('serviceOfferingCode' => array('code' => $api_service_code)),
                                'serviceFormat' => array('serviceFormatCode' => array('code' => $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, 'postTown' => $data->shipping_town, 'postcode' => $data->shipping_postcode),
                                'items' => array('item' => array(
                                            'numberOfItems' => $data->order_tracking_boxes,
                                            'weight' => array( 'unitOfMeasure' => array('unitOfMeasureCode' => array('code' => 'g')), 'value' => ($data->order_tracking_weight*1000) //weight of each individual item
                                                             )
                                                                )
                                                )
                                )               
);

//if any enhancements, add it into the array
if($api_service_enhancements != "") {
    $request['requestedShipment']['serviceEnhancements'] = array('enhancementType' => array('serviceEnhancementCode' => array('code' => $api_service_enhancements)));
}
//try make the call
try { 
    $response = $client->__soapCall( 'createShipment', array($request), array('soapaction' => 'https://api.royalmail.com/shipping/onboarding') );
} catch (Exception $e) {
    //catch the error message and echo the last request for debug
    echo $e->getMessage(); 
    echo " REQUEST:'n" . $client->__getLastRequest() . "'n";
    die;
}
//check for any errors
if(isset($response->integrationFooter->errors)) { 
    $build = "";
    //check it wasn't a single error message
    if(isset($response->integrationFooter->errors->error->errorCode)) { 
        $build .= $output_error->errorCode.": ".$output_error->errorDescription."<br/>"; 
    } else {
        //loop out each error message, throw exception will be added ehre
        foreach($response->integrationFooter->errors->error as $output_error) { 
            $build .= $output_error->errorCode.": ".$output_error->errorDescription."<br/>";
        }
    }
    echo $build; die;
}
print_r($response);
echo "REQUEST:'n" . $client->__getLastRequest() . "'n";
exit;   

我得到的错误是:

Could not connect to host REQUEST: xxxxxkAPI xxxxxxx 2016-03-24T02:50:24Z 2016-03-24T02:50:241.0RMG-API-G-01DeliveryDSD12016-03-24Jon DoeSS23, Some RoadLondonE10g1000000

如有任何帮助,我们将不胜感激。

您完成以下步骤了吗?(摘自运输API V2-技术用户指南)

  1. 注册皇家邮政开发者门户网站
  2. 创建应用程序
  3. 请求订阅Shipping API V2
  4. 确保订阅得到皇家邮政的批准
  5. 从皇家邮政接收API用户名和API密码,以便连接到运输API

进一步检查:

  • 请确保使用正确的API地址(使用.net而不是.com)
    • https://api.royalmail.net/shipping/v2
  • transactionId需要有一个有效的值,否则,如果它像您的情况一样为空($data->order_tracking_id),您将得到以下错误:"E0004架构验证失败"

此外,请查看SoapUI。我发现它有助于调试我的API请求。