[IMP] payment,payment_*,website_quote,website_sale: new rendering mechanism compatibility for payment providers

merge *ALL* the dicts

The form rendering used to receive a dict for partner information and a dict for tx information and to transmit another dict to the qweb template; now everything is done in a single dict
This commit is contained in:
Damien Bouvy
2015-09-04 16:08:22 +02:00
parent f76c78d598
commit 526f27ddac
20 changed files with 314 additions and 393 deletions
+103 -139
View File
@@ -145,93 +145,16 @@ class PaymentAcquirer(osv.Model):
return getattr(self, '%s_get_form_action_url' % acquirer.provider)(cr, uid, id, context=context)
return False
def form_preprocess_values(self, cr, uid, id, reference, amount, currency_id, tx_id, partner_id, partner_values, tx_values, context=None):
""" Pre process values before giving them to the acquirer-specific render
methods. Those methods will receive:
- partner_values: will contain name, lang, email, zip, address, city,
country_id (int or False), country (browse or False), phone, reference
- tx_values: will contain reference, amount, currency_id (int or False),
currency (browse or False), partner (browse or False)
"""
acquirer = self.browse(cr, uid, id, context=context)
if tx_id:
tx = self.pool.get('payment.transaction').browse(cr, uid, tx_id, context=context)
tx_data = {
'reference': tx.reference,
'amount': tx.amount,
'currency_id': tx.currency_id.id,
'currency': tx.currency_id,
'partner': tx.partner_id,
}
partner_data = {
'name': tx.partner_name,
'lang': tx.partner_lang,
'email': tx.partner_email,
'zip': tx.partner_zip,
'address': tx.partner_address,
'city': tx.partner_city,
'country_id': tx.partner_country_id.id,
'country': tx.partner_country_id,
'phone': tx.partner_phone,
'state': None,
}
else:
if partner_id:
partner = self.pool['res.partner'].browse(cr, uid, partner_id, context=context)
partner_data = {
'name': partner.name,
'lang': partner.lang,
'email': partner.email,
'zip': partner.zip,
'city': partner.city,
'address': _partner_format_address(partner.street, partner.street2),
'country_id': partner.country_id.id,
'country': partner.country_id,
'phone': partner.phone,
'state': partner.state_id,
}
else:
partner, partner_data = False, {}
partner_data.update(partner_values)
if currency_id:
currency = self.pool['res.currency'].browse(cr, uid, currency_id, context=context)
else:
currency = self.pool['res.users'].browse(cr, uid, uid, context=context).company_id.currency_id
tx_data = {
'reference': reference,
'amount': amount,
'currency_id': currency.id,
'currency': currency,
'partner': partner,
}
# update tx values
tx_data.update(tx_values)
# update partner values
if not partner_data.get('address'):
partner_data['address'] = _partner_format_address(partner_data.get('street', ''), partner_data.get('street2', ''))
if not partner_data.get('country') and partner_data.get('country_id'):
partner_data['country'] = self.pool['res.country'].browse(cr, uid, partner_data.get('country_id'), context=context)
partner_data.update({
'first_name': _partner_split_name(partner_data['name'])[0],
'last_name': _partner_split_name(partner_data['name'])[1],
})
# compute fees
fees_method_name = '%s_compute_fees' % acquirer.provider
if hasattr(self, fees_method_name):
fees = getattr(self, fees_method_name)(
cr, uid, id, tx_data['amount'], tx_data['currency_id'], partner_data['country_id'], context=None)
tx_data['fees'] = float_round(fees, 2)
return (partner_data, tx_data)
def render(self, cr, uid, id, reference, amount, currency_id, tx_id=None, partner_id=False, partner_values=None, tx_values=None, context=None):
def render(self, cr, uid, id, reference, amount, currency_id, partner_id=False, values=None, context=None):
""" Renders the form template of the given acquirer as a qWeb template.
:param string reference: the transaction reference
:param float amount: the amount the buyer has to pay
:param currency_id: currency id
:param dict partner_id: optional partner_id to fill values
:param dict values: a dictionary of values for the transction that is
given to the acquirer-specific method generating the form values
:param dict context: OpenERP context
All templates will receive:
- acquirer: the payment.acquirer browse record
@@ -239,71 +162,90 @@ class PaymentAcquirer(osv.Model):
- currency_id: id of the transaction currency
- amount: amount of the transaction
- reference: reference of the transaction
- partner: the current partner browse record, if any (not necessarily set)
- partner_values: a dictionary of partner-related values
- tx_values: a dictionary of transaction related values that depends on
the acquirer. Some specific keys should be managed in each
provider, depending on the features it offers:
- 'feedback_url': feedback URL, controler that manage answer of the acquirer
(without base url) -> FIXME
- 'return_url': URL for coming back after payment validation (wihout
base url) -> FIXME
- 'cancel_url': URL if the client cancels the payment -> FIXME
- 'error_url': URL if there is an issue with the payment -> FIXME
- partner_*: partner-related values
- partner: optional partner browse record
- 'feedback_url': feedback URL, controler that manage answer of the acquirer (without base url) -> FIXME
- 'return_url': URL for coming back after payment validation (wihout base url) -> FIXME
- 'cancel_url': URL if the client cancels the payment -> FIXME
- 'error_url': URL if there is an issue with the payment -> FIXME
- context: OpenERP context dictionary
:param string reference: the transaction reference
:param float amount: the amount the buyer has to pay
:param res.currency browse record currency: currency
:param int tx_id: id of a transaction; if set, bypasses all other given
values and only render the already-stored transaction
:param res.partner browse record partner_id: the buyer
:param dict partner_values: a dictionary of values for the buyer (see above)
:param dict tx_custom_values: a dictionary of values for the transction
that is given to the acquirer-specific method
generating the form values
:param dict context: OpenERP context
"""
if context is None:
context = {}
if tx_values is None:
tx_values = {}
if partner_values is None:
partner_values = {}
if values is None:
values = {}
acquirer = self.browse(cr, uid, id, context=context)
# pre-process values
# reference and amount
values.setdefault('reference', reference)
amount = float_round(amount, 2)
partner_values, tx_values = self.form_preprocess_values(
cr, uid, id, reference, amount, currency_id, tx_id, partner_id,
partner_values, tx_values, context=context)
values.setdefault('amount', amount)
# currency id
currency_id = values.setdefault('currency_id', currency_id)
if currency_id:
currency = self.pool['res.currency'].browse(cr, uid, currency_id, context=context)
else:
currency = self.pool['res.users'].browse(cr, uid, uid, context=context).company_id.currency_id
values['currency'] = currency
# Fill partner_* using values['partner_id'] or partner_id arguement
partner_id = values.get('partner_id', partner_id)
if partner_id:
partner = self.pool['res.partner'].browse(cr, uid, partner_id, context=context)
values.update({
'partner': partner,
'partner_id': partner_id,
'partner_name': partner.name,
'partner_lang': partner.lang,
'partner_email': partner.email,
'partner_zip': partner.zip,
'partner_city': partner.city,
'partner_address': _partner_format_address(partner.street, partner.street2),
'partner_country_id': partner.country_id.id,
'partner_country': partner.country_id,
'partner_phone': partner.phone,
'partner_state': partner.state_id,
})
if values.get('partner_name'):
values.update({
'partner_first_name': _partner_split_name(values.get('partner_name'))[0],
'partner_last_name': _partner_split_name(values.get('partner_name'))[1],
})
# Fix address, country fields
if not values.get('partner_address'):
values['address'] = _partner_format_address(values.get('partner_street', ''), values.get('partner_street2', ''))
if not values.get('partner_country') and values.get('partner_country_id'):
values['country'] = self.pool['res.country'].browse(cr, uid, values.get('partner_country_id'), context=context)
# compute fees
fees_method_name = '%s_compute_fees' % acquirer.provider
if hasattr(self, fees_method_name):
fees = getattr(self, fees_method_name)(cr, uid, id, values['amount'], values['currency_id'], values['partner_country_id'], context=None)
values['fees'] = float_round(fees, 2)
# call <name>_form_generate_values to update the tx dict with acqurier specific values
cust_method_name = '%s_form_generate_values' % (acquirer.provider)
if hasattr(self, cust_method_name):
method = getattr(self, cust_method_name)
partner_values, tx_values = method(cr, uid, id, partner_values, tx_values, context=context)
values = method(cr, uid, id, values, context=context)
qweb_context = {
values.update({
'tx_url': context.get('tx_url', self.get_form_action_url(cr, uid, id, context=context)),
'submit_class': context.get('submit_class', 'btn btn-link'),
'submit_txt': context.get('submit_txt'),
'acquirer': acquirer,
'user': self.pool.get("res.users").browse(cr, uid, uid, context=context),
'reference': tx_values['reference'],
'amount': tx_values['amount'],
'currency': tx_values['currency'],
'partner': tx_values.get('partner'),
'partner_values': partner_values,
'tx_values': tx_values,
'context': context,
'type': tx_values.get('type') or 'form',
}
'type': values.get('type') or 'form',
})
values.setdefault('return_url', False)
# because render accepts view ids but not qweb -> need to use the xml_id
return self.pool['ir.ui.view'].render(cr, uid, acquirer.view_template_id.xml_id, qweb_context, engine='ir.qweb', context=context)
return self.pool['ir.ui.view'].render(cr, uid, acquirer.view_template_id.xml_id, values, engine='ir.qweb', context=context)
def _registration_render(self, cr, uid, id, partner_id, qweb_context=None, context=None):
acquirer = self.browse(cr, uid, id, context=context)
@@ -465,21 +407,43 @@ class PaymentTransaction(osv.Model):
partner = None
if partner_id:
partner = self.pool['res.partner'].browse(cr, uid, partner_id, context=context)
return {'value': {
'partner_name': partner and partner.name or False,
'partner_lang': partner and partner.lang or 'en_US',
'partner_email': partner and partner.email or False,
'partner_zip': partner and partner.zip or False,
'partner_address': _partner_format_address(partner and partner.street or '', partner and partner.street2 or ''),
'partner_city': partner and partner.city or False,
'partner_country_id': partner and partner.country_id.id or False,
'partner_phone': partner and partner.phone or False,
}}
return {'value': {
'partner_name': partner and partner.name or False,
'partner_lang': partner and partner.lang or 'en_US',
'partner_email': partner and partner.email or False,
'partner_zip': partner and partner.zip or False,
'partner_address': _partner_format_address(partner and partner.street or '', partner and partner.street2 or ''),
'partner_city': partner and partner.city or False,
'partner_country_id': partner and partner.country_id.id or False,
'partner_phone': partner and partner.phone or False,
}}
return {}
# --------------------------------------------------
# FORM RELATED METHODS
# --------------------------------------------------
def render(self, cr, uid, id, context=None):
tx = self.browse(cr, uid, id, context=context)
values = {
'reference': tx.reference,
'amount': tx.amount,
'currency_id': tx.currency_id.id,
'currency': tx.currency_id,
'partner': tx.partner_id,
'partner_name': tx.partner_name,
'partner_lang': tx.partner_lang,
'partner_email': tx.partner_email,
'partner_zip': tx.partner_zip,
'partner_address': tx.partner_address,
'partner_city': tx.partner_city,
'partner_country_id': tx.partner_country_id.id,
'partner_country': tx.partner_country_id,
'partner_phone': tx.partner_phone,
'partner_state': None,
}
return tx.acquirer_id.render(None, None, None, values=values)
def form_feedback(self, cr, uid, data, acquirer_name, context=None):
invalid_parameters, tx = None, None
+10 -10
View File
@@ -21,16 +21,16 @@ class PaymentAcquirerCommon(common.TransactionCase):
# dict partner values
self.buyer_values = {
'name': 'Norbert Buyer',
'lang': 'en_US',
'email': 'norbert.buyer@example.com',
'street': 'Huge Street',
'street2': '2/543',
'phone': '0032 12 34 56 78',
'city': 'Sin City',
'zip': '1000',
'country_id': self.country_belgium_id,
'country_name': 'Belgium',
'partner_name': 'Norbert Buyer',
'partner_lang': 'en_US',
'partner_email': 'norbert.buyer@example.com',
'partner_address': 'Huge Street 2/543',
'partner_phone': '0032 12 34 56 78',
'partner_city': 'Sin City',
'partner_zip': '1000',
'partner_country': self.env['res.country'].browse(self.country_belgium_id),
'partner_country_id': self.country_belgium_id,
'partner_country_name': 'Belgium',
}
# test partner
+9 -11
View File
@@ -71,7 +71,7 @@ class AcquirerAdyen(osv.Model):
key = acquirer.adyen_skin_hmac_key.encode('ascii')
return base64.b64encode(hmac.new(key, sign, sha1).digest())
def adyen_form_generate_values(self, cr, uid, id, partner_values, tx_values, context=None):
def adyen_form_generate_values(self, cr, uid, id, values, context=None):
base_url = self.pool['ir.config_parameter'].get_param(cr, uid, 'web.base.url')
acquirer = self.browse(cr, uid, id, context=context)
# tmp
@@ -79,22 +79,20 @@ class AcquirerAdyen(osv.Model):
from dateutil import relativedelta
tmp_date = datetime.date.today() + relativedelta.relativedelta(days=1)
adyen_tx_values = dict(tx_values)
adyen_tx_values.update({
'merchantReference': tx_values['reference'],
'paymentAmount': '%d' % int(float_round(tx_values['amount'], 2) * 100),
'currencyCode': tx_values['currency'] and tx_values['currency'].name or '',
values.update({
'merchantReference': values['reference'],
'paymentAmount': '%d' % int(float_round(values['amount'], 2) * 100),
'currencyCode': values['currency'] and values['currency'].name or '',
'shipBeforeDate': tmp_date,
'skinCode': acquirer.adyen_skin_code,
'merchantAccount': acquirer.adyen_merchant_account,
'shopperLocale': partner_values['lang'],
'shopperLocale': values.get('partner_lang'),
'sessionValidity': tmp_date,
'resURL': '%s' % urlparse.urljoin(base_url, AdyenController._return_url),
'merchantReturnData': json.dumps({'return_url': '%s' % values.pop('return_url')}) if values.get('return_url') else False,
'merchantSig': self._adyen_generate_merchant_sig(acquirer, 'in', values),
})
if adyen_tx_values.get('return_url'):
adyen_tx_values['merchantReturnData'] = json.dumps({'return_url': '%s' % adyen_tx_values.pop('return_url')})
adyen_tx_values['merchantSig'] = self._adyen_generate_merchant_sig(acquirer, 'in', adyen_tx_values)
return partner_values, adyen_tx_values
return values
def adyen_get_form_action_url(self, cr, uid, id, context=None):
acquirer = self.browse(cr, uid, id, context=context)
+13 -13
View File
@@ -4,21 +4,21 @@
<template id="adyen_acquirer_button">
<form t-if="acquirer.adyen_merchant_account" t-att-action="tx_url" method="post" target="_self">
<input type="hidden" name="merchantReference" t-att-value="tx_values['merchantReference']"/>
<input type="hidden" name="paymentAmount" t-att-value="tx_values['paymentAmount'] or '0.0'"/>
<input type="hidden" name="currencyCode" t-att-value="tx_values['currencyCode']"/>
<input type="hidden" name="shipBeforeDate" t-att-value="tx_values['shipBeforeDate']"/>
<input type="hidden" name="skinCode" t-att-value="tx_values['skinCode']"/>
<input type="hidden" name="merchantAccount" t-att-value="tx_values['merchantAccount']"/>
<input type="hidden" name="shopperLocale" t-att-value="tx_values['shopperLocale']"/>
<input type="hidden" name="sessionValidity" t-att-value="tx_values['sessionValidity']"/>
<input type="hidden" name="merchantSig" t-att-value="tx_values['merchantSig']"/>
<input type="hidden" name="merchantReference" t-att-value="merchantReference"/>
<input type="hidden" name="paymentAmount" t-att-value="paymentAmount"/>
<input type="hidden" name="currencyCode" t-att-value="currencyCode"/>
<input type="hidden" name="shipBeforeDate" t-att-value="shipBeforeDate"/>
<input type="hidden" name="skinCode" t-att-value="skinCode"/>
<input type="hidden" name="merchantAccount" t-att-value="merchantAccount"/>
<input type="hidden" name="shopperLocale" t-att-value="shopperLocale"/>
<input type="hidden" name="sessionValidity" t-att-value="sessionValidity"/>
<input type="hidden" name="merchantSig" t-att-value="merchantSig"/>
<!-- URLs -->
<input t-if="tx_values.get('resURL')" type='hidden' name='resURL'
t-att-value="tx_values.get('resURL')"/>
<input type='hidden' name='resURL'
t-att-value="resURL"/>
<!-- custom -->
<input t-if="tx_values.get('merchantReturnData')" type='hidden' name='merchantReturnData'
t-att-value="tx_values.get('merchantReturnData')"/>
<input t-if="merchantReturnData" type='hidden' name='merchantReturnData'
t-att-value="merchantReturnData"/>
<!-- submit -->
<button type="submit" width="100px"
t-att-class="submit_class">
+14 -14
View File
@@ -43,14 +43,14 @@ class PaymentAcquirerAuthorize(models.Model):
return hmac.new(str(values['x_trans_key']), data, hashlib.md5).hexdigest()
@api.multi
def authorize_form_generate_values(self, partner_values, tx_values):
def authorize_form_generate_values(self, values):
self.ensure_one()
base_url = self.env['ir.config_parameter'].get_param('web.base.url')
authorize_tx_values = dict(tx_values)
authorize_tx_values = dict(values)
temp_authorize_tx_values = {
'x_login': self.authorize_login,
'x_trans_key': self.authorize_transaction_key,
'x_amount': str(tx_values['amount']),
'x_amount': str(values['amount']),
'x_show_form': 'PAYMENT_FORM',
'x_type': 'AUTH_CAPTURE',
'x_method': 'CC',
@@ -60,21 +60,21 @@ class PaymentAcquirerAuthorize(models.Model):
'x_fp_timestamp': str(int(time.time())),
'x_relay_url': '%s' % urlparse.urljoin(base_url, AuthorizeController._return_url),
'x_cancel_url': '%s' % urlparse.urljoin(base_url, AuthorizeController._cancel_url),
'x_currency_code': tx_values['currency'] and tx_values['currency'].name or '',
'address': partner_values['address'],
'city': partner_values['city'],
'country': partner_values['country'] and partner_values['country'].name or '',
'email': partner_values['email'],
'zip': partner_values['zip'],
'first_name': partner_values['first_name'],
'last_name': partner_values['last_name'],
'phone': partner_values['phone'],
'state': partner_values.get('state') and partner_values['state'].name or '',
'x_currency_code': values['currency'] and values['currency'].name or '',
'address': values.get('partner_address'),
'city': values.get('partner_city'),
'country': values.get('partner_country') and values.get('partner_country').name or '',
'email': values.get('partner_email'),
'zip_code': values.get('partner_zip'),
'first_name': values.get('partner_first_name'),
'last_name': values.get('partner_last_name'),
'phone': values.get('partner_phone'),
'state': values.get('partner_state') and values['partner_state'].name or '',
}
temp_authorize_tx_values['returndata'] = authorize_tx_values.pop('return_url', '')
temp_authorize_tx_values['x_fp_hash'] = self._authorize_generate_hashing(temp_authorize_tx_values)
authorize_tx_values.update(temp_authorize_tx_values)
return partner_values, authorize_tx_values
return authorize_tx_values
@api.multi
def authorize_get_form_action_url(self):
@@ -78,7 +78,7 @@ class AuthorizeForm(AuthorizeCommon):
cr, uid, context = self.env.cr, self.env.uid, {}
res = self.payment_acquirer.render(
cr, uid, self.authorize_id, 'SO004', 320.0, self.currency_usd.id,
partner_id=None, partner_values=self.buyer_values, context=context)
values=self.buyer_values, context=context)
# check form result
tree = objectify.fromstring(res)
self.assertEqual(tree.get('action'), 'https://test.authorize.net/gateway/transact.dll', 'Authorize: wrong form POST url')
+24 -24
View File
@@ -4,32 +4,32 @@
<template id="authorize_acquirer_button">
<form t-if="acquirer" t-att-action="tx_url" method="post" target="_self">
<input type='hidden' name='x_login' t-att-value='tx_values["x_login"]'/>
<input type='hidden' name='x_fp_hash' t-att-value='tx_values["x_fp_hash"]'/>
<input type='hidden' name='x_amount' t-att-value='tx_values["x_amount"] or "0.0"'/>
<input type='hidden' name='x_show_form' t-att-value="tx_values['x_show_form']"/>
<input type='hidden' name='x_type' t-att-value="tx_values['x_type']"/>
<input type='hidden' name='x_method' t-att-value="tx_values['x_method']"/>
<input type='hidden' name='x_fp_sequence' t-att-value='tx_values["x_fp_sequence"]'/>
<input type='hidden' name='x_version' t-att-value="tx_values['x_version']"/>
<input type="hidden" name="x_relay_response" t-att-value="tx_values['x_relay_response']"/>
<input type="hidden" name="x_relay_url" t-att-value="tx_values['x_relay_url']"/>
<input type='hidden' name="x_fp_timestamp" t-att-value="tx_values['x_fp_timestamp']"/>
<input type="hidden" name='return_url' t-att-value="tx_values['returndata']"/>
<input type="hidden" name='x_cancel_url' t-att-value="tx_values['x_cancel_url']"/>
<input type='hidden' name='x_login' t-att-value='x_login'/>
<input type='hidden' name='x_fp_hash' t-att-value='x_fp_hash'/>
<input type='hidden' name='x_amount' t-att-value='x_amount'/>
<input type='hidden' name='x_show_form' t-att-value="x_show_form"/>
<input type='hidden' name='x_type' t-att-value="x_type"/>
<input type='hidden' name='x_method' t-att-value="x_method"/>
<input type='hidden' name='x_fp_sequence' t-att-value='x_fp_sequence'/>
<input type='hidden' name='x_version' t-att-value="x_version"/>
<input type="hidden" name="x_relay_response" t-att-value="x_relay_response"/>
<input type="hidden" name="x_relay_url" t-att-value="x_relay_url"/>
<input type='hidden' name="x_fp_timestamp" t-att-value="x_fp_timestamp"/>
<input type="hidden" name='return_url' t-att-value="returndata"/>
<input type="hidden" name='x_cancel_url' t-att-value="x_cancel_url"/>
<!--Order Information -->
<input type='hidden' name='x_invoice_num' t-att-value='tx_values["reference"]'/>
<input type='hidden' name='x_currency_code' t-att-value='tx_values["x_currency_code"]'/>
<input type='hidden' name='x_invoice_num' t-att-value='reference'/>
<input type='hidden' name='x_currency_code' t-att-value='x_currency_code'/>
<!-- Billing Information-->
<input type='hidden' name='x_first_name' t-att-value="tx_values['first_name']"/>
<input type='hidden' name='x_last_name' t-att-value="tx_values['last_name']"/>
<input type='hidden' name='x_address' t-att-value="tx_values['address']"/>
<input type='hidden' name='x_city' t-att-value="tx_values['city']"/>
<input type='hidden' name='x_zip' t-att-value="tx_values['zip']"/>
<input type='hidden' name='x_country' t-att-value="tx_values['country']"/>
<input type='hidden' name='x_phone' t-att-value='tx_values["phone"]'/>
<input type='hidden' name='x_email' t-att-value="tx_values['email']"/>
<input type='hidden' name='x_state' t-att-value="tx_values['state']"/>
<input type='hidden' name='x_first_name' t-att-value="first_name"/>
<input type='hidden' name='x_last_name' t-att-value="last_name"/>
<input type='hidden' name='x_address' t-att-value="address"/>
<input type='hidden' name='x_city' t-att-value="city"/>
<input type='hidden' name='x_zip' t-att-value="zip_code"/>
<input type='hidden' name='x_country' t-att-value="country"/>
<input type='hidden' name='x_phone' t-att-value='phone'/>
<input type='hidden' name='x_email' t-att-value="email"/>
<input type='hidden' name='x_state' t-att-value="state"/>
<!-- Submit-->
<button type="submit" width="100px" t-att-class="submit_class">
<img t-if="not submit_txt" src="/payment_authorize/static/src/img/authorize_icon.png"/>
+8 -11
View File
@@ -75,28 +75,25 @@ class AcquirerBuckaroo(osv.Model):
return shasign
def buckaroo_form_generate_values(self, cr, uid, id, partner_values, tx_values, context=None):
def buckaroo_form_generate_values(self, cr, uid, id, values, context=None):
base_url = self.pool['ir.config_parameter'].get_param(cr, uid, 'web.base.url')
acquirer = self.browse(cr, uid, id, context=context)
buckaroo_tx_values = dict(tx_values)
buckaroo_tx_values = dict(values)
buckaroo_tx_values.update({
'Brq_websitekey': acquirer.brq_websitekey,
'Brq_amount': tx_values['amount'],
'Brq_currency': tx_values['currency'] and tx_values['currency'].name or '',
'Brq_invoicenumber': tx_values['reference'],
'Brq_amount': values['amount'],
'Brq_currency': values['currency'] and values['currency'].name or '',
'Brq_invoicenumber': values['reference'],
'brq_test': False if acquirer.environment == 'prod' else True,
'Brq_return': '%s' % urlparse.urljoin(base_url, BuckarooController._return_url),
'Brq_returncancel': '%s' % urlparse.urljoin(base_url, BuckarooController._cancel_url),
'Brq_returnerror': '%s' % urlparse.urljoin(base_url, BuckarooController._exception_url),
'Brq_returnreject': '%s' % urlparse.urljoin(base_url, BuckarooController._reject_url),
'Brq_culture': (partner_values.get('lang') or 'en_US').replace('_', '-'),
'Brq_culture': (values.get('partner_lang') or 'en_US').replace('_', '-'),
'add_returndata': {'return_url': '%s' % buckaroo_tx_values.pop('return_url')} if buckaroo_tx_values.get('return_url') else ''
})
if buckaroo_tx_values.get('return_url'):
buckaroo_tx_values['add_returndata'] = {'return_url': '%s' % buckaroo_tx_values.pop('return_url')}
else:
buckaroo_tx_values['add_returndata'] = ''
buckaroo_tx_values['Brq_signature'] = self._buckaroo_generate_digital_sign(acquirer, 'in', buckaroo_tx_values)
return partner_values, buckaroo_tx_values
return buckaroo_tx_values
def buckaroo_get_form_action_url(self, cr, uid, id, context=None):
acquirer = self.browse(cr, uid, id, context=context)
+16 -16
View File
@@ -4,23 +4,23 @@
<template id="buckaroo_acquirer_button">
<form t-if="acquirer.brq_websitekey" t-att-action="tx_url" method="post" target="_self">
<input type="hidden" name="Brq_websitekey" t-att-value="tx_values['Brq_websitekey']"/>
<input type="hidden" name="Brq_amount" t-att-value="tx_values['Brq_amount'] or '0.0'"/>
<input type="hidden" name="Brq_currency" t-att-value="tx_values['Brq_currency']"/>
<input type="hidden" name="Brq_invoicenumber" t-att-value="tx_values['Brq_invoicenumber']"/>
<input type="hidden" name="Brq_signature" t-att-value="tx_values['Brq_signature']"/>
<input type="hidden" name="brq_test" t-att-value="tx_values['brq_test']"/>
<input type="hidden" name="Brq_culture" t-att-value="tx_values['Brq_culture']"/>
<input type="hidden" name="Brq_websitekey" t-att-value="Brq_websitekey"/>
<input type="hidden" name="Brq_amount" t-att-value="Brq_amount"/>
<input type="hidden" name="Brq_currency" t-att-value="Brq_currency"/>
<input type="hidden" name="Brq_invoicenumber" t-att-value="Brq_invoicenumber"/>
<input type="hidden" name="Brq_signature" t-att-value="Brq_signature"/>
<input type="hidden" name="brq_test" t-att-value="brq_test"/>
<input type="hidden" name="Brq_culture" t-att-value="Brq_culture"/>
<!-- URLs -->
<input t-if="tx_values.get('Brq_return')" type='hidden' name='Brq_return'
t-att-value="tx_values.get('Brq_return')"/>
<input t-if="tx_values.get('Brq_returncancel')" type='hidden' name='Brq_returncancel'
t-att-value="tx_values.get('Brq_returncancel')"/>
<input t-if="tx_values.get('Brq_returnerror')" type='hidden' name='Brq_returnerror'
t-att-value="tx_values.get('Brq_returnerror')"/>
<input t-if="tx_values.get('Brq_returnreject')" type='hidden' name='Brq_returnreject'
t-att-value="tx_values.get('Brq_returnreject')"/>
<input type='hidden' name='add_returndata' t-att-value="tx_values.get('add_returndata')"/>
<input t-if="Brq_return" type='hidden' name='Brq_return'
t-att-value="Brq_return"/>
<input t-if="Brq_returncancel" type='hidden' name='Brq_returncancel'
t-att-value="Brq_returncancel"/>
<input t-if="Brq_returnerror" type='hidden' name='Brq_returnerror'
t-att-value="Brq_returnerror"/>
<input t-if="Brq_returnreject" type='hidden' name='Brq_returnreject'
t-att-value="Brq_returnreject"/>
<input type='hidden' name='add_returndata' t-att-value="add_returndata"/>
<!-- submit -->
<button type="submit" width="100px"
t-att-class="submit_class">
+17 -18
View File
@@ -145,39 +145,38 @@ class PaymentAcquirerOgone(osv.Model):
shasign = sha1(sign).hexdigest()
return shasign
def ogone_form_generate_values(self, cr, uid, id, partner_values, tx_values, context=None):
def ogone_form_generate_values(self, cr, uid, id, values, context=None):
base_url = self.pool['ir.config_parameter'].get_param(cr, uid, 'web.base.url')
acquirer = self.browse(cr, uid, id, context=context)
ogone_tx_values = dict(tx_values)
ogone_tx_values = dict(values)
temp_ogone_tx_values = {
'PSPID': acquirer.ogone_pspid,
'ORDERID': tx_values['reference'],
'AMOUNT': float_repr(float_round(tx_values['amount'], 2) * 100, 0),
'CURRENCY': tx_values['currency'] and tx_values['currency'].name or '',
'LANGUAGE': partner_values['lang'],
'CN': partner_values['name'],
'EMAIL': partner_values['email'],
'OWNERZIP': partner_values['zip'],
'OWNERADDRESS': partner_values['address'],
'OWNERTOWN': partner_values['city'],
'OWNERCTY': partner_values['country'] and partner_values['country'].code or '',
'OWNERTELNO': partner_values['phone'],
'ORDERID': values['reference'],
'AMOUNT': float_repr(float_round(values['amount'], 2) * 100, 0),
'CURRENCY': values['currency'] and values['currency'].name or '',
'LANGUAGE': values.get('partner_lang'),
'CN': values.get('partner_name'),
'EMAIL': values.get('partner_email'),
'OWNERZIP': values.get('partner_zip'),
'OWNERADDRESS': values.get('partner_address'),
'OWNERTOWN': values.get('partner_city'),
'OWNERCTY': values.get('partner_country') and values.get('partner_country').code or '',
'OWNERTELNO': values.get('partner_phone'),
'ACCEPTURL': '%s' % urlparse.urljoin(base_url, OgoneController._accept_url),
'DECLINEURL': '%s' % urlparse.urljoin(base_url, OgoneController._decline_url),
'EXCEPTIONURL': '%s' % urlparse.urljoin(base_url, OgoneController._exception_url),
'CANCELURL': '%s' % urlparse.urljoin(base_url, OgoneController._cancel_url),
'PARAMPLUS': 'return_url=%s' % ogone_tx_values.pop('return_url') if ogone_tx_values.get('return_url') else False,
}
if tx_values.get('type') == 'form_save':
if values.get('type') == 'form_save':
temp_ogone_tx_values.update({
'ALIAS': 'ODOO-NEW-ALIAS-%s' % time.time(), # something unique,
'ALIASUSAGE': tx_values.get('alias_usage') or acquirer.ogone_alias_usage,
'ALIASUSAGE': values.get('alias_usage') or acquirer.ogone_alias_usage,
})
if ogone_tx_values.get('return_url'):
temp_ogone_tx_values['PARAMPLUS'] = 'return_url=%s' % ogone_tx_values.pop('return_url')
shasign = self._ogone_generate_shasign(acquirer, 'in', temp_ogone_tx_values)
temp_ogone_tx_values['SHASIGN'] = shasign
ogone_tx_values.update(temp_ogone_tx_values)
return partner_values, ogone_tx_values
return ogone_tx_values
def ogone_get_form_action_url(self, cr, uid, id, context=None):
acquirer = self.browse(cr, uid, id, context=context)
+21 -21
View File
@@ -5,26 +5,26 @@
<template id="ogone_acquirer_button">
<form t-if="acquirer" t-att-action="tx_url" method="post" target="_self">
<!-- seller -->
<input type='hidden' name='PSPID' t-att-value='tx_values["PSPID"]'/>
<input type='hidden' name='ORDERID' t-att-value='tx_values["ORDERID"]'/>
<input type='hidden' name='PSPID' t-att-value='PSPID'/>
<input type='hidden' name='ORDERID' t-att-value='ORDERID'/>
<!-- cart -->
<input type='hidden' name='AMOUNT' t-att-value='tx_values["AMOUNT"] or "0.0"'/>
<input type='hidden' name='CURRENCY' t-att-value='tx_values["CURRENCY"]'/>
<input type='hidden' name='AMOUNT' t-att-value='AMOUNT or "0.0"'/>
<input type='hidden' name='CURRENCY' t-att-value='CURRENCY'/>
<!-- buyer -->
<input type='hidden' name='LANGUAGE' t-att-value='tx_values["LANGUAGE"]'/>
<input type='hidden' name='CN' t-att-value='tx_values["CN"]'/>
<input type='hidden' name='EMAIL' t-att-value='tx_values["EMAIL"]'/>
<input type='hidden' name='OWNERZIP' t-att-value='tx_values["OWNERZIP"]'/>
<input type='hidden' name='OWNERADDRESS' t-att-value='tx_values["OWNERADDRESS"]'/>
<input type='hidden' name='OWNERCTY' t-att-value='tx_values["OWNERCTY"]'/>
<input type='hidden' name='OWNERTOWN' t-att-value='tx_values["OWNERTOWN"]'/>
<input type='hidden' name='OWNERTELNO' t-att-value='tx_values["OWNERTELNO"]'/>
<input type='hidden' name='LANGUAGE' t-att-value='LANGUAGE'/>
<input type='hidden' name='CN' t-att-value='CN'/>
<input type='hidden' name='EMAIL' t-att-value='EMAIL'/>
<input type='hidden' name='OWNERZIP' t-att-value='OWNERZIP'/>
<input type='hidden' name='OWNERADDRESS' t-att-value='OWNERADDRESS'/>
<input type='hidden' name='OWNERCTY' t-att-value='OWNERCTY'/>
<input type='hidden' name='OWNERTOWN' t-att-value='OWNERTOWN'/>
<input type='hidden' name='OWNERTELNO' t-att-value='OWNERTELNO'/>
<t t-if="type == 'form_save'">
<input type='hidden' name='ALIAS' t-att-value='tx_values["ALIAS"]'/>
<input type='hidden' name='ALIASUSAGE' t-att-value='tx_values["ALIASUSAGE"]'/>
<input type='hidden' name='ALIAS' t-att-value='ALIAS'/>
<input type='hidden' name='ALIASUSAGE' t-att-value='ALIASUSAGE'/>
</t>
<!-- before payment verification -->
<input type='hidden' name='SHASIGN' t-att-value='tx_values["SHASIGN"]'/>
<input type='hidden' name='SHASIGN' t-att-value='SHASIGN'/>
<!-- look and print -->
<!-- <input type='hidden' name='TITLE' t-att-value='tx_dict["currency_name"]'/>
<input type='hidden' name='BGCOLOR' t-att-value='tx_dict["currency_name"]'/>
@@ -36,14 +36,14 @@
<input type='hidden' name='LOGO' t-att-value='tx_dict["currency_name"]'/>
<input type='hidden' name='FONTTYPE' t-att-value='tx_dict["currency_name"]'/> -->
<!-- after payment parameters -->
<t t-if='tx_values.get("PARAMPLUS")'>
<input type='hidden' name="PARAMPLUS" t-att-value='tx_values["PARAMPLUS"]'/>
<t t-if='PARAMPLUS'>
<input type='hidden' name="PARAMPLUS" t-att-value='PARAMPLUS'/>
</t>
<!-- redirection -->
<input type='hidden' name='ACCEPTURL' t-att-value='tx_values["ACCEPTURL"]'/>
<input type='hidden' name='DECLINEURL' t-att-value='tx_values["DECLINEURL"]'/>
<input type='hidden' name='EXCEPTIONURL' t-att-value='tx_values["EXCEPTIONURL"]'/>
<input type='hidden' name='CANCELURL' t-att-value='tx_values["CANCELURL"]'/>
<input type='hidden' name='ACCEPTURL' t-att-value='ACCEPTURL'/>
<input type='hidden' name='DECLINEURL' t-att-value='DECLINEURL'/>
<input type='hidden' name='EXCEPTIONURL' t-att-value='EXCEPTIONURL'/>
<input type='hidden' name='CANCELURL' t-att-value='CANCELURL'/>
<!-- submit -->
<button type="submit" width="100px"
t-att-class="submit_class">
+27 -30
View File
@@ -106,35 +106,33 @@ class AcquirerPaypal(osv.Model):
fees = (percentage / 100.0 * amount + fixed ) / (1 - percentage / 100.0)
return fees
def paypal_form_generate_values(self, cr, uid, id, partner_values, tx_values, context=None):
def paypal_form_generate_values(self, cr, uid, id, values, context=None):
base_url = self.pool['ir.config_parameter'].get_param(cr, SUPERUSER_ID, 'web.base.url')
acquirer = self.browse(cr, uid, id, context=context)
paypal_tx_values = dict(tx_values)
paypal_tx_values = dict(values)
paypal_tx_values.update({
'cmd': '_xclick',
'business': acquirer.paypal_email_account,
'item_name': '%s: %s' % (acquirer.company_id.name, tx_values['reference']),
'item_number': tx_values['reference'],
'amount': tx_values['amount'],
'currency_code': tx_values['currency'] and tx_values['currency'].name or '',
'address1': partner_values['address'],
'city': partner_values['city'],
'country': partner_values['country'] and partner_values['country'].name or '',
'state': partner_values['state'] and partner_values['state'].name or '',
'email': partner_values['email'],
'zip': partner_values['zip'],
'first_name': partner_values['first_name'],
'last_name': partner_values['last_name'],
'return': '%s' % urlparse.urljoin(base_url, PaypalController._return_url),
'item_name': '%s: %s' % (acquirer.company_id.name, values['reference']),
'item_number': values['reference'],
'amount': values['amount'],
'currency_code': values['currency'] and values['currency'].name or '',
'address1': values.get('partner_address'),
'city': values.get('partner_city'),
'country': values.get('partner_country') and values.get('partner_country').name or '',
'state': values.get('partner_state') and values.get('partner_state').name or '',
'email': values.get('partner_email'),
'zip_code': values.get('partner_zip'),
'first_name': values.get('partner_first_name'),
'last_name': values.get('partner_last_name'),
'paypal_return': '%s' % urlparse.urljoin(base_url, PaypalController._return_url),
'notify_url': '%s' % urlparse.urljoin(base_url, PaypalController._notify_url),
'cancel_return': '%s' % urlparse.urljoin(base_url, PaypalController._cancel_url),
'handling': '%.2f' % paypal_tx_values.pop('fees', 0.0) if acquirer.fees_active else False,
'custom': json.dumps({'return_url': '%s' % paypal_tx_values.pop('return_url')}) if paypal_tx_values.get('return_url') else False,
})
if acquirer.fees_active:
paypal_tx_values['handling'] = '%.2f' % paypal_tx_values.pop('fees', 0.0)
if paypal_tx_values.get('return_url'):
paypal_tx_values['custom'] = json.dumps({'return_url': '%s' % paypal_tx_values.pop('return_url')})
return partner_values, paypal_tx_values
return paypal_tx_values
def paypal_get_form_action_url(self, cr, uid, id, context=None):
acquirer = self.browse(cr, uid, id, context=context)
@@ -224,8 +222,8 @@ class TxPaypal(osv.Model):
if 'handling_amount' in data and float_compare(float(data.get('handling_amount')), tx.fees, 2) != 0:
invalid_parameters.append(('handling_amount', data.get('handling_amount'), tx.fees))
# check buyer
if tx.partner_reference and data.get('payer_id') != tx.partner_reference:
invalid_parameters.append(('payer_id', data.get('payer_id'), tx.partner_reference))
if tx.payment_method_id and data.get('payer_id') != tx.payment_method_id.acquirer_ref:
invalid_parameters.append(('payer_id', data.get('payer_id'), tx.payment_method_id.acquirer_ref))
# check seller
if data.get('receiver_email') != tx.acquirer_id.paypal_email_account:
invalid_parameters.append(('receiver_email', data.get('receiver_email'), tx.acquirer_id.paypal_email_account))
@@ -236,24 +234,23 @@ class TxPaypal(osv.Model):
def _paypal_form_validate(self, cr, uid, tx, data, context=None):
status = data.get('payment_status')
data = {
res = {
'acquirer_reference': data.get('txn_id'),
'paypal_txn_type': data.get('payment_type'),
'partner_reference': data.get('payer_id')
}
if status in ['Completed', 'Processed']:
_logger.info('Validated Paypal payment for tx %s: set as done' % (tx.reference))
data.update(state='done', date_validate=data.get('payment_date', fields.datetime.now()))
return tx.write(data)
res.update(state='done', date_validate=data.get('payment_date', fields.datetime.now()))
return tx.write(res)
elif status in ['Pending', 'Expired']:
_logger.info('Received notification for Paypal payment %s: set as pending' % (tx.reference))
data.update(state='pending', state_message=data.get('pending_reason', ''))
return tx.write(data)
res.update(state='pending', state_message=data.get('pending_reason', ''))
return tx.write(res)
else:
error = 'Received unrecognized status for Paypal payment %s: %s, set as error' % (tx.reference, status)
_logger.info(error)
data.update(state='error', state_message=error)
return tx.write(data)
res.update(state='error', state_message=error)
return tx.write(res)
# --------------------------------------------------
# SERVER2SERVER RELATED METHODS
+1
View File
@@ -1 +1,2 @@
# -*- coding: utf-8 -*-
import test_paypal
+10 -45
View File
@@ -33,45 +33,12 @@ class PaypalCommon(PaymentAcquirerCommon):
self.switch_polo = (('6331101999990016', '123'))
class PaypalServer2Server(PaypalCommon):
def test_00_tx_management(self):
cr, uid, context = self.cr, self.uid, {}
# be sure not to do stupid things
paypal = self.payment_acquirer.browse(self.cr, self.uid, self.paypal_id, None)
self.assertEqual(paypal.environment, 'test', 'test without test environment')
res = self.payment_acquirer._paypal_s2s_get_access_token(cr, uid, [self.paypal_id], context=context)
self.assertTrue(res[self.paypal_id] is not False, 'paypal: did not generate access token')
tx_id = self.payment_transaction.s2s_create(
cr, uid, {
'amount': 0.01,
'acquirer_id': self.paypal_id,
'currency_id': self.currency_euro_id,
'reference': 'test_reference',
'partner_id': self.buyer_id,
}, {
'number': self.visa[0][0],
'cvc': self.visa[0][1],
'brand': 'visa',
'expiry_mm': 9,
'expiry_yy': 2015,
}, context=context
)
tx = self.payment_transaction.browse(cr, uid, tx_id, context=context)
self.assertTrue(tx.paypal_txn_id is not False, 'paypal: txn_id should have been set after s2s request')
self.payment_transaction.write(cr, uid, tx_id, {'paypal_txn_id': False}, context=context)
class PaypalForm(PaypalCommon):
def test_10_paypal_form_render(self):
cr, uid, context = self.cr, self.uid, {}
# be sure not to do stupid things
self.payment_acquirer.write(cr, uid, self.paypal_id, {'fees_active': False}, context)
self.payment_acquirer.write(cr, uid, self.paypal_id, {'paypal_email_account': 'tde+paypal-facilitator@openerp.com', 'fees_active': False}, context)
paypal = self.payment_acquirer.browse(cr, uid, self.paypal_id, context)
self.assertEqual(paypal.environment, 'test', 'test without test environment')
@@ -83,17 +50,16 @@ class PaypalForm(PaypalCommon):
res = self.payment_acquirer.render(
cr, uid, self.paypal_id,
'test_ref0', 0.01, self.currency_euro_id,
partner_id=None,
partner_values=self.buyer_values,
values=self.buyer_values,
context=context)
form_values = {
'cmd': '_xclick',
'business': 'tde+paypal-facilitator@openerp.com',
'item_name': 'test_ref0',
'item_name': 'YourCompany: test_ref0',
'item_number': 'test_ref0',
'first_name': 'Buyer',
'last_name': 'Norbert',
'first_name': 'Norbert',
'last_name': 'Buyer',
'amount': '0.01',
'currency_code': 'EUR',
'address1': 'Huge Street 2/543',
@@ -136,9 +102,8 @@ class PaypalForm(PaypalCommon):
# render the button
res = self.payment_acquirer.render(
cr, uid, self.paypal_id,
'test_ref0', 12.50, self.currency_euro,
partner_id=None,
partner_values=self.buyer_values,
'test_ref0', 12.50, self.currency_euro_id,
values=self.buyer_values,
context=context)
# check form result
@@ -163,7 +128,7 @@ class PaypalForm(PaypalCommon):
'protection_eligibility': u'Ineligible',
'last_name': u'Poilu',
'txn_id': u'08D73520KX778924N',
'receiver_email': u'tde+paypal-facilitator@openerp.com',
'receiver_email': u'dummy',
'payment_status': u'Pending',
'payment_gross': u'',
'tax': u'0.00',
@@ -183,9 +148,9 @@ class PaypalForm(PaypalCommon):
'address_name': u'Norbert Poilu',
'pending_reason': u'multi_currency',
'item_number': u'test_ref_2',
'receiver_id': u'DEG7Z7MYGT6QA',
'receiver_id': u'dummy',
'transaction_subject': u'',
'business': u'tde+paypal-facilitator@openerp.com',
'business': u'dummy',
'test_ipn': u'1',
'payer_id': u'VTDKRZQSAHYPS',
'verify_sign': u'An5ns1Kso7MWUdW4ErQKJJJ4qi4-AVoiUf-3478q3vrSmqh08IouiYpM',
+22 -22
View File
@@ -4,32 +4,32 @@
<template id="paypal_acquirer_button">
<form t-if="acquirer.paypal_email_account" t-att-action="tx_url" method="post" target="_self">
<input type="hidden" name="cmd" t-att-value="tx_values['cmd']"/>
<input type="hidden" name="business" t-att-value="tx_values['business']"/>
<input type="hidden" name="item_name" t-att-value="tx_values['item_name']"/>
<input type="hidden" name="item_number" t-att-value="tx_values['item_number']"/>
<input type="hidden" name="amount" t-att-value="tx_values['amount'] or '0.0'"/>
<input t-if="'handling' in tx_values" type="hidden" name="handling"
t-att-value="tx_values.get('handling')"/>
<input type="hidden" name="currency_code" t-att-value="tx_values['currency_code']"/>
<input type="hidden" name="cmd" t-att-value="cmd"/>
<input type="hidden" name="business" t-att-value="business"/>
<input type="hidden" name="item_name" t-att-value="item_name"/>
<input type="hidden" name="item_number" t-att-value="item_number"/>
<input type="hidden" name="amount" t-att-value="amount"/>
<input t-if="handling" type="hidden" name="handling"
t-att-value="handling"/>
<input type="hidden" name="currency_code" t-att-value="currency_code"/>
<!-- partner / address data -->
<input type="hidden" name="address1" t-att-value="tx_values['address1']"/>
<input type="hidden" name="city" t-att-value="tx_values['city']"/>
<input type="hidden" name="country" t-att-value="tx_values['country']"/>
<input type="hidden" name="email" t-att-value="tx_values['email']"/>
<input type="hidden" name="first_name" t-att-value="tx_values['first_name']"/>
<input type="hidden" name="last_name" t-att-value="tx_values['last_name']"/>
<input type="hidden" name="zip" t-att-value="tx_values['zip']"/>
<input type="hidden" name="address1" t-att-value="address1"/>
<input type="hidden" name="city" t-att-value="city"/>
<input type="hidden" name="country" t-att-value="country"/>
<input type="hidden" name="email" t-att-value="email"/>
<input type="hidden" name="first_name" t-att-value="first_name"/>
<input type="hidden" name="last_name" t-att-value="last_name"/>
<input type="hidden" name="zip" t-att-value="zip_code"/>
<!-- after payment parameters -->
<input t-if='tx_values.get("custom")' type='hidden' name="custom"
t-att-value='tx_values.get("custom")'/>
<input t-if='custom' type='hidden' name="custom"
t-att-value='custom'/>
<!-- URLs -->
<input t-if="tx_values.get('return')" type='hidden' name='return'
t-att-value="tx_values.get('return')"/>
<input t-if="paypal_return" type='hidden' name='return'
t-att-value="paypal_return"/>
<input t-if="acquirer.paypal_use_ipn" type='hidden' name='notify_url'
t-att-value="tx_values.get('notify_url')"/>
<input t-if="tx_values.get('cancel_return')" type="hidden" name="cancel_return"
t-att-value="tx_values.get('cancel_return')"/>
t-att-value="notify_url"/>
<input t-if="cancel_return" type="hidden" name="cancel_return"
t-att-value="cancel_return"/>
<!-- submit -->
<button type="submit" width="100px"
t-att-class="submit_class">
+7 -7
View File
@@ -78,14 +78,14 @@ class AcquirerSips(models.Model):
return shasign.hexdigest()
@api.multi
def sips_form_generate_values(self, partner_values, tx_values):
def sips_form_generate_values(self, values):
self.ensure_one()
base_url = self.env['ir.config_parameter'].sudo().get_param('web.base.url')
currency = self.env['res.currency'].sudo().browse(tx_values['currency_id'])
currency = self.env['res.currency'].sudo().browse(values['currency_id'])
currency_code = CURRENCY_CODES.get(currency.name, False)
if not currency_code:
raise ValidationError(_('Currency not supported by Wordline'))
amount = int(tx_values.get('amount') * 100)
amount = int(values['amount'] * 100)
if self.environment == 'prod':
# For production environment, key version 2 is required
merchant_id = getattr(self, 'sips_merchant_id')
@@ -95,15 +95,15 @@ class AcquirerSips(models.Model):
merchant_id = '002001000000001'
key_version = '1'
sips_tx_values = dict(tx_values)
sips_tx_values = dict(values)
sips_tx_values.update({
'Data': u'amount=%s|' % amount +
u'currencyCode=%s|' % currency_code +
u'merchantId=%s|' % merchant_id +
u'normalReturnUrl=%s|' % urlparse.urljoin(base_url, SipsController._return_url) +
u'automaticResponseUrl=%s|' % urlparse.urljoin(base_url, SipsController._return_url) +
u'transactionReference=%s|' % tx_values['reference'] +
u'statementReference=%s|' % tx_values['reference'] +
u'transactionReference=%s|' % values['reference'] +
u'statementReference=%s|' % values['reference'] +
u'keyVersion=%s' % key_version,
'InterfaceVersion': 'HP_2.3',
})
@@ -116,7 +116,7 @@ class AcquirerSips(models.Model):
shasign = self._sips_generate_shasign(sips_tx_values)
sips_tx_values['Seal'] = shasign
return partner_values, sips_tx_values
return sips_tx_values
@api.multi
def sips_get_form_action_url(self):
+3 -3
View File
@@ -4,9 +4,9 @@
<template id="sips_acquirer_button">
<form t-att-action="tx_url" method="post" target="_self">
<input type="hidden" name="Data" t-att-value="tx_values['Data']"/>
<input type="hidden" name="InterfaceVersion" t-att-value="tx_values['InterfaceVersion']"/>
<input type="hidden" name="Seal" t-att-value="tx_values['Seal']"/>
<input type="hidden" name="Data" t-att-value="Data"/>
<input type="hidden" name="InterfaceVersion" t-att-value="InterfaceVersion"/>
<input type="hidden" name="Seal" t-att-value="Seal"/>
<!-- submit -->
<button type="submit" width="100px"
t-att-class="submit_class">
+3 -3
View File
@@ -4,11 +4,11 @@
<template id="transfer_acquirer_button">
<form t-if="acquirer" t-att-action="tx_url" method="post" target="_self">
<t t-if="tx_values.get('return_url')">
<input type='hidden' name='return_url' t-att-value='tx_values["return_url"]'/>
<t t-if="return_url">
<input type='hidden' name='return_url' t-att-value='return_url'/>
</t>
<input type='hidden' name='reference' t-att-value='reference'/>
<input type='hidden' name='amount' t-att-value='amount or "0.0"'/>
<input type='hidden' name='amount' t-att-value='amount'/>
<input type='hidden' name='currency' t-att-value='currency.name'/>
<!-- submit -->
<button type="submit" width="100px"
+3 -3
View File
@@ -68,11 +68,11 @@ class sale_quote(http.Controller):
order.name,
order.amount_total,
order.pricelist_id.currency_id.id,
partner_id=order.partner_id.id,
tx_values={
values={
'return_url': '/quote/%s/%s' % (order_id, token) if token else '/quote/%s' % order_id,
'type': 'form',
'alias_usage': _('If we store your payment information on our server, subscription payments will be made automatically.')
'alias_usage': _('If we store your payment information on our server, subscription payments will be made automatically.'),
'partner_id': order.partner_id.id,
},
context=render_ctx)
return request.website.render('website_quote.so_quotation', values)
+2 -2
View File
@@ -741,9 +741,9 @@ class website_sale(http.Controller):
order.name,
order.amount_total,
order.pricelist_id.currency_id.id,
partner_id=shipping_partner_id,
tx_values={
values={
'return_url': '/shop/payment/validate',
'partner_id': shipping_partner_id
},
context=render_ctx)