示例#1
0
    def __init__(self, **kwargs):
        super(AuthNetConnection, self).__init__(**kwargs)

        server = TEST_SERVER if self.test_mode else LIVE_SERVER
        self.cc = CcProcessor(server=server, login=self.auth["login"], key=self.auth["key"])

        self.arb = arb.Api(is_test=self.test_mode, login=u"%s" % self.auth["login"], key=u"%s" % self.auth["key"])
 def processor(self):
     options = IAuthorizeNetOptions(self.context)
     server = self._sites.get(options.server_url)
     cc = CcProcessor(server=server,
                      login=options.merchant_id,
                      key=options.merchant_key)
     return cc
示例#3
0
class AuthNetConnection(OnlinePaymentBase):
    # map codes to exceptions - tuples denote ranges
    CODE_MAP = OnlinePaymentBase._explode_map(
        {
            2: OnlinePaymentBase.TransactionDeclined,
            3: OnlinePaymentBase.TransactionDeclined,
            4: OnlinePaymentBase.TransactionDeclined,
            5: OnlinePaymentBase.AmountInvalid,
            6: OnlinePaymentBase.CardNumberInvalid,
            7: OnlinePaymentBase.CardExpirationInvalid,
            8: OnlinePaymentBase.CardExpired,
            11: OnlinePaymentBase.DuplicateTransaction,
            13: OnlinePaymentBase.AuthError,
            17: OnlinePaymentBase.InvalidCardType,
            (19, 23): OnlinePaymentBase.TryAgainLater,
            (25, 26): OnlinePaymentBase.TryAgainLater,
            27: OnlinePaymentBase.AVSFailure,
            28: OnlinePaymentBase.InvalidCardType,
            37: OnlinePaymentBase.CardNumberInvalid,
            41: OnlinePaymentBase.FraudCheckFailed,
            (44, 45): OnlinePaymentBase.CCVInvalid,
            49: OnlinePaymentBase.AmountTooHigh,
            (57, 63): OnlinePaymentBase.TryAgainLater,
            65: OnlinePaymentBase.TransactionDeclined,
            78: OnlinePaymentBase.CCVInvalid,
            251: OnlinePaymentBase.FraudCheckFailed,
            (252, 253): OnlinePaymentBase.AcceptedForReview,
            315: OnlinePaymentBase.CardNumberInvalid,
            316: OnlinePaymentBase.CardExpirationInvalid,
            317: OnlinePaymentBase.CardExpired,
            318: OnlinePaymentBase.DuplicateTransaction,
            "E00012": OnlinePaymentBase.DuplicateTransaction,
            "E00035": OnlinePaymentBase.RecurringOrderDoesNotExist,
        }
    )

    # field map is empty for auth.net - API was based on auth.net so
    # all the names are the same
    FIELD_MAP = {
        "recurring_id": "subscription_id",
        "recurring_start": "start_date",
        "recurring_total_occurrences": "total_occurrences",
        "recurring_period": "interval_unit",
        "recurring_interval_length": "interval_length",
    }

    def __init__(self, **kwargs):
        super(AuthNetConnection, self).__init__(**kwargs)

        server = TEST_SERVER if self.test_mode else LIVE_SERVER
        self.cc = CcProcessor(server=server, login=self.auth["login"], key=self.auth["key"])

        self.arb = arb.Api(is_test=self.test_mode, login=u"%s" % self.auth["login"], key=u"%s" % self.auth["key"])

    def validate_auth(self, auth):
        if not "login" in auth:
            raise InvalidAuthException("Missing required 'login' parameter.")
        if not "key" in auth:
            raise InvalidAuthException("Missing required 'key' parameter.")

    def authorize(self, **kwargs):
        # check and process params
        kwargs = self._process_params(kwargs)

        # from warnings import warn
        # warn(self.cc.connection.formatRequest(kwargs))

        auth_result = self.cc.authorize(**kwargs)
        result = self._munge_result(auth_result)

        self._handle_errors(result)

        return result

    def capture(self, **kwargs):
        # check and process params
        kwargs = self._process_params(kwargs)

        cap_result = self.cc.captureAuthorized(**kwargs)
        result = self._munge_result(cap_result)

        self._handle_errors(result)

        return result

    def sale(self, **kwargs):
        # do this in two steps since zc.authdotnet doesn't have
        # AUTH_CAPTURE support yet - probably worth patching to fix
        result = self.authorize(**kwargs)
        self.capture(trans_id=result.orig.trans_id)

        return result

    def credit(self, **kwargs):
        # check and process params
        kwargs = self._process_params(kwargs)

        credit_result = self.cc.credit(**kwargs)
        result = self._munge_result(credit_result)

        self._handle_errors(result)

        return result

    def void(self, **kwargs):
        # check and process params
        kwargs = self._process_params(kwargs)

        void_result = self.cc.void(**kwargs)
        result = self._munge_result(void_result)

        self._handle_errors(result)

        return result

    def recurring_order_create(self, **kwargs):

        if "recurring_total_occurrences" in kwargs and (
            kwargs["recurring_total_occurrences"] == 0 or kwargs["recurring_total_occurrences"] == "0"
        ):

            kwargs["recurring_total_occurrences"] = "9999"
            # authorize.net's "infinity"

        if "recurring_interval_length" not in kwargs:
            kwargs["recurring_interval_length"] = 1

        return self._recurring_call(self.arb.create_subscription, **kwargs)

    def recurring_order_update(self, **kwargs):
        return self._recurring_call(self.arb.update_subscription, **kwargs)

    def recurring_order_cancel(self, **kwargs):
        return self._recurring_call(self.arb.cancel_subscription, **kwargs)

    def recurring_order_payments(self, **kwargs):
        raise Exception(
            "Authorize.NET does not support querying a "
            "recurring order for payment history. You "
            "should complain to them too."
        )

    def _recurring_call(self, call, **kwargs):

        kwargs = self._convert_to_unicode(kwargs)
        kwargs["extra_field_map"] = {
            "exp_date": "expiration_date",
            "card_num": "card_number",
            "first_name": "bill_first_name",
            "last_name": "bill_last_name",
            "company": "bill_company",
            "address": "bill_address",
            "city": "bill_city",
            "state": "bill_state",
            "zip": "bill_zip",
            "country": "bill_country",
        }

        kwargs = self._process_params(kwargs)

        if self.debug:
            self.log.debug("Recurring Calling: %s" % repr(kwargs))

        result = call(**kwargs)
        result = self._recurring_munge_result(result)

        self._handle_errors(result)

        return result

    def _convert_to_unicode(self, params):
        result = {}
        for param, value in params.items():
            result[param] = u"%s" % value
        return result

    def _recurring_munge_result(self, orig):
        if self.debug:
            self.log.debug("Recurring Result: %s" % repr(orig))

        result = {}

        response = orig["messages"]

        # authorize has the worst XML parser *ever*
        result["code"] = u"%s" % response["message"]["code"]["text_"]
        result["message"] = u"%s" % response["message"]["text"]["text_"]
        result["orig"] = orig

        result_code = u"%s" % response["result_code"]["text_"]
        result["success"] = True if result_code == u"Ok" else False

        if "subscription_id" in orig:
            result["recurring_id"] = orig["subscription_id"]["text_"]
        else:
            result["recurring_id"] = None

        result["trans_id"] = None

        if self.debug:
            self.log.debug("Recurring Munged: %s" % repr(result))

        return OnlinePaymentRecurringResult(**result)

    def _munge_result(self, orig):
        if self.debug:
            self.log.debug("Result: %s" % repr(orig.__dict__))

        result = {}

        result["code"] = int(orig.response_reason_code)
        result["message"] = orig.response_reason
        result["success"] = True if result["code"] == 1 else False
        result["trans_id"] = orig.trans_id
        result["orig"] = orig

        return OnlinePaymentResult(**result)