C#如何在HTTPS中使用SOAP V2添加客户数据(Magento 1.9.3.3)

时间:2018-03-08 12:41:21

标签: c# soap wsdl magento-1.9

我正在开发一个C#winapp来将客户数据添加到Magento服务器。我的服务器正在使用Magento 1.9.3.3。当我尝试使用https协议将数据添加到服务器时,我遇到了问题。如果使用http,则下面的代码可以完美运行。

这是我的App.config文件。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="httpsBinding" allowCookies="true" maxReceivedMessageSize="2147483647" maxBufferPoolSize="2147483647">
      <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
          <security mode="Transport">
            <transport clientCredentialType="None" 
              proxyCredentialType="None" realm=""/>
            <message clientCredentialType="Certificate" algorithmSuite="Default"/>
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
        <client>    
            <endpoint address="https://192.168.1.72/magento/index.php/api/v2_soap/index/"
                binding="basicHttpBinding" bindingConfiguration="httpsBinding"
                contract="MagentoService.PortType" name="Port" />
        </client>
    </system.serviceModel>
</configuration>

这是创建客户的代码。

    PortTypeClient mservice = new PortTypeClient();
            var mlogin = mservice.login("SoapUser", "ApiKey"); //login
        try
        {        
                int newCustomerCreateID = 0;
                filters myfilter = new filters();

                // Create Customer
                customerCustomerEntityToCreate customerCreate = new customerCustomerEntityToCreate();
                customerCreate.email = "tarasdzxc@gmail.com";
                customerCreate.password = "0000000000";
                customerCreate.firstname = "tarawat";
                customerCreate.lastname = "kingposs";
                customerCreate.middlename = "";
                customerCreate.store_id = 1;
                customerCreate.store_idSpecified = true;
                customerCreate.website_id = 1;
                customerCreate.website_idSpecified = true;
                customerCreate.group_id = 1;
                customerCreate.group_idSpecified = true;
                customerCreate.prefix = "MR";
                customerCreate.dob = "10/01/1995";
                customerCreate.gender = Int32.Parse("1"); //1-Male;2-Female
                customerCreate.genderSpecified = true;

                newCustomerCreateID = 
                mservice.customerCustomerCreate(mlogin, customerCreate);
                MessageBox.Show(newCustomerCreateID.ToString());
                mservice.endSession(mlogin);                                 
            }
            catch (Exception ex)
            {
                //Unable to create account
                MessageBox.Show(ex.ToString());
            }

我跑完之后它给了我这个错误:

System.ServiceModel.FaultException: 'SOAP-ERROR: Parsing WSDL: Couldn't load from 'https://192.168.1.72/magento/index.php/api/v2_soap/index/?wsdl=1' : failed to load external entity "https://192.168.1.72/magento/index.php/api/v2_soap/index/?wsdl=1"'

如果我将安全模式更改为http,它可以正常运行,但我需要使用https。 我尝试了复制网址https://192.168.1.72/magento/index.php/api/v2_soap/index/?wsdl=1并输入浏览器结果显示为XML like this

最后,我使用的是Apache 2.4中的OpenSSL,我已经允许php.ini进行SSL扩展,但我的localhost表示不安全。

更新:仍然无法正常工作。我从Rom Eh的回答中得到了这个错误

System.ServiceModel.ProtocolException: 'The content type text/xml; charset=utf-8 of the response message does not match the content type of the binding (application/soap+xml; charset=utf-8). If using a custom encoder, be sure that the IsContentTypeSupported method is implemented properly. The first 470 bytes of the response were: '<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Body><SOAP-ENV:Fault><faultcode>WSDL</faultcode><faultstring>SOAP-ERROR: Parsing WSDL: Couldn't load from 'https://192.168.1.72/magento2/index.php/api/v2_soap/index/?wsdl=1' : failed to load external entity "https://192.168.1.72/magento2/index.php/api/v2_soap/index/?wsdl=1"
</faultstring></SOAP-ENV:Fault></SOAP-ENV:Body></SOAP-ENV:Envelope>

1 个答案:

答案 0 :(得分:0)

OP是我的同事,几天前我们已经解决了这个问题,并且我正在为那些对这个问题感到好奇的人发布这个问题。

首先,他的app.config绝对正常。具有basicHttpBinding模式的Transport可以与HTTPS一起使用,但实际问题是他的SSL是自签名证书。 Visual Studio的错误报告没有提供足够的信息,您还必须查看Apache错误日志(error.log)。它总是抛出这些错误

SoapServer::SoapServer(): SSL operation failed with code 1. OpenSSL Error messages:\nerror:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed in C:\\xampp\\htdocs\\magento\\lib\\Zend\\Soap\\Server.php on line 814
SoapServer::SoapServer(): Failed to enable crypto in C:\\xampp\\htdocs\\magento\\lib\\Zend\\Soap\\Server.php on line 814
SoapServer::SoapServer(): I/O warning : failed to load external entity &quot;https://192.168.1.72/magento/index.php/api/v2_soap/index/?wsdl=1&quot; in C:\\xampp\\htdocs\\magento\\lib\\Zend\\Soap\\Server.php on line 814
PHP Fatal error:  SOAP-ERROR: Parsing WSDL: Couldn't load from 'https://192.168.1.72/magento/index.php/api/v2_soap/index/?wsdl=1' : failed to load external entity "https://192.168.1.72/magento/index.php/api/v2_soap/index/?wsdl=1"\n in C:\\xampp\\htdocs\\magento\\lib\\Zend\\Soap\\Server.php on line 814

它显示问题是OpenSSL无法验证他的证书。所以我们改变了使用合法SSL的测试环境,一切都没有任何问题。