def post(self):

        self.set_header("Content-Type", "application/json")
        print self.request.body
        json_data = xml2json(self.request.body.encode('utf8'), options)
        data = json.loads(json_data)['xml']
        return_code = data['return_code']
        if return_code == 'SUCCESS':
            openid = data['openid']
            out_trade_no = data['out_trade_no']
            cash_fee = data['cash_fee']
            where = " openid='%s' and id=%s and (status<>'payed' or status is null) " % (openid, out_trade_no)
            from webpy_db import SQLLiteral
            count = pg.update('pay', status='payed', wexin_return=json_data, stat_date=SQLLiteral('NOW()'), where=where)
            if count != 1:
                error_info = 'update failure: count=%s where=%s' % (count, where)
                print error_info
                raise Exception(error_info)
            else:
                wechat = wechat_oper.getWechat()
                content = '''您支付的 %s 元已进入充值系统,正在向您的油卡充值,请耐心等候......''' % (int(cash_fee) / 100.00)
                wechat.send_text_message(openid, content)
        else:
            print data['return_msg']
#{u'openid': u'oGXiIwHwx_zB8ekXibYjdt3Xb_fE', u'trade_type': u'JSAPI', u'cash_fee': u'1', u'nonce_str': u'798243e4902342c83e833c71141385f', u'return_code': u'SUCCESS', u'is_subscribe': u'Y', u'bank_type': u'CFT', u'mch_id': u'1308443701', u'out_trade_no': u'86', u'result_code': u'SUCCESS', u'total_fee': u'1', u'appid': u'wx907d8a3f50de65db', u'fee_type': u'CNY', u'time_end': u'20160215113326', u'transaction_id': u'1002230516201602153283628055', u'sign': u'CAD12073F45232BB600B8F066B434A30'}

        success = '''
        <xml>
          <return_code><![CDATA[SUCCESS]]></return_code>
          <return_msg><![CDATA[OK]]></return_msg>
        </xml>
        '''
        self.write(success)
    def put(self):
        self.set_header("Content-Type", "application/json")
        parm = json.loads(self.request.body)
        id = parm.get("id")
        status = parm.get("status")

        user_id = self.get_secure_cookie("user_id")
        count = self.pg.update("pay", where="id=%s and status<>'%s' " % (id, status), status=status, user_id=user_id)
        if count != 1:
            raise Exception("占位失败")
        if status == "recharged":  # 完成充值,向微信发送
            pay_info = public_db.getPayInfo(id=id)[0]
            wechat = wechat_oper.getWechat()
            content = """ %s 元已已成功冲入油卡,可以使用了!""" % (int(pay_info.total_fee) / 100.00)
            wechat.send_text_message(pay_info.openid, content)

        self.write(json.dumps({"error": "0"}, cls=public_bz.ExtEncoder))
    def post(self):
        self.set_header("Content-Type", "application/json")

        wechat = wechat_oper.getWechat()

        wechat.parse_data(self.request.body)
        message = wechat.get_message()

        response = None
        if isinstance(message, TextMessage):
            # count = public_db.updateDescription(openid=message.source, desc=message.content)
            # if count == 1:
            #    response = wechat.response_text(content=u'描述已经添加,感谢您的举报.')
            # else:
            #    response = wechat.response_text(content=u'请先发送需要举报的照片')
            response = wechat.response_text(content=u'文字信息')

        elif isinstance(message, VoiceMessage):
            response = wechat.response_text(content=u'语音信息')
        elif isinstance(message, ImageMessage):

            # 需要下载图片
            def downloadImageFile():
                http_client = tornado.httpclient.AsyncHTTPClient()
                http_client.fetch(message.picurl, callback=done)

            def done(response):
                with open("static/upload/images/" + message.media_id + '.jpg', "w") as f:
                    f.write(response.body)
                print "DONE"
            downloadImageFile()
            # 检查用户是否存储了,没有的话存之
            wechat_user_info = public_db.getWechatUserByOpenid(message.source)
            if wechat_user_info:
                pass
            else:
                wechat_user_info = wechat.get_user_info(message.source)
                pg.db.insert('wechat_user', **wechat_user_info)
            pg.db.insert('upload_info', openid=message.source, media_id=message.media_id)

            response = wechat.response_text(content=u'图片已经保存,请继续向我们发送对图片的描述')
        elif isinstance(message, VideoMessage):
            response = wechat.response_text(content=u'视频信息')
        elif isinstance(message, LinkMessage):
            wechat_user_info = wechat.get_user_info(message.source)
            print wechat_user_info
            response = wechat.response_text(content=u'链接信息')
        elif isinstance(message, LocationMessage):
            response = wechat.response_text(content=u'地理位置信息')
        elif isinstance(message, EventMessage):  # 事件信息
            if message.type == 'subscribe':  # 关注事件(包括普通关注事件和扫描二维码造成的关注事件)
                print message.source
                if message.key and message.ticket:  # 如果 key 和 ticket 均不为空,则是扫描二维码造成的关注事件
                    response = wechat.response_text(content=u'用户尚未关注时的二维码扫描关注事件')
                else:
                    response = wechat.response_text(content=u'普通关注事件')
            elif message.type == 'unsubscribe':
                response = wechat.response_text(content=u'取消关注事件')
            elif message.type == 'scan':
                response = wechat.response_text(content=u'用户已关注时的二维码扫描事件')
            elif message.type == 'location':
                response = wechat.response_text(content=u'上报地理位置事件')
            elif message.type == 'click':
                response = wechat.response_text(content=u'自定义菜单点击事件')
            elif message.type == 'view':
                response = wechat.response_text(content=u'自定义菜单跳转链接事件')

        self.write(response)
    web_class = tornado_bz.getAllWebBzRequestHandlers()
    web_class.update(globals().copy())

    if len(sys.argv) == 2:
        port = int(sys.argv[1])
    else:
        port = 9000
    print port

    url_map = tornado_bz.getURLMap(web_class)
    # 机器人
    url_map.append((r'/robots.txt()', tornado.web.StaticFileHandler, {'path': "./static/robots.txt"}))
    # sitemap
    url_map.append((r'/sitemap.xml()', tornado.web.StaticFileHandler, {'path': "./static/sitemap.xml"}))
    #url_map.append((r'/static/(.*)', tornado.web.StaticFileHandler, {'path': "./static"}))

    settings = tornado_bz.getSettings()
    settings["pg"] = pg
    settings["domain"] = 'yinmore.follow.center'
    settings["appid"] = wechat_oper.appid
    settings["appsecret"] = wechat_oper.appsecret
    settings["wechat"] = wechat_oper.getWechat()

    application = tornado.web.Application(url_map, **settings)

    application.listen(port)
    ioloop = tornado.ioloop.IOLoop().instance()

    tornado.autoreload.start(ioloop)
    ioloop.start()
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import wechat_oper
if __name__ == '__main__':
    wechat = wechat_oper.getWechat()
    menu_data = {
        'button': [
            {
                'type': 'view',
                'name': '油卡冲值',
                'url': 'http://yinmore.follow.center/app'
            },
            {
                'type': 'view',
                'name': '油卡管理',
                'url': 'http://yinmore.follow.center/app#!/card_manager/'
            },
        ]
    }
    print wechat.create_menu(menu_data)
 def initialize(self):
     super(WechatBaseHandler, self).initialize()
     self.wechat = wechat_oper.getWechat()