コード例 #1
0
        /// <summary>
        ///
        /// </summary>
        ///
        /// Structure d'une réponse E
        ///
        /// xx          : N° Caisse : Identifiant de la caisse
        /// x			: STATUT	: Etat de la transaction
        ///                                     = 0 → si transaction acceptée
        ///                                     = 7 → si transaction non aboutie
        /// xxxxxxxx    : MONTANT	: Montant exprimé dans la plus petite unité de fractionnement
        ///                                     complété à gauche par des zéros. Indiquer un montant positif.
        /// x			: MODE		: Mode de règlement,
        ///                                     = 1 → traitement carte uniquement,
        ///                                     = C → traitement chèque (si pas d'appli chèque, message "FONCTIONNON IMPLEMENTEE ")
        ///                                     = autre → choix "CARTE CHEQUE"
        /// xx...55..xx	: REP		: si l’application, ayant traitée le débit, a renseigné le champ REP, celui-ci est remonté.
        /// xxx			: DEVISE	: Code numérique de la devise
        ///									(pour info: 250 pour FRF, 978 pour EUR)
        ///									= code numérique connu → traitement du débit dans la devise spécifiée
        ///									= code numérique inconnu → affichage "FONCTION IMPOSSIBLE"
        ///                                     = autre → choix "CARTE CHEQUE"
        /// xxxxxxxxxx	: PRIVE		: Données privées remontées par l’application.
        ///									par défaut = 10 caractères (à blanc lorsqu’elle ne véhicule rien
        ///
        /// <param name="message"></param>
        /// <returns></returns>
        public PaymentResponse PrepareResponse(byte[] bytes)
        {
            ByteStream stream = new ByteStream(bytes);

            if (!stream.Available())
            {
                throw new ProtocolException("Terminal response is empty");
            }

            // at least STX ETX LRC
            if (!stream.Available(3))
            {
                throw new ProtocolException("Laformed terminal response : " + BitConverter.ToString(bytes));
            }

            // Must start with STX
            if (stream.ReadFirstByte() != STX)
            {
                throw new ProtocolException("Response does not start with ETX : " + BitConverter.ToString(bytes));
            }

            // Read payload and compute LRC
            List <byte> payload = new List <byte>();

            stream.ReadBytesUntil(ETX, true, payload);
            int lrc         = stream.ReadLastByte();
            int lrcExpected = LRC(payload.ToArray());

            if (lrcExpected != lrc)
            {
                throw new ProtocolException(String.Format("Wrong LRC for {0} Expected {1}, Given {2} ", BitConverter.ToString(payload.ToArray()), lrcExpected, lrc));
            }

            // now parse payload, reset the stream first with payload
            stream.Close();
            stream.Dispose();

            payload.RemoveAt(payload.Count - 1); // Delete ETX
            stream = new ByteStream(payload.ToArray());

            PaymentResponse response = new PaymentResponse();

            response.Pos    = stream.ReadStringToShort(2);
            response.Status = stream.ReadChar();
            response.Amount = (float)stream.ReadStringToInt(8) / 100;
            response.Mode   = stream.ReadChar();

            // If content is available
            if (stream.BytesToRead() > 13)
            {
                response.Content = stream.ReadString(55);
            }

            response.Currency = stream.ReadStringToShort(3);
            response.Data     = stream.ReadString(10);

            stream.Close();
            stream.Dispose();

            return(response);
        }