def wrapper(*args, **kwargs): global cur_token if not cur_token or cur_token["access_token_expires_at"] - 60 < int(time.time()): wechat = WechatBasic(appid=wechat_appid, appsecret=wechat_appsecret) wechat.grant_token(True) cur_token = wechat.get_access_token() return wechat_function(*args, **kwargs)
def wrapper(*args, **kwargs): global cur_token if not cur_token or cur_token["access_token_expires_at"] - 60 < int( time.time()): wechat = WechatBasic(appid=wechat_appid, appsecret=wechat_appsecret) wechat.grant_token(True) cur_token = wechat.get_access_token() return wechat_function(*args, **kwargs)
def test_grant_token(self): # 测试无 appid 和 appsecret 初始化 wechat = WechatBasic() with self.assertRaises(NeedParamError): wechat.grant_token() # 测试有 appid 和 appsecret 初始化(覆盖已有 access_token,默认override=True即覆盖) wechat = WechatBasic(appid=self.appid, appsecret=self.appsecret) with HTTMock(wechat_api_mock): resp = wechat.grant_token() self.assertEqual(resp['access_token'], self.fixtures_access_token) self.assertEqual(resp['expires_in'], 7200) self.assertEqual(wechat.conf.access_token, self.fixtures_access_token)
class WeixinMananger: def __init__(self, appid="wxc2b14fc7557dc863", appsecret="67c0097d1bf2f7804f9eb2375f3d2039", redisIp="127.0.0.1", redisPort=6379): self.redis = redis.StrictRedis(host=redisIp) self.appid = appid; self.appsecret = appsecret; self.wechat = WechatBasic(appid=appid, appsecret=appsecret); def __getRedisWXAccessToken(self): return self.redis.get("wx_access_token") def __getRedisWXJsApiToken(self): return self.redis.get("wx_jsapi_token") def getAccessToken(self): token = self.__getRedisWXAccessToken() if token is None: token = self.wechat.grant_token() if token != None: timeout = token["expires_in"] self.redis.setex("wx_access_token", timeout, token["access_token"]) return token["access_token"] else: return None; else: return token def getJsApiToken(self): ticket = self.__getRedisWXJsApiToken() if ticket is None: print self.getAccessToken() ticket = self.wechat.grant_jsapi_ticket() if (ticket != None): timeout = ticket["expires_in"]; self.redis.setex("wx_jsapi_token", timeout, ticket["ticket"]) return ticket["ticket"] else: return None else: return ticket def getJsJDK(self, srcUrl): timestamp = int(time.time()) noncestr = str(time.time()) url = srcUrl jsApiToken = self.getJsApiToken(); data = {}; data["timestamp"] = timestamp data["nonceStr"] = noncestr data["appId"] = self.appid data["signature"] = self.wechat.generate_jsapi_signature(timestamp, noncestr, url, jsApiToken) data["jsApiList"] = ["openLocation", "getLocation", "scanQRCode", "showMenuItems"] data["debug"] = True return data
class WeChatService(object): def __init__(self, app_id=None, app_secret=None): self.redis = redis.StrictRedis(host='localhost', port=6379, db=1) self.app_id = app_id self.app_secret = app_secret if not app_id: self.wechat_admin = WeChatAdmin.objects.all().order_by('id')[1] self.wechat = WechatBasic(appid=self.wechat_admin.app_id, appsecret=self.wechat_admin.app_secret, token=self.wechat_admin.access_token) self.app_id = self.wechat_admin.app_id self.app_secret = self.wechat_admin.app_secret else: self.wechat_admin = None self.wechat = WechatBasic(appid=app_id, appsecret=app_secret, token='123') self.get_token() def get_token(self): key = 'access_token_{0}'.format(self.app_id) token = self.redis.get(key) if not token: res = self.wechat.grant_token() token = res.get('access_token') self.redis.set(key, token, 3500) if self.wechat_admin: self.wechat_admin.access_token = token self.wechat_admin.save() return token def send_message(self, open_id, message): token = self.get_token() req_url = 'https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token={0}'.format( token) message = message.decode('utf-8') data = { 'touser': open_id, 'msgtype': 'text', 'text': { 'content': str('测试') } } result = requests.post(req_url, data=simplejson.dumps(data)) return json.loads(result.content) def get_kefu_list(self): token = self.get_token() req_url = 'https://api.weixin.qq.com/cgi-bin/customservice/getkflist?access_token={0}'.format( token) result = requests.get(req_url) return json.loads(result.content) def distribution_kefu(self, open_id, account, extra_mes): token = self.get_token() req_url = 'https://api.weixin.qq.com/customservice/kfsession/create?access_token={0}'.format( token) data = {'kf_account': account, 'openid': open_id, 'text': extra_mes} result = requests.post(req_url, data=json.dumps(data)) return result def create_qrcode(self, scene): data = { "action_name": "QR_LIMIT_STR_SCENE", "action_info": { "scene": { "scene_str": scene } } } result = self.wechat.create_qrcode(data) ticket = result.get('ticket', '') url = result.get('url', '') return ticket, url def get_user_info_by_code(self, code): req_url = '''https://api.weixin.qq.com/sns/oauth2/access_token?appid={0}&secret={1}&code={2}&grant_type=authorization_code'''.format( self.wechat_admin.app_id, self.wechat_admin.app_secret, code) result = requests.get(req_url) return json.loads(result.content) def get_promotion_info(self, openID, channel=None): result = Promotion.objects.filter(open_id=openID) if result.exists(): return result[0] user_info = self.wechat.get_user_info(openID) nick = user_info.get('nickname', None) city = user_info.get('city', None) province = user_info.get('province', None) sex = '男' if str(user_info.get('sex', 0)) == '2': sex = '女' elif str(user_info.get('sex', 0)) == '0': sex = '未知' new_promotion = Promotion(open_id=openID, nick=nick, sex=sex, city=city, province=province, channel=channel) new_promotion.save() return new_promotion def message_manage(self, message_body): self.wechat.parse_data(message_body) message = self.wechat.get_message() manage_dict = { 'text': self.text_manage, 'image': self.image_manage, 'video': self.other_manage, 'shortvideo': self.other_manage, 'link': self.other_manage, 'location': self.other_manage, 'subscribe': self.event_manage, 'unsubscribe': self.event_manage, 'scan': self.event_manage, 'view': self.event_manage, 'event': self.event_manage, 'voice': self.other_manage, 'click': self.click_manage } result, is_news = manage_dict[message.type](message) if not is_news: response = self.wechat.response_text(result) else: response = result return response def image_manage(self, message): return '照片已收到', False def other_manage(self, message): pass def click_manage(self, message): pass def text_manage(self, message): if message.content == 'cm': menu = { 'button': [ { 'name': '🚘去保养', 'type': 'view', 'url': 'http://sy.chafanbao.com/page/shops/' }, { 'name': '昆仑微网', 'type': 'view', 'url': 'http://kunlunlube.cnpc.com.cn/klrhy/mindex/m_index.shtml?from=weixin' }, ] } self.wechat.create_menu(menu) return 'cm success', False return '收到', False def response_article(self, mount, token): article = { 'url': 'http://sy.chafanbao.com/page/phone/?token={0}'.format(token), 'title': '恭喜您获得一张 {0} 元电子券'.format(mount), 'description': '快来领取!', 'picurl': 'http://static.fibar.cn/{0}y.jpg'.format(mount) } news = self.wechat.response_news([article]) return news, True def event_manage(self, message): if message.type == 'subscribe': return self.handle_coupon(message) elif message.type == 'scan': return self.handle_coupon(message) def handle_coupon(self, message): key = message.key if key.startswith('qrscene_'): unique_id = key.split('qrscene_')[1] else: unique_id = key uc = UniqueCode.objects.filter(unique_id=unique_id).all() scode_type = {1: '10', 2: '30', 3: '50', 4: '60', 11: '50'} if uc.exists(): uc = uc[0] if uc.code_type == 10: return "<a href='http://sy.chafanbao.com/page/shops/'>导航</a>", False # return "<a href='https://ditu.amap.com/place/B01670M5JQ'>导航</a>", False if uc.code_type == 11: return self.response_article(scode_type.get(uc.code_type), uc.unique_id) # return "<a href='http://sy.chafanbao.com/page/phone/?token={0}'>点击领券</a>".format(unique_id) if not uc.use: return self.response_article(scode_type.get(uc.code_type), uc.unique_id) # return "<a href='http://sy.chafanbao.com/page/phone/?token={0}'>点击领券</a>".format(unique_id) return '优惠券已被领取', False
class WeChatService(object): def __init__(self, app_id=None, app_secret=None): self.redis = redis.StrictRedis(host='localhost', port=6379, db=2) self.app_id = app_id self.app_secret = app_secret if not app_id: self.wechat_admin = Area.objects.all().order_by('id')[0] self.wechat = WechatBasic(appid=self.wechat_admin.wx_app_id, appsecret=self.wechat_admin.wx_secret, token='123') self.app_id = self.wechat_admin.app_id self.app_secret = self.wechat_admin.app_secret else: self.wechat_admin = None self.wechat = WechatBasic(appid=app_id, appsecret=app_secret, token='123') self.get_token() def get_token(self): key = 'access_token_{0}'.format(self.app_id) token = self.redis.get(key) if not token: res = self.wechat.grant_token() token = res.get('access_token') self.redis.set(key, token, 3500) return token def get_js_ticket(self): key = 'js_ticket_{0}'.format(self.app_id) ticket = self.redis.get(key) if not ticket or ticket == 'None': res = self.wechat.get_jsapi_ticket() ticket = res.get('jsapi_ticket') self.redis.set(key, ticket, 3500) return ticket def get_random_str(self): return string.join( random.sample('ZYXWVUTSRQPONMLKJIHGFEDCBA1234567890zyxwvutsrqponmlkjihgfedcbazyxwvutsrqponmlkjihgfedcba', 32)).replace(" ", "") def get_js_signature(self, url): timestamp = int(time.time()) nostr = self.get_random_str() ticket = self.get_js_ticket() signature = self.wechat.generate_jsapi_signature(timestamp, nostr, url, ticket) return {'timestamp': timestamp, 'ticket': ticket, 'noncestr': nostr, 'url': url, 'signature': signature} def send_message(self, open_id, message): token = self.get_token() req_url = 'https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token={0}'.format(token) message = message.decode('utf-8') data = {'touser': open_id, 'msgtype': 'text', 'text': {'content': str('测试')}} result = requests.post(req_url, data=simplejson.dumps(data)) return json.loads(result.content) if __name__ == '__main__': ws = WeChatService('wx53a0bb66744d6ff8', '72714e74ea52de8a0917111bb7b4b324') print ws.get_js_signature('http://www.rapospectre.com')
def index(): echostr = request.args.get('echostr', '') if (echostr != ''): return echostr signature = request.args.get('signature') timestamp = request.args.get('timestamp') nonce = request.args.get('nonce') body_text = request.data print 'body=======' print body_text print '========' wechat = WechatBasic(token = wechat_config['token'], appid = wechat_config['appid'], appsecret = wechat_config['appsecret']) wechat.grant_token() # 对签名进行校验 if wechat.check_signature(signature=signature, timestamp=timestamp, nonce=nonce): # 对 XML 数据进行解析 (必要, 否则不可执行 response_text, response_image 等操作) wechat.parse_data(body_text) message = wechat.get_message() openid = message.source if message.type == 'text': if message.content == 'wechat': response = wechat.response_text(u'^_^') else: response = wechat.response_text(u'文字') elif message.type == 'image': response = wechat.response_text(u'图片') elif message.type == 'click': if message.key == 'GET_STEP': response = wechat.response_news([{ 'title': u'步数信息', 'url': u'http://%s:5000%s' % (wechat_config['localAddr'], url_for('main.step', openid = openid)) }]) elif message.key == 'GET_RATE_CURVE': response = wechat.response_news([{ 'title': u'心率曲线', 'url': u'http://%s:5000%s' % (wechat_config['localAddr'], url_for('main.rate', openid = openid)) }]) elif message.key == 'GET_RATE_NOW': response = wechat.response_news([{ 'title': u'当前心率', 'url': u'http://%s:5000%s' % (wechat_config['localAddr'], url_for('main.rate_now', openid = openid)) }]) elif message.key == 'GET_RANK': response = response_rank(message.target, message.source) print ranklist elif message.key == 'SET_INFO': response = wechat.response_news([{ 'title': u'信息维护', 'url': u'http://%s:5000%s' % (wechat_config['localAddr'], url_for('main.register', openid = openid)) }]) elif message.key == 'ADD_SPORT': response = wechat.response_news([{ 'title': u'添加运动', 'url': u'http://%s:5000%s' % (wechat_config['localAddr'], url_for('main.add_sport', openid = openid)) }]) elif message.key == 'PET_SYS': if exist_user(message.source): response = wechat.response_news([{ 'title': u'宠物系统', 'url': u'http://%s:5000%s' % (wechat_config['localAddr'], url_for('main.pet_welcome', openid = openid)) }]) else: response = wechat.response_text(u'请先维护个人信息(点击“个人”-“信息维护”)') else: response = wechat.response_text(u'抱歉,这个功能还在开发中0 0') elif message.type == 'subscribe': response = wechat.response_text(u'雷吼!') else: response = wechat.response_text(u'未知') # 现在直接将 response 变量内容直接作为 HTTP Response 响应微信服务器即可 print 'response: ========' #print response print '========' return response