我有一个由第三方提供商提供的API,可用于创建虚拟货币,创建礼品卡等.API具有类似
的资源Creating customers
Transfer of funds between customers
Crediting virtual money to customers account
Debiting virtual money from customers account etc..
API在SOAP中,我发送soap请求来访问资源。要使用API中的任何资源,我必须使用他们提供的登录API登录。一旦我登录,他们发回一个sessionID有效期为2分钟,它将在此之后到期。我可以使用Keepalive api保持会话活动,这将使会话保持活动另外2分钟。
当我打电话给任何资源说创建客户时,我必须发送sessionID。
问题是我无法维持会话及其失败。我正在使用codeigniter。我目前保存的登录信息如下
class Wallet
{
function __construct()
{
$this->ci =& get_instance();
$this->ci->load->model('merchant_model');
define("UID", "test");
define("PWD", "34rf3a4557510c82d47d0ac1a5244c4eba0762b3");
define("API_ENDPOINT", "http://uat-api.*******.in/services/smp");
define("PRODUCT_CODE", "24");
$SessionID = $this->keepAliveLib();
define("SessionID",$SessionID);
}
function keepAliveLib()
{
$SessionID = $this->ci->merchant_model->updateWalletSession();
if($SessionID)
{
return $SessionID;
} else {
return $this->login();
}
}
function login()
{
$soap_do = curl_init();
curl_setopt($soap_do, CURLOPT_URL,API_ENDPOINT);
curl_setopt($soap_do, CURLOPT_RETURNTRANSFER,true);
curl_setopt($soap_do, CURLOPT_SSL_VERIFYPEER,false);
curl_setopt($soap_do, CURLOPT_SSL_VERIFYHOST,false);
curl_setopt($soap_do, CURLOPT_POST,true);
curl_setopt($soap_do, CURLOPT_POSTFIELDS,"<?xml version='1.1'?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/' xmlns:sas='http://uat-api.******.in/services/simulator'>
<SOAP-ENV:Body>
<sas:Login>
<Username>".UID."</Username>
<Password>".PWD."</Password>
</sas:Login>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>");
$response = curl_exec($soap_do);
$xml = simplexml_load_string($response, NULL, NULL, "http://schemas.xmlsoap.org/soap/envelope/");
$ns = $xml->getNamespaces(true);
$soap = $xml->children($ns['SOAP-ENV']);
$res = $soap->Body->children($ns['ns1']);
foreach ($xml->xpath('/SOAP-ENV:Envelope/SOAP-ENV:Body/ns1:LoginResponse/return') as $item)
{
$response = (array) $item;
}
$res = $this->ci->merchant_model->insertNewWalletSession($response);
if($res)
{
return $response['SessionID'];
}
}
//Other function follows
这是一个图书馆,
无论何时加载此库,都会触发keepAliveLib()函数 2. keepAliveLib()函数将在数据库中检查任何不早于2minute的会话ID。这段代码是
$ this-&gt; merchant-&gt; select(&#39; SessionID,creationTime&#39;); $ query = $ this-&gt; merchant-&gt; get($ this-&gt; wallet_keepalive_sessions_table); $ res = $ query-&gt; result_array(); foreach($ query-&gt; result()为$ row) { $ SessionID = $ row-&gt; SessionID; $ creationTime = $ row-&gt; creationTime; }
if( strtotime($creationTime) > strtotime("-2 minutes"))
{
$data['creationTime'] = date('Y-m-d H:i:s');
$this->merchant->where('SessionID', $SessionID);
$this->merchant->update($this->wallet_keepalive_sessions_table, $data);
return $SessionID;
} else{
return 0;
}
如果有任何超过2分钟的sessionID,它将返回null,否则返回一个有效的sessionID,并将此sessionID作为常量设置在构造函数中,否则它将调用登录API并登录到api并保存数据库中的sessionID。
这是整个过程。但这似乎没有用。
当一些函数被调用时,它会进行无效会话或空白会话。
有人可以为我提供一个关于如何通过超时的API维护会话的标准做法吗?
请帮忙。