微信小程序openid获取实现

一、有风险写法:

说明:整个的流程是这样的,前端调用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)

结果:

你可能感兴趣的:(python,前端技术)