You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 12:05:32