#c# #php #soap
#c# #php #soap
Вопрос:
Я пытаюсь интегрировать SOAP с PHP, но приведенный пример — C #.
Я пытался долгое время, но, думаю, я не смог правильно отправить параметры.
Адрес WSDL: https://betatest.elogo.com.tr/webservice/PostBoxService.svc?singlewsdl
Пример кода c #;
using (PostBoxService.PostBoxServiceClient svc = new PostBoxService.PostBoxServiceClient()) {
PostBoxService.LoginType login = new PostBoxService.LoginType();
login.userName = “test”;
login.passWord = “test”;
string sessionId;
if (svc.Login(login, out sessionId)) {
}
}
Пример запроса SOAP
<soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:tem="http://tempuri.org/"
xmlns:efat="http://schemas.datacontract.org/2004/07/eFaturaWebService">
<soapenv:Header/>
<soapenv:Body>
<tem:Login>
<tem:login>
<efat:appStr></efat:appStr>
<efat:passWord>XXXXX</efat:passWord>
<efat:source></efat:source>
<efat:userName>XXXXX</efat:userName>
<efat:version></efat:version>
</tem:login>
</tem:Login>
</soapenv:Body>
</soapenv:Envelope>
Я использую PHP-код;
$data = array(
'login' => array(
'userName'=>self::username,
'password'=>self::password
)
);
$client = new SoapClient(self::url,$client_params);
$client->Login($data);
В PHP-коде отображается следующая ошибка;
[previous:Exception:private] =>
[faultstring] => String reference not set to an instance of a String.
Parameter name: s
[faultcode] => a:InternalServiceFault
[detail] => stdClass Object
(
[ExceptionDetail] => stdClass Object
(
[HelpLink] =>
[InnerException] =>
[Message] => String reference not set to an instance of a String.
Parameter name: s
[StackTrace] => at System.Text.Encoding.GetBytes(String s)
at CommonLib.Helper.HelperLib.ComputeMd5Hash(String input)
at CommonLib.Documents.LoginLogout.Login(LoginType login, Stringamp; sessionID)
at SyncInvokeLogin(Object , Object[] , Object[] )
at System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]amp; outputs)
at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpcamp; rpc)
at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpcamp; rpc)
at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11(MessageRpcamp; rpc)
at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)
[Type] => System.ArgumentNullException
)
)
Большое вам спасибо за вашу помощь.
Ответ №1:
В вашем примере запроса SOAP показано, что ключом пароля является «Пароль» (обратите внимание на заглавную букву W), но в вашем PHP вы отправляете «пароль». Таким образом, в PHP-коде нет ничего плохого, за исключением того, что массив данных должен быть:
$data = array(
'login' => array(
'userName'=>self::username,
'passWord'=>self::password
)
);