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中文编码:退保成功 我仔细分析后发现,退编码实际上 ...
随机推荐
- 洲阁筛 & min_25筛学习笔记
洲阁筛 给定一个积性函数$F(n)$,求$\sum_{i = 1}^{n}F(n)$.并且$F(n)$满足在素数和素数次幂的时候易于计算. 显然有: $\sum_{i = 1}^{n} F(n) = ...
- Protocol Buffer序列化/反序列化---初体验(java版)
今天闲遐时学习了 Protocol Buffer 在网上看到了许多资料,其中不泛精品,想要详细了解的请看文章结尾的友情链接,我这里就做加深印象,快速入门的一个完整的demo,仅此而已. 学完你可以得到 ...
- Python入门经典案例一
# 有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? sum = 0 values = range(1, 5) for i in values: for j in valu ...
- Android文件各种存储路径的比较
1.File cacheDir = context.getCacheDir(); 应用内部存储空间(数据文件私有)文件存储到这个路径下,不需要申请权限,当应用被卸载的时候,目录下的文件会被删除. 需要 ...
- 关于js中的类式继承
; }; ,,]; }; ); ; }; //子类 function Bb(){ }; var F=new f(); F.prototype=Aa.prototype;//此处只能传递方法,没有办法传 ...
- C C++互相调用注意
注意:直接调用会找不到函数定义 1. C 调用 C++封装好后的函数: 在C++中有一个函数 int main_cpp(): 首先构建头文件, #ifndef CPP_FILE_H #define ...
- mc面试题记录
1.linux 查看磁盘空间 df -hl 2.根目录下有哪些文件及其作用 3.查找/tmp下的文件内容含有abc的命令 grep -rn "abc" /tmp4.linux下的s ...
- Lintcode174-Remove Nth Node From End of List-Easy
174. Remove Nth Node From End of List Given a linked list, remove the nth node from the end of list ...
- setTimeout异步
同步任务和异步任务 同步和异步操作的区别就是是否阻碍后续代码的执行. 同步任务是那些没有被引擎挂起.在主线程上排队执行的任务.只有前一个任务执行完毕,才能执行后一个任务. 异步任务是那些被引擎放在一边 ...
- magic