一、有风险写法:
说明:整个的流程是这样的,前端调用wx.login获取code,用code+secret+appid拼接url请求微信服务器来获取用户唯一标识:oppenid,然后post请求把一堆oppenid、username等的用户信息再传给服务器,服务器(python)接收到请求以后,再给前端一个json格式的用户信息(数据库读取)。
前端小程序:
wx.login({
success: res => {
console.log(res.code);
if (res.code) { //得到code以后,用code+secret+appid获取用户唯一标识:openid
var appId = 'wx0xxxxxxxx'; //放你自己的appid
var secret = '4a67321xxxxxxxxxxxx'; //方你自己的secret
var code=res.code;
wx.request({ //请求微信服务器,为了得到oppenid
url: 'https://api.weixin.qq.com/sns/jscode2session?appid=' + appId + '&secret=' + secret + '&js_code=' + code + '&grant_type=authorization_code',
data: {},
header: {
'content-type': 'json'
},
success: res1 => {
var openid = res1.data.openid //返回openid
console.log('openid为' + openid);
console.log('sessonkey为' + res1.data.session_key);
wx.request({ // 插入登录的用户的相关信息到数据库
url: 'http://127.0.0.1:8080/login/',
// url: 'http://www.xxxxxxxx.top:9090/login/', //把拿到的openid传给自己的服务端
method: "POST",
data: {
openid: openid,
userName: this.data.nickName,
gender: this.data.gender,
city: this.data.city,
province:this.data.province,
},
header: {
'content-type': 'application/json;charset=UTF-8'
},
success: res => {
console.log("插入小程序登录用户信息成功!!!!");
console.log(res.data); //服务端将登录人插入数据库,然后返回个data,也可以返回个标志啥的
}
});
}
})
}}
})
}
后端python接收登录数据(django框架):
urls.py
from django.urls import path,re_path
from . import views
urlpatterns = [
re_path(r'login/$', views.loginDto),
views.py
def loginDto(request):
postBody = request.body
print(postBody.decode())
json_result = json.loads(postBody.decode()) #decode用来避免乱码问题
openid = json_result['openid']
conn = StuDB.connDB() //连接数据库
cursor = conn.cursor()
sql = "select * from loginUser where openId =" + "'" + openid + "'"
print("aaaaaaaaaa:" + sql)
a = cursor.execute(sql) # 执行
re = cursor.fetchall()
if (len(re)) is 0: #根据openid查不到就返回0,说明没注册过。就插入loginUser数据库新增用户。如果有的话跳过这步,直接查询sql
userName=json_result['userName']
NC=json_result['userName']
phone=''
gender=str(json_result['gender'])
print(gender)
dt=datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
sql = "insert into loginUser(userName,NC,phone,ZCRQ,gender,openId,state) \
values('%s','%s','%s','%s','%s','%s','%s')" % \
(userName, NC, phone, dt, gender, openid, '1')
//ZCRQ(注册日期)是date类型的,必须要这样拼接
print("bbbbbbbbbbbbbbb" + sql)
cursor.execute(sql)
conn.commit()
sql = "select * from loginUser where openId =" + "'" + openid + "'" //查询数据库,用于返回信息
print("cccccccccccccc:" + sql)
a = cursor.execute(sql) # 执行
re = cursor.fetchall()
print(re)
data = {
'userId': re[0][0],
'userName': re[0][1],
'NC': re[0][2],
'phone': re[0][3],
}
print(data)
return HttpResponse(json.dumps(data,ensure_ascii=False)) //返回数据库中的数据
二、改造后写法:
上面的写法其实是把oppenid给暴漏了,非常不安全,而且人家微信官方都不建议前端知道openid,其实也没必要知道openid这些:直接前端获取code后传给后端,让后端来请求code+secret+appid拼接url请求微信服务器来获取用户唯一标识:oppenid。
wx.login({
success: res => {
console.log(res.code);
if (res.code) { //得到code以后,用code+secret+appid获取用户唯一标识:oppenid
var appId = 'wx0xxxxxxx';
var secret = '4a673216xxxxxxxxxxxxx';
var code=res.code;
wx.request({ // 把code传给后端
url: 'http://127.0.0.1:8080/headImg1/'+code+'/',
header: {
'content-type': 'json'
},
success: res => {
//从数据库获取用户信息
console.log("调用服务端成功!!!!@@@@@");
console.log(res.data);
}});}}})
}
后端:
urls.py
from django.conf.urls import url
from django.urls import path,re_path
from . import views
urlpatterns = [
re_path(r'headImg1/(?P.+)/$', views.getcodeReOppenid),
]
views.py
def getcodeReOppenid(self,mycode):
# 以下为GET请求
appId='wx0xxxxxxxx'
secret='4a673216xxxxxxxxxxxx'
url='https://api.weixin.qq.com/sns/jscode2session?appid=' + appId + '&secret=' + secret + '&js_code=' + mycode + '&grant_type=authorization_code'
req = requests.get(url)
print(url)
print(req.json())#获取请求,得到的是字典格式
print(type(req.text))
print(type(req.json()))
return HttpResponse(req.text)
结果: