美文网首页
微信小程序_1.0 本地tp5环境搭建_用户登录校验

微信小程序_1.0 本地tp5环境搭建_用户登录校验

作者: 毛子阿卡西 | 来源:发表于2018-05-12 09:57 被阅读0次
    业务流程图
    api-login.jpg 小程序登录流程.png
    小程序开发工具新建快速启动模版
    小程序.jpg
    如要配置本地环境,需勾选不校验合法域名
    小程序登录2.jpg
    添加配置文件 config.js
    /**
     * 小程序配置文件
     */
    // 此处主机域名修改成腾讯云解决方案分配的域名
    var host = 'http://www.parkserver.com';
    var config = {
        // 下面的地址配合云端 Demo 工作
        service: {
            host,
            // 登录地址,用于建立会话
            loginUrl: `${host}/api/login/index`,
        }
    };
    module.exports = config;
    
    app.js导入配置文件
    //app.js
    var config = require('./config')
    
    • 调用登录接口返回临时票据code
    • 调用登陆接口提交后台登录凭证校验接口
    // 登录
    wx.login({
      success: res => {
        // 发送 res.code 到后台换取 openId, sessionKey, unionId
        var code = res.code;
        if (res.code) {
            wx.getUserInfo({
                success: function(res) {
                    var userInfo = res.userInfo;
                    var rawData = res.rawData;//不包括敏感信息的原始数据字符串,用于计算签名。
                    var signature = res.signature;//使用 sha1( rawData + sessionkey ) 得到字符串,用于校验用户信息,参考文档 signature。
                    var encryptedData = res.encryptedData;//包括敏感数据在内的完整用户信息的加密数据
                    var iv = res.iv;//加密算法的初始向量
                    wx.request({
                        url: config.service.loginUrl,
                        data: {
                            "code":code,
                            "rawData":rawData,
                            "signature":signature,
                            'encryptedData': encryptedData,
                            'iv': iv
                        },
                        succuess: function (info) {
                            console.log("info");
                            console.log(info);
                        }
                    });
                }
            });
        }
      }
    });
    
    后端php文件
    • 小程序配置文件
    <?php
    return [
        'template'               => [
            // 模板文件名分隔符
            'view_depr'    => '_',
            'taglib_pre_load'    => 'app\common\taglib\Clt',
        ],
        #微信小程序配置
        'wechat' => [
            'wx_appid'=>'wx9d34cf6e8977f3a4',
            'wx_appsec'=>'b46bb6e915a3b00cdcec0c3b4db11fb7',
            #微信登录凭证校验接口
            'wx_loginurl'=>'https://api.weixin.qq.com/sns/jscode2session'
        ]
    ];
    
    • 登录校验主方法
    public function index() {
        #微信小程序登录 临时code
        $code = mz_checkfield('code', true, '缺少code');
        $appid = $this->config['wx_appid'];
        $appsec = $this->config['wx_appsec'];
        $url = $this->config['wx_loginurl'];
        
        $params = array(
            'appid' => $appid,
            'secret' => $appsec,
            'js_code' => $code,
            'grant_type' => 'authorization_code'
        );
        
        #通过微信登录校验凭证获取 session_key 以及 openid
        $arr = mz_http_send($url,$params,'post');
        $arr = json_decode($arr, true);
        
        if (isset($arr['errcode']) && !empty($arr['errcode'])) {
            #获取失败
            return mz_apierror($arr['errmsg']);
        }
        
        $openid = $arr['openid'];
        $session_key = $arr['session_key'];
        
        # 数据签名校验
        $signature = input("signature");
        $signature2 = sha1($_GET['rawData'] . $session_key);  //别用框架自带的input,会过滤掉必要的数据
        if ($signature != $signature2) {
            return mz_apierror("数据签名校验失败");
        }
        
        #开发者如需要获取敏感数据,需要对接口返回的加密数据( encryptedData )进行对称解密
        $encryptedData = $_GET['encryptedData'];
        $iv = $_GET['iv'];
        #导入微信解密算法SDK
        \think\Loader::import('wxBizDataCrypt.wxBizDataCrypt');
        
        $pc = new \WXBizDataCrypt($appid, $session_key);
        $errCode = $pc->decryptData($encryptedData, $iv, $data);  //其中$data包含用户的所有数据
        if ($errCode != 0) {
            return mz_apierror("获取失败");
        }
        
        #数据库操作 存储用户信息 $data
        /****** */
        //写自己的逻辑: 操作数据库等操作
        /****** */
        
        #生成第三方3rd_session 用于识别用户
        #3rd_session为key session_key+openid为value
        $session3rd = null;
        $strPol = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz";
        $max = strlen($strPol) - 1;
        for ($i = 0; $i < 16; $i++) {
            $session3rd .=$strPol[rand(0, $max)];
        }
        
        #存储sessionkey
        Session::set($session3rd, $arr);
        return mz_apisuc("成功", $session3rd);
    }
    
    • 工具方法
    /** 
    * 发送HTTP请求方法 
    * @param string $url  请求URL 
    * @param array $params 请求参数 
    * @param string $method 请求方法GET/POST 
    * @return array $data  响应数据 
    */
    function mz_http_send($url, $params, $method = 'GET', $header = array(), $multi = false) {
        $opts = array(
            CURLOPT_TIMEOUT => 30,
            CURLOPT_RETURNTRANSFER => 1,
            CURLOPT_SSL_VERIFYPEER => false,
            CURLOPT_SSL_VERIFYHOST => false,
            CURLOPT_HTTPHEADER => $header
        );
        /* 根据请求类型设置特定参数 */
        switch (strtoupper($method)) {
            case 'GET':
                $opts[CURLOPT_URL] = $url . '?' . http_build_query($params);
                break;
            case 'POST':
                //判断是否传输文件 
                $params = $multi ? $params : http_build_query($params);
                $opts[CURLOPT_URL] = $url;
                $opts[CURLOPT_POST] = 1;
                $opts[CURLOPT_POSTFIELDS] = $params;
                break;
            default:
                throw new Exception('不支持的请求方式!');
        }
        /* 初始化并执行curl请求 */
        $ch = curl_init();
        curl_setopt_array($ch, $opts);
        $data = curl_exec($ch);
        $error = curl_error($ch);
        curl_close($ch);
        if ($error)
            throw new Exception('请求发生错误:' . $error);
        return $data;
    }
    

    相关文章

      网友评论

          本文标题:微信小程序_1.0 本地tp5环境搭建_用户登录校验

          本文链接:https://www.haomeiwen.com/subject/giecdftx.html