Esempio n. 1
0
class Mpi(XmlMixin):
    """
    Class representing the mpi payments
    """
    cavv = Field(default='', validator=MpiValidator.cavv)
    xid = Field(default='', validator=MpiValidator.xid)
    eci = Field(convert=str, default='', validator=MpiValidator.eci)
Esempio n. 2
0
class DccInfoWithAmount(FieldsAmountMixin, DccInfo):
    """
    Class representing the DCC information with rate type and amount (amount, currency)
    """
    ratetype = Field(default='', validator=DccValidator.ratetype)
    rate = Field(default='', validator=DccValidator.rate)
    xml_root_tag = 'dccinfo'
class FieldsAmountMixin(object):
    """
    This mixin add amount fields and necessary definition for parse to XML
    """
    currency = Field(default=None, validator=RequestValidator.currency)
    amount = Field(default='', convert=str, validator=RequestValidator.amount)
    xml_grouped_fields = [('amount', 'currency')]
class DisplayCardsRequest(HppRequest):
    """
    Class representing a display stored cards request to be sent to HPP.
    """

    # Mandatory
    hpp_select_stored_card = Field(
        default='', validator=CardStorageValidator.hpp_select_stored_card)
    offer_save_card = Field(default='0', validator=RequestValidator.flag)
    payer_exist = Field(default='1',
                        validator=CardStorageValidator.payer_exist)

    flag_fields = [
        'auto_settle_flag', 'card_storage_enable', 'offer_save_card',
        'payer_exist'
    ]

    def get_hash_values(self):
        """
        Override function to get necessary hash values for this request
        :return: list
        """
        # Empty values represents pmt_ref
        return [
            self.timestamp, self.merchant_id, self.order_id, self.amount,
            self.currency, self.hpp_select_stored_card, ''
        ]
Esempio n. 5
0
class Recurring(XmlMixin):
    """
    Class representing the recurring payments
    """
    type = Field(default=None, validator=RecurringValidator.type)
    sequence = Field(default=None, validator=RecurringValidator.sequence)

    xml_root_attributes = ['type', 'sequence']
Esempio n. 6
0
class PhoneNumbers(XmlMixin):
    """
    Class representing the phone number of the customer
    """
    home = Field(default='', validator=PhoneValidator.string_fifty)
    work = Field(default='', validator=PhoneValidator.string_twenty)
    fax = Field(default='', validator=PhoneValidator.string_twenty)
    mobile = Field(default='', validator=PhoneValidator.string_twenty)
Esempio n. 7
0
class CardRef(XmlMixin):
    """
    Class represents the card reference and payer reference
    """
    # Mandatory fields
    ref = Field(default='', validator=FieldsValidator.ref)
    payerref = Field(default='', validator=FieldsValidator.ref)
    xml_root_tag = 'card'
Esempio n. 8
0
class Card(XmlMixin):
    """
    Class represents the card
    """
    # Mandatory fields
    number = Field(validator=CardValidator.number)
    expdate = Field(validator=CardValidator.expdate)
    chname = Field(validator=CardValidator.chname)
    type = Field(validator=CardValidator.type)
class RealVaultThreeDsVerifyEnrolled(ApiRequest, FieldsAmountMixin):
    """
    Class representing a 3D Secure verify Stored card enrolled to be sent to API.
    """
    payerref = Field(default=None, validator=Validator.ref)
    paymentmethod = Field(default=None, validator=Validator.ref)

    request_type = 'realvault-3ds-verifyenrolled'
    hash_fields = ['timestamp', 'merchantid', 'orderid', 'amount', 'currency', 'payerref']
class CardDccRateRequest(ApiRequest, FieldsAmountMixin, FieldsCommentMixin):
    """
    Class representing a card dcc rate to be sent to API.
    """
    payerref = Field(default=None, validator=Validator.ref)
    paymentmethod = Field(default=None, validator=Validator.ref)
    dccinfo = Field(default=None, validator=attr.validators.instance_of(DccInfo))

    request_type = 'realvault-dccrate'
    object_fields = ['dccinfo']
    hash_fields = ['timestamp', 'merchantid', 'orderid', 'amount', 'currency', 'payerref']
class ReceiptInRequest(ApiRequest, FieldsMixin, FieldsAmountMixin):
    """
    Class representing a receipt in request to be sent to API.
    """
    payerref = Field(default=None, validator=Validator.ref)
    paymentmethod = Field(default=None, validator=Validator.ref)
    paymentdata = Field(default=None, validator=attr.validators.instance_of(PaymentData))

    request_type = 'receipt-in'
    object_fields = ['paymentdata']
    flag_fields = ['autosettle']
    hash_fields = ['timestamp', 'merchantid', 'orderid', 'amount', 'currency', 'payerref']
class CardNewRequest(ApiRequest, FieldsCommentMixin):
    """
    Class representing a new card to be sent to API.
    """
    card = Field(default=None, validator=attr.validators.instance_of(CardWithRef))

    request_type = 'card-new'
    object_fields = ['card']

    def get_hash_values(self):
        """
        Override function to get necessary hash values for this request
        :return: list
        """
        # Empty values represents amount and currency
        return [
            self.timestamp,
            self.merchantid,
            self.orderid,
            '',
            '',
            self.card.payerref,
            self.card.chname,
            self.card.number
        ]
Esempio n. 13
0
class CardWithCvn(Card):
    """
    Class represents the card with Cvn
    """
    cvn = Field(default=None, validator=attr.validators.instance_of(Cvn))
    object_fields = ['cvn']
    xml_root_tag = 'card'
class AuthRequestWithRecurring(AuthRequest):
    """
    Class representing a authorisation with 3DS request to be sent to API.
    """
    recurring = Field(default=None, validator=attr.validators.instance_of(Recurring))

    object_fields = ['card', 'recurring']
class AuthRequestWithThreeDS(AuthRequest):
    """
    Class representing a authorisation with 3DS request to be sent to API.
    """
    mpi = Field(default=None, validator=attr.validators.instance_of(Mpi))

    object_fields = ['card', 'mpi']
class AuthRequestWithDccInfo(AuthRequest):
    """
    Class representing a authorisation with DCC info request to be sent to API.
    """
    dccinfo = Field(default=None,
                    validator=attr.validators.instance_of(DccInfoWithAmount))

    object_fields = ['card', 'dccinfo']
Esempio n. 17
0
class PaymentData(XmlMixin):
    """
    Class representing the payment data (cvn)
    """
    cvn_number = Field(default='', validator=CvnValidator.number)

    def normalize_xml(self):
        return {self.__class__.__name__.lower(): {'cvn': {'number': self.cvn_number}}}
class RecurringPaymentRequest(HppRequest):
    """
    Class representing a recurring payment request to be sent to HPP.
    """

    # Mandatory
    card_storage_enable = Field(default='1', validator=RequestValidator.flag)
    offer_save_card = Field(default='0', validator=RequestValidator.flag)
    payer_exist = Field(default='0', validator=RequestValidator.flag)

    # Optional
    payer_ref = Field(default='', validator=Validator.payer_ref)
    pmt_ref = Field(default='', validator=Validator.pmt_ref)

    recurring_type = Field(default='',
                           validator=CardStorageValidator.recurring_type)
    recurring_sequence = Field(
        default='', validator=CardStorageValidator.recurring_sequence)

    flag_fields = [
        'auto_settle_flag', 'card_storage_enable', 'offer_save_card',
        'payer_exist'
    ]
    hash_fields = [
        'timestamp', 'merchant_id', 'order_id', 'amount', 'currency',
        'payer_ref', 'pmt_ref'
    ]
class Settle(FieldsCommentMixin, ApiRequest):
    """
    Class representing a settle request to be sent to API.
    """
    pasref = Field(default='', validator=TransactionManagementValidator.pasref)
    amount = Field(default='', convert=str, validator=RequestValidator.amount)

    request_type = 'settle'

    def get_hash_values(self):
        """
        Override function to get necessary hash values for this request
        :return: list
        """
        # Empty values represents currency and card number
        return [
            self.timestamp, self.merchantid, self.orderid, self.amount, '', ''
        ]
class ThreeDsVerifySig(ApiRequest, FieldsAmountMixin):
    """
    Class representing a 3D Secure signature verification request to be sent to API.
    """
    pares = Field(default=None, validator=ThreeDSValidator.pares)

    request_type = '3ds-verifysig'

    def get_hash_values(self):
        return [self.timestamp, self.merchantid, self.orderid, self.amount, self.currency, '']
Esempio n. 21
0
class Payer(FieldsCommentMixin, XmlMixin):
    """
    Class representing Payer information to be passed to API
    """
    ref = Field(default='', validator=FieldsValidator.ref)
    type = Field(default='', validator=PayerValidator.type)
    title = Field(default='', validator=PayerValidator.title)
    firstname = Field(default='', validator=PayerValidator.firstname)
    surname = Field(default='', validator=PayerValidator.surname)
    company = Field(default='', validator=PayerValidator.surname)
    email = Field(default='', validator=PayerValidator.email)
    address = Field(default=None, validator=attr.validators.optional(attr.validators.instance_of(Address)))
    phonenumbers = Field(default=None, validator=attr.validators.optional(attr.validators.instance_of(PhoneNumbers)))

    object_fields = ['address', 'phonenumbers']
    xml_root_attributes = ['ref', 'type']
class ThreeDsVerifyEnrolled(ApiRequest, FieldsAmountMixin, FieldsCommentMixin):
    """
    Class representing a 3D Secure verifying card request to be sent to API.
    """
    card = Field(default=None, validator=attr.validators.instance_of(Card))

    object_fields = ['card']
    request_type = '3ds-verifyenrolled'

    def get_hash_values(self):
        return [self.timestamp, self.merchantid, self.orderid, self.amount, self.currency, self.card.number]
class DccRate(FieldsAmountMixin, FieldsCommentMixin, ApiRequest):
    """
    Class representing a DCC rate request to be sent to API.
    """
    card = Field(default=None, validator=attr.validators.instance_of(Card))
    dccinfo = Field(default=None,
                    validator=attr.validators.instance_of(DccInfoWithRateType))

    object_fields = ['card', 'dccinfo']
    request_type = 'dccrate'

    def get_hash_values(self):
        """
        Override function to get necessary hash values for this request
        :return: list
        """
        return [
            self.timestamp, self.merchantid, self.orderid, self.amount,
            self.currency, self.card.number
        ]
class Rebate(FieldsAmountMixin, FieldsCommentMixin, ApiRequest):
    """
    Class representing a rebate request to be sent to API.
    """
    pasref = Field(default='', validator=TransactionManagementValidator.pasref)
    authcode = Field(default='',
                     validator=TransactionManagementValidator.authcode)
    refundhash = Field(default=None, validator=RequestValidator.sha1hash)

    request_type = 'rebate'

    def get_hash_values(self):
        """
        Override function to get necessary hash values for this request
        :return: list
        """
        # Empty values represents amount and currency
        return [
            self.timestamp, self.merchantid, self.orderid, self.amount,
            self.currency, ''
        ]
Esempio n. 25
0
class Address(XmlMixin):
    """
    Class representing the address of the customer
    """
    line1 = Field(default='', validator=AddressValidator.string_fifty)
    line2 = Field(default='', validator=AddressValidator.string_fifty)
    line3 = Field(default='', validator=AddressValidator.string_fifty)
    city = Field(default='', validator=AddressValidator.string_fifty)
    county = Field(default='', validator=AddressValidator.string_fifty)
    country = Field(default='', validator=AddressValidator.string_fifty)
    code = Field(default='', validator=AddressValidator.code)
    postcode = Field(default='', validator=AddressValidator.postcode)

    xml_grouped_fields = [('country', 'code')]
Esempio n. 26
0
class ApiRequest(HashMixin, XmlMixin):
    """
    Super class representing a request to be sent to API.
    This class contains all common attributes and functions for all other classes.

    You can consult the specific documentation of all request fields on the website
    https://desarrolladores.addonpayments.com

    Subclasses values (fields to be defined in the subclasses):
        request_type            Type of the Addonpayments request (auth, receipt-in, payer-new, card-new, ...)
    Mixin HashMixin attributes:
        hash_fields             Hash a string made up of the request values
    Mixin XMLMixin attributes:
        xml_root_tag            If the object is a Request the root tag is <request attributes></ request>.
        xml_root_attributes     Normalized request objects always have timestamp and type attributes in the root tag
    """

    # Mandatory field
    merchantid = Field(validator=RequestValidator.merchant_id)
    type = Field(default=None)

    # Mandatory fields with auto-generation
    timestamp = Field(default=None, validator=RequestValidator.timestamp)
    orderid = Field(default=None, validator=RequestValidator.order_id)

    # Mandatory fields generated later
    sha1hash = Field(default=None, validator=RequestValidator.sha1hash)

    # Optional field
    account = Field(default='', validator=RequestValidator.account)

    # Static variables
    # Defined in subclasses
    request_type = ''
    # Default values for XmlMixin, all XML requests starts with <request type='' timestamp=''>
    xml_root_tag = 'request'
    xml_root_attributes = ['timestamp', 'type']

    def __attrs_post_init__(self):
        """
        This method will be called after the class is fully initialized.
        Uses method to set auto-generate values if they have not been initialized and request type
        """
        self.type = self.request_type
        gen_utl = GenerationUtils()
        if not self.timestamp:
            self.timestamp = gen_utl.generate_timestamp()
        if not self.orderid:
            self.orderid = gen_utl.generate_order_id()

    def hash(self, secret):
        """
        Set and validate sha1hash
        :param secret: string
        """
        self.sha1hash = self.generate_hash(secret)
        # Validate hash
        attr.validate(self)
        return self.sha1hash
class CardCancelRequest(ApiRequest, FieldsCommentMixin):
    """
    Class representing a card cancellation to be sent to API.
    """
    card = Field(default=None, validator=attr.validators.instance_of(CardRef))

    request_type = 'card-cancel-card'
    object_fields = ['card']

    def get_hash_values(self):
        """
        Override function to get necessary hash values for this request
        :return: list
        """
        return [self.timestamp, self.merchantid, self.card.payerref, self.card.ref]
class Void(FieldsCommentMixin, ApiRequest):
    """
    Class representing a void request to be sent to API.
    """
    pasref = Field(default='', validator=TransactionManagementValidator.pasref)

    request_type = 'void'

    def get_hash_values(self):
        """
        Override function to get necessary hash values for this request
        :return: list
        """
        # Empty values represents amount and currency
        return [self.timestamp, self.merchantid, self.orderid, '', '', '']
class PayerEditRequest(ApiRequest, FieldsCommentMixin):
    """
    Class representing a edit payer to be sent to API.
    """
    payer = Field(default=None, validator=attr.validators.instance_of(Payer))

    request_type = 'payer-edit'
    object_fields = ['payer']

    def get_hash_values(self):
        """
        Override function to get necessary hash values for this request
        :return: list
        """
        # Empty values represents amount and currency
        return [self.timestamp, self.merchantid, self.orderid, '', '', self.payer.ref]
class AuthRequest(ApiRequest, FieldsMixin, FieldsAmountMixin):
    """
    Class representing a authorisation request to be sent to API.
    """
    card = Field(default=None, validator=attr.validators.instance_of(Card))

    object_fields = ['card']
    flag_fields = ['autosettle']
    request_type = 'auth'

    def get_hash_values(self):
        """
        Override function to get necessary hash values for this request
        :return: list
        """
        return [
            self.timestamp, self.merchantid, self.orderid, self.amount,
            self.currency, self.card.number
        ]