# Garpix CloudPayments
Прием платажей с CloudPayments.
## Быстрый старт
Установите через pipenv:
```bash
pipenv install garpix_cloudpayments
```
Добавьте `garpix_cloudpayments` в `INSTALLED_APPS` и укажите адрес для миграций:
```python
# settings.py
INSTALLED_APPS += [
'garpix_cloudpayments',
]
MIGRATION_MODULES = {
# ...
}
MIGRATION_MODULES['garpix_cloudpayments'] = 'app.migrations.garpix_cloudpayments'
```
Создайте директории и файлы:
```bash
backend/app/migrations/garpix_cloudpayments/
backend/app/migrations/garpix_cloudpayments/__init__.py
```
Сделайте миграции и мигрируйте:
```bash
python3 backend/manage.py makemigrations
python3 backend/manage.py migrate
```
Добавьте пути в `urls.py`:
```python
from django.urls import path, include
urlpatterns = [
path('cloudpayments/', include('garpix_cloudpayments.urls')),
# ...
]
```
Также, добавьте в личном кабинете CloudPayments ссылки на эти коллбеки:
* `Pay уведомление` => `https://example.com/cloudpayments/pay/`
* `Fail уведомление` => `https://example.com/cloudpayments/fail/`
После этого необходимо зайти в административную панель и добавить публичный ключ из личного кабинета CloudPayments.
При изменении статуса платежа, дергается функция, указанная в `app/settings.py` (вы можете поменять на свою функцию и указать путь до нее):
```
# app/settings.py
GARPIX_PAYMENT_STATUS_CHANGED_CALLBACK = 'garpix_payment.callbacks.empty_callback'
```
Пример функции:
```python
from garpix_cloudpayments.models.choices import PAYMENT_STATUS_COMPLETED, PAYMENT_STATUS_CANCELLED, PAYMENT_STATUS_DECLINED
def my_callback(payment):
if payment.status == PAYMENT_STATUS_COMPLETED:
print('Меняем статус заказа на успешный')
elif payment.status in (PAYMENT_STATUS_CANCELLED, PAYMENT_STATUS_DECLINED):
print('Заказ провален')
else:
print('Можем тоже использовать')
```
Ниже пример работы на фронтенде (до вызова точки `/cloudpayments/payment_data/` необходимо создать объект модели `Payment`):
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Garpix CloudPayments</title>
<script src="https://widget.cloudpayments.ru/bundles/cloudpayments"></script>
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
</head>
<body>
<label>Номер заказа (payment_uuid):<input type="text" value="1" name="payment_uuid" class="jsPaymentUUID"></label>
<button onclick="getDataAndPay(); return false;">Оплатить</button>
<script>
function getDataAndPay() {
var paymentUUID = document.querySelector('.jsPaymentUUID').value;
axios.get('/cloudpayments/payment_data/?payment_uuid=' + paymentUUID)
.then(function (paymentData) {
console.log(paymentData);
pay(paymentData);
})
}
function pay(paymentData) {
var widget = new cp.CloudPayments();
widget.pay('auth', // или 'charge'
paymentData,
{
onSuccess: function (options) { // success
//действие при успешной оплате
alert('success');
},
onFail: function (reason, options) { // fail
//действие при неуспешной оплате
alert('fail');
},
onComplete: function (paymentResult, options) { //Вызывается как только виджет получает от api.cloudpayments ответ с результатом транзакции.
//например вызов вашей аналитики Facebook Pixel
alert('complete')
}
}
)
};
</script>
</body>
</html>
```
# Changelog
See [CHANGELOG.md](CHANGELOG.md).
# Contributing
See [CONTRIBUTING.md](CONTRIBUTING.md).
# License
[MIT](LICENSE)
---
Developed by Garpix / [https://garpix.com](https://garpix.com)
Raw data
{
"_id": null,
"home_page": "https://github.com/garpixcms/garpix_cloudpayments",
"name": "garpix-cloudpayments",
"maintainer": "",
"docs_url": null,
"requires_python": "",
"maintainer_email": "",
"keywords": "",
"author": "Garpix LTD",
"author_email": "info@garpix.com",
"download_url": "https://files.pythonhosted.org/packages/5c/d1/60666bba08a5592de16b5ddeda6cbb9c800e96fa810d3e4aae67e7259556/garpix_cloudpayments-1.2.0.tar.gz",
"platform": null,
"description": "# Garpix CloudPayments\n\n\u041f\u0440\u0438\u0435\u043c \u043f\u043b\u0430\u0442\u0430\u0436\u0435\u0439 \u0441 CloudPayments.\n\n## \u0411\u044b\u0441\u0442\u0440\u044b\u0439 \u0441\u0442\u0430\u0440\u0442\n\n\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 \u0447\u0435\u0440\u0435\u0437 pipenv:\n\n```bash\npipenv install garpix_cloudpayments\n```\n\n\u0414\u043e\u0431\u0430\u0432\u044c\u0442\u0435 `garpix_cloudpayments` \u0432 `INSTALLED_APPS` \u0438 \u0443\u043a\u0430\u0436\u0438\u0442\u0435 \u0430\u0434\u0440\u0435\u0441 \u0434\u043b\u044f \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0439:\n\n```python\n# settings.py\n\nINSTALLED_APPS += [\n 'garpix_cloudpayments',\n]\nMIGRATION_MODULES = {\n # ...\n}\nMIGRATION_MODULES['garpix_cloudpayments'] = 'app.migrations.garpix_cloudpayments'\n```\n\n\u0421\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u0438 \u0444\u0430\u0439\u043b\u044b:\n\n```bash\nbackend/app/migrations/garpix_cloudpayments/\nbackend/app/migrations/garpix_cloudpayments/__init__.py\n```\n\n\u0421\u0434\u0435\u043b\u0430\u0439\u0442\u0435 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 \u0438 \u043c\u0438\u0433\u0440\u0438\u0440\u0443\u0439\u0442\u0435:\n\n```bash\npython3 backend/manage.py makemigrations\npython3 backend/manage.py migrate\n```\n\n\u0414\u043e\u0431\u0430\u0432\u044c\u0442\u0435 \u043f\u0443\u0442\u0438 \u0432 `urls.py`:\n\n```python\nfrom django.urls import path, include\n\nurlpatterns = [\n path('cloudpayments/', include('garpix_cloudpayments.urls')),\n # ...\n]\n```\n\n\u0422\u0430\u043a\u0436\u0435, \u0434\u043e\u0431\u0430\u0432\u044c\u0442\u0435 \u0432 \u043b\u0438\u0447\u043d\u043e\u043c \u043a\u0430\u0431\u0438\u043d\u0435\u0442\u0435 CloudPayments \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u044d\u0442\u0438 \u043a\u043e\u043b\u043b\u0431\u0435\u043a\u0438:\n\n* `Pay \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0435` => `https://example.com/cloudpayments/pay/`\n\n* `Fail \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0435` => `https://example.com/cloudpayments/fail/`\n\n\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0437\u0430\u0439\u0442\u0438 \u0432 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u0438\u0432\u043d\u0443\u044e \u043f\u0430\u043d\u0435\u043b\u044c \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 \u0438\u0437 \u043b\u0438\u0447\u043d\u043e\u0433\u043e \u043a\u0430\u0431\u0438\u043d\u0435\u0442\u0430 CloudPayments.\n\n\u041f\u0440\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u0441\u0442\u0430\u0442\u0443\u0441\u0430 \u043f\u043b\u0430\u0442\u0435\u0436\u0430, \u0434\u0435\u0440\u0433\u0430\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u0430\u044f \u0432 `app/settings.py` (\u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043d\u0430 \u0441\u0432\u043e\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0443\u0442\u044c \u0434\u043e \u043d\u0435\u0435):\n\n```\n# app/settings.py\n\nGARPIX_PAYMENT_STATUS_CHANGED_CALLBACK = 'garpix_payment.callbacks.empty_callback'\n```\n\n\u041f\u0440\u0438\u043c\u0435\u0440 \u0444\u0443\u043d\u043a\u0446\u0438\u0438:\n\n```python\nfrom garpix_cloudpayments.models.choices import PAYMENT_STATUS_COMPLETED, PAYMENT_STATUS_CANCELLED, PAYMENT_STATUS_DECLINED\n\n\ndef my_callback(payment):\n if payment.status == PAYMENT_STATUS_COMPLETED:\n print('\u041c\u0435\u043d\u044f\u0435\u043c \u0441\u0442\u0430\u0442\u0443\u0441 \u0437\u0430\u043a\u0430\u0437\u0430 \u043d\u0430 \u0443\u0441\u043f\u0435\u0448\u043d\u044b\u0439')\n elif payment.status in (PAYMENT_STATUS_CANCELLED, PAYMENT_STATUS_DECLINED):\n print('\u0417\u0430\u043a\u0430\u0437 \u043f\u0440\u043e\u0432\u0430\u043b\u0435\u043d')\n else:\n print('\u041c\u043e\u0436\u0435\u043c \u0442\u043e\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c')\n```\n\n\u041d\u0438\u0436\u0435 \u043f\u0440\u0438\u043c\u0435\u0440 \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0430 \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434\u0435 (\u0434\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u0442\u043e\u0447\u043a\u0438 `/cloudpayments/payment_data/` \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442 \u043c\u043e\u0434\u0435\u043b\u0438 `Payment`):\n\n```html\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <title>Garpix CloudPayments</title>\n <script src=\"https://widget.cloudpayments.ru/bundles/cloudpayments\"></script>\n <script src=\"https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js\"></script>\n</head>\n<body>\n\n<label>\u041d\u043e\u043c\u0435\u0440 \u0437\u0430\u043a\u0430\u0437\u0430 (payment_uuid):<input type=\"text\" value=\"1\" name=\"payment_uuid\" class=\"jsPaymentUUID\"></label>\n<button onclick=\"getDataAndPay(); return false;\">\u041e\u043f\u043b\u0430\u0442\u0438\u0442\u044c</button>\n\n<script>\n function getDataAndPay() {\n var paymentUUID = document.querySelector('.jsPaymentUUID').value;\n axios.get('/cloudpayments/payment_data/?payment_uuid=' + paymentUUID)\n .then(function (paymentData) {\n console.log(paymentData);\n pay(paymentData);\n })\n }\n\n\n function pay(paymentData) {\n var widget = new cp.CloudPayments();\n widget.pay('auth', // \u0438\u043b\u0438 'charge'\n paymentData,\n {\n onSuccess: function (options) { // success\n //\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043f\u0440\u0438 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0439 \u043e\u043f\u043b\u0430\u0442\u0435\n alert('success');\n },\n onFail: function (reason, options) { // fail\n //\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043f\u0440\u0438 \u043d\u0435\u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0439 \u043e\u043f\u043b\u0430\u0442\u0435\n alert('fail');\n },\n onComplete: function (paymentResult, options) { //\u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u0438\u0434\u0436\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043e\u0442 api.cloudpayments \u043e\u0442\u0432\u0435\u0442 \u0441 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438.\n //\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0432\u044b\u0437\u043e\u0432 \u0432\u0430\u0448\u0435\u0439 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438 Facebook Pixel\n alert('complete')\n }\n }\n )\n };\n</script>\n</body>\n</html>\n```\n\n# Changelog\n\nSee [CHANGELOG.md](CHANGELOG.md).\n\n# Contributing\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md).\n\n# License\n\n[MIT](LICENSE)\n\n---\n\nDeveloped by Garpix / [https://garpix.com](https://garpix.com)\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "",
"version": "1.2.0",
"split_keywords": [],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "976bae12caf5c24758988683e042c8f0d99d6de4ed59274c7ebffe9622de00c4",
"md5": "562fe54c0f8bad98499ededad834c268",
"sha256": "3ce2c20724b2165f3db3a539f9205bda0c1b3b9c384b237d711db4fdb80a77fb"
},
"downloads": -1,
"filename": "garpix_cloudpayments-1.2.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "562fe54c0f8bad98499ededad834c268",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": null,
"size": 25293,
"upload_time": "2023-02-09T07:15:27",
"upload_time_iso_8601": "2023-02-09T07:15:27.120077Z",
"url": "https://files.pythonhosted.org/packages/97/6b/ae12caf5c24758988683e042c8f0d99d6de4ed59274c7ebffe9622de00c4/garpix_cloudpayments-1.2.0-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "5cd160666bba08a5592de16b5ddeda6cbb9c800e96fa810d3e4aae67e7259556",
"md5": "942cab64f53d2fd435da2f780f8e02bf",
"sha256": "5f20946ef98692830be0479c539c81001895149a2a09e9feea4494e0d9d9cc20"
},
"downloads": -1,
"filename": "garpix_cloudpayments-1.2.0.tar.gz",
"has_sig": false,
"md5_digest": "942cab64f53d2fd435da2f780f8e02bf",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 15912,
"upload_time": "2023-02-09T07:15:29",
"upload_time_iso_8601": "2023-02-09T07:15:29.280354Z",
"url": "https://files.pythonhosted.org/packages/5c/d1/60666bba08a5592de16b5ddeda6cbb9c800e96fa810d3e4aae67e7259556/garpix_cloudpayments-1.2.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2023-02-09 07:15:29",
"github": true,
"gitlab": false,
"bitbucket": false,
"github_user": "garpixcms",
"github_project": "garpix_cloudpayments",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"lcname": "garpix-cloudpayments"
}