#!/usr/bin/env python2.7
# -*- coding: utf-8 -*-

from __future__ import print_function

import BaseHTTPServer
import hashlib
import json
import sys
import threading
import time
import urllib
import urllib2

MB_HTTP_URL = 'http://df-mbhttp.61.com.tw/mb-httpd-for-tw/router.php'
PARTNER = '202011111613'
PARTNER_KEY = 'tlaoxJiF4dDyokuX8k0H34vm0Kteqw'

GAME_ID = 2
#PRODUCT_ID = 1101
PRODUCT_ID = 200042
#PRODUCT_ID = '701'
#PRODUCT_NAME = 'vip_1_month'
PRODUCT_NAME = 'buy_seer_bean'
PRODUCT_COUNT = 1
#AMT = 500 # 
AMT = 7000
VIP_AUTO_FLAG = 0
PAY_PASSWD = ''
EXT = 'mb_http_vip_test'

CALLBACK_HOST = '127.0.0.1'
CALLBACK_PORT = 38080
NOTIFY_URL = 'http://%s:%u/notify' % (CALLBACK_HOST, CALLBACK_PORT)
#NOTIFY_URL = 'https://seerdf-account.61.com.tw/third.php?r=ThirdPartyNonDirect/asyncback&payType=mbpay'
HTTP_TIMEOUT_SEC = 10


class NotifyHandler(BaseHTTPServer.BaseHTTPRequestHandler):
    def do_POST(self):
        length = int(self.headers.getheader('content-length', 0))
        if length > 0:
            self.rfile.read(length)
        self.send_response(200)
        self.send_header('Content-Type', 'text/plain')
        self.end_headers()
        self.wfile.write('SUCCESS')

    def do_GET(self):
        self.send_response(200)
        self.send_header('Content-Type', 'text/plain')
        self.end_headers()
        self.wfile.write('SUCCESS')

    def log_message(self, fmt, *args):
        return


def start_notify_server():
    server = BaseHTTPServer.HTTPServer((CALLBACK_HOST, CALLBACK_PORT), NotifyHandler)
    thread = threading.Thread(target=server.serve_forever)
    thread.daemon = True
    thread.start()
    return server


def make_out_trade_id(account_id):
    return 'mbvip_%u_%d' % (account_id, int(time.time() * 1000))


def make_sign(params):
    sign_items = []
    for key in sorted(params.keys()):
        sign_items.append((key, params[key]))
    sign_str = urllib.urlencode(sign_items) + '&key=' + PARTNER_KEY
    return hashlib.md5(sign_str).hexdigest()


def post_form(url, params):
    data = urllib.urlencode(params)
    req = urllib2.Request(url, data)
    return urllib2.urlopen(req, timeout=HTTP_TIMEOUT_SEC).read()


def main():
    if len(sys.argv) != 2:
        print('usage: python2.7 test_mb_http_buy_vip.py account_id')
        return 1

    account_id = int(sys.argv[1])
    out_trade_id = make_out_trade_id(account_id)

    notify_server = start_notify_server()

    params = {
        'cmd': '1001',
        'partner': PARTNER,
        'out_trade_id': out_trade_id,
        'account_id': str(account_id),
        'game_id': str(GAME_ID),
        'amt': str(AMT),
        'product_id': str(PRODUCT_ID),
        'product_name': PRODUCT_NAME,
        'product_count': str(PRODUCT_COUNT),
        'notify_url': NOTIFY_URL,
        'vip_auto_flag': str(VIP_AUTO_FLAG),
        'dest_account_id': str(account_id),
        'pay_passwd': PAY_PASSWD,
        'ext': EXT,
    }
    params['sign'] = make_sign(params)

    try:
        response = post_form(MB_HTTP_URL, params)
    except Exception as err:
        print('url=%s' % MB_HTTP_URL)
        print('account_id=%u' % account_id)
        print('out_trade_id=%s' % out_trade_id)
        print('error=%s' % err)
        notify_server.shutdown()
        return 1

    notify_server.shutdown()

    print('url=%s' % MB_HTTP_URL)
    print('account_id=%u' % account_id)
    print('out_trade_id=%s' % out_trade_id)
    print('product_id=%s' % PRODUCT_ID)
    print('amt=%u' % AMT)
    print('response=%s' % response)

    try:
        body = json.loads(response)
    except Exception as err:
        print('json_error=%s' % err)
        return 1

    result = int(body.get('result', -1))
    print('result=%d' % result)

    if result == 0 and 'info' in body:
        info = body['info']
        print('trans_id=%s' % info.get('trans_id', ''))
        print('trans_status=%s' % info.get('trans_status', ''))
        print('charge_value=%s' % info.get('charge_value', ''))
        print('product_count=%s' % info.get('product_count', ''))

    return 0 if result == 0 else 1


if __name__ == '__main__':
    sys.exit(main())

