[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:
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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')
|
||||
|
||||
@@ -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"/>
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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 +1,2 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
import test_paypal
|
||||
@@ -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',
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user