Autor Zpráva
blahapet
Profil
Dobrý den všem, mám prosbu. Snažím se zprovoznit SMS službu no hostingu 90, kde mají standardně zakázanou direktivu allow_url_fopen. Doporučení je zde.

Níže mám současný skript, který se zapnutou allow_url_fopen mi běžně jinde funguje:

<?php

define("BLOCK_SIZE",8192);
define("API_URL","https://smsgateapi.sms-sluzba.cz/apipost30/sms");
define("AUTH_MSG_LENGTH",31);

class ApiPost30{
  private $recipient, $text, $login, $password, $smsgateapi_url, $params, $encoding;

  public function ApiPost30($login, $password, $encoding="UTF-8") {
    $this->login = $login;
    $this->password = $password;
    $this->encoding = $encoding;
    $this->params = Array();
  }

  public function send() {
    $handle = fopen($this->get_url(),'rb',false,$this->get_params());
    $contents = '';
    if (!$handle)
      return false;
    while (!feof($handle)) {
      $contents .= fread($handle, BLOCK_SIZE);
    }
    fclose($handle);
    echo $contents;
  }

  public function set_recipient($recipient) { $this->recipient = $recipient; }
  public function set_text($text) { $this->text = $text; }

  private function get_url() { return API_URL; }

   private function get_params() {
    $data = array ('login' => $this->login, 'act' => 'send', 'msisdn' => $this->recipient, 'msg'=>$this->text, 'auth'=>$this->get_auth());
    $data = http_build_query($data, '', '&');
    $params = array('http' => array(
      'method' => 'POST',
      'header' => 'Content-Type: application/x-www-form-urlencoded; charset=utf-8',
      'content' => $data
    ));
    return stream_context_create($params);
  }

  private function get_auth() { return md5(md5($this->password).$this->login.'send'.substr($this->text,0,AUTH_MSG_LENGTH)); } 

}




/*------------------------- ODESLÁNÍ ZPRÁVY --------------------------------------- */

    $sms_recipient = "+420604863288";
    
    define('SMSLOGIN','___LOGIN____');
    define('SMSPASSWORD','___HESLO___');   
            
    require_once("sms.php");        
    $apipost = new ApiPost30(SMSLOGIN, SMSPASSWORD);
    $apipost->set_recipient($sms_recipient);

    $apipost->set_text('Test esemesky');                        
    $apipost->send();
    
    
?>

Skript jsem si upravil tak, že jsem tam vložil novou privátní metodu getCurl() a poté pozměnil původní privátní metodu get_url()

  private function getCurl(){

    $handler = curl_init(API_URL);
    curl_setopt($handler, CURLOPT_RETURNTRANSFER,1);
    $obsah = curl_exec($handler);
    curl_close($handler);

    return $obsah;

  }
  
  
  private function get_url() { return $this->getCurl(); }

Skript mi po spuštění hází chybu u metody send(), konkrétně řádek:

public function send() {
    $handle = fopen($this->get_url(),'rb',false,$this->get_params());
    ... ... ... .
    
    }

Warning: fopen(): Filename cannot be empty in ... ... ...


Nevíte prosím, kde dělám chybu?

Děkuju moc za každou radu.
Kajman
Profil
Musíte přece přepsat tu metodu send, aby používala curl.

Parametry předáte např. dle příkladu
www.php.net/manual/en/curl.examples-basic.php#117009
podle toho, jak server očekává data.
blahapet
Profil
blahapet:

Díky moc za nasměrování. Metodu send() jsem přepsal takto, nicméně se po stisknutí klávesy F5 zobrazuje jen bílá stránka i se zapnutým chybovým hlášením...

public function send() {

    $params = $this->get_params();
    $defaults = array(
    CURLOPT_URL => API_URL, 
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => $params,
    );
    $ch = curl_init();
    curl_setopt_array($ch, $defaults);

  }

Omlouvám se, jsem v tom neználek.
Kajman
Profil
To curl musíte pustit a vypsat výsledek, jinak bude bílá stránka vždy.
...
curl_setopt_array($ch, $defaults);
$obsah = curl_exec($ch);
curl_close($ch);
echo $obsah;
blahapet
Profil
Opět díky moc za pomoc... V podstatě se nic nezměnilo, jen je vidět, že skript pracuje o 1-2 sekundu déle a zase bílo... Pro přehlednost zasílám znovu celý skript. Jen pototýkám, že při zkoušce odesílání jsem na konci souboru LOGIN a HESLO měl správně dosazeno.

<?php

define("BLOCK_SIZE",8192);
define("API_URL","https://smsgateapi.sms-sluzba.cz/apipost30/sms");
define("AUTH_MSG_LENGTH",31);

class ApiPost30{
  private $recipient, $text, $login, $password, $smsgateapi_url, $params, $encoding;

  public function ApiPost30($login, $password, $encoding="UTF-8") {
    $this->login = $login;
    $this->password = $password;
    $this->encoding = $encoding;
    $this->params = Array();
  }


  public function send() {

    $params = $this->get_params();
    $defaults = array(
    CURLOPT_URL => API_URL, 
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => $params,
    );
    $ch = curl_init();
    curl_setopt_array($ch, $defaults);

    $obsah = curl_exec($ch);
    curl_close($ch);
    echo $obsah;

  }

  public function set_recipient($recipient) { $this->recipient = $recipient; }
  public function set_text($text) { $this->text = $text; }

  private function get_params() {
    $data = array ('login' => $this->login, 'act' => 'send', 'msisdn' => $this->recipient, 'msg'=>$this->text, 'auth'=>$this->get_auth());

    $data = http_build_query($data, '', '&');
    $params = array('http' => array(
      'method' => 'POST',
      'header' => 'Content-Type: application/x-www-form-urlencoded; charset=utf-8',
      'content' => $data
    ));
    
    return stream_context_create($params);
  }

  private function get_auth() { return md5(md5($this->password).$this->login.'send'.substr($this->text,0,AUTH_MSG_LENGTH)); } 

}




/*---------------------------------------------------------------- */

    $sms_recipient = "+420604863288";
    
    define('SMSLOGIN','__LOGIN__');
    define('SMSPASSWORD','__HESLO__');   
            
    //require_once("sms.php");        
    $apipost = new ApiPost30(SMSLOGIN, SMSPASSWORD);
    $apipost->set_recipient($sms_recipient);

    $apipost->set_text('Test esemesky');                        
    $apipost->send();
    
    
?>
blaaablaaa
Profil
blahapet:
Mícháte tam dvě věci dohromady.


Takže:
1. HTTP hlavičky se nastavují přes CURLOPT_HTTPHEADER
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/x-www-form-urlencoded; charset=utf-8']);
2. Do CURLOPT_POSTFIELDS patří jen string, vy tam předáváte referenci na stream:
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(['login' => $this->login, 'act' => 'send', 'msisdn' => $this->recipient, 'msg'=>$this->text, 'auth'=>$this->get_auth()]));
3. Pokud chcete číst výsledek, je třeba o to požádat:
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
4. Při vývoji je dobré mít zaplý výpis chyb:
ini_set('display_errors', 1);
blahapet
Profil
Díky moc za nasměrování, moc jste mi pomohl. Metodu send() jsem přestavěl takto, asi by to šlo i lépe, ale SMSky konečně odcházejí.

public function send() {

    $defaults = array(
    CURLOPT_URL => API_URL,
    CURLOPT_HTTPHEADER => ['Content-Type: application/x-www-form-urlencoded; charset=utf-8'],
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => http_build_query(['login' => $this->login, 'act' => 'send', 'msisdn' => $this->recipient, 'msg'=>$this->text, 'auth'=>$this->get_auth()]),
    );

    $ch = curl_init();     
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt_array($ch, $defaults);

    $obsah = curl_exec($ch);

    curl_close($ch);
    echo $obsah;

  }

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0