2011-12-25 16 views
0

私はいくつかの支払いオプションが必要な小さなwebshopを開発しています。私のプラットフォームはGoogle App EngineとPython 2.7です。 django/pythonであるsatchmoというプロジェクトがあります。コードを使用できるのだろうか? Hereは、支払いのためにそのモデルのいくつかのオープンソースです:GAEのpython 2.7を使用したwebshopの支払い処理ですか?

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)) 

コードは、アプリエンジンへの移植に見えると私はしたい場合はI、あるいはポートこのコードがすべきは、サッチモのプロジェクトはすでにの多くを解決することを考えることができ私のwebshopを実装する際に直面する問題は何ですか?それとも、実際にappエンジンでsatchmoを実行しているのと同様の質問で示唆されているように、もっと「django-friendly hosting」を取得する必要がありますか?

答えて

3

多くの人がこれを試して諦めてあきらめたような気がします。アプリエンジンでsatchmoを実行するといくつかの問題があります。ほとんどはモデルや依存関係に関連していますが、PCI Complianceの問題もあります。

最初にPCIアスペクトに対処します - あなたのアカウントのプラグを引っ張る商人アカウントプロバイダの心配なしにクレジットカードデータを保存できるようにするには、PCI DSSに準拠する必要があります。これは、クレジットカードのデータとやりとりする場合、弁護士(ハ!)がセキュリティの基準を設定するために作成した文書です。これは、CVV2(カードの裏面に3桁のコード)を保存しないなど、ほとんどの場合のベストプラクティスです。しかし、1つの大きな側面は、使用されるストレージのセキュリティと関連しています。 Googleはこれを宣伝しませんが、App Engineとその独自のDBはPCIに準拠していないと確信しています。つまり、上に構築したものは決してPCIに準拠しません。

今、技術面。私が読んだことから、この仕事を得るための最善の策はdjango_nonrelです。いくつかのモデルを外部キーに依存しないように変更する必要があります。また、reportlabのようないくつかの依存関係が呼び出されています。ここではそのことについて話してポストです:http://groups.google.com/group/satchmo-developers/browse_thread/thread/f14053df13232615

そして最後にではなく、少なくとも、ここstackoverflowの上の古い議論があります:How to make Satchmo work in Google App Engine

一般的なコンセンサスは、サッチモはGAEに適していないということです。棚のソリューションではうまくいかないようですが、Paypalをご覧になることをおすすめします。https://www.x.com/devzone/articles/using-paypals-adaptive-payments-and-google-app-engine-build-online-market-python

また、このコードは必要なものに合わせることができます。彼らは、Googleのチェックアウトを使用している:https://stripe.com/

幸運: http://code.google.com/p/chippysshop/

最後に、クレジットカード取引のすべての種類を処理し、商人のアカウントを必要としないストライプを、あります!

+0

ありがとうございました。 GAEのPaypalの例は、Python 2.5 SDKを使用して私のために働いています。しかし、ithython 2.7にアップグレードすると、別の質問で投稿したというエラーメッセージが表示されます。 –

関連する問題