def test_get_menu(self): # 测试无 appid 和 appsecret 初始化 wechat = WechatBasic() with self.assertRaises(NeedParamError): wechat.get_menu() # 测试有 appid 和 appsecret 初始化 wechat = WechatBasic(appid=self.appid, appsecret=self.appsecret) with HTTMock(wechat_api_mock): resp = wechat.get_menu() self.assertEqual(resp['menu'], { "button": [ { "type": "click", "name": "今日歌曲", "key": "V1001_TODAY_MUSIC", "sub_button": [] }, { "type": "click", "name": "歌手简介", "key": "V1001_TODAY_SINGER", "sub_button": [] }, { "name": "菜单", "sub_button": [ { "type": "view", "name": "搜索", "url": "http://www.soso.com/", "sub_button": [] }, { "type": "view", "name": "视频", "url": "http://v.qq.com/", "sub_button": [] }, { "type": "click", "name": "赞一下我们", "key": "V1001_GOOD", "sub_button": [] } ] } ] })
def test_get_menu(self): # 测试无 appid 和 appsecret 初始化 wechat = WechatBasic() with self.assertRaises(NeedParamError): wechat.get_menu() # 测试有 appid 和 appsecret 初始化 wechat = WechatBasic(appid=self.appid, appsecret=self.appsecret) with HTTMock(wechat_api_mock): resp = wechat.get_menu() self.assertEqual( resp['menu'], { "button": [{ "type": "click", "name": "今日歌曲", "key": "V1001_TODAY_MUSIC", "sub_button": [] }, { "type": "click", "name": "歌手简介", "key": "V1001_TODAY_SINGER", "sub_button": [] }, { "name": "菜单", "sub_button": [{ "type": "view", "name": "搜索", "url": "http://www.soso.com/", "sub_button": [] }, { "type": "view", "name": "视频", "url": "http://v.qq.com/", "sub_button": [] }, { "type": "click", "name": "赞一下我们", "key": "V1001_GOOD", "sub_button": [] }] }] })
class MenusHandler(BaseHandler): def __init__(self, *argc, **argkw): super(MenusHandler, self).__init__(*argc, **argkw) self.MpsMenuCacheKey = 'taurusxee.cache.mps.menus' try: token = self.get_param_value('mps_token') appid = self.get_param_value('mps_appid') appsecret = self.get_param_value('mps_apisecret') encrypt_mode = self.get_param_value('mps_encrypt_mode', 'normal') encoding_aes_key = self.get_param_value( 'mps_encoding_aes_key', '') wechat_conf = WechatConf( token=token, appid=appid, appsecret=appsecret, encrypt_mode=encrypt_mode, encoding_aes_key=encoding_aes_key, access_token_getfunc=functools.partial( self.mpsapi.get_access_token, appid, appsecret), access_token_setfunc=self.mpsapi.set_access_token) self.wechat = WechatBasic(conf=wechat_conf) except Exception as err: logger.exception(err) def get_menu_data(self, mps_apiurl): try: _fetch_result = lambda: self.wechat.get_menu().get('menu') menus_obj = self.cache.aget(self.MpsMenuCacheKey, _fetch_result, expire=86400) if isinstance(menus_obj, (str, unicode)): menus_obj = json.loads(menus_obj) logger.debug(menus_obj) return menus_obj except Exception as err: logger.exception(err) mstr = menutpl_str.replace('{mps_apiurl}', mps_apiurl) return json.loads(utils.safestr(mstr)) @authenticated def get(self, template_variables={}): """ 查询菜单,从数据库解析json字符串发送到页面初始化 """ mps_apiurl = self.get_param_value('mps_apiurl', '') menus_obj = self.get_menu_data(mps_apiurl) menu_buttons_array = menus_obj['button'] menudata = {} _midx = 1 for mbs in menu_buttons_array: midx = 'menu%s' % _midx menudata['%s_name' % midx] = mbs['name'] menudata['%s_type' % midx] = mbs.get('type', '') menudata['%s_key' % midx] = mbs.get('key', '') menudata['%s_url' % midx] = mbs.get('url', '') sub_buttons = mbs.get('sub_button', []) _idx = 1 for sbmenu in sub_buttons: menudata['%s_sub%s_type' % (midx, _idx)] = sbmenu['type'] menudata['%s_sub%s_name' % (midx, _idx)] = sbmenu['name'] menudata['%s_sub%s_key' % (midx, _idx)] = sbmenu.get( 'key', '') menudata['%s_sub%s_url' % (midx, _idx)] = sbmenu.get( 'url', '') _idx += 1 _midx += 1 menu_str = json.dumps(menudata, ensure_ascii=False).replace('"', '\\"') self.render('mps_menus.html', menudata=menu_str) @authenticated def post(self, *args, **kwargs): """ 更新菜单,保存菜单数据为json字符串 """ menudata = self.get_argument('menudata') menu_json = json.loads(menudata) try: menu_object = {'button': []} for menu in ['menu1', 'menu2', 'menu3']: menu_buttons = {'name': menu_json['%s_name' % menu]} menu_type = menu_json.get('%s_type' % menu) menu_url = menu_json.get('%s_url' % menu) menu_key = menu_json.get('%s_key' % menu) if all([menu_type, menu_url]) or all([menu_type, menu_key ]): menu_buttons['type'] = menu_type if 'click' in menu_type: menu_buttons['key'] = menu_key else: menu_buttons['url'] = menu_url menu_object['button'].append(menu_buttons) continue menu_buttons['sub_button'] = [] for ms in range(1, 6): menu_button = {} _menu_type = menu_json['%s_sub%s_type' % (menu, ms)] _menu_name = menu_json['%s_sub%s_name' % (menu, ms)] _menu_key = menu_json['%s_sub%s_key' % (menu, ms)] _menu_url = menu_json['%s_sub%s_url' % (menu, ms)] if len(_menu_name) > 1: menu_button['type'] = _menu_type menu_button['name'] = _menu_name if 'click' in _menu_type: menu_button['key'] = _menu_key else: menu_button['url'] = _menu_url menu_buttons['sub_button'].append(menu_button) menu_object['button'].append(menu_buttons) menu_result = json.dumps(menu_object, ensure_ascii=False, sort_keys=True, indent=4, separators=(',', ': ')) logger.info(menu_result) self.cache.set(self.MpsMenuCacheKey, menu_result) _resp = self.wechat.create_menu(menu_object) if int(_resp.get('errcode')) > 0: logger.error(u'同步菜单失败,' + _resp.get('errmsg')) logger.error(menu_result) return self.render_json(code=0, msg=u'同步微信菜单失败了[%s],请检查错误再试试' % _resp.get('errmsg')) except: logger.exception(u'更新菜单失败') return self.render_json(code=0, msg=u'更新菜单失败') self.render_json(code=0, msg=u'更新菜单成功')