Imports System.Text Imports DevExpress.XtraRichEdit.Model Partial Public Class pagostelematicos Public ReadOnly Property CodigoRecibo As String Get If Me.idRecibo.HasValue Then Return Me.recibos.CodigoRecibo Else Return "" End If End Get End Property Public Shared Function GeneraPagoTelematico(bd As bdGestionAsegasa.gestionasegasaEntities, OrigenPago As OrigenPagoEnum, Referencia As String, EmailConfirmacionPago As String, Telefono As String, Importe As Double, Optional DNI As String = "", Optional idRecibo As Integer? = Nothing) As pagostelematicos Try If idRecibo.HasValue AndAlso Not bd.recibos.Any(Function(x) x.idRecibo = idRecibo.Value) Then Throw New Exception("No se encuentra el recibo con id: " & idRecibo.Value.ToString) Static r As System.Random = New System.Random() Dim np As New bdGestionAsegasa.pagostelematicos With np .DNI = DNI.Trim().ToUpper() .Referencia = Referencia.Trim().ToUpper() .EmailConfirmacionPago = EmailConfirmacionPago.Trim().ToLower() .Telefono = Telefono .Importe = Math.Round(Importe, 2) .FechaCreacion = Now .idRecibo = idRecibo .OrigenPago = OrigenPago Randomize() .CodigoConfirmacionPago = r.Next(100000000, 999999999).ToString End With bd.pagostelematicos.AddObject(np) bd.SaveChanges() Return np Catch ex As Exception Throw New Exception(ex.Message, ex) End Try End Function End Class Public Enum OrigenPagoEnum PAGO_GENERICO = 0 PAGO_RECIBO = 1 End Enum Public Class RespuestaRedsysPOST '//////////////////////////// '// Atributos de la clase // '///////////////////////// Public Ds_SignatureVersion As String Public Ds_MerchantParameters As String Public Ds_Signature As String Public Confirmacion As ConfirmacionRedsys '//////////////////// '// Constructores // '////////////////// Public Sub New() MyBase.New() End Sub Public Sub New(datosPOST As Specialized.NameValueCollection) '// Esto lo he implementado como un bucle porque no estoy seguro de si los parámetros opcionales llegarán '// vacíos o no llegarán. De este modo, garantizo que no habrá excepciones por exigir la existencia '// de un parámetro que nunca llegue. For Each p In datosPOST If p = "Ds_SignatureVersion" Then Me.Ds_SignatureVersion = datosPOST(p) If p = "Ds_MerchantParameters" Then Me.Ds_MerchantParameters = datosPOST(p) If p = "Ds_Signature" Then Me.Ds_Signature = datosPOST(p) Next Dim bDatos As Byte() = Convert.FromBase64String(Ds_MerchantParameters) Dim sDatos As String = Encoding.UTF8.GetString(bDatos) Dim jDatos As ConfirmacionRedsys = Newtonsoft.Json.JsonConvert.DeserializeObject(sDatos, GetType(ConfirmacionRedsys)) Me.Confirmacion = jDatos End Sub End Class Public Class ConfirmacionRedsys '//////////////////////////// '// Atributos de la clase // '///////////////////////// Public Ds_Date As String Public Ds_Hour As String Public Ds_Amount As String Public Ds_Currency As String Public Ds_Order As String Public Ds_MerchantCode As String Public Ds_Terminal As String Public Ds_Response As String Public Ds_MerchantData As String Public Ds_SecurePayment As String Public Ds_TransactionType As String Public Ds_Card_Country As String '// Lista de códigos de país: https://unstats.un.org/unsd/methodology/m49/ Public Ds_AuthorisationCode As String Public Ds_ConsumerLanguage As String Public Ds_Card_Type As String Private sSeparadorFecha = "%2F" Private sSeparadorHora = "%3A" '////////////////// '// Propiedades // '//////////////// Public ReadOnly Property Ds_Date__ComoDate As DateTime Get Dim dd As String = Me.Ds_Date.Split(sSeparadorFecha)(0) Dim mm As String = Me.Ds_Date.Split(sSeparadorFecha)(1).Substring(2, 2) Dim yyyy As String = Me.Ds_Date.Split(sSeparadorFecha)(2).Substring(2, 4) Dim resultado As New Date(yyyy, mm, dd) Return resultado End Get End Property Public ReadOnly Property Ds_Hour__ComoTimeSpan As TimeSpan Get Dim H As String = Me.Ds_Hour.Split(sSeparadorHora)(0) Dim m As String = Me.Ds_Hour.Split(sSeparadorHora)(1).Substring(2, 2) Dim resultado As New TimeSpan(H, m, 0) Return resultado End Get End Property Public ReadOnly Property Ds_Amount__ComoDouble As Double Get Return Me.Ds_Amount / 100.0 End Get End Property Public ReadOnly Property Ds_Response__ComoBoolean As Boolean Get Dim resultado As Boolean = False Dim codigoRespuesta As UInteger = UInteger.Parse(Me.Ds_Response) If codigoRespuesta >= 0 AndAlso codigoRespuesta <= 99 Then resultado = True End If Return resultado End Get End Property Public ReadOnly Property Ds_SecurePayment__ComoBoolean As Boolean Get If Me.Ds_SecurePayment = "1" Then Return True Else Return False End If End Get End Property Public ReadOnly Property Ds_Card_Type__ComoEnum As RedsysTipoTarjeta Get Dim resultado As RedsysTipoTarjeta = RedsysTipoTarjeta.NO_PROPORCIONADO If Me.Ds_Card_Type = "C" Then resultado = RedsysTipoTarjeta.CREDITO ElseIf Me.Ds_Card_Type = "D" Then resultado = RedsysTipoTarjeta.DEBITO End If Return resultado End Get End Property Public ReadOnly Property FechaHora As DateTime Get Dim dd As String = Me.Ds_Date.Split(sSeparadorFecha)(0) Dim mm As String = Me.Ds_Date.Split(sSeparadorFecha)(1).Substring(2, 2) Dim yyyy As String = Me.Ds_Date.Split(sSeparadorFecha)(2).Substring(2, 4) Dim H As String = Me.Ds_Hour.Split(sSeparadorHora)(0) Dim m As String = Me.Ds_Hour.Split(sSeparadorHora)(1).Substring(2, 2) Return New DateTime(yyyy, mm, dd, H, m, 0) End Get End Property ''//////////////////// ''// Constructores // ''////////////////// 'Public Sub New() ' MyBase.New() 'End Sub 'Public Sub New(datosPOST As Specialized.NameValueCollection) ' MyBase.New() ' For Each p In datosPOST ' If p = "Ds_Date" Then Me.Ds_Date = datosPOST(p) ' If p = "Ds_Hour" Then Me.Ds_Hour = datosPOST(p) ' If p = "Ds_Amount" Then Me.Ds_Amount = datosPOST(p) ' If p = "Ds_Currency" Then Me.Ds_Currency = datosPOST(p) ' If p = "Ds_Order" Then Me.Ds_Order = datosPOST(p) ' If p = "Ds_MerchantCode" Then Me.Ds_MerchantCode = datosPOST(p) ' If p = "Ds_Terminal" Then Me.Ds_Terminal = datosPOST(p) ' If p = "Ds_Response" Then Me.Ds_Response = datosPOST(p) ' If p = "Ds_MerchantData" Then Me.Ds_MerchantData = datosPOST(p) ' If p = "Ds_SecurePayment" Then Me.Ds_SecurePayment = datosPOST(p) ' If p = "Ds_TransactionType" Then Me.Ds_TransactionType = datosPOST(p) ' If p = "Ds_Card_Country" Then Me.Ds_Card_Country = datosPOST(p) ' If p = "Ds_AuthorisationCode" Then Me.Ds_AuthorisationCode = datosPOST(p) ' If p = "Ds_ConsumerLanguage" Then Me.Ds_ConsumerLanguage = datosPOST(p) ' If p = "Ds_Card_Type" Then Me.Ds_Card_Type = datosPOST(p) ' Next 'End Sub End Class Public Enum RedsysTipoTarjeta NO_PROPORCIONADO = 0 CREDITO = 1 DEBITO = 2 End Enum