基于RobRichards资源的PHP调用带签名ASP.NET WebService问询
PHP实现带数字证书签名的ASP.NET WebService调用(ConsultaAutoliquidacio方法)
基于你已搭建的XAMPP环境及RobRichards的XMLSecLibs,以下是实现带数字证书签名调用目标WebService的完整方案,核心分为构造SOAP请求体、XML数字签名、发送请求三个环节。
依赖与证书准备
- 确认XMLSecLibs的引入路径(假设放置在XAMPP的
htdocs/xmldsig目录下) - 准备PKCS#12格式的数字证书(
.p12文件),并记录证书密码
完整代码实现
<?php // 引入RobRichards的XMLSecLibs库 require_once 'xmldsig/xmlseclibs.php'; // 1. 核心配置参数 $wsdl_url = 'https://wsproves.orgt.diba.cat/AutoliquidacioGenerica/AutoliquidacioGenericaService.svc/mex?singleWsdl'; $soap_action = 'http://tempuri.org/IAutoliquidacioGenericaService/ConsultaAutoliquidacio'; // 需与WSDL定义的SOAPAction一致 $cert_path = '/absolute/path/to/your/certificate.p12'; // 替换为你的P12证书绝对路径 $cert_password = 'your-cert-passphrase'; // 替换为证书密码 // 2. 构造符合WSDL要求的SOAP请求体 $soap_body = <<<XML <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/" xmlns:aut="http://schemas.datacontract.org/2004/07/AutoliquidacioGenerica.Model"> <soapenv:Header/> <soapenv:Body> <tem:ConsultaAutoliquidacio> <!-- 替换为实际业务参数,以下为示例结构 --> <tem:peticio> <aut:CodiEmpresa>123456</aut:CodiEmpresa> <aut:CodiOperacio>001</aut:CodiOperacio> <aut:Any>2024</aut:Any> <aut:Mes>6</aut:Mes> </tem:peticio> </tem:ConsultaAutoliquidacio> </soapenv:Body> </soapenv:Envelope> XML; // 3. 对SOAP请求进行数字签名 $doc = new DOMDocument(); $doc->loadXML($soap_body); // 初始化签名对象 $objDSig = new XMLSecurityDSig(); $objDSig->setCanonicalMethod(XMLSecurityDSig::C14N); // 对SOAP Body节点添加签名引用(若服务要求签名特定节点,可调整XPath定位) $objDSig->addReference( $doc, XMLSecurityDSig::SHA256, array('http://www.w3.org/2000/09/xmldsig#enveloped-signature'), array('force_uri' => true) ); // 加载证书私钥 $objKey = new XMLSecurityKey(XMLSecurityKey::RSA_SHA256, array('type' => 'private')); $objKey->loadKey($cert_path, true, array('passphrase' => $cert_password)); // 执行签名并将签名插入SOAP Header $objDSig->sign($objKey); $objDSig->add509Cert(file_get_contents($cert_path)); $objDSig->appendSignature($doc->documentElement->firstChild); // 插入到Header节点后 // 4. 发送签名后的SOAP请求 $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $wsdl_url); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $doc->saveXML()); curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Content-Type: text/xml; charset=utf-8', 'SOAPAction: "' . $soap_action . '"' )); // 测试环境禁用SSL校验(生产环境需配置可信CA证书) curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 执行请求并处理结果 $response = curl_exec($ch); if(curl_errno($ch)){ die('CURL请求错误: ' . curl_error($ch)); } curl_close($ch); // 输出响应 echo '服务响应结果:' . PHP_EOL; echo htmlspecialchars($response); ?>
关键注意事项
- SOAP结构校验:务必根据WSDL定义的
ConsultaAutoliquidacio方法调整请求体的命名空间和参数,结构不匹配会直接导致服务报错 - 签名位置调整:若服务要求签名嵌入
<soap:Body>内的特定节点,可修改addReference的目标节点(通过XPath定位具体方法节点) - 证书权限:确保XAMPP的Apache进程有权限读取P12证书文件,避免因权限不足导致加载失败
- 生产环境SSL配置:生产环境需移除
CURLOPT_SSL_VERIFYPEER和CURLOPT_SSL_VERIFYHOST的禁用配置,添加可信CA证书路径 - 签名算法适配:若服务要求使用SHA1等其他算法,需将
XMLSecurityKey::RSA_SHA256替换为对应常量(如XMLSecurityKey::RSA_SHA1)
内容的提问来源于stack exchange,提问作者user1977269
相关产品推荐
相关产品推荐

