维护外部API PHP Codeigniter的登录和会话

时间:2014-11-20 13:53:51

标签: php codeigniter api session soap

我有一个由第三方提供商提供的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

这是一个图书馆,

  1. 无论何时加载此库,都会触发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. 如果有任何超过2分钟的sessionID,它将返回null,否则返回一个有效的sessionID,并将此sessionID作为常量设置在构造函数中,否则它将调用登录API并登录到api并保存数据库中的sessionID。

    这是整个过程。但这似乎没有用。

    当一些函数被调用时,它会进行无效会话或空白会话。

    有人可以为我提供一个关于如何通过超时的API维护会话的标准做法吗?

    请帮忙。

0 个答案:

没有答案