In App Validation

Wer bei Apple einen In App kauf validieren möchte, muss an Apple den sogenannten Reciept senden.

Apple verschickt dafür einen String der wie folgt aussieht: “<7b0a0922 7369676e 61747572 6522203d 20224167 322b577….” Dieses sind Hexwerte und müssen erst in ASCII umgewandelt werden. Mit diesen paar Zeilen PHP-Code kann dieses geschehen:
$temp = preg_replace("/[^0-9a-fA-F]/","", $hex);
for($i = 0; $i < strlen($temp); $i = $i + 2)
{
$ascii = $ascii.chr(hexdec(substr($temp, $i, 2)));
}

Anschließend muss ein Array erstellt werden, in diesem Array muss der ASCII String mittels base64_encode umgewandelt und dieses JSON Encodet werden.

$postData = json_encode(
array('receipt-data' => base64_encode($ascii))
);

Diese Daten können dann per Post an Apple übertragen werden (an https://sandbox.itunes.apple.com/verifyReceipt bzw. https://buy.itunes.apple.com/verifyReceipt ). Apple gibt dann zurück, ob alles geklappt hat.

Ein beliebter Fehlercode wäre: {“status”:21002, “exception”:”java.lang.IllegalArgumentException”} D.h. es sind nicht die richtigen Werte übergeben worden.

Apache – Erster Connect langsam?

Bei Einsatzeleiter.net hatte ich das Problem, dass besonders in den Abendstunden der erste Verbindungsversuch sehr langsam war. Alle weiteren Verbindungen innerhalb von ein paar Sekunden waren dann “normal schnell”. Danach gab es wieder einen extra lahmen Verbindungsaufbau.

Nach etwas rumprobieren und studieren der Performance-Tipps, bin ich dann irgendwann auf “Keep Alive” gestoßen. Eigentlich soll eine Verbindung damit erst abgebaut werden, wenn alle Anfragen beendet sind – somit spart man sich eigentlich unnötige Verbindungsaufbauten.

Das deaktivieren des Features hat allerdings den Apache dermaßen beschleunigt, dass ich jetzt das System weiter beobachten werden – vermutlich aber Keep Alive deaktiviert lasse.

Symfony Fillin Problem

Hi,

gestern im Büro saß ich bestimmt 2 Stunden an einem Problem, dass Symfony trotz “fillin” nicht die Formularfelder vorausgefüllt hat.

Im Internet konnte ich keine Lösung finden, auch wenn schon einige dieses Problem hatten. Durch durchsuchen des Quelltextes von Symfony bin ich auch dann auf (meinen) Fehler gekommen.

Sobald mehrere Formulare sich auf einer Seite befinden, muss(!) der Name des Formulars bei den “Fillin” Parametern mit angegeben werden – da Symfony  ansonsten das erste Formular auf der Seite auswertet.

Grundsätzlich ist also zu sagen: Wenn Fillin im Validator benutzt wird, sollte immer der Name des Forms mit übergeben werden – um spätere Probleme direkt auszuschließen.

MySQL Update mit Symfony

Es gibt mehrere Möglichkeiten mit dem PHP Framework Symfony mehrere Zeilen einer Datenbank (in unserem Fall MySQL) zu updaten.

Nehmen wir den Befehl:

UPDATE user SET active=0 WHERE password=1234

Die erste (und offensichtliche) Möglichkeit lautet, alle User mit dem Passwort ’1234′ mithilfe eines Criteria auszulesen – um dann mittels einer foreach Schleife einzelnt die Datensätze durchlaufen und upzudaten.

Allerdings verbraucht diese Möglichkeit unnötig viel Resourcen, weil X+1 SQL-Querys ausgeführt werden.

Um dieses zu vermeiden, gibt es einen schöneren Weg über die BasePeer Class von Symfony:

$con = Propel::getConnection();

// — Select Anweisung (steht also im WHERE Teil)
$c_select = new Criteria();
$c_select->add(UserPeer::ACTIVE, 0);

// — Eigentliche Update Anweisung
$c_update = new Criteria();
$c_update->add(UserPeer::PASSWORD, 1234);

BasePeer::doUpdate($c_select, $c_update, $con);

Mittels diesen kleinen Symfony Snippets ist es also Möglich, schnell mehrere Zeilen in einer Tabelle Resourcen schonend  zu updaten.

Im oberen Beispiel wird nämlich genau 1 Query ausgeführt. Also haben wir eine Erspannis von X MySQL- Querys.

Einarbeitung in Symfony

Moin,

wir haben uns in der Firma jetzt überlegt ein großes Projekt auf Symfony umzubauen.

Symfony ist ein ziemlich geniales PHP5 Framework – welches vergleichbar mit Ruby On Rails ist.

Symfony unterstützt einen erfahrenen Webentwickler ziemlich in der Programmierung.

Einige der vielen Features:

  • Template System
  • Caching System
  • URL-Routing System
  • Multilanguage (I18N) Support
  • Ajax
  • … :)