Documentation
¶
Overview ¶
Version will be automatically set during the build
Index ¶
- Variables
- func Describe(message *Message, w io.Writer, filters ...FieldFilter) error
- func DescribeFieldContainer(container FieldContainer, w io.Writer, filters ...FieldFilter) error
- type ContainerWithBitmap
- type FieldContainer
- type FieldFilter
- type FilterFunc
- type Message
- func (m *Message) BinaryField(id int, val []byte) error
- func (m *Message) Bitmap() *field.Bitmap
- func (m *Message) Clone() (*Message, error)
- func (m *Message) Field(id int, val string) error
- func (m *Message) GetBytes(id int) ([]byte, error)
- func (m *Message) GetField(id int) field.Field
- func (m *Message) GetFields() map[int]field.Field
- func (m *Message) GetMTI() (string, error)
- func (m *Message) GetSpec() *MessageSpec
- func (m *Message) GetString(id int) (string, error)
- func (m *Message) MTI(val string)
- func (m *Message) Marshal(v interface{}) error
- func (m *Message) MarshalJSON() ([]byte, error)
- func (m *Message) MarshalPath(path string, value any) error
- func (m *Message) Pack() ([]byte, error)
- func (m *Message) SetData(data any) error
- func (m *Message) Unmarshal(v interface{}) error
- func (m *Message) UnmarshalJSON(b []byte) error
- func (m *Message) UnmarshalPath(path string, value any) error
- func (m *Message) Unpack(src []byte) error
- func (m *Message) UnsetField(id int)
- func (m *Message) UnsetFields(idPaths ...string) error
- func (m *Message) UnsetPath(idPaths ...string) error
- type MessageSpec
- type MessageWrapper
- type MesssageTypeIndicator
Constants ¶
This section is empty.
Variables ¶
var DefaultFilters = func() []FieldFilter { filters := []FieldFilter{ FilterField("2", PANFilter), FilterField("20", PANFilter), FilterField("35", Track2Filter), FilterField("36", Track3Filter), FilterField("45", Track1Filter), FilterField("52", PINFilter), FilterField("55", EMVFilter), } return filters }
var DoNotFilterFields = func() []FieldFilter { filters := []FieldFilter{ FilterField("-1", NoOpFilter), } return filters }
var EMVFilter = func(in string, data field.Field) string { if utf8.RuneCountInString(in) < emvFirstIndex+emvLastIndex { return in } return in[0:emvFirstIndex] + emvPattern + in[len(in)-emvLastIndex:] }
var ErrCreatingNewTrackData = errors.New("creating new track data")
var NoOpFilter = func(in string, data field.Field) string {
return in
}
var PANFilter = func(in string, data field.Field) string { if utf8.RuneCountInString(in) < panFistIndex+panLastIndex { return in } return in[0:panFistIndex] + panPattern + in[len(in)-panLastIndex:] }
var PINFilter = func(in string, data field.Field) string { if utf8.RuneCountInString(in) < pinFirstIndex+pinLastIndex { return in } return in[0:pinFirstIndex] + pinPattern + in[len(in)-pinLastIndex:] }
var Track1Filter = func(in string, data field.Field) string { track := field.Track1{} if err := newTrackData(data, &track); err != nil { return in } track.PrimaryAccountNumber = PANFilter(track.PrimaryAccountNumber, nil) return getTrackDataString(in, &track) }
var Track2Filter = func(in string, data field.Field) string { track := field.Track2{} if err := newTrackData(data, &track); err != nil { return in } track.PrimaryAccountNumber = PANFilter(track.PrimaryAccountNumber, nil) return getTrackDataString(in, &track) }
var Track3Filter = func(in string, data field.Field) string { track := field.Track3{} if err := newTrackData(data, &track); err != nil { return in } track.PrimaryAccountNumber = PANFilter(track.PrimaryAccountNumber, nil) return getTrackDataString(in, &track) }
var Version string
Functions ¶
func Describe ¶ added in v0.11.0
func Describe(message *Message, w io.Writer, filters ...FieldFilter) error
func DescribeFieldContainer ¶ added in v0.18.0
func DescribeFieldContainer(container FieldContainer, w io.Writer, filters ...FieldFilter) error
DescribeFieldContainer describes the FieldContainer (e.g. Wrapped Message or CompositeField)
Types ¶
type ContainerWithBitmap ¶ added in v0.18.0
type FieldContainer ¶ added in v0.18.0
FieldContainer should be implemented by the type to be described we use GetSubfields() as a common method to get subfields while Message doesn't implement FieldContainer interface directly we use MessageWrapper to wrap Message and implement FieldContainer
type FieldFilter ¶ added in v0.14.0
type FieldFilter func(fieldFilters map[string]FilterFunc)
func FilterField ¶ added in v0.14.0
func FilterField(id string, filterFn FilterFunc) FieldFilter
type Message ¶
type Message struct {
// contains filtered or unexported fields
}
func NewMessage ¶
func NewMessage(spec *MessageSpec) *Message
func (*Message) BinaryField ¶ added in v0.0.2
func (*Message) Clone ¶ added in v0.8.0
Clone clones the message by creating a new message from the binary representation of the original message
func (*Message) GetBytes ¶ added in v0.0.2
GetBytes returns the byte slice representation of the field with the given ID. If the field does not exist in the message, nil will be returned. If the field ID is not defined in the specification, an error will be returned.
func (*Message) GetField ¶ added in v0.4.1
GetField returns the field with the given ID, or nil if the field is not set or not defined in the specification.
func (*Message) GetFields ¶ added in v0.4.1
Fields returns the copy of the map of the set fields in the message. Be aware that fields are live references, so modifying them will affect the message.
func (*Message) GetMTI ¶ added in v0.0.2
GetMTI returns the Message Type Indicator (MTI) of the message. It returns an empty string if the MTI field is not set.
func (*Message) GetSpec ¶ added in v0.4.8
func (m *Message) GetSpec() *MessageSpec
func (*Message) GetString ¶ added in v0.0.2
GetString returns the string representation of the field with the given ID. If the field does not exist in the message, an empty value will be returned. If the field ID is not defined in the specification, an error will be returned.
func (*Message) Marshal ¶ added in v0.10.0
Marshal populates message fields with v struct field values. It traverses through the message fields and calls Unmarshal(...) on them setting the v If v is not a struct or not a pointer to struct then it returns error.
func (*Message) MarshalJSON ¶ added in v0.3.3
func (*Message) MarshalPath ¶ added in v0.23.5
func (*Message) Pack ¶ added in v0.0.2
Pack locks the message, packs its fields, and then unlocks it. If any errors are encountered during packing, they will be wrapped in a *PackError before being returned.
func (*Message) Unmarshal ¶ added in v0.10.0
Unmarshal populates v struct fields with message field values. It traverses through the message fields and calls Unmarshal(...) on them setting the v If v is nil or not a pointer it returns error.
func (*Message) UnmarshalJSON ¶ added in v0.6.1
func (*Message) UnmarshalPath ¶ added in v0.23.5
func (*Message) Unpack ¶ added in v0.0.2
Unpack unpacks the message from the given byte slice or returns an error which is of type *UnpackError and contains the raw message
func (*Message) UnsetField ¶ added in v0.22.2
UnsetField marks the field with the given ID as not set and replaces it with a new zero-valued field. This effectively removes the field's value and excludes it from operations like Pack() or Marshal().
func (*Message) UnsetFields ¶ added in v0.22.2
UnsetFields marks multiple fields identified by their paths as not set and replaces them with new zero-valued fields. Each path should be in the format "a.b.c". This effectively removes the fields' values and excludes them from operations like Pack() or Marshal(). Deprecated: use UnsetPath instead.
func (*Message) UnsetPath ¶ added in v0.23.5
UnsetPath marks multiple fields identified by their paths as not set and replaces them with new zero-valued fields. Each path should be in the format "a.b.c". This effectively removes the fields' values and excludes them from operations like Pack() or Marshal().
type MessageSpec ¶ added in v0.0.2
var Spec87 *MessageSpec = &MessageSpec{ Name: "ISO 8583 v1987 ASCII", Fields: map[int]field.Field{ 0: field.NewString(&field.Spec{ Length: 4, Description: "Message Type Indicator", Enc: encoding.ASCII, Pref: prefix.ASCII.Fixed, }), 1: field.NewBitmap(&field.Spec{ Length: 8, Description: "Bitmap", Enc: encoding.BytesToASCIIHex, Pref: prefix.Hex.Fixed, }), 2: field.NewString(&field.Spec{ Length: 19, Description: "Primary Account Number", Enc: encoding.ASCII, Pref: prefix.ASCII.LL, }), 3: field.NewNumeric(&field.Spec{ Length: 6, Description: "Processing Code", Enc: encoding.ASCII, Pref: prefix.ASCII.Fixed, }), 4: field.NewString(&field.Spec{ Length: 12, Description: "Transaction Amount", Enc: encoding.ASCII, Pref: prefix.ASCII.Fixed, Pad: padding.Left('0'), }), 5: field.NewString(&field.Spec{ Length: 12, Description: "Settlement Amount", Enc: encoding.ASCII, Pref: prefix.ASCII.Fixed, Pad: padding.Left('0'), }), 6: field.NewString(&field.Spec{ Length: 12, Description: "Billing Amount", Enc: encoding.ASCII, Pref: prefix.ASCII.Fixed, Pad: padding.Left('0'), }), 7: field.NewString(&field.Spec{ Length: 10, Description: "Transmission Date & Time", Enc: encoding.ASCII, Pref: prefix.ASCII.Fixed, }), 8: field.NewString(&field.Spec{ Length: 8, Description: "Billing Fee Amount", Enc: encoding.ASCII, Pref: prefix.ASCII.Fixed, }), 9: field.NewString(&field.Spec{ Length: 8, Description: "Settlement Conversion Rate", Enc: encoding.ASCII, Pref: prefix.ASCII.Fixed, }), 10: field.NewString(&field.Spec{ Length: 8, Description: "Cardholder Billing Conversion Rate", Enc: encoding.ASCII, Pref: prefix.ASCII.Fixed, }), 11: field.NewString(&field.Spec{ Length: 6, Description: "Systems Trace Audit Number (STAN)", Enc: encoding.ASCII, Pref: prefix.ASCII.Fixed, }), 12: field.NewString(&field.Spec{ Length: 6, Description: "Local Transaction Time", Enc: encoding.ASCII, Pref: prefix.ASCII.Fixed, }), 13: field.NewString(&field.Spec{ Length: 4, Description: "Local Transaction Date", Enc: encoding.ASCII, Pref: prefix.ASCII.Fixed, }), 14: field.NewString(&field.Spec{ Length: 4, Description: "Expiration Date", Enc: encoding.ASCII, Pref: prefix.ASCII.Fixed, }), 15: field.NewString(&field.Spec{ Length: 4, Description: "Settlement Date", Enc: encoding.ASCII, Pref: prefix.ASCII.Fixed, }), 16: field.NewString(&field.Spec{ Length: 4, Description: "Currency Conversion Date", Enc: encoding.ASCII, Pref: prefix.ASCII.Fixed, }), 17: field.NewString(&field.Spec{ Length: 4, Description: "Capture Date", Enc: encoding.ASCII, Pref: prefix.ASCII.Fixed, }), 18: field.NewString(&field.Spec{ Length: 4, Description: "Merchant Type", Enc: encoding.ASCII, Pref: prefix.ASCII.Fixed, }), 19: field.NewString(&field.Spec{ Length: 3, Description: "Acquiring Institution Country Code", Enc: encoding.ASCII, Pref: prefix.ASCII.Fixed, }), 20: field.NewString(&field.Spec{ Length: 3, Description: "PAN Extended Country Code", Enc: encoding.ASCII, Pref: prefix.ASCII.Fixed, }), 21: field.NewString(&field.Spec{ Length: 3, Description: "Forwarding Institution Country Code", Enc: encoding.ASCII, Pref: prefix.ASCII.Fixed, }), 22: field.NewString(&field.Spec{ Length: 3, Description: "Point of Sale (POS) Entry Mode", Enc: encoding.ASCII, Pref: prefix.ASCII.Fixed, }), 23: field.NewString(&field.Spec{ Length: 3, Description: "Card Sequence Number (CSN)", Enc: encoding.ASCII, Pref: prefix.ASCII.Fixed, }), 24: field.NewString(&field.Spec{ Length: 3, Description: "Function Code", Enc: encoding.ASCII, Pref: prefix.ASCII.Fixed, }), 25: field.NewString(&field.Spec{ Length: 2, Description: "Point of Service Condition Code", Enc: encoding.ASCII, Pref: prefix.ASCII.Fixed, }), 26: field.NewString(&field.Spec{ Length: 2, Description: "Point of Service PIN Capture Code", Enc: encoding.ASCII, Pref: prefix.ASCII.Fixed, }), 27: field.NewString(&field.Spec{ Length: 1, Description: "Authorizing Identification Response Length", Enc: encoding.ASCII, Pref: prefix.ASCII.Fixed, }), 28: field.NewString(&field.Spec{ Length: 9, Description: "Transaction Fee Amount", Enc: encoding.ASCII, Pref: prefix.ASCII.Fixed, }), 29: field.NewString(&field.Spec{ Length: 9, Description: "Settlement Fee Amount", Enc: encoding.ASCII, Pref: prefix.ASCII.Fixed, }), 30: field.NewString(&field.Spec{ Length: 9, Description: "Transaction Processing Fee Amount", Enc: encoding.ASCII, Pref: prefix.ASCII.Fixed, }), 31: field.NewString(&field.Spec{ Length: 9, Description: "Settlement Processing Fee Amount", Enc: encoding.ASCII, Pref: prefix.ASCII.Fixed, }), 32: field.NewString(&field.Spec{ Length: 11, Description: "Acquiring Institution Identification Code", Enc: encoding.ASCII, Pref: prefix.ASCII.LL, }), 33: field.NewString(&field.Spec{ Length: 11, Description: "Forwarding Institution Identification Code", Enc: encoding.ASCII, Pref: prefix.ASCII.LL, }), 34: field.NewString(&field.Spec{ Length: 28, Description: "Extended Primary Account Number", Enc: encoding.ASCII, Pref: prefix.ASCII.LL, }), 35: field.NewString(&field.Spec{ Length: 37, Description: "Track 2 Data", Enc: encoding.ASCII, Pref: prefix.ASCII.LL, }), 36: field.NewString(&field.Spec{ Length: 104, Description: "Track 3 Data", Enc: encoding.ASCII, Pref: prefix.ASCII.LLL, }), 37: field.NewString(&field.Spec{ Length: 12, Description: "Retrieval Reference Number", Enc: encoding.ASCII, Pref: prefix.ASCII.Fixed, }), 38: field.NewString(&field.Spec{ Length: 6, Description: "Authorization Identification Response", Enc: encoding.ASCII, Pref: prefix.ASCII.Fixed, }), 39: field.NewString(&field.Spec{ Length: 2, Description: "Response Code", Enc: encoding.ASCII, Pref: prefix.ASCII.Fixed, }), 40: field.NewString(&field.Spec{ Length: 3, Description: "Service Restriction Code", Enc: encoding.ASCII, Pref: prefix.ASCII.Fixed, }), 41: field.NewString(&field.Spec{ Length: 8, Description: "Card Acceptor Terminal Identification", Enc: encoding.ASCII, Pref: prefix.ASCII.Fixed, }), 42: field.NewString(&field.Spec{ Length: 15, Description: "Card Acceptor Identification Code", Enc: encoding.ASCII, Pref: prefix.ASCII.Fixed, }), 43: field.NewString(&field.Spec{ Length: 40, Description: "Card Acceptor Name/Location", Enc: encoding.ASCII, Pref: prefix.ASCII.Fixed, }), 44: field.NewString(&field.Spec{ Length: 99, Description: "Additional Data", Enc: encoding.ASCII, Pref: prefix.ASCII.LL, }), 45: field.NewString(&field.Spec{ Length: 76, Description: "Track 1 Data", Enc: encoding.ASCII, Pref: prefix.ASCII.LL, }), 46: field.NewString(&field.Spec{ Length: 999, Description: "Additional data (ISO)", Enc: encoding.ASCII, Pref: prefix.ASCII.LLL, }), 47: field.NewString(&field.Spec{ Length: 999, Description: "Additional data (National)", Enc: encoding.ASCII, Pref: prefix.ASCII.LLL, }), 48: field.NewString(&field.Spec{ Length: 999, Description: "Additional data (Private)", Enc: encoding.ASCII, Pref: prefix.ASCII.LLL, }), 49: field.NewString(&field.Spec{ Length: 3, Description: "Transaction Currency Code", Enc: encoding.ASCII, Pref: prefix.ASCII.Fixed, }), 50: field.NewString(&field.Spec{ Length: 3, Description: "Settlement Currency Code", Enc: encoding.ASCII, Pref: prefix.ASCII.Fixed, }), 51: field.NewString(&field.Spec{ Length: 3, Description: "Cardholder Billing Currency Code", Enc: encoding.ASCII, Pref: prefix.ASCII.Fixed, }), 52: field.NewString(&field.Spec{ Length: 8, Description: "PIN Data", Enc: encoding.BytesToASCIIHex, Pref: prefix.Hex.Fixed, }), 53: field.NewString(&field.Spec{ Length: 16, Description: "Security Related Control Information", Enc: encoding.ASCII, Pref: prefix.ASCII.Fixed, }), 54: field.NewString(&field.Spec{ Length: 120, Description: "Additional Amounts", Enc: encoding.ASCII, Pref: prefix.ASCII.LLL, }), 55: field.NewString(&field.Spec{ Length: 999, Description: "ICC Data – EMV Having Multiple Tags", Enc: encoding.ASCII, Pref: prefix.ASCII.LLL, }), 56: field.NewString(&field.Spec{ Length: 999, Description: "Reserved (ISO)", Enc: encoding.ASCII, Pref: prefix.ASCII.LLL, }), 57: field.NewString(&field.Spec{ Length: 999, Description: "Reserved (National)", Enc: encoding.ASCII, Pref: prefix.ASCII.LLL, }), 58: field.NewString(&field.Spec{ Length: 999, Description: "Reserved (National)", Enc: encoding.ASCII, Pref: prefix.ASCII.LLL, }), 59: field.NewString(&field.Spec{ Length: 999, Description: "Reserved (National)", Enc: encoding.ASCII, Pref: prefix.ASCII.LLL, }), 60: field.NewString(&field.Spec{ Length: 999, Description: "Reserved (National)", Enc: encoding.ASCII, Pref: prefix.ASCII.LLL, }), 61: field.NewString(&field.Spec{ Length: 999, Description: "Reserved (Private)", Enc: encoding.ASCII, Pref: prefix.ASCII.LLL, }), 62: field.NewString(&field.Spec{ Length: 999, Description: "Reserved (Private)", Enc: encoding.ASCII, Pref: prefix.ASCII.LLL, }), 63: field.NewString(&field.Spec{ Length: 999, Description: "Reserved (Private)", Enc: encoding.ASCII, Pref: prefix.ASCII.LLL, }), 64: field.NewString(&field.Spec{ Length: 8, Description: "Message Authentication Code (MAC)", Enc: encoding.BytesToASCIIHex, Pref: prefix.Hex.Fixed, }), 70: field.NewString(&field.Spec{ Length: 3, Description: "Network management information code", Enc: encoding.ASCII, Pref: prefix.ASCII.Fixed, }), 90: field.NewString(&field.Spec{ Length: 42, Description: "Original Data Elements", Enc: encoding.ASCII, Pref: prefix.ASCII.Fixed, }), }, }
keep it here for a little while for compatibility all new specs and updates to Spec87 should go to ./specs
func (*MessageSpec) Validate ¶ added in v0.19.3
func (s *MessageSpec) Validate() error
Validate checks if the MessageSpec is valid.
type MessageWrapper ¶ added in v0.18.0
type MessageWrapper struct {
*Message
}
MessageWrapper implements FieldContainer interface for the iso8583.Message as currently it has GetFields() and not GetSubfields and it returns map[int]field.Field (key is int, not string)
func (*MessageWrapper) GetSubfields ¶ added in v0.18.0
func (m *MessageWrapper) GetSubfields() map[string]field.Field
type MesssageTypeIndicator ¶ added in v0.4.10
type MesssageTypeIndicator string
MesssageTypeIndicator message type indicator is a four-digit numeric field which indicates the overall function of the ISO 8583:1987 message
const ( // AuthorizationRequest is a request from a point-of-sale terminal for authorization for a cardholder purchase AuthorizationRequest MesssageTypeIndicator = "0100" // AuthorizationResponse is a request response to a point-of-sale terminal for authorization for a cardholder purchase AuthorizationResponse MesssageTypeIndicator = "0110" // AuthorizationAdvice is when the point-of-sale device breaks down and you have to sign a voucher AuthorizationAdvice MesssageTypeIndicator = "0120" // AuthorizationAdviceRepeat used to repeat if the advice times out AuthorizationAdviceRepeat MesssageTypeIndicator = "0121" // IssuerResponseToAuthorizationAdvice is a confirmation of receipt of authorization advice IssuerResponseToAuthorizationAdvice MesssageTypeIndicator = "0130" // AuthorizationPositiveAcknowledgement indicates that an Authorization Response was received AuthorizationPositiveAcknowledgement MesssageTypeIndicator = "0180" // AuthorizationNegativeAcknowledgement indicates that an Authorization Response or Reversal Response was late or invalid AuthorizationNegativeAcknowledgement MesssageTypeIndicator = "0190" // AcquirerFinancialRequest is a request for funds, typically from an ATM or pinned point-of-sale device AcquirerFinancialRequest MesssageTypeIndicator = "0200" // IssuerResponseToFinancialRequest is a issuer response to request for funds IssuerResponseToFinancialRequest MesssageTypeIndicator = "0210" // AcquirerFinancialAdvice is used to complete transaction initiated with authorization request. e.g. Checkout at a hotel. AcquirerFinancialAdvice MesssageTypeIndicator = "0220" // AcquirerFinancialAdviceRepeat is used if the advice times out AcquirerFinancialAdviceRepeat MesssageTypeIndicator = "0221" // IssuerResponseToFinancialAdvice is a confirmation of receipt of financial advice IssuerResponseToFinancialAdvice MesssageTypeIndicator = "0230" // BatchUpload is a file update/transfer advice BatchUpload MesssageTypeIndicator = "0320" // BatchUploadResponse is a file update/transfer advice response BatchUploadResponse MesssageTypeIndicator = "0330" // AcquirerReversalRequest is used to reverse a transaction AcquirerReversalRequest MesssageTypeIndicator = "0400" // AcquirerReversalResponse is a response to a reversal request AcquirerReversalResponse MesssageTypeIndicator = "0410" // AcquirerReversalAdvice AcquirerReversalAdvice MesssageTypeIndicator = "0420" // AcquirerReversalAdviceResponse AcquirerReversalAdviceResponse MesssageTypeIndicator = "0430" // BatchSettlementResponse is a card acceptor reconciliation request response BatchSettlementResponse MesssageTypeIndicator = "0510" // AdministrativeRequest is a message delivering administrative data, often free-form and potentially indicating a failure message AdministrativeRequest MesssageTypeIndicator = "0600" // AdministrativeResponse is a response to an administrative request AdministrativeResponse MesssageTypeIndicator = "0610" // AdministrativeAdvice is an administrative request with stronger delivery guarantees AdministrativeAdvice MesssageTypeIndicator = "0620" // AdministrativeAdviceResponse is a response to an administrative advice AdministrativeAdviceResponse MesssageTypeIndicator = "0630" // NetworkManagementRequest is used in hypercom terminals initialize request. Echo test, logon, logoff etc NetworkManagementRequest MesssageTypeIndicator = "0800" // NetworkManagementResponse is a hypercom terminals initialize response. Echo test, logon, logoff etc. NetworkManagementResponse MesssageTypeIndicator = "0810" // NetworkManagementAdvice is a key change NetworkManagementAdvice MesssageTypeIndicator = "0820" )
