最近调了一个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. 16: vue + crypto-js + python前后端加密解密

    1.1 vue中使用crypto-js进行AES加密解密    参考博客:https://www.cnblogs.com/qixidi/p/10137935.html 1.初始化vue项目 vue i ...

  2. 0x11栈之火车进栈

    参考<算法竞赛进阶指南>p.49 题目链接:https://www.acwing.com/problem/content/description/131/ 递推与递归的宏观描述 对于一个待 ...

  3. 复旦大学2017--2018学年第二学期高等代数II期末考试情况分析

    一.期末考试成绩班级前十名 张菲诺(95).刘宇其(95).魏一鸣(93).郭宇城(92).程梓兼(91).葛珈玮(90).汪子怡(90).余张伟(90).张昰昊(89).朱柏青(89) 二.总成绩计 ...

  4. Python - 如何统计序列中元素出现的频次

    1.用内置的count()方法,该方法返回子字符串在字符串中出现的次数(同样适用于列表)2.用collections模块的Counter类 示例: from collections import Co ...

  5. 动态生成具有嵌套属性的linq选择(select)

    class SelectItem { public string Item { get; set; } } class SelectList { public int ID { get; set; } ...

  6. ATS 相关

    启动命令 /usr/local/CCTS/bin/trafficserver   start |stop | restart 清盘 /usr/local/CCTS/bin/traffic_server ...

  7. C语言: 简易图书管理系统

    这只是一个简易的图书管理系统,虽然它有千余行代码,不过终究是个简单基本的东西. 在Linux系统下,用Vim编写,如要在Windows上运行则需要一些改动,主要是一些调用系统函数的改动.如Window ...

  8. mysql workbench快捷键小结

    执行整篇sql脚本, ctrl+shift+enter 执行当前行,ctrl+enter 注释/取消注释, ctrl+/   [注意]这里的 / 指的是小键盘中的除法Divide符号格式化sql语句( ...

  9. Yaml语法使用

    YAML概要 1. 认识 YAML YAML是一个类似 XML.JSON 的标记性语言.YAML 强调以数据为中心,并不是以标识语言为重点.因而 YAML 本身的定义比较简单,号称“一种人性化的数据格 ...

  10. RabbitMQ跟Redis做消息队列的区别

    区别 https://www.zhihu.com/question/20795043 https://blog.csdn.net/dd18709200301/article/details/79077 ...