예제 #1
0
 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)
예제 #2
0
 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)
예제 #3
0
    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)
예제 #4
0
    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)
예제 #5
0
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
예제 #6
0
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
예제 #7
0
파일: wx.py 프로젝트: bluedazzle/ooil
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')
예제 #8
0
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