/**
  * Call this function when the confirmation URL is called by the Scheme Operator.
  * The function will write ShopResponseDetails to the $outputStream in case of
  * BankConfirmationDetails.
  * 
  * @param callable $confirmationCallback a callable to send BankConfirmationDetails to.
  * Will be called with the raw post data as first parameter and an Instance of
  * BankConfirmationDetails as second parameter. This callable must return TRUE.
  * @param callable $vitalityCheckCallback an optional callable for the vitalityCheck
  * @param string $rawPostStream will read from this stream or file with file_get_contents
  * @param string $outputStream will write to this stream the expected responses for the
  * Scheme Operator
  * @throws InvalidCallbackException when callback is not callable
  * @throws CallbackResponseException when callback does not return TRUE
  * @throws XmlValidationException when $rawInputStream does not validate against XSD
  * @throws \UnexpectedValueException when using security suffix without security seed
  * @throws UnknownRemittanceIdentifierException when security suffix does not match
  */
 public function HandleConfirmationUrl($confirmationCallback, $vitalityCheckCallback = null, $rawPostStream = 'php://input', $outputStream = 'php://output')
 {
     $shopResponseDetails = new ShopResponseDetails();
     try {
         $this->TestCallability($confirmationCallback, 'confirmationCallback');
         if ($vitalityCheckCallback != null) {
             $this->TestCallability($vitalityCheckCallback, 'vitalityCheckCallback');
         }
         $HTTP_RAW_POST_DATA = file_get_contents($rawPostStream);
         XmlValidator::ValidateEpsProtocol($HTTP_RAW_POST_DATA);
         $xml = new \SimpleXMLElement($HTTP_RAW_POST_DATA);
         $epspChildren = $xml->children(XMLNS_epsp);
         $firstChildName = $epspChildren[0]->getName();
         if ($firstChildName == 'VitalityCheckDetails') {
             $this->WriteLog('Vitality Check');
             if ($vitalityCheckCallback != null) {
                 $VitalityCheckDetails = new VitalityCheckDetails($xml);
                 $this->ConfirmationUrlCallback($vitalityCheckCallback, 'vitality check', array($HTTP_RAW_POST_DATA, $VitalityCheckDetails));
             }
             // 7.1.9 Schritt III-3: Bestätigung Vitality Check Händler-eps SO
             file_put_contents($outputStream, $HTTP_RAW_POST_DATA);
         } else {
             if ($firstChildName == 'BankConfirmationDetails') {
                 $this->WriteLog('Bank Confirmation');
                 $BankConfirmationDetails = new BankConfirmationDetails($xml);
                 // Strip security hash from remittance identifier
                 $BankConfirmationDetails->SetRemittanceIdentifier($this->StripHash($BankConfirmationDetails->GetRemittanceIdentifier()));
                 $shopResponseDetails->SessionId = $BankConfirmationDetails->GetSessionId();
                 $shopResponseDetails->StatusCode = $BankConfirmationDetails->GetStatusCode();
                 $shopResponseDetails->PaymentReferenceIdentifier = $BankConfirmationDetails->GetPaymentReferenceIdentifier();
                 $this->WriteLog(sprintf('Calling confirmationUrlCallback for remittance identifier "%s" with status code %s', $BankConfirmationDetails->GetRemittanceIdentifier(), $BankConfirmationDetails->GetStatusCode()));
                 $this->ConfirmationUrlCallback($confirmationCallback, 'confirmation', array($HTTP_RAW_POST_DATA, $BankConfirmationDetails));
                 // Schritt III-8: Bestätigung Erhalt eps Zahlungsbestätigung Händler-eps SO
                 $this->WriteLog('III-8 Confirming payment receipt');
                 file_put_contents($outputStream, $shopResponseDetails->GetSimpleXml()->asXml());
             }
         }
     } catch (\Exception $e) {
         $this->WriteLog($e->getMessage());
         if (is_subclass_of($e, 'at\\externet\\eps_bank_transfer\\ShopResponseException')) {
             $shopResponseDetails->ErrorMsg = $e->GetShopResponseErrorMessage();
         } else {
             $shopResponseDetails->ErrorMsg = 'An exception of type "' . get_class($e) . '" occurred during handling of the confirmation url';
         }
         file_put_contents($outputStream, $shopResponseDetails->GetSimpleXml()->asXml());
         throw $e;
     }
 }
 public function testGetReferenceIdentifier()
 {
     $t = new BankConfirmationDetails($this->simpleXmls['WithSignature']);
     $actual = $t->GetReferenceIdentifier();
     $this->assertEquals('1234567890ABCDEFG', $actual);
 }