2016-02-10 13 views
5

Chúng tôi đã gặp một số vấn đề với việc thiết lập Máy khách SOAP PHP để sử dụng API theo dõi thư của Royal Mail. Chúng tôi có một tài khoản được thiết lập với Royal Mail và có ID và bí mật của chúng tôi. Chúng tôi có thể làm cho nó hoạt động bằng cách sử dụng SOAPUI nhưng chúng tôi luôn gặp lỗi "Phiên bản sai" khi cố gắng triển khai nó trong PHP. Chúng tôi có tệp WSDL cục bộ (mà Royal Mail cung cấp thông qua cổng thông tin dành cho nhà phát triển của họ), nó hoạt động với SOAPUI nhưng không phải là PHP SOAP Client. Chúng tôi đã hy vọng một người nào đó có thể nhìn thấy nếu chúng tôi đang làm bất cứ điều gì sai trái. Tôi sẽ đăng mã bên dưới nhưng sẽ bỏ qua bí mật và ID của chúng tôi từ mã.API theo dõi thư điện tử và Royal Mail

<?php 
ini_set('soap.wsdl_cache_enabled', 0); 
ini_set('soap.wsdl_cache_ttl', 900); 
ini_set('default_socket_timeout', 15); 

$trackingNumber = 'F111111111JD'; 
$time = gmdate('Y-m-d\TH:i:s'); 

$intHeaders = [ 
    'dateTime' => $time, 
    'version' => '1.0', 
    'identification' => [ 
     'applicationId' => '***********', 
     'transactionId' => 123456 
    ] 
]; 

$wsdl = 'WSDL/Tracking_API_V1_1_1.wsdl'; 

$options = array(
    'uri'=>'http://schemas.xmlsoap.org/soap/envelope/', 
    'style'=>SOAP_RPC, 
    'use'=>SOAP_ENCODED, 
    'soap_version'=>SOAP_1_2, 
    'cache_wsdl'=>WSDL_CACHE_NONE, 
    'connection_timeout'=>15, 
    'trace'=>true, 
    'encoding'=>'UTF-8', 
    'exceptions'=>true, 
    'stream_context' => stream_context_create([ 
     "http" => [ 
      'Accept' => 'application/soap+xml', 
      'X-IBM-Client-Secret' => '****', 
      'X-IBM-Client-Id'=> '****' 
     ] 
    ]) 
); 
try { 
    $soap = new SoapClient($wsdl, $options); 
    $data = $soap->getSingleItemHistory(['integrationHeader' => $intHeaders, 'trackingNumber' => $trackingNumber]); 
} 
catch(Exception $e) { 
    die($e->getMessage()); 
} 

var_dump($data); 
die; 

Chúng tôi đã thử sử dụng SOAP_1_1 và SOAP_1_2 cho 'soap_version' nhưng nó luôn quay lại lỗi "Phiên bản sai".

Hy vọng ai đó có thể trợ giúp.

Trả lời

7

Bạn cần phải đặt header chìa khóa bên trong mảng http như vậy:

'stream_context' => stream_context_create(
    [ 
     'http' => 
      [ 
       'header'   => implode(
        "\r\n", 
        [ 
         'Accept: application/soap+xml', 
         'X-IBM-Client-Id: ' . $clientId, 
         'X-IBM-Client-Secret: ' . $clientSecret, 
        ] 
       ), 
      ], 
    ] 
) 
+0

Cảm ơn bạn rất nhiều. Điều này đã làm việc cho chúng tôi. Xin lỗi vì trả lời chậm câu trả lời của bạn vì tôi đã đi và không có quyền truy cập vào trang web. – Flyingearl

+0

@alexbibie, bạn đã cứu được ngày của tôi. Tôi đã đập đầu của tôi trong 2 ngày để kịch bản tương tự trong một api ngân hàng tôi đang thực hiện. – Anon30

Các vấn đề liên quan