# -*- 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)