Replace website_published and environment by a generic state on payment.acquirer Payment acquirers aren't enabled by default. When setting their state to 'enabled' or 'test', it is verified the required fields for the provider are set.
64 lines
2.9 KiB
Python
64 lines
2.9 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
import logging
|
|
import pprint
|
|
import requests
|
|
import werkzeug
|
|
|
|
from odoo import http
|
|
from odoo.http import request
|
|
|
|
_logger = logging.getLogger(__name__)
|
|
|
|
|
|
class AlipayController(http.Controller):
|
|
_notify_url = '/payment/alipay/notify'
|
|
_return_url = '/payment/alipay/return'
|
|
|
|
def _alipay_validate_data(self, **post):
|
|
resp = post.get('trade_status')
|
|
if resp:
|
|
if resp in ['TRADE_FINISHED', 'TRADE_SUCCESS']:
|
|
_logger.info('Alipay: validated data')
|
|
elif resp == 'TRADE_CLOSED':
|
|
_logger.warning('Alipay: payment refunded to user and closed the transaction')
|
|
else:
|
|
_logger.warning('Alipay: unrecognized alipay answer, received %s instead of TRADE_FINISHED/TRADE_SUCCESS and TRADE_CLOSED' % (post['trade_status']))
|
|
if post.get('out_trade_no') and post.get('trade_no'):
|
|
post['reference'] = request.env['payment.transaction'].sudo().search([('reference', '=', post['out_trade_no'])]).reference
|
|
return request.env['payment.transaction'].sudo().form_feedback(post, 'alipay')
|
|
return False
|
|
|
|
def _alipay_validate_notification(self, **post):
|
|
if post.get('out_trade_no'):
|
|
alipay = request.env['payment.transaction'].sudo().search([('reference', '=', post.get('out_trade_no'))]).acquirer_id
|
|
else:
|
|
alipay = request.env['payment.acquirer'].sudo().search([('provider', '=', 'alipay')])
|
|
val = {
|
|
'service': 'notify_verify',
|
|
'partner': alipay.alipay_merchant_partner_id,
|
|
'notify_id': post['notify_id']
|
|
}
|
|
response = requests.post(alipay.alipay_get_form_action_url(), val)
|
|
response.raise_for_status()
|
|
_logger.info('Validate alipay Notification %s' % response.text)
|
|
# After program is executed, the page must print “success” (without quote). If not, Alipay server would keep re-sending notification, until over 24 hour 22 minutes Generally, there are 8 notifications within 25 hours (Frequency: 2m,10m,15m,1h,2h,6h,15h)
|
|
if response.text == 'true':
|
|
self._alipay_validate_data(**post)
|
|
return 'success'
|
|
return ""
|
|
|
|
@http.route('/payment/alipay/return', type='http', auth="public", methods=['GET', 'POST'])
|
|
def alipay_return(self, **post):
|
|
""" Alipay return """
|
|
_logger.info('Beginning Alipay form_feedback with post data %s', pprint.pformat(post))
|
|
self._alipay_validate_data(**post)
|
|
return werkzeug.utils.redirect('/payment/process')
|
|
|
|
@http.route('/payment/alipay/notify', type='http', auth='public', methods=['POST'], csrf=False)
|
|
def alipay_notify(self, **post):
|
|
""" Alipay Notify """
|
|
_logger.info('Beginning Alipay notification form_feedback with post data %s', pprint.pformat(post))
|
|
return self._alipay_validate_notification(**post)
|