微信小程序授权登录,PHP解密数据,并返回用户信息token记住登录状态 - Go语言中文社区

微信小程序授权登录,PHP解密数据,并返回用户信息token记住登录状态


首先创建一个项目,把这些代码都清空,我们自己写!

首先index.wxml,写一个button用于发起登录

index.wxml

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

然后写index.js

通过wx.login()来获取code
如果成功获取,那么返回code
然后调用wx.request()向服务端发起一个请求,即向登录api接口发送code
换取openid和session_key

//index.js
//获取应用实例
const app = getApp()
Page({
  data: {

  },

  //授权登录
  onGotUserInfo(e) {
    // console.log(e)
  },
  //登录获取code
  bindGetUserInfo(e) {
    var that = this;
    that.setData({
      kais: false,
      userimg: e.detail.userInfo.avatarUrl,
      username: e.detail.userInfo.nickName,
    });
    wx.login({
      success: function (res) {
        wx.getUserInfo({ //得到rawData, signatrue, encryptData
          success: function (data) {
            var rawData = data.rawData;
            var signature = data.signature;
            var encryptedData = data.encryptedData;
            var iv = data.iv;
            wx.request({
              url: '/api/user/login',
              data: {
                "code": res.code,
                "rawData": rawData,
                "signature": signature,
                'iv': iv,
                'encryptedData': encryptedData
              },
              method: 'POST',
              success: function (info) {
                console.log(info);
                that.setData({
                  token: info.data,
                  kais: false,
                });
                //存储登录信息
                if (wx.getStorageSync('key') == '') {
                  wx.setStorage({
                    key: 'key',
                    data: info.data,
                  });
                };
              }
            })
          }
        })
      },
    })
  },        
})

app.js,这个清空,留下这样就行了

//app.js
App({
 
})

写到这小程序端酒写完了,现在开始写服务端了

<?php
// +----------------------------------------------------------------------
// | Date: 2019/4/8 9:49
// +----------------------------------------------------------------------
// | Description: 用户控制器
// +----------------------------------------------------------------------
namespace appminiapicontroller;
use appminiapimodelWxUser;
use thinkCache;
use thinkDb;

class User extends Base
{
 



    /*
       *登录(调用wx.login获取)
       * @param $code string
       * @param $rawData string
       * @param $signatrue string
       * @param $encryptedData string
       * @param $iv string
       * @return $code 成功码
       * @return $session3rd  第三方3rd_session
       * @return $data  用户数据
   */
    public function login()
    {
        //开发者使用登陆凭证 code 获取 session_key 和 openid
        $APPID = '';//自己配置
        $AppSecret = '';//自己配置
      

        $code = input('code');
        $url = "https://api.weixin.qq.com/sns/jscode2session?appid=" . $APPID . "&secret=" . $AppSecret . "&js_code=" . $code . "&grant_type=authorization_code";
        $arr = $this->vget($url);  // 一个使用curl实现的get方法请求
        $arr = json_decode($arr, true);
        $openid = $arr['openid'];
        $session_key = $arr['session_key'];
        // 数据签名校验
        $signature = input('signature');
        $rawData = input('rawData');
        $signature2 = sha1($rawData . $session_key);
        if ($signature != $signature2) {
            return json(['code' => 500, 'msg' => '数据签名验证失败!']);
        }
        Vendor("PHP.wxBizDataCrypt");  //加载解密文件,在官方有下载(下载后放到vender目录去)
        $encryptedData = input('encryptedData');
        $iv = input('iv');
        $pc = new WXBizDataCrypt($APPID, $session_key);
        $errCode = $pc->decryptData($encryptedData, $iv, $data);  //其中$data包含用户的所有数据
        $data = json_decode($data,true);
        if ($errCode == 0) {
           $user_id = md5($data['openId']);
           //缓存七天
           //Cache::set("$user_id",$data['openId'],60*60*24*7);
           $userInfo = [
               'open_id'    => $data['openId'],
               'nickName'   => $data['nickName'],
               'avatarUrl'  => $data['avatarUrl'],
               'gender'     => $data['gender'],
               'country'    => $data['language'],
               'province'   => $data['province'],
               'city'       => $data['city'],
               'create_time'=> date('Y-m-d H:i:s'),
               'update_time'=> date('Y-m-d H:i:s'),
           ];
           $uid = Db::name('wx_user')->field('id')->where('open_id',$data['openId'])->find()['id'];
           //判断用户是否已经授权登录(没有则注册)
           if(empty($uid)){
               $uid = Db::name('wx_user')->insertGetId($userInfo);
           }
           //存储7天作为登录时的验证(token),其中键是md5加密后的openId,值是数据库中用户的id
            Cache::set("$user_id",$uid,60*60*24*7);
            dump($data);
            echo $user_id;
            die;//打印解密所得的用户信息
        } else {
            echo $errCode;//打印失败信息
        }
    }

    public function vget($url){
        $info=curl_init();
        curl_setopt($info,CURLOPT_RETURNTRANSFER,true);
        curl_setopt($info,CURLOPT_HEADER,0);
        curl_setopt($info,CURLOPT_NOBODY,0);
        curl_setopt($info,CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($info,CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($info,CURLOPT_URL,$url);
        $output= curl_exec($info);
        curl_close($info);
        return $output;
    }




}


后台可以通过openID和session_key解密打印用户的所有信息

 

 

最后服务端会返回token,小程序本地保存下来,下次需要用到用户相关的接口时记得携带就可以了

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/zz_lkw/article/details/89246865
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-03-01 23:08:38
  • 阅读 ( 1070 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢