最近调了一个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请求的更多相关文章

  1. Axis2(10):使用soapmonitor模块监视soap请求与响应消息

    在Axis2中提供了一个Axis2模块(soapmonitor),该模块实现了与<WebService大讲堂之Axis2(9):编写Axis2模块(Module)>中实现的logging模 ...

  2. Java发布一个简单 webservice应用 并发送SOAP请求

    一.创建并发布一个简单的webservice应用 1.webservice 代码: package com.ls.demo; import javax.jws.WebMethod; import ja ...

  3. Java发布webservice应用并发送SOAP请求调用

    webservice框架有很多,比如axis.axis2.cxf.xFire等等,做服务端和做客户端都可行,个人感觉使用这些框架的好处是减少了对于接口信息的解析,最主要的是减少了对于传递于网络中XML ...

  4. [Postman]发出SOAP请求(18)

    使用Postman发出SOAP请求: 将SOAP端点作为URL.如果您使用的是WSDL,那么请将WSDL的路径作为URL. 将请求方法设置为POST. 打开原始编辑器,并将正文类型设置为“text / ...

  5. java 查看SOAP请求报文

    log.info("ESB 请求URL = " + cachedEndpoint.toString());//打印SOAP请求报文 add by LinJC on 20170120 ...

  6. C# httpRequest Soap请求

    一般添加web服务引用是.NET用代理类模式 创建SOAP请求代理类,代理类是.NET开发工具VS自动给你生成. 下面用一般HTTP的模式有时候可能更合适,原理是构造SOAP请求的XML后POST过去 ...

  7. iOS webservice SOAP 请求

    1. Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的.专门的第三方软件或硬件, 就可相互交换数据或集成.依据Web Service规范实施的应用之间, 无论它们所使用的语 ...

  8. [转]C#通过Http发送Soap请求

    /// <summary>        /// 发送SOAP请求,并返回响应xml        /// </summary>        /// <param na ...

  9. Web Service之Soap请求响应内容中文编码解密

    java模拟Soap请求测试Web Service接口,发现Web Service响应内容中的中文竟然是编码格式.比如: 中文:退保成功 Soap中文编码:退保成功   我仔细分析后发现,退编码实际上 ...

随机推荐

  1. 629D - Babaei and Birthday Cake

    题意:给定n个圆柱体的半径和高,输入顺序即圆柱体的编号顺序.现在规定,只有编号和体积均大于另一个圆柱体,才能放到另一个圆柱体的体积上面.求能叠加的最大体积是多少. 酝酿了我三天,才理解.自己敲个代码, ...

  2. Oracle错误——ORA-39000:转储文件说明错误、ORA-39001:参数值无效、ORA-39088:文件名不能包含路径说明

    错误 在使用数据泵导入文件时,报错如下 Next 出错原因 在使用参数DUMPFILE指定文件名称时,不能包含路径信息,只可以使用文件名称 Next 解决办法 在使用数据泵进行数据导入导出前,必须要创 ...

  3. 单元测试系列之八:Sonar 数据库表关系整理一(续)

    更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 简介:Sonar平台是目前较为流行的静态代码扫描平台,为了便于使用以及自己二次开发,有必要对它的数据库结构进行学习 ...

  4. 【codeforces 438D】The Child and Sequence

    [原题题面]传送门 [大致题意] 给定一个长度为n的非负整数序列a,你需要支持以下操作: 1:给定l,r,输出a[l]+a[l+1]+…+a[r]. 2:给定l,r,x,将a[l],a[l+1],…, ...

  5. HDU 1024 Max Sum Plus Plus【DP】

    Now I think you have got an AC in Ignatius.L's "Max Sum" problem. To be a brave ACMer, we ...

  6. 理解bootstrap的列偏移offset 和 推拉push/pull的区别?

    参考: http://www.cnblogs.com/jnslove/p/5430481.html & https://blog.csdn.net/hly_coder/article/deta ...

  7. BZOJ-1587|前缀和 预处理 dp||叶子合并leaves

    叶子合并leaves Description 在一个美丽的秋天,丽丽每天都经过的花园小巷落满了树叶,她决定把树叶堆成K堆,小巷是笔直的 共有N片树叶(树叶排列也是笔直的),每片树叶都有一个重量值,并且 ...

  8. C#异常重试通用类Retry

    //Retry机制 public static class Retry { /// <summary> /// 重试零个参数无返回值的方法 /// </summary> /// ...

  9. npm ERR! File exists: /XXX/xxx npm ERR! Move it away, and try again.

    今天抽空将我的静态服务 ks-server 之前留下的 bug(在node低版本情况下报错)维护了一下. 当我重新 npm link 时,如下错误: npm WARN ks-server@1.0.2 ...

  10. HDU - 3652

    #include<stdio.h> #include<string.h> #include<math.h> #include<time.h> #incl ...