【问题标题】:PHP : How to add keystore for SOAP https requestPHP:如何为 SOAP https 请求添加密钥库
【发布时间】:2017-01-12 00:35:22
【问题描述】:

我是 PHP 新手。我的一个 PHP 项目需要进行 SOAP 调用才能通过 HTTPS 访问 Web 服务。

服务提供商只给了我们三个文件 .jks、.p12。和 .wsdl 文件。我在 SOAPUI 工具中测试了 .wsdl 文件,它正在工作。我在 SOAPUI preference >ssl settings

中上传了我的 .jks 文件

然后我写了我的 PHP 代码

<?php



$wsdl = 'http://localhost/RbphpGateway/librb/RB_OLP_INITIATE_PAYMENT.wsdl';


try{
    $clinet=new SoapClient($wsdl);

    $ver =array("olpIdAlias"=>"****","merchantId"=>"***","merchantRefNum"=>"418934223","paymentAmount"=>"100","paymentCurrency"=>"USD","dynamicMerchantLandingURL"=>"","dynamicMerchantFailureURL"=>"");
    $quates=$clinet->executeRB_OLP_INITIATE_PAYMENT($ver);

    echo  $quates->initiatePaymentDetailsRes->ibURL;


}catch(SoapFault $e){
    echo $e->getMessage();
}

我的输出是

无法连接到主机

根据我对安全 https 连接的了解,我们需要使用代码添加密钥库。
谁能给我提示如何在 PHP 中添加证书。?我可以用 php 添加我的 .jks 文件吗?

【问题讨论】:

    标签: php web-services soap https wsdl


    【解决方案1】:

    我怀疑这个问题与 https 有关,尤其是当您描述它在 SoupUI 中有效时。

    您无法连接到哪个主机?
    你指的是localhost上的wsdl文件,我怀疑web服务位于不同的主机上?
    那么问题是链接到 localhost 还是链接到 ws-host?

    开始确保您可以访问 wsdl 文件,并在创建 $clinet 时添加选项 trace = 1 和 exception = 0:

    $clinet=new SoapClient($wsdl,array('trace' => 1, 'exception' => 0));
    

    它允许您使用$client-&gt;__getLastRequest() 进一步检查肥皂结果

    【讨论】:

    • 你知道如何在 php 代码中使用 .jks(keystore) 文件吗?在 Soapui 我优先上传 .jks > ssl 设置
    • 不,我对 .jks 一无所知。但是您是如何通过 SoapUI 进行连接的呢?您是否在项目配置文件中设置了任何安全设置,因此 SoapUI 除了发送普通通信之外还发送安全标头?
    • 我将我的 WSDL 添加到 SOAPUI 工具。然后创建一个测试用例。然后将我的 .jks(keystore 格式) 文件上传到我的 soapui 首选项 > SSL 设置并设置密码。这就是我在soapui所做的。
    • 尝试使用“http 日志”(位于底部面板中)分析 SoapUI 中的流量。特别是寻找 Header-items。在 PHP 中使用 Soap 时,您必须像这样设置标头,然后再进行主调用
    【解决方案2】:

    我找到了解决方案。首先我使用来自 .p12 的openssl 生成 .pem 文件

    $wsdl = dirname(__FILE__).'/librb/xxxxxx.wsdl';
    
    $endpoint       = 'https://pay.bnk.com/soap?service=payment';
    $local_cert = dirname(__FILE__)."/key1.pem";
    $passphrase = "*****";
    $options = array(
    
        'location'      => $endpoint,
        'keep_alive'    => true,
        'trace'         => true,
        'local_cert'    => $local_cert,
        'passphrase'    => $passphrase,
        'cache_wsdl'    => WSDL_CACHE_NONE,
    'trace'       => 1,     // traces let us look at the actual SOAP messages later
            'exceptions'  => 1 ,
    
    );
    
    try{
       $client = new SoapClient($wsdl,$options)
        } catch (SoapFault $E) { 
            echo $E->getMessage();
        }
    

    【讨论】:

      猜你喜欢
      • 2021-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-29
      • 2017-11-06
      • 1970-01-01
      相关资源
      最近更新 更多