PHP och BankID
28 februari 13:41 -
0
bankid
Jag hade en hel del problem med BankID och PHP innan jag plöjde igenom hela specen och med lite trial and error listade ut grunderna.
Här är kodexempel på implementation av BankID och SOAP via PHP. Själva delen med AJAX och anrop mot "bankid.php" får du lösa själv, men tanken är alltså att via AJAX så anropar du bankid.php som i sin tur returnerar svar på din förfrågan. Så första anropet är med ett personnummer och initiering av förfrågan, och sedan anropar du bankid.php med förfrågan om status var x:e sekund till exempel.
Min kod är avhängigt mitt eget CMS, så en del variabler får anpassas ($in är en samling av $_GET och $_POST t.ex).

Först, själva bankid-klassen:

class bankid {     private $client;     public $debug = false;     public $status;     function __construct($url, $certificate, $passphrase){       try {         $this->client = new SoapClient($url, array("local_cert" => $certificate, "passphrase" => $passphrase, "trace" => 1));         $this->status = "ok";       } catch (Exception $e){         $this->status = "error";         if ($this->debug) $this->status .= " ". $e->getMessage();       }     }     public function sign($social, $message){       $parameters = array(         "parameters" => array(           "personalNumber" => $social,           "userVisibleData" => base64_encode(encode($message))         )       );       return $this->call("Sign", $parameters);     }     public function collect($ref){       $parameters = array(         "orderRef" => $ref       );       return $this->call("Collect", $parameters);     }     private function call($function, $parameters){       try {         $response = $this->client->__soapCall($function, $parameters);         if ($this->debug){           error_log("REQUEST:n");           error_log($this->client->__getLastRequest() . "n");           error_log("RESPONSE:n");           error_log($this->client->__getLastResponse() . "n");         }         return $response;       } catch (Exception $e) {         $error = $e->detail->RpFault;         if ($this->debug){           error_log("REQUEST:n");           error_log($this->client->__getLastRequest() . "n");           error_log("RESPONSE:n");           error_log($this->client->__getLastResponse() . "n");         }         return false;       }     }   }
Så som du ser så tar klassen tre argument, url, certifikat och lösenord, certifikatet ska vara path:en till filen. Sedan har vi enbart två publika funktioner, sign och collect. "sign" är funktionen för att skicka iväg ett signeringsanrop till BankID, som i sin tur skapar en signeringsförfrågan till BankID-appen när den är öppen. "collect" är en funktion för att hämta status på en befintlig förfrågan. Notera hur arrayen till anropet ser annorlunda ut i de två funktionerna, något som inte är uppenbart i BankID's egna spec, detta var det jag fick lov att prova mig fram med.

Resten av bankid.php ser ut så här:

$in["socialsecurity"] = format_social_security($in["socialsecurity"]); # egen "tvätta personnummer"-funktion   $certificate = "filpath";   $passphrase = "pass";   $url = "https://appapi.bankid.com/rp/v4?wsdl";   header("Cache-Control: no-cache, no-store");   $bankid = new bankid($url, $certificate, $passphrase);   #$bankid->debug = true;   $return = array(     "function" => $in["function"],     "status" => $bankid->status   );   if ($in["function"] == "sign"){     if ($bankid->debug) error_log($in["function"] . ": " . $in["socialsecurity"] . "n");     if ($response = $bankid->sign($in["socialsecurity"], "Rubrik i appen")){       $return["reference"] = $response->orderRef;       $return["status"] = "requested";     } else {       $return["status"] = "error";     }   }   if ($in["function"] == "status"){     if ($bankid->debug) error_log($in["function"] . ": " . $in["reference"] . "n");     if ($response = $bankid->collect($in["reference"])){       if ($response->progressStatus == "COMPLETE"){         # Vi är signerade! Do your stuff!         $return["status"] = "complete";         $return["bankid"] = $id;       } else {         $return["status"] = $response->progressStatus;       }     }   }   print json_encode($return);
Så beroende på vilken "function" som ditt javascript anropar med så får du olika status tillbaka.
Så första anropet ska vara "bankid.php?socialsecurity=XXXXXXXXX&function=sign"
Det skapar en ny underskriftsförfrågan till BankID för det personnumret samt returnerar "reference" vilket är det referens-id du får för den här förfrågan.
Sedan sätter du en repeat på den här förfrågan: "bankid.php?function=status&reference=XXXXXXXX" att köras varannan sekund eller så. När svaret på den förfrågan är "complete" så är signeringen klar och "Do your stuff" har sparat kunden i databasen eller whatever och i UX kan du ladda om sidan eller vad det nu är du vill göra.
Hoppas detta hjälpte någon!
Tutorials
#inlineditbutton