stp

package module
v0.0.3 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 29, 2021 License: MIT Imports: 15 Imported by: 0

README

go-stp

Librería creada para tener interacción con STP, ejecutar sus métodos y generar las firmas para los requests de comunicación con ellos.

Instalación

go get github.com/kalmecak/go-stp

Uso

import "github.com/kalmecak/go-stp"

Generación de claves

Métodos de generación de claves para trabajar con STP

Nunca compartas el certificado privado con nadie, manéjalo con precausión


// Llave priv
keytool -genkey -alias NombreDeLaEmpresa -keyalg RSA -keystore llavePrivada.jks 
-keysize 2048 -deststoretype jks

//  Llave pub
keytool -export -alias NombreDeLaEmpresa -keystore llavePrivada.jks -rfc -file publica.cer

//JKS a P12
keytool -importkeystore -srckeystore llavePrivada.jks -destkeystore llavePrivada.p12 -srcstoretype jks -deststoretype pkcs12

//P12 a pem
openssl pkcs12 -in llavePrivada.p12 -out llavePrivada.pem

// Quitar el password del certificado
openssl rsa -in llavePrivada.pem -out llavePrivada.pem

Certificados

Nunca compartas el certificado privado con nadie, manéjalo con precausión

La libraría usa el certificado privado para generar las firmas que se envían a STP.

El certificado deberá estar en la variable de entorno:

export STP_PRIVATE_CERT="
-----BEGIN RSA PRIVATE KEY-----
...
-----END RSA PRIVATE KEY-----
"

Sign

M´etodo para generar una firma a partir de un string, usa el certificado privado de la variable de entorno antes mecionada:

s := "Una cadena a firmar"
s, err := Sign(s)
if err != nil {

    log.Panicln(err.Error())
}

log.Println(s)
// Ih4uxLgoZH4dDF/QlVEbK8xo4MKMtjJvEv/EYlND9ORCxK4zCjFEQhJaQdy8cacIa7Q8D5VWsWL+y4P6Mab+R5qIsdr9T4iNPisKc/3m79jeiRioYUQVSNmgM5WMW3tdXA3LpzE+2fY3hVmJNSUQzZdAMh/htWGq+yN4Zl/zFLlWAwb7H1sWSO3pII0HpRG40S94xgeR9Rd/JD/V7geDLtuaFZGyoah3+ZtRKScXghqhERXenPUPt3erEchFsbXS6u9f3V1++NPsee0AjoMT3l+DSzol/xyc5Dla4uLyKcGZmB2+EiXwVxvsvWXC9QCbJkGBYGXjibaUGf+C9gT3ag

Dispersión (registrarOrden)

Estructura para manejar los registros de órdenes SPEI, contiene los campos y métodos necesarios:

RegistraOrden

// No importa el orden que metas los datos, la librería los ordena
registraOrden = RegistraOrden{
    InstitucionContraparte: 40072,
    Empresa:                "Empresa_en_STP",
    FechaOperacion:         "20210928",
    FolioOrigen:            "AAABBB-234AA-dd",
    ClaveRastreo:           "12345678",
    InstitucionOperante:    90646,
    Monto:                  123.45,
    TipoPago:               1,
    TipoCuentaOrdenante:    40,
    NombreOrdenante:        "Ordenante",
    CuentaOrdenante:        "846180000400000001",
    RFCCurpOrdenante:       "XXXXXXXXXXXX",
    TipoCuentaBeneficiario: 40,
    NombreBeneficiario:     "Beneficiario",
    CuentaBeneficiario:     "846180000400000001",
    RFCCurpBeneficiario:    "XXXXXXXXXXXX",
    ConceptoPago:           "un pago",
    ReferenciaNumerica:     1234567,
}

Fecha - RegistraOrden.SetDate

STP pide el formato AAAAMMDD, si tú la manejas en otro formato, puedes usar el método SetDate y se setearrá en la estructura con el formato requerido, sólo debes pasar la fecha y el formato:


// No importa el orden que metas los datos, la librería los ordena

err := registraOrden.SetDate("2021-09-11T09:59:25.963", "2006-01-02T15:04:05.000")
if err != nil {

    log.Panicln(err.Error())
}
log.Println(registraOrden.FechaOperacion)
// 20210911
Cadena original - RegistraOrden.PipeChain

Si necesitas obtener la cadena original, no importa el orden que haya metido los datos, la librería te dará la cadena original en el formato requerido:

Validación - RegistraOrden.Validate

Este método verifica que los campos cumplan con los requerimientos de STP, se recomienda ejecutarse antes de crear el JSON para enviar el POST.

Se recomienda usar este método antes de generar la cadena original o el JSON

if err := registraOrden.Validate(); err != nil {

    log.Panicln(err.Error())
    // error at: RegistraOrden.Firma validation: required
}
co := registraOrden.PipeChain()
log.Println(co)
// ||40072|Empresa_en_STP|20210928|AAABBB-234AA-dd|12345678|90646|123.45|1|40|Ordenante|846180000400000001|XXXXXXXXXXXX|40|Beneficiario|846180000400000001|XXXXXXXXXXXX||||||un pago||||||1234567|||||||||
Firma - RegistraOrden.Sign

Este método, crea y setea la firma criptográfica de la cadena original por lo tanto, al ejecutarlo, deberás ya haber ingresado los datos en la estructura.

if err := registraOrden.Sign(); err != nil {

    log.Panicln(err.Error())
}
log.Println(registraOrden.Firma)
// eJwVwcwBgIAAoBgkqhkiG9w0BBwagggEoMIICJjCCAh4CAQEwgZQwgY4xCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRMwEQYDVQQKEwpHb29nbGUgSW5jLjETMBEGA1UECxMKR2VuZXJhdGVkIEluYzEiMCAGA1UEAxMZR2VuZXJhdGVkIEluYyBDZXJ0aWZpY2F0ZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcUvh4P/bCiPVlDRnwaYgjN6zGVsxX+0WctHK6PnkxEKbKm3+cYiDnj6GZ+pQTztvkp2cO0bN0ZVObxh1SbCe+NknXXOiQXIeY0Ibzp0d2bdW1jAJ2ZbzkNlOd4ZjmBt+7tv3u1ZJl+bzJeJqpCQ7I26nH7l+LHO049tVjQ1+bgaSvZpQjGktNlHhlDljBu/t2iWZHJvPL/7UawKjl0htgxP93CiOBnQwLtKmXdFQTZ+9Qp9bZNtHX/7rjkpM7UaDShD9bQGjZvdi0z29nFZrBjbEoQXJfzBxQjE9yZGVsLnNl
JSON - RegistraOrden.ToJSON

Este método te entrega el string listo que se enviará en el body de la petición al API de STP:

var js string
if js, err := registraOrden.ToJSON(); err != nil {

    log.Panicln(err.Error())
}
log.Println(js)
// {"institucionContraparte":40072,"empresa":"Empresa_en_STP","fechaOperacion":"20210928","folioOrigen":"AAABBB-234AA-dd","claveRastreo":"12345678","institucionOperante":90646,"monto":123.45,"tipoPago":1,"tipoCuentaOrdenante":40,"nombreOrdenante":"Ordenante","cuentaOrdenante":"846180000400000001","rfcCurpOrdenante":"XXXXXXXXXXXX","tipoCuentaBeneficiario":40,"nombreBeneficiario":"Beneficiario","cuentaBeneficiario":"846180000400000001","rfcCurpBeneficiario":"XXXXXXXXXXXX","conceptoPago":"un pago","referenciaNumerica":1234567,"firma":"eJwVwcwBgIAAoBgkqhkiG9w0BBwagggEoMIICJjCCAh4CAQEwgZQwgY4xCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRMwEQYDVQQKEwpHb29nbGUgSW5jLjETMBEGA1UECxMKR2VuZXJhdGVkIEluYzEiMCAGA1UEAxMZR2VuZXJhdGVkIEluYyBDZXJ0aWZpY2F0ZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcUvh4P/bCiPVlDRnwaYgjN6zGVsxX+0WctHK6PnkxEKbKm3+cYiDnj6GZ+pQTztvkp2cO0bN0ZVObxh1SbCe+NknXXOiQXIeY0Ibzp0d2bdW1jAJ2ZbzkNlOd4ZjmBt+7tv3u1ZJl+bzJeJqpCQ7I26nH7l+LHO049tVjQ1+bgaSvZpQjGktNlHhlDljBu/t2iWZHJvPL/7UawKjl0htgxP93CiOBnQwLtKmXdFQTZ+9Qp9bZNtHX/7rjkpM7UaDShD9bQGjZvdi0z29nFZrBjbEoQXJfzBxQjE9yZGVsLnNl"

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func Sign

func Sign(s string) (string, error)

Sign receives the string to sign and return the base64 encoded signature.

Types

type RegistraOrden

type RegistraOrden struct {
	InstitucionContraparte  int     `validate:"required,max=99999" json:"institucionContraparte"`
	Empresa                 string  `validate:"required,max=15" json:"empresa"`
	FechaOperacion          string  `validate:"required,max=8" json:"fechaOperacion"`
	FolioOrigen             string  `validate:"required,max=50" json:"folioOrigen"`
	ClaveRastreo            string  `validate:"required,min=8,max=30" json:"claveRastreo"`
	InstitucionOperante     int     `validate:"required,eq=90646" json:"institucionOperante"`
	Monto                   float64 `validate:"required,max=9999999999999999999.99" json:"monto"`
	TipoPago                int     `validate:"required,max=99" json:"tipoPago"`
	TipoCuentaOrdenante     int     `validate:"required,max=99" json:"tipoCuentaOrdenante"`
	NombreOrdenante         string  `validate:"required,max=40" json:"nombreOrdenante"`
	CuentaOrdenante         string  `validate:"required,max=20" json:"cuentaOrdenante"`
	RFCCurpOrdenante        string  `validate:"required,max=18" json:"rfcCurpOrdenante"`
	TipoCuentaBeneficiario  int     `validate:"required,max=99" json:"tipoCuentaBeneficiario"`
	NombreBeneficiario      string  `validate:"required,max=40" json:"nombreBeneficiario"`
	CuentaBeneficiario      string  `validate:"required,max=20" json:"cuentaBeneficiario"`
	RFCCurpBeneficiario     string  `validate:"required,max=18" json:"rfcCurpBeneficiario"`
	EmailBeneficiario       string  `validate:"omitempty,max=64,email" json:"emailBeneficiario,omitempty"`
	TipoCuentaBeneficiario2 int     `validate:"omitempty,max=99" json:"tipoCuentaBeneficiario2,omitempty"`
	NombreBeneficiario2     string  `validate:"omitempty,max=40" json:"nombreBeneficiario2,omitempty"`
	CuentaBeneficiario2     string  `validate:"omitempty,max=20" json:"cuentaBeneficiario2,omitempty"`
	RFCCurpBeneficiario2    string  `validate:"omitempty,max=18" json:"rfcCurpBeneficiario2,omitempty"`
	ConceptoPago            string  `validate:"required,max=40" json:"conceptoPago,"`
	ConceptoPago2           string  `validate:"omitempty,max=40" json:"conceptoPago2,omitempty"`
	ClaveCatalogoUsuario1   int     `validate:"omitempty,max=999" json:"claveCatalogoUsuario1,omitempty"`
	ClaveCatalogoUsuario2   int     `validate:"omitempty,max=999" json:"claveCatalogoUsuario2,omitempty"`
	ClavePago               int     `validate:"omitempty,max=999" json:"clavePago,omitempty"`
	ReferenciaCobranza      string  `validate:"omitempty,max=40" json:"referenciaCobranza,omitempty"`
	ReferenciaNumerica      int     `validate:"required,max=9999999" json:"referenciaNumerica"`
	TipoOperacion           int     `validate:"omitempty,max=99" json:"tipoOperacion,omitempty"`
	Topologia               string  `validate:"omitempty,max=20" json:"topologia,omitempty"`
	Usuario                 string  `validate:"omitempty,max=20" json:"usuario,omitempty"`
	MedioEntrega            string  `validate:"omitempty,max=20" json:"medioEntrega,omitempty"`
	Prioridad               string  `validate:"omitempty,max=20" json:"prioridad,omitempty"`
	IVA                     float64 `validate:"omitempty,max=9999999999999999999.99" json:"iva,omitempty"`
	Firma                   string  `validate:"-" json:"firma,omitempty"`
}

RegistraOrden es la estructura para manejar los datos para registrar una orden de pago. Los atributos estan en el orden que los solicita STP.

func (*RegistraOrden) PipeChain

func (r *RegistraOrden) PipeChain() string

PipeChain Genera la cadena original con los datos de la estructura, Justo como lo solicita STP. Regresa el string de la cadena original.

func (*RegistraOrden) SetDate

func (r *RegistraOrden) SetDate(date, format string) error

SetDate Recibe una fecha y su formato para escribirlo en el formato que STP necesita: "YYYYMMDD"

func (*RegistraOrden) Sign

func (r *RegistraOrden) Sign() error

Sign Genera la firma y la setea en el campo "Firma" para que esté listo para ser enviado a STP en el request.

func (*RegistraOrden) ToJSON

func (r *RegistraOrden) ToJSON() (string, error)

ToJSON Genera el JSON que debe ser enviado a STP para la dispersión (RegistraOrden)

func (*RegistraOrden) Validate

func (r *RegistraOrden) Validate() error

Validate corre las validaciones de la estructura

Directories

Path Synopsis
examples

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL