Saltar a contenido

Integración con Passbook

Passbook

Passbook es el formato utilizado por tarjetas y cupones para integrarse en Apple Wallet.
flexygo permite ahora generar un passbook de forma sencilla.

A continuación explicaremos cómo generar e instalar los certificados obligatorios para poder generar el passbook correctamente.
El primer requisito es disponer de una cuenta de desarrollador de Apple.

Apple WWDR

Para obtener el primer certificado solo tenemos que ir a https://www.apple.com/certificateauthority/ y descargar Worldwide Developer Relations - G4 (Expiring 12/10/2030 00:00:00 UTC), que es el que funciona actualmente.

Instalamos el certificado y seleccionamos el almacén “Intermediate Certification Authorities”.

Crear Pass Type ID

Accede a https://developer.apple.com/ e inicia sesión con una cuenta de desarrollador.
Una vez dentro, entra en Account y accede al menú de la izquierda Certificates, IDs & Profiles.

Añadimos un nuevo Identifier y elegimos el tipo Pass Type IDs, rellenando la información.
Es recomendable que el identificador mantenga la estructura pass.com.x.

Crear una petición de certificado (CSR)

Si no tenemos OpenSSL instalado, podemos descargarlo e instalarlo desde aquí: OpenSSL.

Una vez instalado, abrimos la consola con permisos de administrador, nos situamos en la ruta donde queremos generar los ficheros y ejecutamos el comando:

Bash
openssl req -new -newkey rsa:2048 -out passbook.csr -keyout passbook.key

Aparecerá una serie de datos a rellenar. El primero será la PEM pass phrase; es muy importante recordarla ya que la usaremos para generar el passbook y para firmar con la clave.

Al terminar de rellenar la información, se habrán generado dos ficheros en la ruta indicada:

  • passbook.key (clave privada para firmar)
  • passbook.csr (petición de certificado)

Firmar la CSR y crear el certificado Passbook

Volvemos al portal de desarrolladores y, desde el menú de certificados, pulsamos + para crear un nuevo Pass Type Id Certificate.

A continuación, rellenamos el nombre del certificado y elegimos el identificador que hemos creado previamente; aparecerá como opción desplegable. Si nos fijamos en el valor del desplegable, coincide con TeamID.IdentifierPassTypeID.

En el siguiente paso debemos seleccionar el archivo CSR que generamos antes (passbook.csr), lo subimos y continuamos. Se mostrará una ventana de resumen con el certificado recién generado, su fecha de caducidad, nombre, tipo, etc.

Convertir el certificado pass.cer a PEM y luego a PFX

Primero, colocamos el archivo .cer descargado desde la web de Apple en la misma carpeta que passbook.key y passbook.csr.

Después abrimos la consola de OpenSSL, navegamos hasta esa carpeta y ejecutamos:

Bash
openssl x509 -in pass.cer -inform der -out passbook.pem
Bash
openssl pkcs12 -export -out passbook.pfx -inkey passbook.key -in passbook.pem

Con este último comando, nos pedirá la contraseña (pass phrase) asociada a la clave privada. Una vez introducida, se generará el archivo passbook.pfx, que debemos instalar en el equipo.

Añadir el certificado PFX al servidor

Vamos a la consola de certificados: Certificates (Local Computer) -> Personal -> Certificates.

Botón derecho, All Tasks → Import, siguiente, y al examinar el archivo cambiamos el filtro de extensión para buscar .pfx y seleccionamos el fichero generado.

En el siguiente paso introducimos la contraseña de la clave privada, marcamos la opción de exportable e incluimos todas las propiedades extendidas. Lo añadimos al almacén Personal.

Con esto tendremos instalados los certificados necesarios para poder generar Passbook desde flexygo. Es importante que tanto el archivo passbook.pfx como AppleWWDRCAG4.cer estén en una carpeta accesible para la aplicación.

También es importante que, desde la consola, una vez importado el certificado en el almacén Personal, hagamos:

  • Botón derecho → All Tasks → Manage Private Keys
  • Añadimos IIS_IUSRS y le damos permisos.

Es necesario también tener configurado el impersonate, ya que la generación del passbook hace uso de él.

Si, aun habiendo dado permisos a IIS_IUSRS y usando un usuario de impersonation con permisos elevados, sigue dando error de permisos al generar el passbook, será necesario modificar la identidad del Application Pool a LocalSystem.

Configuración en flexygo

Una vez realizado todo lo anterior, podemos proceder a configurar los ajustes en flexygo:

  • Passbook_AppleWWDRCACertificatePath: Ruta absoluta al certificado de Apple.
  • Passbook_CertificatePath: Ruta absoluta a nuestro certificado.
  • Passbook_CertificatePassword: Contraseña (clave privada) de nuestro certificado.
  • Passbook_PassTypeIdentifier: Pass Type ID creado en Apple (por ejemplo, pass.com.x).
  • Passbook_TeamIdentifier: Valor Team ID, visible en el portal de desarrolladores de Apple en Membership → Team ID.

Ejemplo de uso desde DLL

Ejemplo de DLL

Ejemplo de diseño y layout

VB.net
Public Shared Function generatePassbook(ByVal Entity As EntityObject, ByRef Ret As ProcessHelper) As Boolean
        Try
            Dim aPrimaryField As List(Of KeyValuePair(Of String, String)) = New List(Of KeyValuePair(Of String, String))
            aPrimaryField.Add(New KeyValuePair(Of String, String)("Nombre", "Aitor"))
            Dim aSecondaryField As List(Of KeyValuePair(Of String, String)) = New List(Of KeyValuePair(Of String, String))
            aSecondaryField.Add(New KeyValuePair(Of String, String)("Apellido", "Torres"))
            Dim aAuxiliaryField As List(Of KeyValuePair(Of String, String)) = New List(Of KeyValuePair(Of String, String))
            aAuxiliaryField.Add(New KeyValuePair(Of String, String)("Movil", "123456"))
            Dim aBackField As List(Of KeyValuePair(Of String, String)) = New List(Of KeyValuePair(Of String, String))
            aBackField.Add(New KeyValuePair(Of String, String)("Otros", "Loren ipsum"))
            Dim aBackgroundColor As String = "#000000"
            Dim aForegroundColor As String = "#FFFFFF"
            Dim aLabelColor As String = "#FFFFFF"
            Dim aIcon As Byte() = File.ReadAllBytes(HttpContext.Current.Server.MapPath("~\img\icons\icon-256x256.png"))
            Dim aLogo As Byte() = File.ReadAllBytes(HttpContext.Current.Server.MapPath("~\img\icons\icon-256x256.png"))
            Dim aDescription As String = "Passbook flexygo"
            Dim aOrganizationName As String = "Flexygo"
            Dim aLogoText As String = "Logo text"
            Dim aThumbnail As Byte() = File.ReadAllBytes(HttpContext.Current.Server.MapPath("~\img\Avatars\avatar_blank.png"))
            Dim aHeaderField As KeyValuePair(Of String, String)=("Cabecera","Business card")

            'vCard info for qr barcode
            Dim FirstName As String = "Aitor"
            Dim LastName As String = "Torres"
            Dim CompanyName As String = "Flexygo"
            Dim JobTitle As String = "Programador"
            Dim StreetAddress As String = "Carrer dels Ceramistes 19"
            Dim Zip As String = "46900"
            Dim City As String = "Valencia"
            Dim CountryName As String = "España"
            Dim Phone As String = "123456"
            Dim Mobile As String = "987654"
            Dim Fax As String = ""
            Dim Email As String = "aitor@ahora.es"
            Dim HomePage As String = "www.flexygo.com"
            Dim loUid As String = System.Guid.NewGuid().ToString()
            Dim vCard As New VCard(FirstName, LastName, CompanyName, JobTitle, StreetAddress, Zip, City, CountryName, Phone, Mobile, Fax, Email, HomePage, loUid)

            Dim aBarcode As String = vCard.VCardBody()

            Dim passbook As New Passbook(aPrimaryField, aBackgroundColor, aForegroundColor, aLabelColor, aIcon, aDescription, aOrganizationName, aLogoText, aBarcode, aHeaderField, aLogo, aSecondaryField, aAuxiliaryField, aBackField, aThumbnail)
            'We can write on disk, download it, send by mail, etc...
            File.WriteAllBytes(HttpContext.Current.Server.MapPath("~\Custom\passbook\prueba.pkpass"), passbook.generatePassbook())
            Dim path As String = HttpContext.Current.Server.MapPath("~\Custom\passbook\prueba.pkpass")
            Dim dw As New Utilities.Download With {
                    .Path = path,
                    .DeleteAfterDownload = True
                }

            Ret.JSCode = String.Format("window.open('{0}')", Ret.ConfToken.ResolveUrl(dw.GetLink))
            Ret.Success = True
            Ret.SuccessMessage = "Passbook generated"
            Return Ret.Success

        Catch ex As Exception
            Ret.Success = False
            Ret.LastException = ex
            Return Ret.Success
        End Try
    End Function