def init_wechat_sdk(): """ 初始化微信sdk :return: WechatBasic """ access_token = db.get("wechat:access_token") jsapi_ticket = db.get("wechat:jsapi_ticket") token_expires_at = db.get("wechat:access_token_expires_at") ticket_expires_at = db.get("wechat:jsapi_ticket_expires_at") if all((access_token, jsapi_ticket, token_expires_at, ticket_expires_at)): wechat = WechatBasic(appid=app.config['APP_ID'], appsecret=app.config['APP_SECRET'], token=app.config['TOKEN'], access_token=access_token, access_token_expires_at=int(token_expires_at), jsapi_ticket=jsapi_ticket, jsapi_ticket_expires_at=int(ticket_expires_at)) else: wechat = WechatBasic(appid=app.config['APP_ID'], appsecret=app.config['APP_SECRET'], token=app.config['TOKEN']) access_token = wechat.get_access_token() db.set("wechat:access_token", access_token['access_token'], 7000) db.set("wechat:access_token_expires_at", access_token['access_token_expires_at'], 7000) jsapi_ticket = wechat.get_jsapi_ticket() db.set("wechat:jsapi_ticket", jsapi_ticket['jsapi_ticket'], 7000) db.set("wechat:jsapi_ticket_expires_at", jsapi_ticket['jsapi_ticket_expires_at'], 7000) return wechat
def getbasic(): access_token = None access_token_expires_at = None accesstoken = db.session.query(AccessToken).order_by( AccessToken.id.desc()).first() if accesstoken is not None: access_token = accesstoken.accesstoken access_token_expires_at = accesstoken.expires conf = WechatConf( token=os.environ.get('WECHAT_TOKEN'), appid=os.getenv('appid') or 'wx2fa77d7048b61431', appsecret=os.getenv('appsecret') or 'd9dd89550c7c221d44ccd581a6558fd6', encrypt_mode='normal', access_token=access_token, access_token_expires_at=access_token_expires_at, ) basic = WechatBasic(conf=conf) now = time() if access_token_expires_at - now < 60: token = basic.get_access_token() db.session.add( AccessToken(accesstoken=token['access_token'], expires=token['access_token_expires_at'])) return basic
def init_wechat_sdk(): """初始化微信 SDK""" access_token = redis.get("wechat:access_token") jsapi_ticket = redis.get("wechat:jsapi_ticket") token_expires_at = redis.get("wechat:access_token_expires_at") ticket_expires_at = redis.get("wechat:jsapi_ticket_expires_at") if access_token and jsapi_ticket and token_expires_at and ticket_expires_at: wechat = WechatBasic(appid=app.config['APP_ID'], appsecret=app.config['APP_SECRET'], token=app.config['TOKEN'], access_token=access_token, access_token_expires_at=int(token_expires_at), jsapi_ticket=jsapi_ticket, jsapi_ticket_expires_at=int(ticket_expires_at)) else: wechat = WechatBasic(appid=app.config['APP_ID'], appsecret=app.config['APP_SECRET'], token=app.config['TOKEN']) access_token = wechat.get_access_token() redis.set("wechat:access_token", access_token['access_token'], 7000) redis.set("wechat:access_token_expires_at", access_token['access_token_expires_at'], 7000) jsapi_ticket = wechat.get_jsapi_ticket() redis.set("wechat:jsapi_ticket", jsapi_ticket['jsapi_ticket'], 7000) redis.set("wechat:jsapi_ticket_expires_at", jsapi_ticket['jsapi_ticket_expires_at'], 7000) return wechat
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 get_access_token(): token = cache.get(TOKEN_KEY) token_expired_at = cache.get(TOKEN_EXPIRED_AT_KEY) if token: return token, token_expired_at b = WechatBasic(appid=settings.app_id, appsecret=settings.secret) print "get_access_token at:", datetime.datetime.now() d = b.get_access_token() token = d["access_token"] expired_at = d["access_token_expires_at"] cache.set(TOKEN_KEY, token, (expired_at - time.time()) * 60) cache.set(TOKEN_EXPIRED_AT_KEY, expired_at, (expired_at - time.time()) * 60) return token, expired_at
def get_access_token(): token = cache.get(TOKEN_KEY) token_expired_at = cache.get(TOKEN_EXPIRED_AT_KEY) if token: return token, token_expired_at b = WechatBasic(appid=settings.APP_ID, appsecret=settings.SECRET) print 'get_access_token at:', datetime.datetime.now() d = b.get_access_token() token = d['access_token'] expired_at = d['access_token_expires_at'] cache.set(TOKEN_KEY, token, (expired_at - time.time()) * 60) cache.set(TOKEN_EXPIRED_AT_KEY, expired_at, (expired_at - time.time()) * 60) return token, expired_at
def get_access_token(): token = cache.get(TOKEN_KEY) token_expired_at = cache.get(TOKEN_EXPIRED_AT_KEY) if token: return token, token_expired_at b = WechatBasic( appid=settings.APP_ID, appsecret=settings.SECRET) print 'get_access_token at:', datetime.datetime.now() d = b.get_access_token() token = d['access_token'] expired_at = d['access_token_expires_at'] cache.set(TOKEN_KEY, token, int(expired_at - time.time())*60) cache.set(TOKEN_EXPIRED_AT_KEY, expired_at, int(expired_at - time.time())*60) return token, expired_at
def getNewWechatInfo(): ''' modify by bigzhu at 15/07/20 00:00:12 自动转化python的时间类型 ''' wechat = WechatBasic(token=token, appid=appid, appsecret=appsecret) the_access_token = wechat.get_access_token() access_token = the_access_token['access_token'] access_token_expires_at = the_access_token['access_token_expires_at'] ticket_info = wechat.get_jsapi_ticket() jsapi_ticket = ticket_info['jsapi_ticket'] jsapi_ticket_expires_at = ticket_info['jsapi_ticket_expires_at'] access_token_expires_at = time_bz.timestampToDateTime(access_token_expires_at) jsapi_ticket_expires_at = time_bz.timestampToDateTime(jsapi_ticket_expires_at) return wechat, access_token, access_token_expires_at, jsapi_ticket, jsapi_ticket_expires_at
def getNewWechatInfo(): ''' modify by bigzhu at 15/07/20 00:00:12 自动转化python的时间类型 modify by bigzhu at 15/09/13 17:25:43 为了用订阅号给指定用户发消息,改用WechatExt ''' wechat = WechatBasic(token=token, appid=appid, appsecret=appsecret) the_access_token = wechat.get_access_token() access_token = the_access_token['access_token'] access_token_expires_at = the_access_token['access_token_expires_at'] ticket_info = wechat.get_jsapi_ticket() jsapi_ticket = ticket_info['jsapi_ticket'] jsapi_ticket_expires_at = ticket_info['jsapi_ticket_expires_at'] access_token_expires_at = time_bz.timestampToDateTime(access_token_expires_at) jsapi_ticket_expires_at = time_bz.timestampToDateTime(jsapi_ticket_expires_at) return wechat, access_token, access_token_expires_at, jsapi_ticket, jsapi_ticket_expires_at
def initWechat(settings): ''' create by bigzhu at 15/05/18 14:42:20 初始化wechat,获取必要的信息,返回 settings >>> initWechat({'token':'jhxh4lkwscelseyumc4jmoymmqkz1le1', 'appid':'wx2427206f53ca5191', 'appsecret':'96c12db489bf34bddc5b8929f2745937'}) #doctest:+ELLIPSIS new access_token= ... ({'access_token_expires_at': 1..., 'access_token': u'...', 'jsapi_ticket': u'...', 'appsecret': '96c12db489bf34bddc5b8929f2745937', 'token': 'jhxh4lkwscelseyumc4jmoymmqkz1le1', 'appid': 'wx2427206f53ca5191', 'jsapi_ticket_expires_at': ...}, <wechat_sdk.basic.WechatBasic object at ...>) ''' wechat = WechatBasic(token=settings["token"], appid=settings["appid"], appsecret=settings["appsecret"]) token = wechat.get_access_token() settings['access_token'] = token['access_token'] settings['access_token_expires_at'] = token['access_token_expires_at'] ticket_info = wechat.get_jsapi_ticket() settings['jsapi_ticket'] = ticket_info['jsapi_ticket'] settings['jsapi_ticket_expires_at'] = ticket_info['jsapi_ticket_expires_at'] print 'new access_token=', settings['access_token'] return settings, wechat
def init_wechat_sdk(): access_token = redis.get("wechat:access_token") if access_token != None: conf = WechatConf( token=app.config['TOKEN'], appid=app.config['APP_ID'], appsecret=app.config['APP_SECRET'], access_token=access_token, encrypt_mode="normal", access_token_expires_at=redis.ttl("wechat:access_token")) wechat = WechatBasic(conf=conf) else: conf = WechatConf(token=app.config['TOKEN'], appid=app.config['APP_ID'], encrypt_mode="normal", appsecret=app.config['APP_SECRET']) wechat = WechatBasic(conf=conf) access_token = wechat.get_access_token() redis.set("wechat:access_token", access_token['access_token'], 7000) return wechat
def get_new_access_token(): """根据时间戳来判断数据库是否有未过期的access_token""" timestamps = int(time.time()) access_token_records = AccessToken.objects.filter( access_token_expires_at__gt=timestamps - 7200) if len(access_token_records) == 0: wechat_obj = WechatBasic( token='projie', appid='wxe1c1f049439b6c30', appsecret='f85b53570ae1540b078e548b99a45f6c', ) new_access_token = wechat_obj.get_access_token() AccessToken.objects.create( access_token=new_access_token['access_token'], access_token_expires_at=new_access_token['access_token_expires_at'] ) return new_access_token['access_token'], new_access_token[ 'access_token_expires_at'] else: return access_token_records[0].access_token, access_token_records[ 0].access_token_expires_at
def get_wechat(restaurant): # 判断access token是否过期 if (restaurant.weixin_access_token is None or restaurant.weixin_access_token_expires_at < int(time.time()) - 1000): wechat = WechatBasic(token=restaurant.token, appid=restaurant.app_id, appsecret=restaurant.app_secret) r = wechat.get_access_token() restaurant.weixin_access_token = r["access_token"] restaurant.weixin_access_token_expires_at = r[ "access_token_expires_at"] restaurant.save() wechat = WechatBasic( token=restaurant.token, appid=restaurant.app_id, appsecret=restaurant.app_secret, access_token=restaurant.weixin_access_token, access_token_expires_at=restaurant.weixin_access_token_expires_at) return wechat
def getNewWechatInfo(): ''' modify by bigzhu at 15/07/20 00:00:12 自动转化python的时间类型 modify by bigzhu at 15/09/13 17:25:43 为了用订阅号给指定用户发消息,改用WechatExt ''' conf = WechatConf( token=token, appid=appid, appsecret=appsecret, encrypt_mode='compatible', encoding_aes_key=encoding_aes_key ) wechat = WechatBasic(conf=conf) the_access_token = wechat.get_access_token() access_token = the_access_token['access_token'] access_token_expires_at = the_access_token['access_token_expires_at'] ticket_info = wechat.get_jsapi_ticket() jsapi_ticket = ticket_info['jsapi_ticket'] jsapi_ticket_expires_at = ticket_info['jsapi_ticket_expires_at'] access_token_expires_at = time_bz.timestampToDateTime(access_token_expires_at) jsapi_ticket_expires_at = time_bz.timestampToDateTime(jsapi_ticket_expires_at) return wechat, access_token, access_token_expires_at, jsapi_ticket, jsapi_ticket_expires_at
def get_basic_obj(request): # type: (object) -> object """ 获取基本操作对象,access_token和access_token_expires_at从session中获取 :return: """ access_token = None access_token_expires_at = None token_id = None token_list = AccessToken.objects.order_by("-id") if token_list: old_token = token_list[0] access_token = old_token.token access_token_expires_at = old_token.expires token_id = old_token.id jsapi_ticket = None jsapi_ticket_expires_at = None ticket_id = None ticket_list = JsapiTicket.objects.order_by("-id") if ticket_list: old_ticket = ticket_list[0] jsapi_ticket = old_ticket.ticket jsapi_ticket_expires_at = old_ticket.expires ticket_id = old_ticket.id # 微信配置 conf = WechatConf( token=settings.TOKEN, appid=settings.APPID, appsecret=settings.APPSECRET, encrypt_mode=settings. ENCRYPT_MODE, # 可选项:normal/compatible/safe,分别对应于 明文/兼容/安全 模式 encoding_aes_key=settings. ENCODING_AES_KEY, # 如果传入此值则必须保证同时传入 token, appid access_token=access_token, access_token_expires_at=access_token_expires_at, jsapi_ticket=jsapi_ticket, jsapi_ticket_expires_at=jsapi_ticket_expires_at, ) wechat = WechatBasic(conf=conf) access_token = wechat.get_access_token() print("current access_token:", access_token) # 将access_token重新更新到db new_token = AccessToken() new_token.token = access_token["access_token"] new_token.expires = access_token["access_token_expires_at"] if token_id: new_token.id = token_id new_token.save() jsapi_ticket = wechat.get_jsapi_ticket() print("current jsapi_ticket:", jsapi_ticket) # 将jsapi_ticket重新更新到db new_ticket = JsapiTicket() new_ticket.ticket = jsapi_ticket["jsapi_ticket"] new_ticket.expires = jsapi_ticket["jsapi_ticket_expires_at"] if ticket_id: new_ticket.id = ticket_id new_ticket.save() return wechat
# 队列 celery = make_celery(app) # 记录日志 handler = RotatingFileHandler('app.log', maxBytes=10000, backupCount=1) handler.setFormatter( logging.Formatter('%(asctime)s %(levelname)s: %(message)s ' '[in %(pathname)s:%(lineno)d]')) handler.setLevel(logging.WARNING) app.logger.addHandler(handler) # 初始第三方库 redis = Redis() # 初始化微信 SDK wechat = WechatBasic(appid=app.config['APP_ID'], appsecret=app.config['APP_SECRET'], token=app.config['TOKEN']) if not redis.exists("wechat:access_token"): # access_token 写入缓存 wechat.grant_jsapi_ticket() redis.set("wechat:access_token", wechat.get_access_token()['access_token'], 7000) # 路由 from .routes import * # 定时任务 from .plugins.cron import *
# 队列 celery = make_celery(app) # 记录日志 handler = RotatingFileHandler('app.log', maxBytes=10000, backupCount=1) handler.setFormatter(logging.Formatter( '%(asctime)s %(levelname)s: %(message)s ' '[in %(pathname)s:%(lineno)d]' )) handler.setLevel(logging.WARNING) app.logger.addHandler(handler) # 初始第三方库 redis = Redis() # 初始化微信 SDK wechat = WechatBasic(appid=app.config['APP_ID'], appsecret=app.config['APP_SECRET'], token=app.config['TOKEN']) if not redis.exists("wechat:access_token"): # access_token 写入缓存 wechat.grant_jsapi_ticket() redis.set("wechat:access_token", wechat.get_access_token()['access_token'], 7000) # 路由 from .routes import * # 定时任务 from .plugins.cron import *
from wechat_sdk import WechatBasic from wechat_sdk.exceptions import ParseError from wechat_sdk.messages import TextMessage, VoiceMessage, ImageMessage, VideoMessage, LinkMessage, LocationMessage, EventMessage from .menu import create_menu from GuoShop.settings import BASE_DIR # Create your views here. TOKEN = 'ygf' AppID = 'wx99ab3b8f58db68be' AppSecret = 'b84b99057fc5f2217581f9540468cb02' #缓存access_token if not cache.get('access_token') or not cache.get('access_token_expires_at'): wechat = WechatBasic(token=TOKEN, appid=AppID, appsecret=AppSecret) access_token_dit = wechat.get_access_token() access_token = access_token_dit.get('access_token', '') access_token_expires_at = access_token_dit.get('access_token_expires_at', '') cache.set('access_token', access_token, 7000) cache.set('access_token_expires_at', access_token_expires_at, 7000) wechat = WechatBasic(token=TOKEN, appid=AppID, appsecret=AppSecret, access_token=cache.get('access_token'), access_token_expires_at=cache.get('access_token_expires_at')) @csrf_exempt def index(request): ''' :param request:
from wechat_sdk.exceptions import ParseError from wechat_sdk.messages import TextMessage import time import fcntl conf = WechatConf( token='weixin_langrensha', appid='wx40204f4d0ec2ea5a', appsecret='451bc8bf5e759c596256cade2e11e42d', encrypt_mode='normal', # 可选项:normal/compatible/safe,分别对应于 明文/兼容/安全 模式 encoding_aes_key= 'qY71DJ7XdXsDWksumrazYMxf29gAKlopjOIB6n3pFV2' # 如果传入此值则必须保证同时传入 token, appid ) wechat = WechatBasic(conf=conf) # 实例化 WechatBasic 官方接口类 while (True): access_token = wechat.get_access_token() f = open('AccessToken', 'w', encoding='utf-8') fcntl.flock(f, fcntl.LOCK_EX) f.write(access_token["access_token"] + '\n') f.write(str(access_token["access_token_expires_at"])) fcntl.flock(f, fcntl.LOCK_UN) #batch_get(access_token["access_token"] , 'image') f.close() time.sleep(3500) # def batch_get(self, accessToken, mediaType, offset=0, count=10): # postUrl = "https://api.weixin.qq.com/cgi-bin/material/batchget_material?access_token=%s" % accessToken # postData = '{ "type": "%s", "offset": %d, "count": %d }' % (mediaType, offset, count) # urlResp = urllib.request.urlopen(postUrl, postData.encode('utf-8')) # print(urlResp.read())
def interface(): """初始化接入""" signature = str(request.args.get("signature")) timestamp = str(request.args.get('timestamp')) nonce = str(request.args.get('nonce')) echostr = request.args.get('echostr') if 'access_token' not in session: # 实例化 wechat access_token = None access_token_expires_at = None wechat = WechatBasic(appid=appid, appsecret=appsecret) token_dict = wechat.get_access_token() access_token = token_dict.get('access_token') if access_token: session['access_token'] = access_token session['access_token_expires_at'] = token_dict.get('access_token_expires_at') response = "" wechat = WechatBasic(token=token) # 对签名进行校验 if wechat.check_signature(signature=signature, timestamp=timestamp, nonce=nonce): # 获取请求类型 if request.method == 'POST': # 读取用户发送消息 body_text = request.data print body_text wechat.parse_data(body_text) # 获得解析结果 message = wechat.get_message() print "target_user,", message.target print "from_user,", message.source print "message_type:", message.type openid = message.source # print request.data # 用户发送文本消息 if message.type == 'text': if message.content == 'test': response = wechat.response_text(u'^_^') else: response = wechat.response_text(u'您好!') if not g.user: # 检查用户是否存在 user = User.query.filter(User.profile.any(Profile.openid == openid)).first() if user is not None: signin_user(user) print u'新用户(%s)关注微信...' % user.name else: user = add_wechat_user_to_db(openid) session['openid'] = openid else: user = g.user message = WechatMessage(user_id=user.id, content=message.content) db.session.add(message) db.session.commit() # 用户发送图片消息 elif message.type == 'image': response = wechat.response_text(u'图片') elif message.type == 'scan': if message.key and message.ticket: # TODO 扫码回收优惠券,这里还要判断扫码的用户是否为该品牌店授权的店员 # TODO 考虑到还有绑定店员的扫码事件,key分为两种:11[brandid],12[discount_id] logging.info(message.key[0:2]) logging.info(message.key[2]) if message.key[0:2] == '11': brand_id = int(message.key[2:]) brand = Brand.query.get(brand_id) if not brand: response = wechat.response_text("要绑定的店铺不存在") data = {"bid": brand_id} url_text = current_app.config.get("SITE_DOMAIN") + "/check_saler_info" + "?" + urlencode(data) brand_text = "<a href='{0}'>{1}</a>".format(url_text, brand.name) print brand_text text = "您正在申请绑定门店%s,点击输入手机号验证身份" % brand_text response = wechat.response_text(text) elif message.key[0:2] == '12': record_id = int(message.key[2:]) ticket_record = GetTicketRecord.query.get(record_id) logging.info("tid" + str(ticket_record.id)) # 判断扫码用户是否为该店铺的店员 discount_id = ticket_record.discount_id discount = Discount.query.get(discount_id) scan_user = User.query.filter(User.profile.any(Profile.openid == openid)).first() salers = Saler.query.filter(Saler.user_id == scan_user.id) if salers.count() > 0: saler = salers.filter(Saler.brand_id == discount.brand_id).first() if not saler: brand = Brand.query.get(discount.brand_id) tip = "您不是该店铺{0}的店员".format(brand.name) response = wechat.response_text(tip) else: callback_ticket(record_id) saler.count += 1 db.session.add(saler) db.session.commit() response = "" else: tip = "您还没有绑定该店铺" response = wechat.response_text(tip) # 用户在关注微信时就将用户数据写入数据库 elif message.type == 'subscribe': if message.key and message.ticket: # TODO 扫码回收优惠券,这里还要判断扫码的用户是否为该品牌店授权的店员 # TODO 考虑到还有绑定店员的扫码事件,key分为两种:bind_[brandid],ticket_[code] value = message.key.replace("qrscene_", "") if value.split("_")[0] == 'ticket': record_id = int(message.key.split("_")[1]) callback_ticket(record_id) response = "" elif value.split("_")[0] == 'bind': brand_id = int(message.key.split("_")[1]) brand = Brand.query.get(brand_id) data = {"bid": brand_id} url_text = current_app.config.get("SITE_DOMAIN") + "/check_saler_info" + "?" + urlencode(data) brand_text = "<a href='{0}'>{1}</a>".format(url_text, brand.name) text = "您正在申请绑定门店%s,点击输入手机号验证身份" % brand_text response = wechat.response_text(text) openid = message.source if not g.user: # 检查用户是否存在 user = User.query.filter(User.profile.any(Profile.openid == openid)).first() if user is None: add_wechat_user_to_db(openid) print u'新用户(%s)关注微信' % user.name response = wechat.response_text(u'欢迎关注汝州百事优惠圈') elif message.type == 'location': # 这里有location事件 TODO latitude, longitude, precision = message.latitude, message.longitude, message.precision print '-' * 10, latitude, longitude, precision, request.remote_addr session['latitude'] = latitude session['longitude'] = longitude session['precision'] = precision g.latitude = latitude g.longitude = longitude g.precision = precision return "" else: return "" return response else: return echostr else: return "error"
#coding=utf-8