首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用CURL的SOAP

使用CURL的SOAP
EN

Stack Overflow用户
提问于 2017-02-10 04:32:19
回答 2查看 1.1K关注 0票数 1

我试图使用用于Ezidebit的soap来获取列表中的所有客户。他们对我的记录非常混乱,似乎遗漏了一些东西。可能是我也没有足够的技能。

文档在这里:https://www.getpayments.com/docs/#getcustomerlist

目前我得到的反应是:

代码语言:javascript
复制
a:ActionNotSupportedThe message with Action 'run' cannot be processed at the receiver, due to a ContractFilter mismatch at the EndpointDispatcher. This may be because of either a contract mismatch (mismatched Actions between sender and receiver) or a binding/security mismatch between the sender and the receiver. Check that sender and receiver have the same contract and the same binding (including security requirements, e.g. Message, Transport, None).

下面是我的代码:(我已经删除了xml中的密钥并替换为000000000000000 )

代码语言:javascript
复制
<?php
  $soap_request ='<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:px="https://px.ezidebit.com.au/">
                   <soapenv:Header/>
                   <soapenv:Body>
                      <px:GetCustomerList>
                      <px:DigitalKey>000000000000000</px:DigitalKey>
                         <px:CustomerStatus>ALL</px:CustomerStatus>
                         <px:OrderBy>EzidebitCustomerID</px:OrderBy>
                         <px:Order>ASC</px:Order>
                         <px:PageNumber>1</px:PageNumber> 
                      </px:GetCustomerList>
                   </soapenv:Body>
                </soapenv:Envelope>';

  $header = array(
    "Content-type: text/xml;charset=\"utf-8\"",
    "Accept: text/xml",
    "Cache-Control: no-cache",
    "Pragma: no-cache",
    "SOAPAction: \"run\"",
    "Content-length: ".strlen($soap_request),
  );

  $soap_do = curl_init();
  curl_setopt($soap_do, CURLOPT_URL, "https://api.ezidebit.com.au/v3-5/nonpci" );
  curl_setopt($soap_do, CURLOPT_CONNECTTIMEOUT, 10);
  curl_setopt($soap_do, CURLOPT_TIMEOUT,        10);
  curl_setopt($soap_do, CURLOPT_RETURNTRANSFER, true );
  curl_setopt($soap_do, CURLOPT_SSL_VERIFYPEER, false);
  curl_setopt($soap_do, CURLOPT_SSL_VERIFYHOST, false);

  curl_setopt($soap_do, CURLOPT_POST,           true );
  curl_setopt($soap_do, CURLOPT_POSTFIELDS,     $soap_request);
  curl_setopt($soap_do, CURLOPT_HTTPHEADER,     $header);
  $content  = curl_exec($soap_do);
  if(curl_exec($soap_do) === false) {
    $err = 'Curl error: ' . curl_error($soap_do);
    curl_close($soap_do);
    print $err;
  } else {
    curl_close($soap_do);
    print_r($content);
  }
?>

我可以看到这个错误是指"SOAPAction:\"run\"“的标题,但是我不确定我应该用什么代替它。

希望有人能帮我。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-10 13:43:57

尝试将SOAPAction头更改为

"SOAPAction:\"https://px.ezidebit.com.au/INonPCIService/GetCustomerList\"“

在此服务的WSDL中,您可以找到

代码语言:javascript
复制
<wsdl:operation name="GetCustomerList"><wsdl:input wsaw:Action="https://px.ezidebit.com.au/INonPCIService/GetCustomerList"

现在密码是:

代码语言:javascript
复制
$soap_request ='<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:px="https://px.ezidebit.com.au/">
               <soapenv:Header/>
               <soapenv:Body>
                  <px:GetCustomerList>
                  <px:DigitalKey>000000000000000</px:DigitalKey>
                     <px:CustomerStatus>ALL</px:CustomerStatus>
                     <px:OrderBy>EzidebitCustomerID</px:OrderBy>
                     <px:Order>ASC</px:Order>
                     <px:PageNumber>1</px:PageNumber> 
                  </px:GetCustomerList>
               </soapenv:Body>
            </soapenv:Envelope>';

    $header = array(
        "Content-type: text/xml;charset=\"utf-8\"",
        "Accept: text/xml",
        "Cache-Control: no-cache",
        "Pragma: no-cache",
        "SOAPAction: \"https://px.ezidebit.com.au/INonPCIService/GetCustomerList\"",
        "Content-length: ".strlen($soap_request),
    );

    $soap_do = curl_init();
    curl_setopt($soap_do, CURLOPT_URL, "https://api.ezidebit.com.au/v3-5/nonpci" );
    curl_setopt($soap_do, CURLOPT_CONNECTTIMEOUT, 10);
    curl_setopt($soap_do, CURLOPT_TIMEOUT,        10);
    curl_setopt($soap_do, CURLOPT_RETURNTRANSFER, true );
    curl_setopt($soap_do, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($soap_do, CURLOPT_SSL_VERIFYHOST, false);

    curl_setopt($soap_do, CURLOPT_POST,           true );
    curl_setopt($soap_do, CURLOPT_POSTFIELDS,     $soap_request);
    curl_setopt($soap_do, CURLOPT_HTTPHEADER,     $header);
    $content  = curl_exec($soap_do);
    if(curl_exec($soap_do) === false) {
        $err = 'Curl error: ' . curl_error($soap_do);
        curl_close($soap_do);
        print $err;
    } else {
        curl_close($soap_do);
        print_r($content);
    }

给出错误

无效的DigitalKey。

SoapClient也是如此:

代码语言:javascript
复制
$wsdl = 'https://api.demo.ezidebit.com.au/v3-5/nonpci?wsdl';
    $client = new SoapClient($wsdl, array('soap_version' => SOAP_1_1, 'trace' => 1, "exceptions" => 0));

    $params = [
        'DigitalKey' => '8591BFD4-E7C8-4284-84F7-E6C419114FA8',
        'CustomerStatus' => 'ALL',
        'OrderBy' => 'EzidebitCustomerID',
        'Order' => 'ASC',
        'PageNumber' => 1
    ];

    $result = $client->__soapCall('GetCustomerList', [$params]);


    print_r($client->__getLastRequest());
    echo PHP_EOL;
    print_r($result);
票数 1
EN

Stack Overflow用户

发布于 2017-02-10 13:02:40

如果您不知道如何使用本地PHP SoapClient类(这是在php中使用SOAP的最佳方法),那么使用一个WSDL到php生成器,它将把所有事情封装在结构化类中,这样您就不会怀疑在哪里做错了什么。如果有一个错误,你会准确地识别它。除了PackageGenerator项目之外,我什么也提不出来

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42151565

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档