{ "info": { "author": "Joeri Bekker", "author_email": "joeri@maykinmedia.nl", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Framework :: Django", "Framework :: Django :: 1.11", "Framework :: Django :: 1.8", "Framework :: Django :: 2.0", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: Implementation :: CPython", "Topic :: Communications", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: System :: Distributed Computing" ], "description": "============\nPython iDEAL\n============\n\n:Version: 0.3.0\n:Download: https://pypi.python.org/pypi/ideal\n:Source: https://github.com/maykinmedia/python-ideal\n:Keywords: python, ideal, django\n\n|build-status| |coverage| |license| |pyversion|\n\nAbout\n=====\n\nImplementation of the iDEAL v3.3.1 specification in Python.\n\nInstallation\n============\n\nYou can install `ideal` either via the Python Package Index (PyPI) or from\nsource.\n\nTo install using ``pip``:\n\n.. code-block:: console\n\n $ pip install -U ideal\n\nUsage\n=====\n\nIt is assumed you have already requested access at your bank for iDEAL.\n\n#. Install the `ideal` library:\n\n .. code-block:: console\n\n $ pip install ideal\n\n#. Generate or locate your certificates (``cert.cer``, and ``priv.pem``) and your bank's public certificate (here named\n ``ideal_v3.cer`` but depends on your bank), and place them in a folder where your web application can access them.\n\n#. Create a config file called ``ideal.cfg`` (or copy and modify the ``ideal-example.cfg``)::\n\n [ideal]\n debug = 1\n private_key_file = priv.pem\n private_key_password = secret\n private_certificate = cert.cer\n certificates = ideal_v3.cer\n merchant_id = 123456789\n sub_id = 0\n merchant_return_url = https://www.example.com/ideal/callback/\n acquirer = ING\n\n4. In Python, make sure your settings are initialized by loading the config file:\n\n .. code-block:: python\n\n from ideal.conf import settings\n settings.load('ideal.cfg')\n\n # You may adjust (or completely define) your settings (capitalized) in Python as well\n settings.DEBUG = True\n\n5. After your settings are loaded, you can communicate with iDEAL:\n\n .. code-block:: python\n\n from ideal.client import IdealClient\n ideal = IdealClient()\n\n response = ideal.get_issuers()\n print response.issuers\n\n\nSettings\n========\n\nThese settings are lower-case and stored in your ``ideal.cfg`` file (or in Django's ``settings.py``, prefixed with\n``IDEAL_``).\n\n*DEBUG* (``boolean``)\n Uses the test URL of the acquirer if set to ``True``, otherwise the production URL is used (default: ``True``).\n\n*PRIVATE_KEY_FILE* (``string``)\n Absolute path to the merchant's private key (default: ``priv.pem``).\n\n*PRIVATE_KEY_PASSWORD* (``string``)\n Password to access the merchant's private key.\n\n*PRIVATE_CERTIFICATE* (``string``)\n Absolute path to the merchant's private certificate (default: ``cert.cer``).\n\n*CERTIFICATES* (``list`` or comma-separated ``string`` if file config is used)\n Absolute path the the acquirer's iDEAL certificate (default: ``ideal_v3.cer``).\n\n*MERCHANT_ID* (``string``)\n The ID of the online shop, received by the acceptor during the iDEAL registration process.\n\n*SUB_ID* (``string``)\n Sub ID of the online shop, also received during the registration process (default: ``0``).\n\n*MERCHANT_RETURN_URL* (``string``)\n The callback URL for iDEAL. The customer is redirected to this URL after the payment process at the acquirer.\n\n*EXPIRATION_PERIOD* (``string``)\n The time a transaction is valid for in ISO 8601 format, minimum is 1 minute, maximum is 1 hour\n (default: ``PT15M``).\n\n*ACQUIRER* (``string``)\n Acquirer code to identify the endpoint. Valid values are: [``ING``, ``RABOBANK``] (default: ``None``).\n\n*ACQUIRER_URL* (``string``)\n Overrides the default acquirer URL and ignores the ``ACQUIRER`` and ``DEBUG`` setting (default: ``None``).\n\n*LANGUAGE* (``string``)\n Response language in ISO 639-1 format, only Dutch (``nl``) and English (``en``) are supported (default: ``nl``).\n\n\nTesting\n=======\n\nTo run all unit tests, download the entire package and run:\n\n.. code-block:: console\n\n $ python setup.py test\n\n\nContrib\n=======\n\nDjango\n------\n\n1. All settings can be capitalized and prefixed with ``IDEAL_`` and placed in Django's ``settings.py`` file, rather\n than using a configuration file. Of course, you may still use the settings file method.\n\n2. Add ``ideal.contrib.django.ideal_compat`` to your ``INSTALLED_APPS``.\n\n3. Run ``python manage.py migrate`` to create the ``Issuer`` table in your database, to store a local\n copy of all issuers.\n\n4. Run ``python manage.py sync_issuers`` to fill the ``Issuer`` table with a list of issuers. You should run this\n command every day or so using a cronjob.\n\n5. You should create a view to handle the iDEAL callback and add the URL (as defined in your settings as\n ``MERCHANT_RETURN_URL``) to your ``urls.py``. Below, you'll find an example view to redirect the use depending on\n the transaction status:\n\n .. code-block:: python\n\n from django.views.generic.base import RedirectView\n from ideal.client import IdealClient, TransactionStatus\n from ideal.exceptions import IdealException\n\n class IdealCallbackView(RedirectView):\n permanent = False\n\n def get_redirect_url(self, **kwargs):\n \"\"\"\n Simplistic view to handle the callback. You probably want to update your database with the transaction\n status as well, or sent a confirmation email, etc.\n \"\"\"\n client = IdealClient()\n\n try:\n response = client.get_transaction_status(self.request.GET.get('trxid'))\n if response.status == TransactionStatus.SUCCESS:\n # Redirect to some view with a success message.\n return ''\n except IdealException, e:\n # Do something with the error message.\n error_message = e.message\n\n # Redirect to some view with a failure message.\n return ''\n\n6. Optionally, you can add the the following to your main ``urls.py`` to test your configuration and perform all iDEAL\n operations via a web interface:\n\n .. code-block:: python\n\n if settings.DEBUG:\n urlpatterns += [\n url(r'^ideal/tests/', include('ideal.contrib.django.ideal_compat.test_urls')),\n ]\n\n7. If you are in DEBUG mode and use ``runserver``, you can point your browser to:\n ``http://localhost:8000/ideal/tests/``.\n\n\n.. |build-status| image:: https://secure.travis-ci.org/maykinmedia/python-ideal.svg?branch=master\n :alt: Build status\n :target: https://travis-ci.org/maykinmedia/python-ideal\n\n.. |coverage| image:: https://codecov.io/github/maykinmedia/python-ideal/coverage.svg?branch=master\n :target: https://codecov.io/github/maykinmedia/python-ideal?branch=master\n\n.. |license| image:: https://img.shields.io/pypi/l/ideal.svg\n :alt: MIT License\n :target: https://opensource.org/licenses/MIT\n\n.. |pyversion| image:: https://img.shields.io/pypi/pyversions/ideal.svg\n :alt: Supported Python versions\n :target: http://pypi.python.org/pypi/python-ideal/\n\n\n", "description_content_type": null, "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/maykinmedia/python-ideal", "keywords": "python ideal django", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "ideal", "package_url": "https://pypi.org/project/ideal/", "platform": "any", "project_url": "https://pypi.org/project/ideal/", "project_urls": { "Homepage": "https://github.com/maykinmedia/python-ideal" }, "release_url": "https://pypi.org/project/ideal/0.3.0/", "requires_dist": [ "requests (>=1.2.0)", "lxml", "python-dateutil", "pyOpenSSL", "six" ], "requires_python": "", "summary": "Implementation of the iDEAL v3.3.1 specification in Python.", "version": "0.3.0" }, "last_serial": 5181000, "releases": { "0.2.0": [ { "comment_text": "", "digests": { "md5": "c74a4fe0c54c7aad52a80bfb35aa0f5c", "sha256": "feef2f11923df0066af3000c737b8f008c96b6513cdda7414bcf424b31625009" }, "downloads": -1, "filename": "ideal-0.2.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "c74a4fe0c54c7aad52a80bfb35aa0f5c", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 43750, "upload_time": "2018-02-12T16:38:38", "url": "https://files.pythonhosted.org/packages/1c/0d/7d9534f4a9949d8151bdd27629f0e398e35012b4b32f9f4da25ad98c35e7/ideal-0.2.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7ec68152c6fbf7dca8324004cf77f931", "sha256": "3f3820f82b4f8baaafa8ac901dbe3d799064c6424e79a046a79c71c79e6bf8c1" }, "downloads": -1, "filename": "ideal-0.2.0.tar.gz", "has_sig": false, "md5_digest": "7ec68152c6fbf7dca8324004cf77f931", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 33543, "upload_time": "2018-02-12T16:38:41", "url": "https://files.pythonhosted.org/packages/3d/66/8ad3b9c1bdae895a8e6fe0a4b47cbf42a8b20bcc4280a118ade85daf9e39/ideal-0.2.0.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "bcc1541191586fd46b9324daebc295fa", "sha256": "445212b3c312b9094e399fc9041710d24645bb76714a8e09632ca2679a5d54b1" }, "downloads": -1, "filename": "ideal-0.3.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "bcc1541191586fd46b9324daebc295fa", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 44306, "upload_time": "2018-02-21T17:13:11", "url": "https://files.pythonhosted.org/packages/5e/dd/b671144cea8b5143b9a5eaf8d5efd56f6cbc0f8780b39bdb48dafff9a4fa/ideal-0.3.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "544db84102d840ee8320d4b23bb5913b", "sha256": "f699475e0ae592056ed9e4a28d2d32ffc91950e4ed9de920ca9c7ff853a40749" }, "downloads": -1, "filename": "ideal-0.3.0.tar.gz", "has_sig": false, "md5_digest": "544db84102d840ee8320d4b23bb5913b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 34177, "upload_time": "2018-02-21T17:13:13", "url": "https://files.pythonhosted.org/packages/f3/0a/42d7b3d2adad42ab0306b8e0e8502ee128a2422a157675a7ef28f32117e4/ideal-0.3.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "bcc1541191586fd46b9324daebc295fa", "sha256": "445212b3c312b9094e399fc9041710d24645bb76714a8e09632ca2679a5d54b1" }, "downloads": -1, "filename": "ideal-0.3.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "bcc1541191586fd46b9324daebc295fa", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 44306, "upload_time": "2018-02-21T17:13:11", "url": "https://files.pythonhosted.org/packages/5e/dd/b671144cea8b5143b9a5eaf8d5efd56f6cbc0f8780b39bdb48dafff9a4fa/ideal-0.3.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "544db84102d840ee8320d4b23bb5913b", "sha256": "f699475e0ae592056ed9e4a28d2d32ffc91950e4ed9de920ca9c7ff853a40749" }, "downloads": -1, "filename": "ideal-0.3.0.tar.gz", "has_sig": false, "md5_digest": "544db84102d840ee8320d4b23bb5913b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 34177, "upload_time": "2018-02-21T17:13:13", "url": "https://files.pythonhosted.org/packages/f3/0a/42d7b3d2adad42ab0306b8e0e8502ee128a2422a157675a7ef28f32117e4/ideal-0.3.0.tar.gz" } ] }