獲取用戶的信息的原理,首先用戶會點擊一個url,這個url會包含一個參數redirect_uri,這個url是指向微信那邊的服務器的,然后微信會把這個http請求重定向到redirect_uri,即我們的后端,而且會附帶一個code參數,如果我們需要獲取用戶的基礎信息(也就是openid)就需要用這個code去訪問微信的指定url來請求用戶的openid,如果我們需要獲取用戶的詳細信息(微信名稱,頭像),我們就需要先用code獲取一個access_token,再用這個access_token來獲取用戶的信息
獲取用戶點擊的那個url的方法:
#encoding=utf-8 __author__ = 'kevinlu1010@qq.com' def get_redirect_url(uri, is_info=0): ''' 獲取url,改url可以訪問微信的網址,然后會重定向回來我們的網址,而且附帶訪問的微信用戶的信息 uri 需要跳轉到的uri 如/cherrs is_info 是否獲取詳細信息,如果為1,就獲取用戶的詳細信息,包括名字,圖片,否則就獲取基本信息,只有open_id 返回 url ''' pre_url = 'http://xxxx.xxxxx.com' appid = 'wxxxxxxxxxxxxxxxxxeb' scope = 'snsapi_userinfo' if is_info else 'snsapi_base' data = {'redirect_uri': pre_url + uri, 'appid': appid, 'response_type': 'code', 'scope': scope, 'state': '123'} urlencode = urllib.urlencode(data) wei_url = 'https://open.weixin.qq.com/connect/oauth2/authorize?' + urlencode + '#wechat_redirect' return wei_url
通過code獲取用戶open_id
def get_base_info(code): ''' 通過獲取的code,訪問微信的api,獲取用戶基本信息(只有openid) return 用戶的open id ''' if not code: return '' url = 'https://api.weixin.qq.com/sns/oauth2/access_token' try: data = {'appid': const.appid, 'secret': const.secret, 'code': code, 'grant_type': 'authorization_code'} post_body = urllib.urlencode(data) f = urllib2.urlopen(url, post_body).read() r = ast.literal_eval(f) #字符串轉換成字典 return r['openid'] except: return ''
通過code獲取用戶詳細信息:
def get_detail_info(code): ''' 獲取用戶的詳細信息 return dict {'userID':'','nickname':''m',headimgurl':''} ''' ret = {} url = 'https://api.weixin.qq.com/sns/oauth2/access_token' try: data = {'appid': const.appid, 'secret': const.secret, 'code': code, 'grant_type': 'authorization_code'} post_body = urllib.urlencode(data) f = urllib2.urlopen(url, post_body).read() r = ast.literal_eval(f) #字符串轉換成字典 #獲取用戶詳細信息 access_token = r['access_token'] ret['userID'] = r['openid'] url = 'https://api.weixin.qq.com/sns/userinfo?access_token=%s&openid=%s&lang=zh_CN' % ( access_token, ret['userID']) f = urllib2.urlopen(url).read() r = ast.literal_eval(f) #字符串轉換成字典 ret['nickname'] = urllib.unquote(r['nickname']) ret['headimgurl'] = urllib.unquote(r['headimgurl']) except urllib2.URLError, e: return ret return ret