ここに私が求めている質問の序章があります:私は私の会社のためにPythonでゲートウェイに依存しない支払いAPIを構築しました。現時点では、Authorize.netをサポートするためのコードしか書いておらず、Pythonプログラマーの私のAPI設計の明快さに関するいくつかのフィードバックを、Iよりも少し経験したいと思っていました。これはPythonのAPI設計戦略ですか?
私は自分自身をロールしました。存在感があると思っている人や、Authorize.net特有のものです(私はもっとクリーンなインターフェースでより一般的なパッケージを書いています)。私は特にパッケージ(pythorize)からインスピレーションを得ましたが、そのAPIが嫌いでした。
私がやっていることを説明する前に、パッケージのbitbucketの公開リポジトリへのリンクは次のとおりです:paypy(コードは安定していますが、文書はひどく欠けています。
私の現在の戦略は、ネストされた辞書を使用して、それを支払いメソッドクラスのコンストラクタに渡すことです。 Authorize.net CIMのAPIで新しいユーザープロファイルを作成する例:
>>> options = {'tran_key' : 'test_tran_key',
... 'login' : 'developer_login',
... 'testing' : True,
... 'validation': 'testMode',
... 'customer': {'description': 'Some description of the customer profile',
... 'id' : 22,
... 'email' : '[email protected]'},
... 'billing': [{'type': 'individual',
... 'profile': {'city' : 'Carlsbad',
... 'state' : 'California',
... 'zip' : '92009',
... 'firstname' : 'John',
... 'address' : '12 Alicante Rd. Suite 9',
... 'lastname' : 'Doe',
... 'country' : 'USA',
... 'phone' : '(858) 557-2674'},
... 'payment': {'card': {'ccv' : '524',
... 'number' : '4111111111111111',
... 'expiration' : '2014-04'}}},
... {'type' : 'individual',
... 'profile' : {'city' : 'Las Vegas',
... 'state' : 'Nevada',
... 'zip' : '79112',
... 'firstname' : 'John',
... 'address' : '78 Cloud Front',
... 'lastname' : 'Doe',
... 'country' : 'USA',
... 'phone' : '(858) 557-2674'},
... 'payment': {'card': {'ccv' : '499',
... 'number' : '4111111111111111',
... 'expiration' : '2012-11'}}},
... {'profile': {'city' : 'Carlsbad',
... 'state' : 'California',
... 'zip' : '92009',
... 'firstname' : 'John',
... 'address' : '12 Alicante Rd. Suite 9',
... 'lastname' : 'Doe',
... 'company' : 'Xmarks',
... 'country' : 'USA',
... 'phone' : '(858) 557-2674'},
... 'payment': {'bank': {'name_on_account' : 'John Doe',
... 'account' : '829330184383',
... 'type' : 'checking',
... 'name' : 'Bank of America',
... 'routing' : '122400724'}}}],
... 'shipping': [{'city' : 'Carlsbad',
... 'state' : 'California',
... 'zip' : '92009',
... 'firstname' : 'John',
... 'address' : '12 Alicante Rd. Suite 9',
... 'lastname' : 'Doe',
... 'country' : 'USA',
... 'phone' : '(858) 557-2674'}]}
>>> profile = Profile(options)
>>> result = profile.create()
>>> result.code
'I00001'
>>> print 'Customer Profile ID:' + str(result)
Customer Profile ID: 2758851
>>> print 'Customer Payment Profile IDs:' + repr(result.payment_ids)
Customer Payment Profile IDs: ['2380878', '2380879', '2380880']
>>> print 'Customer Shipping Profile IDs:' + repr(result.shipping_ids)
Customer Shipping Profile IDs: ['2427568']
>>>
>>>
>>> options = {'id' : str(result),
... 'tran_key' : '86U5pvA9TcxZ5b8D',
... 'testing' : True,
... 'login' : '5b3PhGX68'}
>>> profile = Profile(options)
>>> result = profile.remove()
>>> result.code
'I00001'
>>> ^D
あなたは、私が使う魔法のメソッドのカップルわかります(strのよう、など...)結果オブジェクトのために。私はAIMやARBメソッドの辞書戦略を使って、支払いAPIに "オプション"を伝える最も簡単な方法だと思っていました.-ある時点で、GoogleCheckout、Paypalなどのアダプターがあるでしょう。
私が持っていたもう一つの考えは、ディクショナリの代わりにディスクリプタとオブジェクトを使用してオプションデータをアダプタに伝えることでした。
すべてのペイメントゲートウェイAPI(特にPayPalとAuthorize.net)と同様に、インターフェイスはちょっと面倒な傾向があり、どのような方法でも標準化されていないため、一部のゲートウェイ依存オプションを回避することは困難です。
なぜこれを対話型コンソールで行ったのですか? –
私は実際にはしませんでした。これはテストの抜粋です。コードとその結果を対話形式のプロンプトで出力したように書式を設定したので、理解しやすくなります。 – Ixmatus
これはjsonのようです。 jsonと互換性がありますか?これはかなり標準的なAPIであると私は思います。 – Falmarri