使用来自Vanguard的令牌访问USI Webservice会返回错误

时间:2016-12-21 05:12:30

标签: web-services soap token

所以我试图将我们的短信(学生管理系统)连接到政府服务或网站。该过程需要来自Vanguard的身份验证令牌。成功地,我能够获得令牌......但由于PHP中缺少文档和示例代码,我在与所述服务进行通信时遇到问题。我想知道是不是我的代码导致了问题,还是我的调用与网络服务有冲突:请参阅下面的代码:

    <?php
require_once 'VanguardClient.php';
$endpoint   = 'https://3pt.portal.usi.gov.au/Service/v2/UsiService.svc';

function get_sts($endpoint){
    $test = true;

    $auskey_path = 'Keystore.xml';
    $auskey_password = 'Password1!';

    $v = new VanguardClient($test);
    $v->loadAuskey($auskey_path, $auskey_password);

    try {
        return $v->requestToken($endpoint);
    } catch (SoapFault  $e) {
        echo "Error1:";     
        echo $e;
    }
}


//get token from Vanguard
$token      = get_sts($endpoint);


//create soap client
try{
    $wsdl   = 'https://3pt.portal.usi.gov.au/service/V2/UsiService.wsdl';
    $client = new SoapClient($wsdl, 
        array(
            'trace' =>1,
            //'soap_version' => SOAP_1_2, 
            'keep_alive' => false,
            //'connection_timeout' => 500000,           
            'cache_wsdl' => WSDL_CACHE_NONE

        )
    );
} catch (SoapFault  $e) {   
    echo "SoapClient Error:<br />";     
    var_dump($e);
}

try {       
    $result=$client->__setSoapHeaders( $token );
} catch (SoapFault  $e) {   
    echo "__setSoapHeaders:";       
    var_dump($e);
}


$data = array(  
    'OrgCode' => '970003',
    'USI' => 'U6Q8JN6UD9',
    'FirstName' => 'Myrna',
    'FamilyName' => 'Macknight',
    'DateOfBirth' => '1971-04-19'
);  


try{
    $response=$client->__soapCall('VerifyUSI',$data);   

} catch (SoapFault  $e) {   
    echo "__soapCall Error:<br />";     
    echo $e;
}


var_dump($response);

我看到的浏览器上的结果是:

SoapFault异常:[HTTP]无法处理消息,因为内容类型为'text / xml; charset = utf-8'不是预期的类型'application / soap + xml;字符集= UTF-8' 。在/var/www/html/usitest/example1.php:73堆栈跟踪:#0 [内部功能]:SoapClient-&gt; __ doRequest('__ soapCall('VerifyUSI',数组)#2 {main} NULL

先谢谢你们!

2 个答案:

答案 0 :(得分:0)

您的内容类型可能是由SOAP版本引起的。

尝试将SOAP版本设置为1.2:

'soap_version' => SOAP_1_2

请参阅SoapClient connection to SoapServer

但是,我认为您的代码中还存在其他问题 - 尤其是使用Vanguard令牌。

答案 1 :(得分:0)

我们设法解决了这个问题,但是要花很多课,模板,外部程序包和几个月的工作来解决,这不是我们可以在线上解决的问题。但是,我建议您采取一些措施来解决您的情况。

  • 这不能像普通的SOAP服务那样工作。将XML模板用于各个过程的所有步骤(Vanguard,USI,这些部分的组件等)。
  • .Net示例代码的反向工程师,我们在Java代码方面遇到了重大问题。
  • 通过使用代理并捕获发送和接收的内容,我们取得了长足的进步。
  • 除非您使用composer来管理安全性依赖项,否则即使是使用composer,这也将是一件很痛苦的事情。
  • 大约有10个涉及安全性的部分必须进行逆向工程,不要忘了对内容进行规范化以使加密正确无误。
  • 使用Guzzle进行请求,更简单
  • PHP示例中的大多数内容是错误的,或者至少不可能遵循和调试来修复。最后,我们看不到可行的方法。

期望至少花费几周的时间,并且您需要了解很多有关安全性,哈希和ssl证书的信息。

对不起,我无法为您提供完整的解决方案,但知道上述这些步骤肯定会对我们有所帮助,因此我希望它们会为您提供帮助。