2011-12-25 55 views
0

我正在開發一個應該有一些付款選項的小網店。我的平臺是Google App Engine和Python 2.7。有一個名爲satchmo的項目是django/python,我想知道我是否可以使用它的代碼? Here是開源的一些車型的付款:在GAE中使用Python 2.7進行網上商店付款處理?

class PaymentOption(models.Model): 
    """ 
    If there are multiple options - CC, Cash, COD, etc this class allows 
    configuration. 
    """ 
    description = models.CharField(_("Description"), max_length=20) 
    active = models.BooleanField(_("Active"), 
     help_text=_("Should this be displayed as an option for the user?")) 
    optionName = models.CharField(_("Option Name"), max_length=20, choices=iterchoices_db(payment.config.labelled_gateway_choices), 
     unique=True, 
     help_text=_("The class name as defined in payment.py")) 
    sortOrder = models.IntegerField(_("Sort Order")) 

    class Meta: 
     verbose_name = _("Payment Option") 
     verbose_name_plural = _("Payment Options") 

class CreditCardDetail(models.Model): 
    """ 
    Stores an encrypted CC number, its information, and its 
    displayable number. 
    """ 
    orderpayment = models.ForeignKey('shop.OrderPayment', unique=True, 
     related_name="creditcards") 
    credit_type = models.CharField(_("Credit Card Type"), max_length=16, choices=iterchoices_db(payment.config.credit_choices)) 
    display_cc = models.CharField(_("CC Number (Last 4 digits)"), 
     max_length=4,) 
    encrypted_cc = models.CharField(_("Encrypted Credit Card"), 
     max_length=40, blank=True, null=True, editable=False) 
    expire_month = models.IntegerField(_("Expiration Month")) 
    expire_year = models.IntegerField(_("Expiration Year")) 
    card_holder = models.CharField(_("card_holder Name"), max_length=60, blank=True) 
    start_month = models.IntegerField(_("Start Month"), blank=True, null=True) 
    start_year = models.IntegerField(_("Start Year"), blank=True, null=True) 
    issue_num = models.CharField(blank=True, null=True, max_length=2) 

    def storeCC(self, ccnum): 
     """Take as input a valid cc, encrypt it and store the last 4 digits in a visible form""" 
     self.display_cc = ccnum[-4:] 
     encrypted_cc = _encrypt_code(ccnum) 
     if config_value('PAYMENT', 'STORE_CREDIT_NUMBERS'): 
      self.encrypted_cc = encrypted_cc 
     else: 
      standin = "%s%i%i%i" % (self.display_cc, self.expire_month, self.expire_year, self.orderpayment.id) 
      self.encrypted_cc = _encrypt_code(standin) 
      key = _encrypt_code(standin + '-card') 
      keyedcache.cache_set(key, skiplog=True, length=60*60, value=encrypted_cc) 

    def setCCV(self, ccv): 
     """Put the CCV in the cache, don't save it for security/legal reasons.""" 
     if not self.encrypted_cc: 
      raise ValueError('CreditCardDetail expecting a credit card number to be stored before storing CCV') 

     keyedcache.cache_set(self.encrypted_cc, skiplog=True, length=60*60, value=ccv) 

    def getCCV(self): 
     try: 
      ccv = keyedcache.cache_get(self.encrypted_cc) 
     except keyedcache.NotCachedError: 
      ccv = "" 

     return ccv 

    ccv = property(fget=getCCV, fset=setCCV) 

    def _decryptCC(self): 
     ccnum = _decrypt_code(self.encrypted_cc) 
     if not config_value('PAYMENT', 'STORE_CREDIT_NUMBERS'): 
      try: 
       key = _encrypt_code(ccnum + '-card') 
       encrypted_ccnum = keyedcache.cache_get(key) 
       ccnum = _decrypt_code(encrypted_ccnum) 
      except keyedcache.NotCachedError: 
       ccnum = "" 
     return ccnum 

    decryptedCC = property(_decryptCC) 

    def _expireDate(self): 
     return(str(self.expire_month) + "/" + str(self.expire_year)) 
    expirationDate = property(_expireDate) 

    class Meta: 
     verbose_name = _("Credit Card") 
     verbose_name_plural = _("Credit Cards") 

def _decrypt_code(code): 
    """Decrypt code encrypted by _encrypt_code""" 
    # In some blowfish implementations, > 56 char keys can cause problems 
    secret_key = settings.SECRET_KEY[:56] 
    encryption_object = Blowfish.new(secret_key) 
    # strip padding from decrypted credit card number 
    return encryption_object.decrypt(base64.b64decode(code)).rstrip('X') 

def _encrypt_code(code): 
    """Quick encrypter for CC codes or code fragments""" 
    # In some blowfish implementations, > 56 char keys can cause problems 
    secret_key = settings.SECRET_KEY[:56] 
    encryption_object = Blowfish.new(secret_key) 
    # block cipher length must be a multiple of 8 
    padding = '' 
    if (len(code) % 8) <> 0: 
     padding = 'X' * (8 - (len(code) % 8)) 
    return base64.b64encode(encryption_object.encrypt(code + padding)) 

代碼看起來移植到App Engine,如果我想可能我甚至應該端口的代碼,以爲的Satchmo項目已經解決了很多的在實施我的網上商店時遇到的問題?或者我應該像在類似的問題中提到的那樣,在應用引擎上實際運行satchmo,從而獲得更多「django-friendly hosting」?

回答