程序开发登录实例全面解读及步骤分析

why 66 2024-10-14

微信小程序登录
一. 小程序不支持cookie会话
1. 通过传递与检验3rd_session来保持会话
2. 3rd_session可以执行‘`head -n 80 /dev/urandom | tr -dc a-za-z0-9 | head -c 168`该命令生成
3. 使用redis或者数据库存储session
4. 生成的3rd_session发送给客户端,写入storage
5. 客户端的每次请求必须带上3rd_session
二、加密数据解码
1. $iv,$code是被加密过的数据,由于请求过程中因为编码原因+号变成了空格,所以我们需要用下面的方法转换回来

小程序开发登录实例全面解读及步骤分析

1

2

3

function define_str_replace($data){

    return str_replace(' ','+',$data);

  }


三、例子:
php

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

// 微信登录

 public function weixin_login(){

   $session_db=D('Session');

   $session_id=I('get.sessionid','');

   $session=$session_db->getSession($session_id);

   if( !empty( $session ) ){

     $this->ajaxReturn(['error_code'=>0,'sessionid'=>$session_id]);

   }else{

     $iv=define_str_replace(I('get.iv')); //把空格转成+

     $encryptedData=urldecode(I('get.encryptedData'));  //解码

     $code=define_str_replace(I('get.code')); //把空格转成+

     $msg=D('Weixin')->getUserInfo($code,$encryptedData,$iv); //获取微信用户信息(openid)

     if($msg['errCode']==0){

       $open_id=$msg['data']->openId;

       $users_db=D('Users');

       $info=$users_db->getUserInfo($open_id);

       if(!$info||empty($info)){

         $users_db->addUser(['open_id'=>$open_id,'last_time'=>['exp','now()']]); //用户信息入库

         $info=$users_db->getUserInfo($open_id);                  //获取用户信息

         $session_id=`head -n 80 /dev/urandom | tr -dc A-Za-z0-9 | head -c 168`;  //生成3rd_session

         $session_db->addSession(['uid'=>$info['id'],'id'=>$session_id]); //保存session

       }

       if($session_id){

         $this->ajaxReturn(['error_code'=>0,'sessionid'=>$session_id]);  //把3rd_session返回给客户端

       }else{

         $this->ajaxReturn(['error_code'=>0,'sessionid'=>$session_db->getSid($info['id'])]);

       }

  }else{

       $this->ajaxReturn(['error_code'=>'用户信息获取失败!']);

     }

       

   }

 }


获取微信信息模型(包括信息解密,官方例子点击-)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

require_once ABS_APP_PATH.'/Addon/Aes/wxBizDataCrypt.php';

class WeixinModel{

  // 获取微信的用户信息(openid)

  public function getUserInfo($code,$encryptedData,$iv){

    $appid=C('appid');

    $secret=C('secret');

    $grant_type='authorization_code';

    $url='https://api.weixin.qq.com/sns/jscode2session';

    $url= sprintf("%s?appid=%s&secret=%s&js_code=%s&grant_type=%",$url,$appid,$secret,$code,$grant_type);

    $user_data=json_decode(file_get_contents($url));

    $session_key= define_str_replace($user_data->session_key);

    $data="";

    $wxBizDataCrypt=new \WXBizDataCrypt($appid,$session_key);

    $errCode=$wxBizDataCrypt->decryptData($encryptedData,$iv,$data);

    return ['errCode'=>$errCode,'data'=>json_decode($data),'session_key'=>$session_key];

  }

  }


javascript

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

getUserInfo: function(cb) {

    var that = this

    if (this.globalData.userInfo) {

      typeof cb == "function" && cb(this.globalData.userInfo)

    } else {

      //调用登录接口

      wx.login({

        success: function(r) {

          wx.getUserInfo({

            success: function(res) {

              that.login({

                code: r.code,

                iv: res.iv,

                encryptedData: encodeURIComponent(res.encryptedData),

              })

              that.globalData.userInfo = res.userInfo

              typeof cb == "function" && cb(that.globalData.userInfo)

            }

          })

        }

      })

    }

  },

 login: function(param) {

    wx.request({

      url: this.requestUrl('Index/weixin_login'),

      data: param,

      header: {

        'content-type': "application/json",

      },

      success: function(res) {

        var data = JSON.parse(res.data.trim());

        wx.setStorageSync('sessionid', data.sessionid);

      }

    })

  },

以上就是小程序开发之登录实例详解的详细内容。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:微信小程序网络请求封装方法及实例详细解读
下一篇:微信公众号用户管理功能实现方法详细解析
相关文章

 发表评论

暂时没有评论,来抢沙发吧~