summaryrefslogtreecommitdiff
path: root/addons/payment_alipay/controllers/main.py
blob: 5763313b1a936c8939a555d07d058c58db11e05f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# -*- 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)