Laravel+微信小程序(一)微信登录与授权

登录流程

1、首次登录:保存openid到数据库,并把openid存入缓存;

2、非首次登录,但未授权:仅把openid存入缓存;

3、非首次登录,且已授权:从数据库读取用户信息。

授权流程

1、首次登录:点击授权按钮,调用授权函数,获得用户信息,将其与openid发送至后台,更新数据库,即可保存用户到数据库;

2、非首次登录,但未授权:和首次登录一样;

3、非首次登录,且已授权:不显示授权按钮。


微信小程序:登录

app.js

onLaunch: function () {
    wx.login({
      success: res => {
        // 发送 res.code 到后台换取 openId, sessionKey, unionId
        if(res.code){
          wx.request({
            url: 'http://***.com/hotpot/login',
            data:{
              code:res.code
            },
            success:function(res){
              if(res.data.openid!=null){  //没授权
                wx.setStorage({
                  key: 'openid',
                  data: res.data.openid,
                })
              }else{  //授权了
                console.log(res.data);
              }
            }
          })
        }
      }
    })
},

Laravel:登录

composer require guzzlehttp/guzzle:~6.0              //安装^6.0的guzzle,不知道为什么^6.5的最新版本有问题 

php artisan make:controller UserController

在.env文件配置APPID、SECRET、 WECHAT_GET_OPEN_ID

WECHAT_GET_OPEN_ID=https://api.weixin.qq.com/sns/jscode2session
APPID=输入你自己的appid
SECRET=输入你自己的appsecret

路由和接口 

Route::get('/login','UserController@login');

use GuzzleHttp\Client;
use Illuminate\Support\Facades\DB;

class UserController extends Controller
{
    public function login(Request $request){
        //完整参数
        $param=array();
        $param[]='appid='.env('APPID');
        $param[]='secret='.env('SECRET');
        $param[]='js_code='.$request->code;
        $param[]='grant_type=authorization_code';
        $params=implode('&',$param);    //用&符号连起来
        $url = env('WECHAT_GET_OPEN_ID').'?'.$params;
        //请求接口
        $client = new \GuzzleHttp\Client([
            'timeout' => 60
        ]);
        $res = $client->request('GET',$url);
        //openid和session_key
        $data = json_decode($res->getBody()->getContents(),true);
        //openid查重
        $result = DB::table('users')->where('openid',$data['openid'])->first();
        $result = json_decode(json_encode($result), true);
        if($result==NULL){ //首次登录,存openid
            DB::beginTransaction();
            try{
                DB::table('users')->insert(['openid'=>$data['openid']]);
                DB::commit();
            }catch(\Exception $e){
                DB::rollBack();
                return $e->getMessage();
            }
        }else if($result['nickName']!=NULL){ //非首次登录,且已授权,存用户信息
            $user = array();
            $user['nickName'] = $result['nickName'];
            $user['avatarUrl'] = $result['avatarUrl'];
            $user['isBoss'] = $result['isBoss'];
            return $user;
        }
        return $data;
    }
}

微信小程序:授权

index.wxml

<button 
    open-type="getUserInfo" 
    type="primary"
    bindgetuserinfo="bindGetUserInfo">授权</button>

index.js

Page({
    data: {
        avatarUrl: '',
        nickName: '',
    },

    bindGetUserInfo: function (e) {
        let that = this;
        let userInfo = e.detail.userInfo;    //用户信息

        wx.getStorage({    //获取缓存的openid
          key: 'openid',
          success: function (res) {
            wx.request({
              url: 'http://***.com/hotpot/save',
              data:{
                openid:res.data,
                nickName: userInfo.nickName,
                avatarUrl: userInfo.avatarUrl
              },
              success:function(e){
                if(e.data == 1){    //如果更新成功
                  //显示头像昵称
                  that.setData({
                    avatarUrl: userInfo.avatarUrl,
                    nickName: userInfo.nickName
                  })
                }
              }
            })
          },
        })
      }
})

Laravel:授权

Route::get('/save','UserController@save');    

public function save(Request $request){
    DB::beginTransaction();
    try{
        DB::table('users')->where('openid',$request->openid)->update([
            'avatarUrl'=>$request->avatarUrl,
            'nickName'=>$request->nickName
        ]);
        DB::commit();
    }catch(\Exception $e){
        DB::rollBack();
        return $e->getMessage();
    }
    return 1;
}

猜你喜欢

转载自blog.csdn.net/qq_33514421/article/details/104981637