From 8bb48b637579d546628a215902108200631f68d7 Mon Sep 17 00:00:00 2001
From: Ajmalcybrosys
Date: Thu, 28 Nov 2019 10:10:38 +0530
Subject: [PATCH] [ADD] Initial Commit 'paytm_payment_gateway'
---
paytm_payment_gateway/README.md | 32 ++
paytm_payment_gateway/__init__.py | 23 ++
paytm_payment_gateway/__manifest__.py | 47 +++
paytm_payment_gateway/controllers/__init__.py | 22 ++
.../controllers/controllers.py | 41 +++
paytm_payment_gateway/data/data.xml | 17 +
paytm_payment_gateway/doc/RELEASE_NOTES.md | 4 +
paytm_payment_gateway/models/__init__.py | 22 ++
paytm_payment_gateway/models/models.py | 241 ++++++++++++++
.../security/ir.model.access.csv | 2 +
.../static/description/banner.gif | Bin 0 -> 463167 bytes
.../static/description/icon.png | Bin 0 -> 33339 bytes
.../images/AccountingreportsExcel.png | Bin 0 -> 127361 bytes
.../static/description/images/Dynamic.png | Bin 0 -> 114408 bytes
.../static/description/images/biometric.jpeg | Bin 0 -> 217489 bytes
.../description/images/check_out_details.png | Bin 0 -> 53027 bytes
.../static/description/images/checked.png | Bin 0 -> 15093 bytes
.../static/description/images/checkout.png | Bin 0 -> 75235 bytes
.../static/description/images/cybrosys.png | Bin 0 -> 52522 bytes
.../static/description/images/enable.png | Bin 0 -> 58005 bytes
.../description/images/mobile_service.jpeg | Bin 0 -> 54515 bytes
.../static/description/images/paytm.gif | Bin 0 -> 912127 bytes
.../static/description/images/paytm.png | Bin 0 -> 103849 bytes
.../description/images/sales_incentives.png | Bin 0 -> 132890 bytes
.../static/description/images/we2.jpeg | Bin 0 -> 133172 bytes
.../static/description/index.html | 308 ++++++++++++++++++
paytm_payment_gateway/views/templates.xml | 16 +
paytm_payment_gateway/views/views.xml | 29 ++
28 files changed, 804 insertions(+)
create mode 100644 paytm_payment_gateway/README.md
create mode 100644 paytm_payment_gateway/__init__.py
create mode 100644 paytm_payment_gateway/__manifest__.py
create mode 100644 paytm_payment_gateway/controllers/__init__.py
create mode 100644 paytm_payment_gateway/controllers/controllers.py
create mode 100644 paytm_payment_gateway/data/data.xml
create mode 100644 paytm_payment_gateway/doc/RELEASE_NOTES.md
create mode 100644 paytm_payment_gateway/models/__init__.py
create mode 100644 paytm_payment_gateway/models/models.py
create mode 100644 paytm_payment_gateway/security/ir.model.access.csv
create mode 100644 paytm_payment_gateway/static/description/banner.gif
create mode 100644 paytm_payment_gateway/static/description/icon.png
create mode 100644 paytm_payment_gateway/static/description/images/AccountingreportsExcel.png
create mode 100644 paytm_payment_gateway/static/description/images/Dynamic.png
create mode 100644 paytm_payment_gateway/static/description/images/biometric.jpeg
create mode 100644 paytm_payment_gateway/static/description/images/check_out_details.png
create mode 100644 paytm_payment_gateway/static/description/images/checked.png
create mode 100644 paytm_payment_gateway/static/description/images/checkout.png
create mode 100644 paytm_payment_gateway/static/description/images/cybrosys.png
create mode 100644 paytm_payment_gateway/static/description/images/enable.png
create mode 100644 paytm_payment_gateway/static/description/images/mobile_service.jpeg
create mode 100644 paytm_payment_gateway/static/description/images/paytm.gif
create mode 100644 paytm_payment_gateway/static/description/images/paytm.png
create mode 100644 paytm_payment_gateway/static/description/images/sales_incentives.png
create mode 100644 paytm_payment_gateway/static/description/images/we2.jpeg
create mode 100644 paytm_payment_gateway/static/description/index.html
create mode 100644 paytm_payment_gateway/views/templates.xml
create mode 100644 paytm_payment_gateway/views/views.xml
diff --git a/paytm_payment_gateway/README.md b/paytm_payment_gateway/README.md
new file mode 100644
index 000000000..b2d0fee95
--- /dev/null
+++ b/paytm_payment_gateway/README.md
@@ -0,0 +1,32 @@
+Odoo Paytm Payment Gateway
+==========================
+Paytm Payment Gateway.
+
+Installation
+============
+- www.odoo.com/documentation/12.0/setup/install.html
+- Install our custom addon
+
+License
+=======
+GNU AFFERO GENERAL PUBLIC LICENSE, Version 3 (AGPLv3)
+(http://www.gnu.org/licenses/agpl.html)
+
+Bug Tracker
+===========
+Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported.
+
+Credits
+=======
+* Cybrosys Techno Solutions
+
+
+Developer: Afras Habis - odoo@cybrosys.com
+
+Maintainer
+----------
+
+This module is maintained by Cybrosys Technologies.
+
+For support and more information, please visit https://www.cybrosys.com.
+
diff --git a/paytm_payment_gateway/__init__.py b/paytm_payment_gateway/__init__.py
new file mode 100644
index 000000000..9eb966d19
--- /dev/null
+++ b/paytm_payment_gateway/__init__.py
@@ -0,0 +1,23 @@
+# -*- coding: utf-8 -*-
+###################################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2019-TODAY Cybrosys Technologies().
+# This program is free software: you can modify
+# it under the terms of the GNU Affero General Public License (AGPL) as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+###################################################################################
+
+from . import controllers
+from . import models
\ No newline at end of file
diff --git a/paytm_payment_gateway/__manifest__.py b/paytm_payment_gateway/__manifest__.py
new file mode 100644
index 000000000..3267f479e
--- /dev/null
+++ b/paytm_payment_gateway/__manifest__.py
@@ -0,0 +1,47 @@
+# -*- coding: utf-8 -*-
+###################################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2019-TODAY Cybrosys Technologies().
+# This program is free software: you can modify
+# it under the terms of the GNU Affero General Public License (AGPL) as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+###################################################################################
+
+{
+ 'name': 'Odoo Paytm Payment Gateway',
+ 'version': '12.0.1.0.0',
+ 'category': 'eCommerce',
+ 'summary': 'Paytm Payment Gateway Integration for Odoo 12',
+ 'description': 'Paytm Payment Gateway Integration, paytm, payment gateway,Payment Gateway Integration,paytm payment, odoo 12, odoo payment gateway',
+ 'author': 'Cybrosys Techno Solutions',
+ 'company': 'Cybrosys Techno Solutions',
+ 'maintainer': 'Cybrosys Techno Solutions',
+ 'images': ['static/description/banner.gif'],
+ 'website': 'https://www.cybrosys.com',
+ 'depends': ['payment'],
+ 'data': [
+ 'views/views.xml',
+ 'views/templates.xml',
+ 'data/data.xml'
+ ],
+ 'license': 'AGPL-3',
+ 'installable': True,
+ 'auto_install': False,
+ 'application': False,
+
+}
+
+
+
diff --git a/paytm_payment_gateway/controllers/__init__.py b/paytm_payment_gateway/controllers/__init__.py
new file mode 100644
index 000000000..09f371887
--- /dev/null
+++ b/paytm_payment_gateway/controllers/__init__.py
@@ -0,0 +1,22 @@
+# -*- coding: utf-8 -*-
+###################################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2019-TODAY Cybrosys Technologies().
+# This program is free software: you can modify
+# it under the terms of the GNU Affero General Public License (AGPL) as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+###################################################################################
+
+from . import controllers
\ No newline at end of file
diff --git a/paytm_payment_gateway/controllers/controllers.py b/paytm_payment_gateway/controllers/controllers.py
new file mode 100644
index 000000000..752d7067e
--- /dev/null
+++ b/paytm_payment_gateway/controllers/controllers.py
@@ -0,0 +1,41 @@
+# -*- coding: utf-8 -*-
+###################################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2019-TODAY Cybrosys Technologies().
+# This program is free software: you can modify
+# it under the terms of the GNU Affero General Public License (AGPL) as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+###################################################################################
+
+import logging
+import pprint
+import werkzeug
+from werkzeug.utils import redirect
+from odoo import http
+from odoo.http import request
+_logger = logging.getLogger(__name__)
+
+
+class AtomController(http.Controller):
+ @http.route(['/payment/paytm/return/', '/payment/paytm/cancel/', '/payment/paytm/error/'],
+ type='http', auth='public', csrf=False)
+ def paytm_return(self, **post):
+ """ Paytm."""
+
+ _logger.info(
+ 'Paytm: entering form_feedback with post data %s', pprint.pformat(post))
+ if post:
+ request.env['payment.transaction'].sudo().form_feedback(post, 'paytm')
+ return werkzeug.utils.redirect('/payment/process')
\ No newline at end of file
diff --git a/paytm_payment_gateway/data/data.xml b/paytm_payment_gateway/data/data.xml
new file mode 100644
index 000000000..5a286305c
--- /dev/null
+++ b/paytm_payment_gateway/data/data.xml
@@ -0,0 +1,17 @@
+
+
+
+ Paytm
+ paytm
+
+
+
+ test
+ You will be redirected to the Paytm website after clicking on the payment button.
]]>
+
+ demo
+ demo
+
+
+
\ No newline at end of file
diff --git a/paytm_payment_gateway/doc/RELEASE_NOTES.md b/paytm_payment_gateway/doc/RELEASE_NOTES.md
new file mode 100644
index 000000000..6f50d8540
--- /dev/null
+++ b/paytm_payment_gateway/doc/RELEASE_NOTES.md
@@ -0,0 +1,4 @@
+## Module
+
+#### 22.11.2019
+#### Version 12.0.1.1.0
diff --git a/paytm_payment_gateway/models/__init__.py b/paytm_payment_gateway/models/__init__.py
new file mode 100644
index 000000000..f43dc8d9c
--- /dev/null
+++ b/paytm_payment_gateway/models/__init__.py
@@ -0,0 +1,22 @@
+# -*- coding: utf-8 -*-
+###################################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2019-TODAY Cybrosys Technologies().
+# This program is free software: you can modify
+# it under the terms of the GNU Affero General Public License (AGPL) as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+###################################################################################
+
+from . import models
diff --git a/paytm_payment_gateway/models/models.py b/paytm_payment_gateway/models/models.py
new file mode 100644
index 000000000..58e751110
--- /dev/null
+++ b/paytm_payment_gateway/models/models.py
@@ -0,0 +1,241 @@
+# -*- coding: utf-8 -*-
+###################################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2019-TODAY Cybrosys Technologies().
+# This program is free software: you can modify
+# it under the terms of the GNU Affero General Public License (AGPL) as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+###################################################################################
+
+import base64
+import string
+import random
+import hashlib
+
+
+from Crypto.Cipher import AES
+from odoo.exceptions import ValidationError
+from odoo import api, fields, models
+from datetime import datetime
+from werkzeug import urls
+import hashlib
+import json
+
+import hmac
+import base64
+
+import logging
+
+_logger = logging.getLogger(__name__)
+
+
+class PaymentAcquirerAtom(models.Model):
+ _inherit = 'payment.acquirer'
+
+ provider = fields.Selection(selection_add=[('paytm', 'Paytm')])
+ paytm_merchant_id = fields.Char('Merchant ID', required_if_provider='Paytm',
+ groups='base.group_user')
+ paytm_merchant_key = fields.Char('Merchent Key', required_if_provider='Paytm',
+ groups='base.group_user')
+
+
+ @api.model
+ def _get_paytm_urls(self):
+ """ Atom URLS """
+ return {
+ 'paytm_form_url':'https://securegw-stage.paytm.in/order/process'
+ }
+
+ @api.multi
+ def paytm_get_form_action_url(self):
+ return self._get_paytm_urls () ['paytm_form_url']
+
+ # def _paytm_generate_sign(self ,inout ,values):
+ # if inout not in ('in' ,'out'):
+ # raise Exception ("Type must be 'in' or 'out'")
+ #
+ # if inout == 'in':
+ # keys="merchant_id|merchant_key|txnid|ttype|prodid|amt||||||||||".split ('|')
+ # sign=''.join ('%s|' % (values.get (k) or '') for k in keys)
+ # sign+=self.paytm_merchant_key or ''
+ # else:
+ # keys="|status|||||||||||amt|prodid|ttype|txnid".split ('|')
+ # sign=''.join ('%s|' % (values.get (k) or '') for k in keys)
+ # sign=self.paytm_merchant_key + sign + self.paytm_merchant_id
+ #
+ # shasign=hashlib.sha512 (sign.encode ('utf-8')).hexdigest ()
+ # return shasign
+
+ @api.multi
+ def paytm_form_generate_values(self ,values):
+ self.ensure_one ()
+ print("values", values)
+ base_url=self.env ['ir.config_parameter'].sudo ().get_param ('web.base.url')
+ now=datetime.now ()
+
+ paytm_values=dict (
+ MID=self.paytm_merchant_id ,
+ ORDER_ID=str(values ['reference']) ,
+ CUST_ID = str(values.get('partner_id')),
+ INDUSTRY_TYPE_ID='Retail' ,
+ CHANNEL_ID = 'WEB',
+ TXN_AMOUNT=str(values ['amount']) ,
+ WEBSITE='WEBSTAGING',
+ EMAIL=str(values.get ('partner_email')) ,
+ MOBILE_NO = str(values.get('partner_phone')),
+ CALL_BACK_URL=urls.url_join (base_url ,'/payment/paytm/return/') ,
+ )
+
+ paytm_values ['reqHashKey']=self.generate_checksum(paytm_values, self.paytm_merchant_key)
+ print(paytm_values ['reqHashKey'])
+ return paytm_values
+
+ @api.multi
+ def __encode__(self,to_encode ,iv ,key):
+ __pad__=lambda s:s + (16 - len (s) % 16) * chr (16 - len (s) % 16)
+ # Pad
+ to_encode=__pad__ (to_encode)
+ # Encrypt
+ c=AES.new (key ,AES.MODE_CBC ,iv)
+ to_encode=c.encrypt (to_encode)
+ # Encode
+ to_encode=base64.b64encode (to_encode)
+ return to_encode.decode ("UTF-8")
+
+ @api.multi
+ def __decode__(self,to_decode ,iv ,key):
+ # Decode
+ to_decode=base64.b64decode (to_decode)
+ # Decrypt
+ c=AES.new (key ,AES.MODE_CBC ,iv)
+ to_decode=c.decrypt (to_decode)
+ if type (to_decode) == bytes:
+ # convert bytes array to str.
+ to_decode=to_decode.decode ()
+ # remove pad
+ return self.__unpad__ (to_decode)
+
+ @api.multi
+ def __id_generator__(self,size=6 ,chars=string.ascii_uppercase + string.digits + string.ascii_lowercase):
+ return ''.join (random.choice (chars) for _ in range (size))
+
+ @api.multi
+ def __get_param_string__(self,params ,escape_refund=True):
+ params_string=[]
+ print(params)
+ for key in sorted (params.keys ()):
+ print(key)
+ if ("|" in params [key] or (escape_refund == True and "REFUND" in params [key])):
+ respons_dict={}
+ exit ()
+ value=params [key]
+ params_string.append ('' if value == 'null' else str (value))
+ return '|'.join (params_string)
+
+ @api.multi
+ def generate_checksum(self,param_dict ,merchant_key ,salt=None):
+ params_string=self.__get_param_string__ (param_dict)
+ return self.generate_checksum_by_str (params_string ,merchant_key ,salt)
+
+ @api.multi
+ def generate_refund_checksum(self,param_dict ,merchant_key ,salt=None):
+ for i in param_dict:
+ if ("|" in param_dict [i]):
+ param_dict={}
+ exit ()
+ params_string=self.__get_param_string__ (param_dict ,False)
+ return self.generate_checksum_by_str (params_string ,merchant_key ,salt)
+
+ @api.multi
+ def generate_checksum_by_str(self,param_str ,merchant_key ,salt=None):
+ IV="@@@@&&&###$$$$"
+ params_string=param_str
+ salt=salt if salt else self.__id_generator__ (4)
+ final_string='%s|%s' % (params_string ,salt)
+
+ hasher=hashlib.sha256 (final_string.encode ())
+ hash_string=hasher.hexdigest ()
+
+ hash_string+=salt
+
+ return self.__encode__ (hash_string ,IV ,merchant_key)
+
+ @api.multi
+ def verify_checksum(self,param_dict ,merchant_key ,checksum):
+ # Remove checksum
+ if 'CHECKSUMHASH' in param_dict:
+ param_dict.pop ('CHECKSUMHASH')
+
+ params_string=self.__get_param_string__ (param_dict ,False)
+ return self.verify_checksum_by_str (params_string ,merchant_key ,checksum)
+
+ @api.multi
+ def verify_checksum_by_str(self,param_str ,merchant_key ,checksum):
+ IV="@@@@&&&###$$$$"
+ paytm_hash=self.__decode__ (checksum ,IV ,merchant_key)
+ salt=paytm_hash [-4:]
+ calculated_checksum=self.generate_checksum_by_str (param_str ,merchant_key ,salt=salt)
+ return calculated_checksum == checksum
+
+class PaymentTransactionAtom(models.Model):
+ _inherit = 'payment.transaction'
+
+ paytm_txn_type = fields.Char('Transaction type')
+
+ @api.model
+ def _paytm_form_get_tx_from_data(self ,data):
+ print ("dataa" ,data)
+ reference =data.get ('ORDERID')
+ if not reference:
+ error_msg=_ ('Paytm: received data with missing reference (%s)') % (reference)
+ _logger.info (error_msg)
+ raise ValidationError (error_msg)
+
+ txs=self.env ['payment.transaction'].search ([('reference' ,'=' ,reference)])
+ if not txs or len (txs) > 1:
+ error_msg='Paytm: received data for reference %s' % (reference)
+ if not txs:
+ error_msg+='; no order found'
+ else:
+ error_msg+='; multiple order found'
+ _logger.info (error_msg)
+ raise ValidationError (error_msg)
+ return txs [0]
+
+ @api.multi
+ def _paytm_form_get_invalid_parameters(self ,data):
+ invalid_parameters=[]
+ if self.acquirer_reference and data.get ('mmp_txn') != self.acquirer_reference:
+ invalid_parameters.append (('ORDERID' ,data.get ('ORDERID') ,self.acquirer_reference))
+
+ return invalid_parameters
+
+ @api.multi
+ def _paytm_form_validate(self ,data):
+ print (data)
+ status=data.get ('STATUS')
+ result=self.write ({
+ 'acquirer_reference':self.env ['payment.acquirer'].search ([]) ,
+ 'date':fields.Datetime.now () ,
+
+ })
+ print (status)
+ if status == 'TXN_SUCCESS':
+ self._set_transaction_done ()
+ elif status != 'TXN_FAILED':
+ self._set_transaction_cancel ()
+ else:
+ self._set_transaction_pending ()
+ return result
\ No newline at end of file
diff --git a/paytm_payment_gateway/security/ir.model.access.csv b/paytm_payment_gateway/security/ir.model.access.csv
new file mode 100644
index 000000000..b238b59a1
--- /dev/null
+++ b/paytm_payment_gateway/security/ir.model.access.csv
@@ -0,0 +1,2 @@
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_paytm_payment_paytm_payment,paytm_payment.paytm_payment,model_paytm_payment_paytm_payment,,1,0,0,0
\ No newline at end of file
diff --git a/paytm_payment_gateway/static/description/banner.gif b/paytm_payment_gateway/static/description/banner.gif
new file mode 100644
index 0000000000000000000000000000000000000000..dd7fefbdd60d35acea22fee82d3b0e8f56af6cf4
GIT binary patch
literal 463167
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