PHP用post来进行Soap请求
最近调了一个Soap请求C# webservice的项目。网上坑不少。
使用原生的SoapClient库请求也是失败。只好用post来进行模拟了。代码贴出来,给大家参考一下。
<?php namespace App\Services\Proxy; use Log;
use Cache; class Crm
{
private $host; private $namespace; private $app_secret; private $username; private $values; public function __construct()
{
$this->host = config('crm.host');
$this->namespace = config('crm.namespace');
$this->app_secret = config('crm.app_secret');
$this->username = config('crm.username');
$this->values = [];
} /**
* 通过mobile和open_id获取用户信息
*/
public function getVipInfoByMobileOpenID($mobile, $openid)
{
$this->values = [
'mobile' => $mobile,
'openid' => $openid,
]; return $this->response('GetVipInfoByMobileOpenID');
} /**
* 以post方式提交xml到对应的接口url
*/
private function postXml($action, $sign_index = null)
{
$body = $this->toCRMXml($action, $sign_index); // Get cURL resource
$ch = curl_init(); // Set url
curl_setopt($ch, CURLOPT_URL, $this->host); // Set method
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST'); // Set options
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // Set headers
curl_setopt($ch, CURLOPT_HTTPHEADER, ["Content-Type: text/xml"]); curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $body); // Send the request & save response to $resp
$resp = curl_exec($ch); if ($resp === false) {
$error = curl_error($ch);
curl_close($ch); Log::info('CRM请求错误:' . json_encode($error));
return false;
} curl_close($ch);
return $resp;
} /**
* 输出CRM soap xml字符
*/
private function toCRMXml($action, $sign_index = null)
{
$soap_xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n"; $soap_xml .= "<soap:Envelope xmlns:soap=\"http://www.w3.org/2003/05/soap-envelope\" xmlns:tech=\"{$this->namespace}\">\r\n";
$soap_xml .= "<soap:Body>\r\n";
$soap_xml .= "<$action xmlns=\"{$this->namespace}\">\r\n";
$soap_xml .= "<request>\r\n"; // header
$soap_xml .= $this->setHeader($soap_xml, $sign_index); // data
$soap_xml .= "<Data>\r\n";
$soap_xml .= $this->arrayToXml($this->values);
$soap_xml .= "</Data>\r\n";
$soap_xml .= "</request>\r\n"; $soap_xml .= "</$action>\r\n"; $soap_xml .= "</soap:Body>\r\n";
$soap_xml .= "</soap:Envelope>"; return $soap_xml;
} /**
* 生成Header
*/
private function setHeader($xml, $sign_index= null)
{
list($date, $time) = explode(' ', date('Ymd His'));
$sign = $this->setSign($date, $time, $sign_index); $xml = "";
$xml .= "<Header>\r\n";
$xml .= "<SIGN>$sign</SIGN>\r\n";
$xml .= "<REQDATE>$date</REQDATE>\r\n";
$xml .= "<REQTIME>$time</REQTIME>\r\n";
$xml .= "<USER>{$this->username}</USER>\r\n";
$xml .= "</Header>\r\n"; return $xml;
} /**
* 生成sign
*/
private function setSign($date, $time, $sign_index= null)
{
if ($sign_index) {
if (strpos($sign_index, '.')) {
list($stuct_index, $index) = explode('.', $sign_index);
$seeder = $date . $time . $this->values[$stuct_index][$index] . $this->app_secret;
} else {
$seeder = $date . $time . $this->values[$sign_index] . $this->app_secret;
}
} else {
$seeder = $date . $time . $this->app_secret;
} return md5($seeder);
} /**
* 数组转换成xml
*/
private function arrayToXml($params)
{
$xml = "";
foreach ($params as $name => $value) {
if (is_array($value)) {
$xml .= "<$name>" . $this->arrayToXml($value) . "</$name>\r\n";
} else {
$xml .= "<$name>$value</$name>\r\n";
}
} return $xml;
} /**
* 将xml结果转化为对象
*/
public function response($action, $sign_index = null)
{
$result = str_ireplace('soap:', '', $this->postXml($action, $sign_index));
return $this->objectToArray(simplexml_load_string($result, 'SimpleXMLIterator', LIBXML_NOCDATA));
} /**
* 将对象转化为数组
*/
public function objectToArray($obj)
{
$_arr = is_object($obj) ? get_object_vars($obj) : $obj; $arr = [];
foreach ($_arr as $key => $val) {
$val = (is_array($val) || is_object($val)) ? $this->objectToArray($val) : $val;
$arr[$key] = $val;
} return $arr;
}
}
PHP用post来进行Soap请求的更多相关文章
- Axis2(10):使用soapmonitor模块监视soap请求与响应消息
在Axis2中提供了一个Axis2模块(soapmonitor),该模块实现了与<WebService大讲堂之Axis2(9):编写Axis2模块(Module)>中实现的logging模 ...
- Java发布一个简单 webservice应用 并发送SOAP请求
一.创建并发布一个简单的webservice应用 1.webservice 代码: package com.ls.demo; import javax.jws.WebMethod; import ja ...
- Java发布webservice应用并发送SOAP请求调用
webservice框架有很多,比如axis.axis2.cxf.xFire等等,做服务端和做客户端都可行,个人感觉使用这些框架的好处是减少了对于接口信息的解析,最主要的是减少了对于传递于网络中XML ...
- [Postman]发出SOAP请求(18)
使用Postman发出SOAP请求: 将SOAP端点作为URL.如果您使用的是WSDL,那么请将WSDL的路径作为URL. 将请求方法设置为POST. 打开原始编辑器,并将正文类型设置为“text / ...
- java 查看SOAP请求报文
log.info("ESB 请求URL = " + cachedEndpoint.toString());//打印SOAP请求报文 add by LinJC on 20170120 ...
- C# httpRequest Soap请求
一般添加web服务引用是.NET用代理类模式 创建SOAP请求代理类,代理类是.NET开发工具VS自动给你生成. 下面用一般HTTP的模式有时候可能更合适,原理是构造SOAP请求的XML后POST过去 ...
- iOS webservice SOAP 请求
1. Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的.专门的第三方软件或硬件, 就可相互交换数据或集成.依据Web Service规范实施的应用之间, 无论它们所使用的语 ...
- [转]C#通过Http发送Soap请求
/// <summary> /// 发送SOAP请求,并返回响应xml /// </summary> /// <param na ...
- Web Service之Soap请求响应内容中文编码解密
java模拟Soap请求测试Web Service接口,发现Web Service响应内容中的中文竟然是编码格式.比如: 中文:退保成功 Soap中文编码:退保成功 我仔细分析后发现,退编码实际上 ...
随机推荐
- Python3 tkinter基础 Radiobutton variable 默认选中的按钮
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- deep learning入门:感知机
权重和偏置 import numpy as np # 求x1 and x2 def AND(x1, x2): x = np.array([x1, x2]) w = np.array([0.5, 0.5 ...
- Pormise
//Pormisefunction MyPromise (executor) { var self = this self.status = 'pending' self.resolveValue = ...
- UVA11107 Life Forms
思路 后缀数组 先都拼在一起 二分+height分段 按照小于x的为分界,判断是否有一个分段中包含超过n/2个串 代码 #include <cstdio> #include <cst ...
- Linux根目录下各个目录的用途及含义
Linux根目录下各个目录的用途及含义 Linux ./bin 重要的二进制 (binary) 应用程序,包含二进制文件,系统的所有用户使用的命令都在这个目录下. ./boot 启动 (boot) 配 ...
- 前端基础面试题(JS部分)
1.几种基本数据类型?复杂数据类型?值类型和引用数据类型?堆栈数据结构? 基本数据类型:Undefined.Null.Boolean.Number.String 值类型:数值.布尔值.null.und ...
- Visual Studio提示“无法启动IIS Express Web服务器”的解决方法 调试闪退
有时,在使用Visual Studio运行ASP.NET项目时,会提示“无法启动IIS Express Web服务器”,无法运行,如图: 这一般出现在重装系统之后,或者项目是从别的电脑上复制过来的.解 ...
- structure streaming笔记
基于micro-batch, spark2.3之后, 支持continues processing 基于spark SQL 如同在静态table上运行标准批查询一样表现流计算, spark 通过在一个 ...
- vue ui 启动,浏览器报错Unexpected token <
可能的解决办法: 选择清空缓存并硬性重新加载页面. 如果不行,全局卸载@vue/cli,重新安装.
- JS 作用域与变量提升---JS 学习笔记(三)
你知道下面的JavaScript代码执行时会输出什么吗? var foo = 1; function bar() { if (!foo) { var foo = 10; } console.log(f ...