優化登錄接口返回token
如果code能够获取guid 就不需要一直调用授权的方法
所以 默认页面进去的时候就检测这个用户是否建立了绑定关系,,如果建立了,就显示上面那个View 没有注册就显示下面这个。
<view class="bd">
<view class="confirm-btn" bindtap='goToIndex'>
<text >登录 - 1</text>
</view>
<button class="confirm-btn" open-type="getUserInfo" bindgetuserinfo="login">授权登录</button>
<text class="copyright">@虚幻私塾 xuhss.com</text>
</view>
在index.js定义变量
regFlag默认设置为TRUE表示已经注册
//login.js
//获取应用实例
var app = getApp();
Page({
data: {
remind: '加载中',
angle: 0,
userInfo: {},
regFlag:true
},
然后再index.whtml中 添加判断:
wx:if="{{regFlag==true}}"
<view class="bd">
<view class="confirm-btn" bindtap='goToIndex' wx:if="{{regFlag==true}}">
<text >走吧,订餐去 - 1</text>
</view>
<button class="confirm-btn" open-type="getUserInfo" bindgetuserinfo="login" wx:if="{{regFlag==false}}">授权登录</button>
<text class="copyright">@虚幻私塾 xuhss.com</text>
</view>
在app.js添加统一的域名处理
添加buildurl方法 管理url的創建,可以參考web/static/common.js
getRequestHeader:function(){
return {
'content-type': 'application/x-www-form-urlencoded'
}
},
buildUrl:function (path, params) {
var url = this.globalData.domain+path;
var _paramUrl = "";
if (params) {
_paramUrl = Object.keys(params).map(
function (k) {
return [encodeURIComponent(k), encodeURIComponent(params[k])].join("=");
}
).join("&")
_paramUrl = '?'+_paramUrl
}
return url +_paramUrl
}
定义一个方法 checkLogin判断是否已经登录:
这个方法在onload的时候调用:
onLoad:function(){
wx.setNavigationBarTitle({
title: app.globalData.shopName
});
this.checkLogin();
},
運行
可以看到提示500不存在 我們可以添加鏈接的响应
在common/libs下面创建member文件夹 创建一个memberService方法
以UserService为参考,定義一個獲取openid的方法:
import hashlib, base64,random,string,requests,json
from application import app
class MemberService():
@staticmethod
def geneAuthCode(member_info):
m = hashlib.md5()
str = r"%s-%s-%s" % (member_info.id, member_info.salt, member_info.status)
m.update(str.encode("utf-8"))
return m.hexdigest()
@staticmethod
def geneSalt(length = 16):
keylist = [random.choice((string.ascii_letters+string.digits)) for i in range(length)]
return ("".join(keylist))
@staticmethod
def getWeChatOpenId(code):
url = 'https://api.weixin.qq.com/sns/jscode2session?appid={0}&secret={1}&js_code={2}&grant_type=authorization_code' \
.format(app.config['MINA_APP']['appid'], app.config['MINA_APP']['appkey'], code)
r = requests.get(url)
res = json.loads(r.text)
openid = None
if 'openid' in res:
openid = res['openid']
return openid
member.py导入这个通用的memberService
方法
from common.libs.member.MemberService import MemberService
調用方法獲取openid:
將生成salt的方法調用進來
创建后台接口:
产生一个token区分用户是否是登录的 在我们每一次用户登录小程序时候,将这个token带到后端请求来 返回给前端处理,就可以统一判断是否登录 后面我们就可以将这个token发送到API层判断是否是这个用户
@route_api.route( "/member/check-reg", methods = ['GET', 'POST'] )
def checkReg():
resp = {'code': 200, 'msg': '操作成功', 'data': {}}
req = request.values
# app.logger.info(req)
code = req['code'] if 'code' in req else ''
if not code or len(code) < 1:
resp['code'] = -1
resp['msg'] = '需要code'
return jsonify(resp)
openid = MemberService.getWeChatOpenId(code)
if openid is None:
resp['code'] = -1
resp['msg'] = '調用微信出錯'
return jsonify(resp)
# 判断是否注册过,没有注册就注册
bind_info = OauthMemberBind.query.filter_by(openid=openid, type=1).first()
if not bind_info:
resp['code'] = -1
resp['msg'] = '未绑定'
return jsonify(resp)
member_info = Member.query.filter_by(id=bind_info.member_id).first()
if not member_info:
resp['code'] = -1
resp['msg'] = '没有查询到绑定信息'
return jsonify(resp)
token = "%s#%s"%(MemberService.geneAuthCode(member_info),member_info.id)
return jsonify(resp)
login接口也改成返回tocken