class VendingMachine:
    def __init__(self):
        self.payment_processor = PaymentProcessor()
        self.message = 'Please insert money'

    def release_change(self):
        if self.payment_processor.is_payment_made():
            return 1
        else:
            return 0

    def insert_coin(self, count):
        self.payment_processor.make_payment(count)
        amount = float(self.payment_processor.payment_amount()) / 100.0
        self.message = "You have inserted $%s" % amount

    def buy_product(self):
        if self.payment_processor.is_payment_made():
            self.message = 'Enjoy!'
            self.payment_processor.reset()
            return 'product'
        else:
            raise RuntimeError("Cannot buy product without payment")

    def get_message(self):
        return self.message

    def reset(self):
        self.payment_processor.reset()
Example #2
0
def query(request):
    """
    Create a payment and show a payment query page.
    """

    import datetime
    from SP import Payment, PickledStorage
    from processor import PaymentProcessor

    Payment.set_storage(PickledStorage)

    methods = (("nordea", False),)

    code = datetime.datetime.now().strftime("%H%M%S")
    code = "e246df44a03058cb69b2aee147310cd0"
    payment = Payment(code=code)
    payment.set_payment_methods([m[0] for m in methods])
    payment.set_value("currency", "EUR")
    payment.set_value("language", "1")
    payment.set_value("message", "Payment test!")
    payment.set_value("amount", "1,00")
    payment.set_value("fi_reference", "3748")
    payment.save()

    forms = {}
    for method, tested in methods:
        pp = PaymentProcessor.get_processor(method)
        url = pp.URL
        url = "https://solo3.nordea.fi/cgi-bin/SOLOPM10"
        forms[method] = {"url": url, "form": payment.get_query_form(method), "tested": tested}

    context = {"forms": forms}

    return render_to_response("query.html", context)
Example #3
0
def checkout(request):
    """
    Create a payment and show a checkout page.
    """

    import datetime
    from payments import PaymentConnector
    from payments import PaymentProcessor
    from example.utils import PickledPaymentConnector

    # PaymentConnector.set_connector(PickledPaymentConnector)

    methods = (
        ("nordea", True),
        ("tapiola", True),
        #        ("sampo", False),
        #        ("op", True),
        #        ("samlink", True),
        #        ("luottokunta", True),
        #        ("spankki", True),
        #        ("paypal", False),
    )

    code = datetime.datetime.now().strftime("%H%M%S")
    p = {"currency": "EUR", "language": "en", "message": "Payment test!", "amount": "1.00", "fi_reference": "55"}

    payment = PickledPaymentConnector(code, p)

    payment.set_payment_methods([m[0] for m in methods])
    #    payment.add_item(price="42.00", qty="4", tax="0", description="widget")
    #    payment.add_item(price="12.00", qty="2", tax="0", description="choco")
    payment.save()

    forms = {}
    for method, tested in methods:
        pp = PaymentProcessor.get_processor(method)
        forms[method] = {
            "url": payment.get_checkout_url(method),
            "form": payment.get_checkout_params(method),
            "tested": tested,
        }

    context = {"forms": forms}

    return render_to_response("checkout.html", context)
Example #4
0
        "AAB_REJECT": "error",
    }

    PAYMENT_REQ_MAC = "AAB_MAC"
    PAYMENT_REQ_PARAMS = (
        ("AAB_VERSION", "data"),
        ("AAB_STAMP", "data"),
        ("AAB_RCV_ID", "data"),
        ("AAB_AMOUNT", "data"),
        ("AAB_REF", "data"),
        ("AAB_DATE", "data"),
        ("AAB_CUR", "data"),
        ("merchant_secret", "processor"),
    )
    PAYMENT_REQ_SEPARATOR = "&"

    PAYMENT_RESP_MAC = "AAB-RETURN-MAC"
    PAYMENT_RESP_PARAMS = (
        ("AAB-RETURN-VERSION", "GET"),
        ("AAB-RETURN-STAMP","GET"),
        ("AAB-RETURN-REF", "GET"),
        ("AAB-RETURN-PAID", "GET"),
        ("merchant_secret", "processor"),
    )
    PAYMENT_RESP_SEPARATOR = "&"

    COST_FIXED = "0.34"
    COST_PERCENTAGE = "0.00"

PaymentProcessor.register_processor(SpankkiPaymentProcessor)
Example #5
0
        order = ("VERSIO", "MYYJA", "KYSELYTUNNUS", "MAKSUTUNNUS",
                 "VIITE", "TARKISTE-VERSIO", "secret")

        s = ""
        for p in order:
            if p == "secret":
                s += self.get_setting("merchant_secret")
            else:
                s += data[p]

        import md5
        m = md5.new(s)
        data["TARKISTE"] = m.hexdigest().upper()
        
        con = urllib2.urlopen(self.QUERY_URL, urlencode(data))
        resp = con.read()
        print resp

        #respdata = cgi.parse_qs(resp)

        # No response MAC is sent.

        return

        if respdata["ReturnCode"] == "000":
            return (True, respdata)
        else:
            return (False, respdata)

PaymentProcessor.register_processor(OpPaymentProcessor)
Example #6
0
    """
    Payment processor for Aktia/SP/POP-maksu. Extends the generic
    Samlink payment processor.

    Features: authcap, (query)

    Region(s): FI

    Specifications:
      ??
    
    Merchant credentials for testing:
      merchant_key = "0000000000"
      merchant_secret = "11111111111111111111"

    Client credentials for testing:
      username = "******"
      password = "******"
    """

    METHOD = "aktia"

    URL = "https://verkkomaksu.inetpankki.samlink.fi/vm/login.html"
    QUERY_URL = "https://verkkomaksu.inetpankki.samlink.fi/vm/kysely.html"
    BUTTON_URL = "FIXME"

    COST_FIXED = "0.34"
    COST_PERCENTAGE = "0.00"
    
PaymentProcessor.register_processor(AktiaPaymentProcessor)
Example #7
0
        data["gsNextAkt"] = "InetPaySt"
        data["Version"] = "0001"
        data["gsResp"] = "S"
        
        order = ("secret", "MerchantID", "Refno")

        s = ""
        for p in order:
            if p == "secret":
                s += self.get_setting("merchant_secret")
            else:
                s += data[p]

        import md5
        m = md5.new(s)
        data["VerifyCode"] = m.hexdigest().upper()
        
        con = urllib2.urlopen(self.QUERY_URL, urlencode(data))
        resp = con.read()

        respdata = cgi.parse_qs(resp)

        # No response MAC is sent.

        if respdata["ReturnCode"] == "000":
            return (True, respdata)
        else:
            return (False, respdata)

PaymentProcessor.register_processor(SampoPaymentProcessor)
Example #8
0
        "NET_REJECT": "error",
    }

    PAYMENT_REQ_MAC = "NET_MAC"
    PAYMENT_REQ_PARAMS = (
        ("NET_VERSION", "data"),
        ("NET_STAMP", "data"),
        ("NET_SELLER_ID", "data"),
        ("NET_AMOUNT", "data"),
        ("NET_REF", "data"),
        ("NET_DATE", "data"),
        ("NET_CUR", "data"),
        ("merchant_secret", "processor"),
    )
    PAYMENT_REQ_SEPARATOR = "&"

    PAYMENT_RESP_MAC = "NET_RETURN_MAC"
    PAYMENT_RESP_PARAMS = (
        ("NET_RETURN_VERSION", "GET"),
        ("NET_RETURN_STAMP","GET"),
        ("NET_RETURN_REF", "GET"),
        ("NET_RETURN_PAID", "GET"),
        ("merchant_secret", "processor"),
    )
    PAYMENT_RESP_SEPARATOR = "&"

    COST_FIXED = "1.10"
    COST_PERCENTAGE = "0.00"

PaymentProcessor.register_processor(SppopPaymentProcessor)
Example #9
0
        for (var, source) in self.PAYMENT_RESP_PARAMS:
            if source == 'GET':
                s += request.GET.get(var, '')
            elif source == 'POST':
                s += request.POST.get(var, '')
            elif source == 'processor':
                s += self.get_parameter(var)
            elif source == 'payment':
                value = payment.get_value(var)
                if var == 'amount':
                    value = self.massage_amount(value)
                s += value
                
            elif source == 'fixed':
                s += var
            else:
                pass
            s += self.PAYMENT_RESP_SEPARATOR

        m = md5.new(s)
        return_mac = request.GET.get(self.PAYMENT_RESP_MAC, '')

        if m.hexdigest().upper() != return_mac.upper():
            raise PaymentInvalidMacError("Return MAC doesn't match!")

    @classmethod
    def massage_amount(self, value):
        return value.replace(".", "")

PaymentProcessor.register_processor(PaypalPaymentProcessor)
Example #10
0
        for (var, source) in self.PAYMENT_RESP_PARAMS:
            if source == 'GET':
                s += request.GET.get(var, '')
            elif source == 'POST':
                s += request.POST.get(var, '')
            elif source == 'processor':
                s += self.get_setting(var)
            elif source == 'payment':
                value = payment.get_value(var)
                if var == 'amount':
                    value = self.massage_amount(value)
                s += value
                
            elif source == 'fixed':
                s += var
            else:
                pass
            s += self.PAYMENT_RESP_SEPARATOR

        m = md5.new(s)
        return_mac = request.GET.get(self.PAYMENT_RESP_MAC, '')

        if m.hexdigest().upper() != return_mac.upper():
            raise PaymentInvalidMacError("Return MAC doesn't match!")

    @classmethod
    def massage_amount(self, value):
        return value.replace(".", "")

PaymentProcessor.register_processor(LuottokuntaPaymentProcessor)
 def __init__(self):
     self.payment_processor = PaymentProcessor()
     self.message = 'Please insert money'
Example #12
0
        xml = XML(resp)
        for e in xml.getiterator():
            if e.tag.startswith("SOLOPMT_"):
                respdata[e.tag] = e.text

        for p in REFUND_RESP_PARAMS:
            if p in respdata:
                macs += respdata[p] + "&"
                print "USE:", p
            else:
                print "NOT:", p
            # print "%s = %s" % (e.tag, e.text)
        macs += self.get_setting("merchant_secret") + "&"

        respmac = respdata["SOLOPMT_MAC"]

        import md5
        m = md5.new(macs)
        print "macs", macs
        print "MAC-A", m.hexdigest().upper()
        print "MAC-B", respmac

        from exceptions import PaymentInvalidMacError

        if respmac != m.hexdigest().upper():
            raise PaymentInvalidMacError("Response MAC is invalid.")

        return respdata

PaymentProcessor.register_processor(NordeaPaymentProcessor)
Example #13
0
        "AAB_REJECT": "error",
    }

    PAYMENT_REQ_MAC = "AAB_MAC"
    PAYMENT_REQ_PARAMS = (
        ("AAB_VERSION", "data"),
        ("AAB_STAMP", "data"),
        ("AAB_RCV_ID", "data"),
        ("AAB_AMOUNT", "data"),
        ("AAB_REF", "data"),
        ("AAB_DATE", "data"),
        ("AAB_CUR", "data"),
        ("merchant_secret", "processor"),
    )
    PAYMENT_REQ_SEPARATOR = "&"

    PAYMENT_RESP_MAC = "AAB-RETURN-MAC"
    PAYMENT_RESP_PARAMS = (
        ("AAB-RETURN-VERSION", "GET"),
        ("AAB-RETURN-STAMP","GET"),
        ("AAB-RETURN-REF", "GET"),
        ("AAB-RETURN-PAID", "GET"),
        ("merchant_secret", "processor"),
    )
    PAYMENT_RESP_SEPARATOR = "&"

    COST_FIXED = "0.35"
    COST_PERCENTAGE = "0.00"

PaymentProcessor.register_processor(TapiolaPaymentProcessor)