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()
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)
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)
"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)
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)
""" 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)
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)
"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)
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)
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'
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)
"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)