Autor Zpráva
blahapet
Profil
Ahoj všem, zkouším sám implementovat platební bránu GoPay do jednoho obchodu. Vše se daří, až na jeden malý "zásek", když nevím jak dál. Nejspíše to bude asi banalita. Při vytváření platby mám kód:

$response = $gopay->createPayment([
    'payer' => [
        'allowed_payment_instruments' => [PaymentInstrument::PAYMENT_CARD, PaymentInstrument::BANK_ACCOUNT], 
          'allowed_swifts' => ['FIOBCZPP','BREXCZPP','GIBACZPX','AGBACZPP','CEKOCZPP','AIRACZPP'], 
            'contact' => [
           'first_name' => $_SESSION["first_name"],
            'last_name' => $_SESSION["last_name"],
            'email' => $_SESSION["email"],
            'phone_number' => $_SESSION["phone_number"],
            'city' => $_SESSION["city"],
            'street' => $_SESSION["street"],
            'postal_code' => $_SESSION["postal_code"],
            'country_code' => 'CZE',
        ],
    ],
    'amount' => $platba*100,
    'currency' => Currency::CZECH_CROWNS,
    'order_number' => $_SESSION['id_objednavky'],
    'order_description' => 'Nákup na Andělské zvonění.cz',
    'lang' => 'CS',
    'items' => [['name' => 'Andělské zvonění RETRO SILVER', 'amount' => 99000],['name' => 'Andělské svíčky hladké červené', 'amount' => 5500]],
    'callback' => [
        'return_url' => 'https://gopay.andelske-zvoneni.cz/gopay-state',
        'notification_url' => 'https://gopay.andelske-zvoneni.cz/gopay-notify'
    ],
]);


A právě se mi jedná o následující kus kódu:
'items' => [['name' => 'Andělské zvonění RETRO SILVER', 'amount' => 99000],['name' => 'Andělské svíčky hladké červené', 'amount' => 5500]],

Kde položky nákupu generuji výtahem z databáze. Nejdříve jsem si zkoušel udělat fci ObsahObjednavky():
function ObsahObjednavky(){
            global $mysqli;
            
            $r_objednavky = $mysqli->query("select * from objednavky where id_uzivatele = ".$_SESSION['id_objednavky']."");
          
            $a = 0;
            while($r = $r_objednavky->fetch_object()){
              $item = $r->item;
              $cena = $r->cena;
              $sleva = $r->sleva;
              $sleva_kc = $r->sleva_kc;
              $pocet = $r->pocet;      
              
              if($sleva > 0 and $sleva_kc == 0){
                  $rozdil = $cena * $sleva / 100;
                  $cena_po_sleve = $cena - $rozdil;
              }
              
              if($sleva == 0 and $sleva_kc > 0){
                  $cena_po_sleve = $cena - $sleva_kc;
              }
              
              if($sleva == 0 and $sleva_kc == 0){
                  $cena_po_sleve = $cena;
              }

              $itemprice = $cena_po_sleve * 100;
              $a++;
              
              $a > 1 ? $i .= "," : $i .= "";
              $i .= "[";
              $i .= "'name' => '".strip_tags($item)."', 'amount' => ".$itemprice."";
              
              $i .= "]";
          }
             return $i;
}                                                

Jejíž výstupem bylo:

['name' => 'Andělské zvonění RETRO SILVER', 'amount' => 99000],['name' => 'Andělské svíčky hladké červené', 'amount' => 5500]

A tu jsem pak dosadil do kódu:


'items' => [ObsahObjednavky()],

Avšak s neúspěchem... Jediné, co mi šlo, bylo toto:


$item = array('name' => 'Zvonění zlaté', 'amount' => 50000);
... ... ...
... ... ...
... ... ...
'items' => [$item],

Pokud jsem ale chtěl nějakým způsobem vygenerovat do pole více položek, skončilo to opět neúspěchem. Pravděpodobně tam mám něco blbě.


$item = array(
            0 => array('name' => 'Zvonění zlaté', 'amount' => 50000),
              1 => array('name' => 'Zvonění stříbrné', 'amount' => 20000)
);

Díky moc za každou radu.
Keeehi
Profil
To co máš špatně je ta funkce obsah ovjednávky. Ty tam skládáš řetězec v kterém je sice text co vypadá jako pole ale to je úplně jedno. Když to pole reálně není, tak to PHP jako pole nebere, i když nám se to tak zdát může. Takže potřebuješ vytvořit opravdové pole.

Řádek 6 nahraď $i = [];
A řádky 28-34 tímto:
$i[] = ['name' => strip_tags($item), 'amount' => $itemprice];
blahapet
Profil
Díky, upravil jsem tu funkci takto:

          function ObsahObjednavky(){
            global $mysqli;
            
            $r_objednavky = $mysqli->query("select * from objednavky where id_uzivatele = ".$_SESSION['id_objednavky']."");
            $i = [];

            while($r = $r_objednavky->fetch_object()){
              $item = $r->item;
              $cena = $r->cena;
              $sleva = $r->sleva;
              $sleva_kc = $r->sleva_kc;
              $pocet = $r->pocet;      
              
              if($sleva > 0 and $sleva_kc == 0){
                  $rozdil = $cena * $sleva / 100;
                  $cena_po_sleve = $cena - $rozdil;
              }
              
              if($sleva == 0 and $sleva_kc > 0){
                  $cena_po_sleve = $cena - $sleva_kc;
              }
              
              if($sleva == 0 and $sleva_kc == 0){
                  $cena_po_sleve = $cena;
              }

              $itemprice = $cena_po_sleve * 100;
              $a++;
              

              $i[] .= "['name' => '".strip_tags($item)."', 'amount' => ".$itemprice."]";

          }

              
         for($x = 0, $y = 1; $x < count($i); $x++, $y++){
                  $obsah .= $i[$x];
                  $y < count($i) ? $obsah .= "," : $obsah .= "";
                 }
                return $obsah;     
              
}

Jejíž výstupem při dvou položkách bylo:

['name' => 'Andělské zvonění RETRO SILVER', 'amount' => 99000],['name' => 'Andělské svíčky hladké červené', 'amount' => 5500]

a tu pak dosadil sem:

... ... ...
'items' => [ObsahObjednavky()],
... ... ...

Avšak opět bez úspěchu. Pak jsem si všimnul, že jsi mi před tím ve fci ObsahObjednávky() odstranil uvozovky na řádku 31:

$i[] = ['name' => strip_tags($item), 'amount' => $itemprice];

To jsem zkusil a funkce mi vrátila toto: Array,Array

Omlouvám se, jsou to asi základní práce s polem, které nejspíš neovládám...
Keeehi
Profil
Když je něco v uvozovkách, je to pro PHP řetězec (obyčejný text). PHP vůbec nezajíma, co je uvnitř toho textu napsané. Když tam bude nějaký kód, bude to pro něj stejné jako kdyby tam bylo "mám rád modrou barvu". Ten "kód" vidíš jen ty. Pro PHP je to jen směs znaků, se kterou nijak nepracuje.

Tohle je docela důležitý koncept, který musíš pochopit (proto o něm píšu už vlastně poduhé). Rozdíl mezi kódem a řetězcem.
Jestli zatím nepoužíváš, nainstaluj si nejaký editor (neb IDE) se zvýrazňováním syntaxe (barvení kódu). To ti pomůže poznat, co je kód a vykonává se a co je jen text. Ve většině defaultních barevných schémat má řetězec barvu někde na škále oranžová-červená. To by ti mělo pomoc určit, že co je napsané červeným textem je něco, co PHP nepovažuje za kód.
blahapet
Profil
Keeehi díky moc, to už jsem pochopil, že je potřeba pole psát bez uvozovek... Používám léta PsPad, kterej aspoň trochu kód zvýrazňuje.
Teď mám jen problém to pole vypsat tak, abych to dosadil, kam to patří.
Keeehi
Profil
Správně je to bez těch hranatých uvozovek
'items' => ObsahObjednavky(),
Ta tvoje funkce totiž už pole vrací. Těmi uvozovkami vytváříš nové, do kterého do hloubky zanořuješ to tebou vytvořené.
blahapet
Profil
Keeehi, děkuju moc, už to fachá, jen nevím jestli jsi koukal na tu upravenou fci naposled. Měl jsem tam před koncem vnořenej cyklus for() na vypsání pole:

... ... ...
 $i[] = ['name' => strip_tags($item), 'amount' => $itemprice];
 
          }
 
              
         for($x = 0, $y = 1; $x < count($i); $x++, $y++){
                  $obsah .= $i[$x];
                  $y < count($i) ? $obsah .= "," : $obsah .= "";
                 }
                return $obsah;     
              
}
... ... ...

Nedošlo mi, že to tam nemá co dělat. Ještě jednou díky za osvětu!

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