0

У меня есть веб-сервис nu_soap, который я хочу создать и отправить с ним код Captcha и изображение.PHP-переменные сеанса не создаются при использовании nusoap webservice с устройства Android.

Я использую getcaptcha веб-службы, чтобы положить сгенерированный код Captcha в переменной сеанса, а также Captcha Id, а с помощью другого веб-службы с именем: validateCaptcha Я проверяю, если она действует или нет,

Проблема заключается в когда я проверяю свои веб-сервисы с помощью Firefox Soa, клиентские аддоны веб-сервисов работают нормально, и все переменные сеанса работают нормально.

но когда я пытаюсь использовать Android-телефон, чтобы проверить его, переменные сеанса не определены или пусты.

прибудет капчу:

<?php 
session_start(); 
include_once('./Utility/DBM.php'); 
include_once('captcha.class.php'); 

class getCaptcha extends DBM 
{ 
    public function getcaptchacode($dump) 
    { 
     //creating and generating captcha image and code 
     $img = createcaptcha(); 

     //Creating Captcha Id 
     $CaptchaId = (mt_rand(1,1000) . "1234"); 

     imagepng($img[0],'Captcha/'.$CaptchaId.'.png'); 
     imagedestroy($img[0]); 


     //encoding to base64 and getting file content 
     $base64 = base64_encode(file_get_contents('./Captcha/'.$CaptchaId.'.png')); 

     //setting up session for captcha 
     $_SESSION['Captcha_Code']=$img[0]; 
     $_SESSION['Captcha_ID']=$CaptchaId; 

     $img[]=''; 

     $captcha=$base64; 
     $captchaId = $CaptchaId; 

     $this->strResult = ""; 


      $this->strResult.="<captcha>"; 
      $this->strResult.="<captcha>$captcha</captcha>"; 
      $this->strResult.="<captcha_Id>$captchaId</captcha_Id>"; 
      $this->strResult.="</captcha>"; 

    } 


    function __toString() 
    { 
     if($this->strResult!=""){ 
      return $this->strResult; 
     } 
     return ""; 
    } 


} 

?> 

Validate капчет:

<?php 
session_start(); 
include_once('./Utility/DBM.php'); 

class validateCaptcha extends DBM 
{ 
    public function validatecaptcha($CaptchaCode,$Captcha_Id) 
    { 
     if(($CaptchaCode!=""&&$CaptchaCode==$_SESSION['Captcha_Code'])&&($Captcha_Id!=""&&$Captcha_Id==$_SESSION['Captcha_ID'])) 
     { 
      $msg="Captcha is correct"; 
      //generating a Token using md5 & salt 
      $hash = md5(mt_rand(1,1000000) . "123456"); 
      $token=$_SESSION['CapToken'] = $hash; 

      //starting token session time 
      $_SESSION['Token_time'] = time(); 

      //destroying captcha image 
      unlink('./Captcha/'.$Captcha_Id.'.png'); 
     } 
     else 
     { 
      //destroying captcha image 
      unlink('./Captcha/'.$Captcha_Id.'.png'); 

      //destroying all session 
      //session_destroy(); 

      $msg="Wrong Captcha Entered"; 
      $token=""; 

     } 

     $this->strResult = ""; 


      $this->strResult.="<captcha>"; 
      $this->strResult.="<captcha>$msg</captcha>"; 
      $this->strResult.="<token>$token</token>"; 
      $this->strResult.="</captcha>"; 


    } 


    function __toString() 
    { 
     if($this->strResult!=""){ 
      return $this->strResult; 
     } 
     return ""; 
    } 


} 

?> 

ответ

0

Я нашел решение этой проблемы, я думал, чтобы разместить его здесь для использования других.

Вместо использования переменных сеанса я использовал базу данных mysql для хранения captcha (id, code, token, expire_time), затем я использовал функцию php date(), чтобы проверить, не истекает ли время прошивки, и оно действительно, и в веб-службе проверки использовал mysql для выбора из db, чтобы проверить, действительно ли captcha действителен или нет.

проверочный код:

class validateCaptcha extends DBM 
{ 
    public function validatecaptcha($CaptchaCode,$Captcha_Id) 
    { 
     $select_captcha = $this->select("captchaid,code,token,expire", "captcha", "code='$CaptchaCode' AND captchaid='$Captcha_Id'", 0, 0); 
     $captcha_check=mysql_num_rows($select_captcha); 
     $row = mysql_fetch_assoc($select_captcha); 

     if($captcha_check) 
     { 
      $msg="Captcha is correct"; 
      $token=$row['token']; 

      //destroying captcha image 
      unlink('./Captcha/'.$Captcha_Id.'.png'); 
     } 
     else 
     { 
      //destroying captcha image 
      unlink('./Captcha/'.$Captcha_Id.'.png'); 

      $msg="Wrong Captcha Entered"; 
      $token=""; 

     } 

     $this->strResult = ""; 


      $this->strResult.="<captcha>"; 
      $this->strResult.="<captcha>$msg</captcha>"; 
      $this->strResult.="<token>$token</token>"; 
      $this->strResult.="</captcha>"; 


    } 

прибудете CAPTCHA код:

class getCaptcha extends DBM 
{ 
    public function getcaptchacode($dump) 
    { 
     //creating and generating captcha image and code 
     $img = createcaptcha(); 

     //Creating Captcha Id 
     $CaptchaId = (mt_rand(1,1000) . "1234"); 

     imagepng($img[0],'Captcha/'.$CaptchaId.'.png'); 
     imagedestroy($img[0]); 


     //encoding to base64 and getting file content 
     $base64 = base64_encode(file_get_contents('./Captcha/'.$CaptchaId.'.png')); 

     //generating a Token using md5 & salt 
     $hash = md5(mt_rand(1,1000000) . "123456"); 
     $token=$_SESSION['CapToken'] = $hash; 

     //Getting time 
     $getime=date('Y-m-d H:i:s'); 

     //inserting into captcha table 
     $this->RunQuery("INSERT INTO captcha (captchaid,code,token,expire) VALUES ('$CaptchaId','$img[1]','$token','$getime')", true, false);//TODO query 
     if (mysql_insert_id()) 
      $Response = 'True'; 
     else 
      $Response = 'False'; 

     //deleting inactive captcha for 15 minutes 
     $this->RunQuery("DELETE FROM captcha WHERE expire < DATE_SUB(NOW(), INTERVAL 15 MINUTE)",true,false); 

     $img[]=''; 
     $captcha=$base64; 
     $captchaId = $CaptchaId; 

     $this->strResult = ""; 


      $this->strResult.="<captcha>"; 
      $this->strResult.="<captcha>$captcha</captcha>"; 
      $this->strResult.="<captcha_Id>$captchaId</captcha_Id>"; 
      $this->strResult.="<Response>$Response</Response>"; 
      $this->strResult.="</captcha>"; 



    }