与皇家邮政的 SOAP 连接,无法连接到主机 [英] SOAP connection with Royal Mail, Could not connect to host
本文介绍了与皇家邮政的 SOAP 连接,无法连接到主机的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在尝试连接到 Royal Mail 运输 API,但我收到了著名的无法连接到主机的消息.
$api_password = "****";$api_username = "****";$api_application_id = "****";$api_service_type = "D";$api_service_code = "SD1";$api_service_format = "";$api_certificate_passphrase = "****";$time = gmdate('Y-m-d\TH:i:s');$created = gmdate('Y-m-d\TH:i:s\Z');$nonce = mt_rand();$nonce_date_pwd = xyz(从样本中复制);$passwordDigest = zyz(从样本中复制);$ENCODEDNONCE = zyz(从样本中复制);$soapclient_options = array();$soapclient_options['cache_wsdl'] = 'WSDL_CACHE_NONE';$soapclient_options['local_cert'] = "CA2+Splash+Felipe+RM10001654+usr.p12";$soapclient_options['passphrase'] = $api_certificate_passphrase;$soapclient_options['trace'] = true;$soapclient_options['ssl_method'] = 'SOAP_SSL_METHOD_SSLv3';$soapclient_options['location'] = '****';//启动soap客户端$client = new SoapClient("SAPI/ShippingAPI_V2_0_8.wsdl", $soapclient_options);$client->__setLocation($soapclient_options['location']);
(设置标题)
$HeaderObject = new SoapVar( $HeaderObjectXML, XSD_ANYXML );//推送肥皂头$header = new SoapHeader( 'oasis-200401-wss-wssecurity-utility-1.0.xsd', 'Security', $HeaderObject );$client->__setSoapHeaders($header);
(设置请求部分)
if($api_service_enhancements != "") {$request['requestedShipment']['serviceEnhancements'] = array('enhancementType' => array('serviceEnhancementCode' => array('code' => $api_service_enhancements)));}//尝试拨打电话尝试 {$response = $client->__soapCall('createShipment', array($request), array('soapaction' => '***api-link***') );} 捕获(异常 $e){//捕获错误信息并回显上次调试请求echo $e->getMessage();echo "请求:\n" .$client->__getLastRequest() ."\n";死;}
我设置连接和本地证书的方式是否正确?有没有我遗漏的信息?谢谢&问候
解决方案
按照我的最终代码:) 这个肯定有效.甚至可以在服务器繁忙时重试,尽情享受吧.
大批('protocol_version'='1.0', '标题' =>'连接:关闭')));$soapclient_options['local_cert'] = dirname(__FILE__) ."/certificate.pem";$soapclient_options['passphrase'] = $this->api_certificate_passphrase;$soapclient_options['trace'] = true;$soapclient_options['ssl_method'] = 'SOAP_SSL_METHOD_SSLv3';$soapclient_options['location'] = $this->locationforrequest;$soapclient_options['soap_version'] = 'SOAP_1_1';//启动soap客户端$client = new SoapClient(dirname(__FILE__) . "/SAPI/ShippingAPI_V2_0_8.wsdl", $soapclient_options);$client->__setLocation($soapclient_options['location']);//皇家邮件所需的标题//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:密码><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:安全>';//将头部推入soap$HeaderObject = new SoapVar( $HeaderObjectXML, XSD_ANYXML );//推送肥皂头$header = new SoapHeader( 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd', 'Security', $HeaderObject );$client->__setSoapHeaders($header);返回 $client;}公共函数 CreateShippiment($data){$request = $this->buildCreateshippiment($data);$type = 'createShipment';返回 $this->makerequest($type, $request);}公共函数 PrintLabel($shipmentNumber,$order_tracking_id){$time = gmdate('Y-m-d\TH:i:s');$请求 = 数组('integrationHeader' =>大批('日期时间' =>$时间,'版本' =>'2','身份' =>大批('applicationId' =>$this->apiapplicationid,'transactionId' =>$order_tracking_id)),'货件编号' =>$货件编号,'输出格式' =>'PDF',);$type = '打印标签';$response = $this->makerequest($type, $request);返回 $response->label;}私有函数 makerequest($type, $request){$client = $this->preparerequest();$响应=假;$次= 1;而(真){尝试 {$response = $client->__soapCall( $type, array($request), array('soapaction' => $this->locationforrequest) );//echo "请求:\n" .htmlentities($client->__getLastResponse()) ."\n";休息;} 捕获(异常 $e){打印_r($e);if($e->detail->exceptionDetails->exceptionCode == "E0010" && $times <= 25){睡眠(1.5);$times++;继续;}别的{echo $e->getMessage();echo "";print_r($e-> 详细信息);echo $client->__getLastResponse();echo "请求:\n" .htmlentities($client->__getLastResponse()) ."\n";休息;}}休息;}返回 $response;}私有函数 buildCreateshippiment($data2) {$time = gmdate('Y-m-d\TH:i:s');$data = new ArrayObject();foreach ($data2 as $key => $value){$data->$key = $value;}$请求 = 数组('integrationHeader' =>大批('日期时间' =>$时间,'版本' =>'2','身份' =>大批('applicationId' =>$this->apiapplicationid,'transactionId' =>$data->order_tracking_id)),'requestedShipment' =>大批('装运类型' =>数组('代码' => '交付'),'serviceOccurrence' =>1、'服务类型' =>array('code' => $data->api_service_type),'服务提供' =>array('serviceOfferingCode' => array('code' => $data->api_service_code)),'服务格式' =>数组('serviceFormatCode' => array('code' => $data->api_service_format)),'发货日期' =>日期('Y-m-d'),'收件人联系方式' =>数组('name' => $data->shipping_name, 'complementaryName' => $data->shipping_company),'收件人地址' =>数组('addressLine1' => $data->shipping_address1, 'addressLine2' => $data->shipping_address2, 'postTown' => $data->shipping_town, 'postcode' => $data->shipping_postcode),'物品' =>数组('项目' => 数组('numberOfItems' =>$data->order_tracking_boxes,'重量' =>数组('unitOfMeasure' => array('unitOfMeasureCode' => array('code' => 'g')),'价值' =>$data->order_tracking_weight,))),//'签名' =>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)));}返回 $request;}}
I'm trying to connect to Royal Mail shipping API, but I'm receiving the famous Could not connect to host.
$api_password = "****";
$api_username = "****";
$api_application_id = "****";
$api_service_type = "D";
$api_service_code = "SD1";
$api_service_format = "";
$api_certificate_passphrase = "****";
$time = gmdate('Y-m-d\TH:i:s');
$created = gmdate('Y-m-d\TH:i:s\Z');
$nonce = mt_rand();
$nonce_date_pwd = xyz(copy from sample);
$passwordDigest = zyz(copy from sample);
$ENCODEDNONCE = zyz(copy from sample);
$soapclient_options = array();
$soapclient_options['cache_wsdl'] = 'WSDL_CACHE_NONE';
$soapclient_options['local_cert'] = "CA2+Splash+Felipe+RM10001654+usr.p12";
$soapclient_options['passphrase'] = $api_certificate_passphrase;
$soapclient_options['trace'] = true;
$soapclient_options['ssl_method'] = 'SOAP_SSL_METHOD_SSLv3';
$soapclient_options['location'] = '****';
//launch soap client
$client = new SoapClient("SAPI/ShippingAPI_V2_0_8.wsdl", $soapclient_options);
$client->__setLocation($soapclient_options['location']);
(setting header)
$HeaderObject = new SoapVar( $HeaderObjectXML, XSD_ANYXML );
//push soap header
$header = new SoapHeader( 'oasis-200401-wss-wssecurity-utility-1.0.xsd', 'Security', $HeaderObject );
$client->__setSoapHeaders($header);
(setting request part)
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' => '***api-link***') );
} catch (Exception $e) {
//catch the error message and echo the last request for debug
echo $e->getMessage();
echo "REQUEST:\n" . $client->__getLastRequest() . "\n";
die;
}
Is it correct the way I'm setting the connection and the local cert? Is any information I'm missing? Thanks & Regards
解决方案
Follow my final code :) this one works for sure. Even have the retry in case the server is buzy, enjoy.
<?php
//ini_set('soap.wsdl_cache_enabled', '1');
ini_set('soap.wsdl_cache_enabled',0);
ini_set('soap.wsdl_cache_ttl',0);
class royalmaillabelRequest
{
private $apiapplicationid = "insert urs";
private $api_password = "insert urs";
private $api_username = "insert urs"; //"rxxxxxAPI"
private $api_certificate_passphrase = "insert urs";
private $locationforrequest = 'https://api.royalmail.com/shipping/onboarding'; //live 'https://api.royalmail.com/shipping' onbording 'https://api.royalmail.com/shipping/onboarding'
private $api_service_enhancements = "";
private function preparerequest(){
//PASSWORD DIGEST
$time = gmdate('Y-m-d\TH:i:s');
$created = gmdate('Y-m-d\TH:i:s\Z');
$nonce = mt_rand();
$nonce_date_pwd = xyz(copy from sample);
$passwordDigest = nyz(copy from sample);
$ENCODEDNONCE = (copy from sample);
//SET CONNECTION DETAILS
$soapclient_options = array();
$soapclient_options['cache_wsdl'] = 'WSDL_CACHE_NONE';
$soapclient_options['stream_context'] = stream_context_create(
array('http'=>
array(
'protocol_version'=>'1.0'
, 'header' => 'Connection: Close'
)
)
);
$soapclient_options['local_cert'] = dirname(__FILE__) . "/certificate.pem";
$soapclient_options['passphrase'] = $this->api_certificate_passphrase;
$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_8.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;
}
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, '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,
)
)
),
//'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;
}
}
这篇关于与皇家邮政的 SOAP 连接,无法连接到主机的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文