Skip to content

Instantly share code, notes, and snippets.

@afiqiqmal
Last active August 8, 2019 12:08
Show Gist options
  • Save afiqiqmal/e9ad0d386be77b12e79e9502ac57e5b9 to your computer and use it in GitHub Desktop.
Save afiqiqmal/e9ad0d386be77b12e79e9502ac57e5b9 to your computer and use it in GitHub Desktop.
Soap Request Using PHP which focus on SOAP using WSSE Security and Basic Authenticattion
<?php
if (! function_exists('soap_request')) {
function soap_request($array = [])
{
return new \App\Library\SoapRequest();
}
}
<?php
/**
* Created by PhpStorm.
* User: hafiq
* Date: 28/02/2018
* Time: 9:30 AM
*/
namespace App\Library;
use App\Http\Soap\WSSESoapClient;
class SoapRequest
{
protected $opts = null;
protected $soap_option = null;
protected $context = null;
protected $fullUrl = null;
protected $body = null;
protected $function = null;
protected $method = null;
protected $acAsWsToken = false;
protected $env = false; // false production
private $username;
private $password;
public function __construct()
{
$this->initAgent();
}
private function initAgent()
{
$this->opts = [
'https' => [
'user_agent' => 'PHPSoapClient'
],
];
$this->fullUrl = config('cris.url');
}
public function setEnv($env = 'local')
{
$this->env = $env != 'production';
return $this;
}
public function setCredential($user, $pass)
{
$this->username = $user;
$this->password = $pass;
return $this;
}
public function endpoint($url)
{
$this->fullUrl = $url ?? config('cris.url');
return $this;
}
public function setUrl($method, $method2 = null)
{
$this->function = ($method2) ? $method2 : $method;
$this->method = $method;
return $this;
}
public function setBody(array $body)
{
$this->body = $body;
return $this;
}
public function actAsWsUsernameToken()
{
$this->acAsWsToken = true;
return $this;
}
public function execute()
{
$this->fullUrl = $this->fullUrl .'/'. $this->method . "?wsdl";
if ($this->env) {
$this->opts['ssl'] = [
'verify_peer_name' => false,
'allow_self_signed' => true,
];
} else {
$this->opts['ssl'] = [
'verify_peer_name' => false,
'allow_self_signed' => true,
];
}
$this->context = stream_context_create($this->opts);
$this->soap_option = [
'stream_context' => $this->context
];
if ($this->env) {
$this->soap_option['trace'] = true;
$this->soap_option['exceptions'] = true;
}
$this->soap_option['cache_wsdl'] = WSDL_CACHE_NONE;
if (!$this->acAsWsToken) {
$this->soap_option['login'] = $this->username;
$this->soap_option['password'] = $this->password;
}
try {
if (!$this->env) {
$this->soap_option['location'] = $this->fullUrl;
}
$soap = new WSSESoapClient($this->fullUrl, $this->soap_option, $this->acAsWsToken, $this->username, $this->password);
$result = $soap->{$this->function}($this->body);
return (object) [
'code' => 200,
'data' => isset($result->mainData) ? $result->mainData : ($this->acAsWsToken ? $result : null),
'header' => $this->acAsWsToken ? $result : $result->head,
];
} catch (\Exception $exception) {
return (object)[
'code' => 500,
'message' => $exception->getMessage()
];
}
}
}
<?php
$body = [
'head' => [
'key1' => [
'name' => 'ACCT_ID',
'value' => '12312323829382',
]
]
];
$result = soap_request()
->endpoint($url)
->setEnv(env('APP_ENV'))
->setCredential($username, $password)
->setUrl($body_name) // WXFormsList
->setBody($body)
//->actAsWsUsernameToken() // if soap as usernametoken authentication type. As default is Basic Autorization
->execute();
if ($result->code == 200) {
return response()->raw(
$result->code,
(new ApiResource($result->data, true))->toRawArray()
);
} else {
return response()->error();
}
<?php
/**
* Created by PhpStorm.
* User: hafiq
* Date: 27/02/2018
* Time: 3:19 PM
*/
namespace App\Http\Soap;
use Carbon\Carbon;
use SoapHeader;
use SoapVar;
use stdClass;
class WSSEHeader extends SoapHeader
{
private $wss_ns = 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd';
private $wsu_ns = 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd';
function __construct($ns = null)
{
if ($ns) {
$this->wss_ns = $ns;
}
//generate timestamp
$created_time = str_replace('+00:00', 'Z', Carbon::now('UTC')
->subMinute(1)->toIso8601String());
$expires_time = str_replace('+00:00', 'Z', Carbon::now('UTC')
->toIso8601String());
//build variable
$timestamp_obj = new stdClass();
$timestamp_obj->Created = new SoapVar(
$created_time,
XSD_DATE,
null,
$this->wsu_ns,
null,
$this->wsu_ns
);
$timestamp_obj->Expires = new SoapVar(
$expires_time,
XSD_DATE,
null,
$this->wsu_ns,
null,
$this->wsu_ns
);
//build security node
$security_obj = new stdClass();
$security_obj->Timestamp = new SoapVar(
$timestamp_obj,
SOAP_ENC_OBJECT,
null,
$this->wsu_ns,
'Timestamp',
$this->wsu_ns
);
$security_sv = new SoapVar(
new SoapVar(
$security_obj,
SOAP_ENC_OBJECT,
null,
$this->wss_ns,
'Security',
$this->wss_ns
),
SOAP_ENC_OBJECT,
null,
$this->wss_ns,
'Security',
$this->wss_ns
);
parent::__construct($this->wss_ns, 'Security', $security_sv, true);
}
}
<?php
/**
* Created by PhpStorm.
* User: hafiq
* Date: 27/02/2018
* Time: 3:22 PM
*/
namespace App\Http\Soap;
use SoapClient;
class WSSESoapClient extends SoapClient
{
public function __construct($wsdl, $options = array(), $stupidChanges = false, $username = null, $password = null)
{
parent::__construct($wsdl, $options);
if ($stupidChanges) {
$header = new V2WSSEHeader(null, $username, $password);
} else {
$header = new WSSEHeader();
}
$this->__setSoapHeaders(array( $header ));
}
}
<?php
/**
* Created by PhpStorm.
* User: hafiq
* Date: 27/02/2018
* Time: 3:19 PM
*/
namespace App\Http\Soap;
use SoapHeader;
use SoapVar;
use stdClass;
class WSSETokenHeader extends SoapHeader
{
private $wss_ns = 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd';
private $wsu_ns = 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd';
function __construct($ns = null, $user = null, $pass = null)
{
$created = gmdate('Y-m-d\TH:i:s\Z');
$nonce = mt_rand();
$passdigest = base64_encode( pack('H*', sha1( pack('H*', $nonce) . pack('a*',$created). pack('a*',$pass))));
$auth = new stdClass();
$auth->Username = new SoapVar(
$user,
XSD_STRING,
NULL,
$this->wss_ns,
NULL,
$this->wss_ns
);
$auth->Password = new SoapVar(
$pass,
XSD_STRING,
NULL,
$this->wss_ns,
NULL,
$this->wss_ns
);
$auth->Nonce = new SoapVar(
$passdigest,
XSD_STRING,
NULL,
$this->wss_ns,
NULL,
$this->wss_ns
);
$auth->Created = new SoapVar(
$created,
XSD_STRING,
NULL,
$this->wss_ns,
NULL,
$this->wsu_ns
);
$username_token = new stdClass();
$username_token->UsernameToken = new SoapVar(
$auth,
SOAP_ENC_OBJECT,
NULL,
$this->wss_ns,
'UsernameToken',
$this->wss_ns
);
$security_sv = new SoapVar(
$username_token,
SOAP_ENC_OBJECT,
NULL,
$this->wss_ns,
'Security',
$this->wss_ns
);
parent::__construct($this->wss_ns, 'Security', $security_sv, true);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment