- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
经过几天的谷歌搜索/尝试/脱发,我仍然找不到解决方案,所以请帮忙:)
简短信息:
我需要使用 PHP(SOAP 客户端)的 WCF 服务。它使用 wsHttpBinding (ws-security) 并且无法设置 basicHttpBinding。一切都在 VPN 之后,所以我无法为您提供网络服务的链接。数据也被认为是 secret (来自客户的请求),所以我不能给你完整的信息,只有一些“常见”的东西。这是WS配置:
<configuration>
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="WSHttpBinding_IServices" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false" />
<security mode="TransportWithMessageCredential">
<transport clientCredentialType="None" proxyCredentialType="None" realm="" />
<message clientCredentialType="UserName" negotiateServiceCredential="true" algorithmSuite="Default" />
</security>
</binding>
</wsHttpBinding>
</bindings>
<client>
<endpoint address="https://topSecert.url/Service.svc"
binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IServices"
contract="IServices" name="WSHttpBinding_IServices" />
</client>
</system.serviceModel>
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope"
xmlns:a="http://www.w3.org/2005/08/addressing">
<s:Header>
<a:Action s:mustUnderstand="1">http://www.w3.org/2005/08/addressing/soap/fault</a:Action>
</s:Header>
<s:Body>
<s:Fault>
<s:Code>
<s:Value>s:Sender</s:Value>
<s:Subcode>
<s:Value xmlns:a="http://schemas.xmlsoap.org/ws/2005/02/sc">a:BadContextToken</s:Value>
</s:Subcode>
</s:Code>
<s:Reason>
<s:Text xml:lang="en-US">The security context token is expired or is
not valid. The message was not processed.</s:Text>
</s:Reason>
</s:Fault>
</s:Body>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope"
xmlns:ns1="https://topSercret.url/Test">
<env:Header>
<wsse:Security
xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
env:mustUnderstand="1">
<wsse:UsernameToken>
<wsse:Username><!-- Removed --></wsse:Username>
<wsse:Password
Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest"><!-- Removed --></wsse:Password>
<wsse:Nonce><!-- Removed --></wsse:Nonce>
<wsu:Created
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">2014-01-19T15:20:31Z</wsu:Created>
</wsse:UsernameToken>
<wsu:Timestamp
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<wsu:Created>2014-01-19T15:20:31Z</wsu:Created>
<wsu:Expires>2014-01-19T16:20:31Z</wsu:Expires>
</wsu:Timestamp>
</wsse:Security>
</env:Header>
<env:Body>
<ns1:SomeAction />
</env:Body>
<?php
date_default_timezone_set( 'UTC' );
include 'WSSESoap.php';
class TestSoap extends SoapClient {
private $_username;
private $_password;
private $_digest;
// test vars
public $r_request;
public $r_location;
public $r_action;
function addUserToken($username, $password, $digest = false) {
$this->_username = $username;
$this->_password = $password;
$this->_digest = $digest;
}
function __doRequest($request, $location, $saction, $version, $one_way = 0) {
$doc = new DOMDocument('1.0');
$doc->loadXML($request);
$objWSSE = new WSSESoap($doc);
$objWSSE->signAllHeaders = TRUE;
$objWSSE->addTimestamp();
$objWSSE->addUserToken($this->_username, $this->_password, $this->_digest);
// take data for "my" usage
$this->r_request = $objWSSE->saveXML();
$this->r_location = $location;
$this->r_action = $saction;
return '';
}
}
function test()
{
$soapUrl = "https://topSecret.url/Services.svc";
$context = stream_context_create(array(
'ssl' => array(
'verify_peer' => false,
'allow_self_signed' => true
)
));
$client = new TestSoap('/mypath/wsdl.xml', array(
'stream_context' => $context,
'soap_version' => SOAP_1_2,
'trace' => 1,
'connection_timeout' => 10
));
$client->addUserToken('User', 'Password', TRUE );
$requestParams = array(
'data1' => '1',
'data2' => '2',
);
// call to generate request string
$client->myAction($requestParams);
$xml_post_string = $client->r_request;
$headers = array(
"Content-type: application/soap+xml; charset=\"utf-8\"",
"Accept: text/xml,application/soap+xml",
"Cache-Control: no-cache",
"Pragma: no-cache",
"SOAPAction: " . $client->r_action,
"Content-length: " . strlen($xml_post_string)
);
// generate && run cURL request
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_URL, $soapUrl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml_post_string); // the SOAP request
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
}
test();
最佳答案
我前段时间解决了这个问题,但从来没有时间让它更“好”。所以一般问题是 wsHttpBinding 消息安全的工作方式以及如何在 PHP 上实现它。我使用了 https://github.com/enginaygen/kps-soap-client/blob/master/KPSSoapClient.php 的概念,还添加了 Implementation of P_SHA1 algorithm in PHP 的 psha1 。
所以它需要工作的方式是这样的:
// TODO implement this by extending SoapClient class
// currently not implemented in it because request params are not generated correctly
/**
* Client implementing SOAP wsHttpBinding with message security. <br>
* NOTE: this is adapted to work for special needs of our client. It can be modified and there is a lot of work that jet needs to be done (nicer code, options and optimization).
*/
class WSSoap
{
/**
* Securit token request template
*/
const STS_TEMPLATE = <<<X
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing"xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"><s:Header><a:Action s:mustUnderstand="1">http://schemas.xmlsoap.org/ws/2005/02/trust/RST/SCT</a:Action><a:MessageID></a:MessageID><a:ReplyTo><a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address></a:ReplyTo><a:To s:mustUnderstand="1"></a:To><o:Security s:mustUnderstand="1" xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"><u:Timestamp u:Id="_0"><u:Created></u:Created><u:Expires></u:Expires></u:Timestamp><o:UsernameToken u:Id="_1"><o:Username></o:Username><o:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText"></o:Password></o:UsernameToken></o:Security></s:Header><s:Body><t:RequestSecurityToken xmlns:t="http://schemas.xmlsoap.org/ws/2005/02/trust"><t:TokenType>http://schemas.xmlsoap.org/ws/2005/02/sc/sct</t:TokenType><t:RequestType>http://schemas.xmlsoap.org/ws/2005/02/trust/Issue</t:RequestType><t:Entropy><t:BinarySecret Type="http://schemas.xmlsoap.org/ws/2005/02/trust/Nonce"></t:BinarySecret></t:Entropy><t:KeySize>256</t:KeySize></t:RequestSecurityToken></s:Body></s:Envelope>
X;
/**
* Any action request template (mainly for headers)
*/
const KPS_TEMPLATE = <<<X
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"><s:Header><a:Action s:mustUnderstand="1">n</a:Action><a:MessageID></a:MessageID><a:ReplyTo><a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address></a:ReplyTo><a:To s:mustUnderstand="1"></a:To><o:Security s:mustUnderstand="1" xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"><u:Timestamp u:Id="_0"><u:Created></u:Created><u:Expires></u:Expires></u:Timestamp><c:SecurityContextToken xmlns:c="http://schemas.xmlsoap.org/ws/2005/02/sc"><c:Identifier></c:Identifier></c:SecurityContextToken><Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"></CanonicalizationMethod><SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#hmac-sha1"></SignatureMethod><Reference URI="#_0"> <Transforms><Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"></Transform></Transforms><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></DigestMethod><DigestValue></DigestValue></Reference></SignedInfo><SignatureValue></SignatureValue><KeyInfo><o:SecurityTokenReference><o:Reference ValueType="http://schemas.xmlsoap.org/ws/2005/02/sc/sct"></o:Reference></o:SecurityTokenReference></KeyInfo></Signature></o:Security></s:Header><s:Body></s:Body></s:Envelope>
X;
/**
* Namespaces
*/
const S11 = "http://schemas.xmlsoap.org/soap/envelope/";
const S12 = "http://www.w3.org/2003/05/soap-envelope";
const WSU = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd";
const WSSE = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";
const WSSE11 = "http://docs.oasis-open.org/wss/oasis-wss-wsecurity-secext-1.1.xsd";
const WST = "http://schemas.xmlsoap.org/ws/2005/02/trust";
const DS = "http://www.w3.org/2000/09/xmldsig#";
const XENC = "http://www.w3.org/2001/04/xmlenc#";
const WSP = "http://schemas.xmlsoap.org/ws/2004/09/policy";
const WSA = "http://www.w3.org/2005/08/addressing";
const XS = "http://www.w3.org/2001/XMLSchema";
const WSDL = "http://schemas.xmlsoap.org/wsdl/";
const SP = "http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702";
const SC = "http://schemas.xmlsoap.org/ws/2005/02/sc";
/**
* STS Properties
*/
protected $stsHostName;
protected $stsEndpoint;
protected $stsUsername;
protected $stsPassword;
protected $stsNamespace;
/**
* Binary secret used for generating request
*/
protected $requestSecret;
protected $rstrBinarySecret;
protected $rstrKeyIdentifier;
protected $token;
protected $tokenReference;
function __construct( $username, $password, $endpointURL, $namespace )
{
$this->stsUsername = $username;
$this->stsPassword = $password;
$this->stsHostName = parse_url( $endpointURL, PHP_URL_HOST);
$this->stsEndpoint = $endpointURL;
$this->stsNamespace = $namespace;
}
function request( $action, $fullActionName, $params )
{
$this->stsRequest();
$kpsDom = new \DOMDocument("1.0", "utf-8");
$kpsDom->preserveWhiteSpace = false;
$kpsDom->loadXML(static::KPS_TEMPLATE);
$kpsXpath = new \DOMXPath($kpsDom);
$kpsXpath->registerNamespace('S12', static::S12);
$kpsXpath->registerNamespace('WSA', static::WSA);
$kpsXpath->registerNamespace('WSU', static::WSU);
$kpsXpath->registerNamespace('WSSE', static::WSSE);
$kpsXpath->registerNamespace('XENC', static::XENC);
$kpsXpath->registerNamespace('DS', static::DS);
$kpsXpath->registerNamespace('SC', static::SC);
// Addressing
$uuid = $this->uuid();
$actionPath = $kpsXpath->query("//S12:Envelope/S12:Header/WSA:Action");
$messageIDPath = $kpsXpath->query("//S12:Envelope/S12:Header/WSA:MessageID");
$toPath = $kpsXpath->query("//S12:Envelope/S12:Header/WSA:To");
$actionPath->item(0)->nodeValue = $fullActionName;
$messageIDPath->item(0)->nodeValue = sprintf("urn:uuid:%s", $uuid);
$toPath->item(0)->nodeValue = $this->stsEndpoint;
// Timestamp
$time = time();
$dateCreated = gmdate('Y-m-d\TH:i:s\Z', $time);
$dateExpires = gmdate('Y-m-d\TH:i:s\Z', $time + (5 * 60));
$timestampPath = $kpsXpath->query("//S12:Envelope/S12:Header/WSSE:Security/WSU:Timestamp");
$timestampDateCreatedPath = $kpsXpath->query("//S12:Envelope/S12:Header/WSSE:Security/WSU:Timestamp/WSU:Created");
$timestampDateExpiresPath = $kpsXpath->query("//S12:Envelope/S12:Header/WSSE:Security/WSU:Timestamp/WSU:Expires");
$timestampDateCreatedPath->item(0)->nodeValue = $dateCreated;
$timestampDateExpiresPath->item(0)->nodeValue = $dateExpires;
$timestampC14N = $timestampPath->item(0)->C14N(true, false);
// DigestValue
$digestValue = base64_encode(hash('sha1', $timestampC14N, true));
$digestValuePath = $kpsXpath->query("//S12:Envelope/S12:Header/WSSE:Security/DS:Signature/DS:SignedInfo/DS:Reference/DS:DigestValue");
$digestValuePath->item(0)->nodeValue = $digestValue;
// Signature
$signaturePath = $kpsXpath->query("//S12:Envelope/S12:Header/WSSE:Security/DS:Signature/DS:SignedInfo");
$signatureValuePath = $kpsXpath->query("//S12:Envelope/S12:Header/WSSE:Security/DS:Signature/DS:SignatureValue");
$signatureC14N = $signaturePath->item(0)->C14N(true, false);
$psBinary = $this->psha1( $this->requestSecret, $this->rstrBinarySecret );
$signatureValue = base64_encode(hash_hmac("sha1", $signatureC14N, $psBinary, true));
$signatureValuePath->item(0)->nodeValue = $signatureValue;
// token reference
$securityContextTokenReference = $kpsXpath->query("//S12:Envelope/S12:Header/WSSE:Security/DS:Signature/DS:KeyInfo/WSSE:SecurityTokenReference/WSSE:Reference");
$securityContextTokenReference->item(0)->setAttribute('URI', "#$this->tokenReference");
// token ID
$tokenPath = $kpsXpath->query("//S12:Envelope/S12:Header/WSSE:Security/SC:SecurityContextToken");
$tokenPath->item(0)->setAttribute('u:Id', $this->tokenReference);
// token
$tokenPath = $kpsXpath->query("//S12:Envelope/S12:Header/WSSE:Security/SC:SecurityContextToken/SC:Identifier");
$tokenPath->item(0)->nodeValue = $this->token;
// Message
$bodyElemet = $kpsXpath->query("//S12:Envelope/S12:Body")->item(0);
$root = $kpsDom->createElementNS( $this->stsNamespace, $action );
foreach( $params as $name => $value ) {
$root->appendChild( $kpsDom->createElement( $name, $value ) );
}
$bodyElemet->appendChild( $root );
$kpsRequest = $kpsDom->saveXML();
// Request
try {
$stsResponse = $this->execCurl( $kpsRequest );
} catch ( \Exception $e ) {
throw $e;
}
return $stsResponse;
}
/**
* Performs a STS request
*
* @param string $location Request location
*/
protected function stsRequest()
{
$rstXml = static::STS_TEMPLATE;
$rstDom = new \DOMDocument("1.0", "utf-8");
$rstDom->preserveWhiteSpace = false;
$rstDom->loadXML($rstXml);
$rstXpath = new \DOMXPath($rstDom);
$rstXpath->registerNamespace('S12', static::S12);
$rstXpath->registerNamespace('WSA', static::WSA);
$rstXpath->registerNamespace('WSU', static::WSU);
$rstXpath->registerNamespace('WSSE', static::WSSE);
$rstXpath->registerNamespace('XENC', static::XENC);
$rstXpath->registerNamespace('DS', static::DS);
$rstXpath->registerNamespace('WST', static::WST);
$rstXpath->registerNamespace('WSP', static::WSP);
// Addressing
$uuid = $this->uuid();
$messageIDPath = $rstXpath->query("//S12:Envelope/S12:Header/WSA:MessageID");
$toPath = $rstXpath->query("//S12:Envelope/S12:Header/WSA:To");
$messageIDPath->item(0)->nodeValue = sprintf("urn:uuid:%s", $uuid);
$toPath->item(0)->nodeValue = $this->stsEndpoint;
// Timestamp
$time = time();
$dateCreated = gmdate('Y-m-d\TH:i:s\Z', $time);
$dateExpires = gmdate('Y-m-d\TH:i:s\Z', $time + (5 * 60));
$timestampDateCreatedPath = $rstXpath->query("//S12:Envelope/S12:Header/WSSE:Security/WSU:Timestamp/WSU:Created");
$timestampDateExpiresPath = $rstXpath->query("//S12:Envelope/S12:Header/WSSE:Security/WSU:Timestamp/WSU:Expires");
$timestampDateCreatedPath->item(0)->nodeValue = $dateCreated;
$timestampDateExpiresPath->item(0)->nodeValue = $dateExpires;
// Credentials
$usernamePath = $rstXpath->query("//S12:Envelope/S12:Header/WSSE:Security/WSSE:UsernameToken/WSSE:Username");
$passwordPath = $rstXpath->query("//S12:Envelope/S12:Header/WSSE:Security/WSSE:UsernameToken/WSSE:Password");
$usernamePath->item(0)->nodeValue = $this->stsUsername;
$passwordPath->item(0)->nodeValue = $this->stsPassword;
// Set binary key
$this->requestSecret = uniqid();
$binaryKeyPath = $rstXpath->query("//S12:Envelope/S12:Body/WST:RequestSecurityToken/WST:Entropy/WST:BinarySecret");
$binaryKeyPath->item(0)->nodeValue = base64_encode( $this->requestSecret );
// Endpoint
$stsRequest = $rstDom->saveXML();
// Request
try {
$stsResponse = $this->execCurl( $stsRequest );
} catch ( \Exception $e ) {
throw $e;
}
$rstrDom = new \DOMDocument("1.0", "utf-8");
$rstrDom->preserveWhiteSpace = false;
$rstrDom->loadXML($stsResponse);
$rstrXpath = new \DOMXPath($rstrDom);
$rstrXpath->registerNamespace('S12', static::S12);
$rstrXpath->registerNamespace('WSA', static::WSA);
$rstrXpath->registerNamespace('WSU', static::WSU);
$rstrXpath->registerNamespace('WSSE', static::WSSE);
$rstrXpath->registerNamespace('XENC', static::XENC);
$rstrXpath->registerNamespace('DS', static::DS);
$rstrXpath->registerNamespace('WST', static::WST);
$rstrXpath->registerNamespace('WSP', static::WSP);
$rstrXpath->registerNamespace('SC', static::SC);
// parse security context token
$securityContextTokenReference = $rstrXpath->query("//S12:Envelope/S12:Body/WST:RequestSecurityTokenResponse/WST:RequestedSecurityToken/SC:SecurityContextToken");
$this->tokenReference = $securityContextTokenReference->item(0)->getAttribute('u:Id');
$securityContextToken = $rstrXpath->query("//S12:Envelope/S12:Body/WST:RequestSecurityTokenResponse/WST:RequestedSecurityToken/SC:SecurityContextToken/SC:Identifier");
$this->token = $securityContextToken->item(0)->nodeValue;
$securityContextToken = $rstrXpath->query("//S12:Envelope/S12:Body/WST:RequestSecurityTokenResponse/WST:Entropy/WST:BinarySecret");
$this->rstrBinarySecret = base64_decode( $securityContextToken->item(0)->nodeValue );
}
protected function execCurl( $request )
{
// Request
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $this->stsEndpoint);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); // disable SSL verification - re-enable if needed
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
"Host: " . $this->stsHostName,
"Content-Type: application/soap+xml; charset=utf-8",
"Content-Length: " . strlen( $request ),
));
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $request );
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
if ( $response === false ) {
throw new \Exception(curl_error($ch));
}
curl_close($ch);
return $response;
}
/**
* Generates UUID
*
* @return string UUID
*/
protected function uuid()
{
return sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x', //
mt_rand(0, 0xffff), //
mt_rand(0, 0xffff), //
mt_rand(0, 0xffff), //
mt_rand(0, 0x0fff) | 0x4000, //
mt_rand(0, 0x3fff) | 0x8000, //
mt_rand(0, 0xffff), //
mt_rand(0, 0xffff), //
mt_rand(0, 0xffff) //
);
}
/**
* Calculate psha1 hash used for signature generation
* @param unknown $clientSecret
* @param unknown $serverSecret
* @param number $sizeBits
* @return string
*/
protected function psha1($clientSecret, $serverSecret, $sizeBits = 256)
{
$sizeBytes = $sizeBits / 8;
$hmacKey = $clientSecret;
$hashSize = 160; // HMAC_SHA1 length is always 160
$bufferSize = $hashSize / 8 + strlen($serverSecret);
$i = 0;
$b1 = $serverSecret;
$b2 = "";
$temp = null;
$psha = array();
while ($i < $sizeBytes) {
$b1 = hash_hmac('SHA1', $b1, $hmacKey, true);
$b2 = $b1 . $serverSecret;
$temp = hash_hmac('SHA1', $b2, $hmacKey, true);
for ($j = 0; $j < strlen($temp); $j++) {
if ($i < $sizeBytes) {
$psha[$i] = $temp[$j];
$i++;
} else {
break;
}
}
}
return implode("", $psha);
}
}
<s:Header>
<a:Action s:mustUnderstand="1">https://some.url/NamespaceName/IServices/CheckTransaction</a:Action>
...
</s:Header>
<s:Body>
<CheckTransaction xmlns="https://sime.url/ActionToDo">
<TransactionID>1234567</TransactionID>
</CheckTransaction>
</s:Body>
$url = 'https://some.url/Services.svc';
$namespace = 'https://some.url/NamespaceName'; // this is action namespace you need, since there is no WSDL parsing you need to set it by yourself
try {
$c = new WSSoap( $username, $password, $url, $namespace );
$params = array(
'TransactionID' => '1234567'
);
$r = $c->request( 'CheckTransaction', 'https://some.url/NamespaceName/IServices/CheckTransaction', $params ); // also applies - no WSDL parsing so we need to set params
} catch (Exception $e) {
throw $e;
}
关于带有 WCF BadContextToken 的 PHP Soap 客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21218908/
我在 JavaScript 文件中运行 PHP,例如...... var = '';). 我需要使用 JavaScript 来扫描字符串中的 PHP 定界符(打开和关闭 PHP 的 )。 我已经知道使
我希望能够做这样的事情: php --determine-oldest-supported-php-version test.php 并得到这个输出: 7.2 也就是说,php 二进制检查 test.
我正在开发一个目前不使用任何框架的大型 php 站点。我的大问题是,随着时间的推移慢慢尝试将框架融入应用程序是否可取,例如在创建的新部件和更新的旧部件中? 比如所有的页面都是直接通过url服务的,有几
下面是我的源代码,我想在同一页面顶部的另一个 php 脚本中使用位于底部 php 脚本的变量 $r1。我需要一个简单的解决方案来解决这个问题。我想在代码中存在的更新查询中使用该变量。 $name)
我正在制作一个网站,根据不同的情况进行大量 PHP 重定向。就像这样...... header("Location: somesite.com/redirectedpage.php"); 为了安全起见
我有一个旧网站,我的 php 标签从 因为短标签已经显示出安全问题,并且在未来的版本中将不被支持。 关于php - 如何避免在 php 文件中写入
我有一个用 PHP 编写的配置文件,如下所示, 所以我想用PHP开发一个接口(interface),它可以编辑文件值,如$WEBPATH , $ACCOUNTPATH和 const值(value)观
我试图制作一个登录页面来学习基本的PHP,首先我希望我的独立PHP文件存储HTML文件的输入(带有表单),但是当我按下按钮时(触发POST到PHP脚本) )我一直收到令人不愉快的错误。 我已经搜索了S
我正在寻找一种让 PHP 以一种形式打印任意数组的方法,我可以将该数组作为赋值包含在我的(测试)代码中。 print_r 产生例如: Array ( [0] => qsr-part:1285 [1]
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: What is the max key size for an array in PHP? 正如标题所说,我想知道
我正在寻找一种让 PHP 以一种形式打印任意数组的方法,我可以将该数组作为赋值包含在我的(测试)代码中。 print_r 产生例如: Array ( [0] => qsr-part:1285 [1]
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 9 年前。 Improve this ques
我在 MySQL 数据库中有一个表,其中存储餐厅在每个工作日和时段提供的菜单。 表结构如下: i_type i_name i_cost i_day i_start i_
我有两页。 test1.php 和 test2.php。 我想做的就是在 test1.php 上点击提交,并将 test2.php 显示在 div 中。这实际上工作正常,但我需要向 test2.php
我得到了这个代码。我想通过textarea更新mysql。我在textarea中回显我的MySQL,但我不知道如何更新它,我应该把所有东西都放进去吗,因为_GET模式没有给我任何东西,我也尝试_GET
首先,我是 php 的新手,所以我仍在努力学习。我在 Wordpress 上创建了一个表单,我想将值插入一个表(data_test 表,我已经管理了),然后从 data_test 表中获取所有列(id
我有以下函数可以清理用户或网址的输入: function SanitizeString($var) { $var=stripslashes($var); $va
我有一个 html 页面,它使用 php 文件查询数据库,然后让用户登录,否则拒绝访问。我遇到的问题是它只是重定向到 php 文件的 url,并且从不对发生的事情提供反馈。这是我第一次使用 html、
我有一个页面充满了指向 pdf 的链接,我想跟踪哪些链接被单击。我以为我可以做如下的事情,但遇到了问题: query($sql); if($result){
我正在使用 从外部文本文件加载 HTML/PHP 代码 $f = fopen($filename, "r"); while ($line = fgets($f, 4096)) { print $l
我是一名优秀的程序员,十分优秀!