def put(self, siteid, uid):
     user_info = self.storage.get_user_info(uid)
     # Update user info from wechat
     resp = yield wxclient.update_user_info(user_info["appid"], user_info["openid"])
     if resp["err_code"] != 0:
         self.send_response(err_code=resp["err_code"])
     else:
         resp["data"]["uid"] = int(uid)
         self.send_response(data=resp["data"])
Exemple #2
0
 def put(self, siteid, uid):
     user_info = self.storage.get_user_info(uid)
     # Update user info from wechat
     resp = yield wxclient.update_user_info(user_info['appid'],
                                            user_info['openid'])
     if resp['err_code'] != 0:
         self.send_response(err_code=resp['err_code'])
     else:
         resp['data']['uid'] = int(uid)
         self.send_response(data=resp['data'])
    def post(self, siteid):
        appid = self.get_argument("appid")
        appinfo = self.storage.get_app_info(appid=appid)
        if not appinfo:
            self.send_response(err_code=3201)
            raise tornado.gen.Return()

        openid = self.get_argument("openid", "")
        if openid:
            res = yield wxclient.update_user_info(appid, openid)
            if res["err_code"] == 0:
                self.send_response(data=res["data"])
                raise tornado.gen.Return()

        code = self.get_argument("code", "")
        if code:
            req_data1 = {"code": code, "appid": appid, "secret": appinfo["secret"], "grant_type": "authorization_code"}
            try:
                resp1 = yield httputils.get_dict(url=url.wechat_oauth_access_token, data=req_data1)
            except tornado.httpclient.HTTPError:
                self.send_response(err_code=1001)
                raise tornado.gen.Return()

            resp_data1 = self.parse_oauth_resp(resp1)
            if resp_data1:
                openid = resp_data1["openid"]
                res = {"openid": openid, "appid": appid}
                # Get user info from wechat
                if "snsapi_userinfo" in [v.strip() for v in resp_data1["scope"].split(",")]:
                    req_data2 = {"access_token": resp_data1["access_token"], "openid": openid, "lang": "zh_CN"}
                    try:
                        resp2 = yield httputils.get_dict(url=url.wechat_oauth_userinfo, data=req_data2)
                    except tornado.httpclient.HTTPError:
                        self.send_response(err_code=1001)
                        raise tornado.gen.Return()
                    resp_data2 = self.parse_oauth_resp(resp2)
                    if resp_data2:
                        res.update(resp_data2)
                post_resp_data = dtools.transfer(res, copys=user_attrs, allow_empty=False)
                self.send_response(post_resp_data)
                self.storage.add_user_info(post_resp_data)
                raise tornado.gen.Return()
        self.send_response(err_code=1)
Exemple #4
0
    def post(self):
        post_args = dtools.xml2dict(self.request.body.decode('utf8'))
        logging.info(post_args)
        appinfo = self.storage.get_app_info(openid=post_args['ToUserName'])
        appid = appinfo['appid']
        crypter = None
        if appinfo['is_encrypted']:
            crypter = Prpcrypt(appinfo['encoding_key'])
            plain_xml = crypter.decrypt(post_args['Encrypt'], appid)
            if plain_xml:
                post_args = dtools.xml2dict(plain_xml)
            else:
                # TODO: error
                pass
        req_data = dtools.transfer(
            post_args,
            renames=[
                ('FromUserName', 'openid'),
                ('MsgType', 'msg_type'),
                ('MsgId', 'msg_id'),
                ('CreateTime', 'msg_time'),
                ('Content', 'content'),
                ('Event', 'event_type'),
                ('PicUrl', 'pic_url'),
                ('Location_X', 'latitude'),
                ('Location_Y', 'longitude'),
                ('Label', 'label'),
                ('MediaId', 'media_id')],
            allow_empty=False
        )
        logging.info('message from tencent: %s', req_data)
        req_data['appid'] = appid
        site_info = self.storage.get_site_info(appinfo['siteid'])
        security.add_sign(req_data, site_info['sitekey'])
        try:
            resp = yield httputils.post_dict(
                url=site_info['msg_notify_url'],
                data=req_data)
        except tornado.httpclient.HTTPError:
            self.send_response(err_code=9002)
            raise tornado.gen.Return()
        if resp.code != 200:
            self.send_response(err_code=9002)
            raise tornado.gen.Return()

        try:
            resp_data = json.loads(resp.body.decode('utf8'))
            if resp_data.get('err_code') == 0:
                wx_resp = build_response(from_id=post_args['ToUserName'],
                                         to_id=post_args['FromUserName'],
                                         data=resp_data.get('data'))
                if appinfo['is_encrypted']:
                    wx_resp = encrypt_data(wx_resp, crypter, appid)
                self.send_response(wx_resp)
            else:
                self.send_response(err_code=9003)
        except ValueError:
            self.send_response(err_code=9101)

        # Add basic user info
        openid = req_data['openid']
        user_info = self.storage.get_user_info(appid=appid, openid=openid)
        if not user_info:
            if appinfo['is_verified']:
                yield wxclient.update_user_info(appid, openid)
            else:
                self.storage.add_user_info({
                    'appid': appid,
                    'openid': openid,
                    'fakeid': openid
                })

        # Use mock_browser to get user info
        if not appinfo['is_protected'] and (not user_info or not user_info.get('nickname')) and not req_data.get(
                'event_type'):
            user_resp = yield wxclient.mock_browser.find_user(
                appid=appid,
                timestamp=int(req_data['msg_time']),
                mtype=req_data['msg_type'],
                content=req_data.get('content', '')
            )
            if user_resp['err_code'] == 0:
                more_info = {
                    'appid': appid,
                    'openid': openid,
                    'fakeid': user_resp['data']['fakeid'],
                    'nickname': user_resp['data']['nick_name']
                }
                if not appinfo['is_verified']:
                    contact_resp = yield wxclient.mock_browser.get_contact_info(
                        appid=appid,
                        fakeid=user_resp['data']['fakeid'],
                        msg_id=user_resp['data']['id']
                    )
                    contact_info = contact_resp['data']['contact_info']
                    more_info.update({
                        'sex': contact_info['gender'],
                        'city': contact_info['city'],
                        'province': contact_info['province'],
                        'country': contact_info['country']
                    })
                logging.info('userinfo updated: %s', more_info)
                self.storage.add_user_info(more_info)
Exemple #5
0
    def post(self, siteid):
        appid = self.get_argument('appid')
        appinfo = self.storage.get_app_info(appid=appid)
        if not appinfo:
            self.send_response(err_code=3201)
            raise tornado.gen.Return()

        openid = self.get_argument('openid', '')
        if openid:
            res = yield wxclient.update_user_info(appid, openid)
            if res['err_code'] == 0:
                self.send_response(data=res['data'])
                raise tornado.gen.Return()

        code = self.get_argument('code', '')
        if code:
            req_data1 = {
                'code': code,
                'appid': appid,
                'secret': appinfo['secret'],
                'grant_type': 'authorization_code',
            }
            try:
                resp1 = yield httputils.get_dict(
                    url=url.wechat_oauth_access_token, data=req_data1)
            except tornado.httpclient.HTTPError:
                self.send_response(err_code=1001)
                raise tornado.gen.Return()

            resp_data1 = self.parse_oauth_resp(resp1)
            if resp_data1:
                openid = resp_data1['openid']
                res = {
                    'openid': openid,
                    'appid': appid,
                }
                # Get user info from wechat
                if 'snsapi_userinfo' in [
                        v.strip() for v in resp_data1['scope'].split(',')
                ]:
                    req_data2 = {
                        'access_token': resp_data1['access_token'],
                        'openid': openid,
                        'lang': 'zh_CN'
                    }
                    try:
                        resp2 = yield httputils.get_dict(
                            url=url.wechat_oauth_userinfo, data=req_data2)
                    except tornado.httpclient.HTTPError:
                        self.send_response(err_code=1001)
                        raise tornado.gen.Return()
                    resp_data2 = self.parse_oauth_resp(resp2)
                    if resp_data2:
                        res.update(resp_data2)
                post_resp_data = dtools.transfer(res,
                                                 copys=user_attrs,
                                                 allow_empty=False)
                self.send_response(post_resp_data)
                self.storage.add_user_info(post_resp_data)
                raise tornado.gen.Return()
        self.send_response(err_code=1)