php微信小程序登陆

1、php后端代码

public function login()
    {
        $this->_globals();
        $input = file_get_contents("php://input");
        if (!$input) {
            return err('非法请求');
        }
        $params = json_decode($input, true);
        if (!isset($params['code']) || !$params['code']) {
            return err('参数错误');
        }
        if (!isset($params['info']) || !$params['info']) {
            return err('参数错误');
        }
        $code = $params['code'];
        $res = $this->getWechatOpenId($code); //获取openid
        $resArr = json_decode($res, true);
        if (isset($resArr['openid'])) {
            //$_SESSION['miniuser'] = $resArr;
            //cache 用户的session key
            $sessionKey = 'sessionkey_' . $resArr['openid'];
            $this->cache->set($sessionKey, json_encode($resArr));

            $bind = 0;
            //获取绑定信息
            $miniuser = $this->mBasic->getRow('miniusers', array("openid='{$resArr['openid']}'"));

            if (!$miniuser) {
                $minidata = array(
                    'openid' => $resArr['openid'],
                    'nickname' => $params['info']['nickName'],
                    'gender' => $params['info']['gender'],
                    'headimgurl' => $params['info']['avatarUrl'],
                    'country' => $params['info']['country'],
                    'province' => $params['info']['province'],
                    'city' => $params['info']['city']
                );
                $this->mBasic->save('miniusers', $minidata);
            } elseif ($miniuser['user_id']) {
                //绑定了系统用户
                $user = $this->mBasic->getRow('users', array("id='{$miniuser['user_id']}'"));
                $bind = 1;
                $staff = $this->mBasic->getRow("hr_staffs", array("id={$user['staff_id']}"));
                //获取用户角色ID
                $roleIds = $this->mDb->getAll("SELECT `roles_id` FROM `" . get_table("hr_staff_roles") . "` WHERE `staff_id` = {$staff['id']}");
                //判断用户是否存在角色
                if (!$roleIds) {
                    die(json_encode(array("code" => 500, "message" => "用户身份信息不存在,请联系管理员")));
                }
                $roleIds = implode(",", array_unique(array_column($roleIds, "roles_id")));
                //获取用户角色信息
                $roles = $this->mDb->getAll("SELECT `id`, `name` FROM `" . get_table("sys_roles") . "` WHERE `id` in({$roleIds}) AND `flag` = 1 AND `is_del` = 0");
                $roleName = implode(",", array_column($roles, "name"));
                //查询客户总数
                $clientNum = $this->mDb->getOne("SELECT COUNT(id) FROM " . get_table('crm_customers') . " WHERE business_id={$staff['id']}");
                //查询业务报单总数
                $reportNum = $this->mDb->getOne("SELECT COUNT(id) FROM " . get_table('biz_report') . " WHERE staff_id={$staff['id']} AND is_del=0");
                //查询订单的总数
                $orderNum = $this->mDb->getOne("SELECT COUNT(id) FROM " . get_table('biz_order') . " WHERE staff_id={$staff['id']} AND is_del=0");
                $data = array(
                    "id" => $staff['id'],
                    "sn" => $staff['sn'], //编号
                    "name" => $staff['name'], //名称
                    "gender" => $staff['gender'], //性别 0女 1男
                    "birthday" => $staff['birthday'], //生日
                    "mobile" => $staff['mobile'], //手机号
                    "email" => $staff['email'], //邮箱
                    "idtype" => $staff['idtype'], //身份证号
                    "salesman" => $staff['salesman'], //1是业务员 0不是
                    "company" => $staff['company'], //公司名称
                    "rolesname" => $roleName, //用户身份
                    'clientNum' => $clientNum == null ? '' : $clientNum, //客户数量
                    'reportNum' => $reportNum == null ? '' : $reportNum, //业务报单总数
                    'orderNum' => $orderNum == null ? '' : $orderNum
                );
                $resArr['user'] = $data;
                //$_SESSION['user'] = $data;
                //$resArr = array_merge($resArr, $data);
            }

            $resArr['bind'] = $bind;
        }
        die(json_encode(array("status" => "success", "data" => $resArr)));
    }

    public function getWechatOpenId($code)
    {
        $params = array(
            'appid' => $this->appId,
            'secret' => $this->appSecret,
            'js_code' => $code,
            'grant_type' => 'authorization_code',
        );
        $curl = new Curl();
        $url = 'https://api.weixin.qq.com/sns/'. 'jscode2session';
     $res
= $curl->get($url, $params); //curl get请求
     return $res;
   }

2、curl封装

<?php
class Curl {
    const VERSION = '2.1.0';

    private $cookies = array();
    private $headers = array();
    private $options = array();

    private $multi_parent = false;
    private $multi_child = false;
    private $before_send_function = null;
    private $success_function = null;
    private $error_function = null;
    private $complete_function = null;

    public $curl;
    public $curls;

    public $error = false;
    public $error_code = 0;
    public $error_message = null;

    public $curl_error = false;
    public $curl_error_code = 0;
    public $curl_error_message = null;

    public $http_error = false;
    public $http_status_code = 0;
    public $http_error_message = null;

    public $request_headers = null;
    public $response_headers = null;
    public $response = null;
    public $raw_response = null;

    public $response_decode = false;

    public function __construct()
    {
        if (!extension_loaded('curl')) {
            throw new \ErrorException('cURL library is not loaded');
        }

        $this->curl = curl_init();
        $this->setDefaultUserAgent();
        $this->setOpt(CURLINFO_HEADER_OUT, true);
        $this->setOpt(CURLOPT_HEADER, true);
        $this->setOpt(CURLOPT_RETURNTRANSFER, true);
    }

    public function get($url_mixed, $data = array())
    {
        if (is_array($url_mixed)) {
            $curl_multi = curl_multi_init();
            $this->multi_parent = true;

            $this->curls = array();

            foreach ($url_mixed as $url) {
                $curl = new Curl();
                $curl->multi_child = true;
                $curl->setOpt(CURLOPT_URL, $this->buildURL($url, $data), $curl->curl);
                $curl->setOpt(CURLOPT_CUSTOMREQUEST, 'GET');
                $curl->setOpt(CURLOPT_HTTPGET, true);
                $this->call($this->before_send_function, $curl);
                $this->curls[] = $curl;

                $curlm_error_code = curl_multi_add_handle($curl_multi, $curl->curl);
                if (!($curlm_error_code === CURLM_OK)) {
                    throw new \ErrorException('cURL multi add handle error: ' . curl_multi_strerror($curlm_error_code));
                }
            }

            foreach ($this->curls as $ch) {
                foreach ($this->options as $key => $value) {
                    $ch->setOpt($key, $value);
                }
            }

            do {
                $status = curl_multi_exec($curl_multi, $active);
            } while ($status === CURLM_CALL_MULTI_PERFORM || $active);

            while (!($info_array = curl_multi_info_read($curl_multi)) === false) {
                if (!($info_array['msg'] === CURLMSG_DONE)) {
                    continue;
                }
                foreach ($this->curls as $ch) {
                    if ($ch->curl === $info_array['handle']) {
                        $ch->curl_error_code = $info_array['result'];
                        break;
                    }
                }
            }

            foreach ($this->curls as $ch) {
                $this->exec($ch);
            }
        } else {
            $this->setopt(CURLOPT_URL, $this->buildURL($url_mixed, $data));
            $this->setOpt(CURLOPT_CUSTOMREQUEST, 'GET');
            $this->setopt(CURLOPT_HTTPGET, true);
            return $this->exec();
        }
    }

    public function post($url, $data = array())
    {
        if (is_array($data) && empty($data)) {
            $this->unsetHeader('Content-Length');
        }

        $this->setOpt(CURLOPT_URL, $this->buildURL($url));
        $this->setOpt(CURLOPT_CUSTOMREQUEST, 'POST');
        $this->setOpt(CURLOPT_POST, true);
        $this->setOpt(CURLOPT_POSTFIELDS, $this->postfields($data));
        return $this->exec();
    }

    public function put($url, $data = array())
    {
        $this->setOpt(CURLOPT_URL, $url);
        $this->setOpt(CURLOPT_CUSTOMREQUEST, 'PUT');
        $put_data = http_build_query($data);
        if (empty($this->options[CURLOPT_INFILE]) && empty($this->options[CURLOPT_INFILESIZE])) {
            $this->setHeader('Content-Length', strlen($put_data));
        }
        $this->setOpt(CURLOPT_POSTFIELDS, $put_data);
        return $this->exec();
    }

    public function patch($url, $data = array())
    {
        $this->unsetHeader('Content-Length');
        $this->setOpt(CURLOPT_URL, $this->buildURL($url));
        $this->setOpt(CURLOPT_CUSTOMREQUEST, 'PATCH');
        $this->setOpt(CURLOPT_POSTFIELDS, $data);
        return $this->exec();
    }

    public function delete($url, $data = array())
    {
        $this->unsetHeader('Content-Length');
        $this->setOpt(CURLOPT_URL, $this->buildURL($url, $data));
        $this->setOpt(CURLOPT_CUSTOMREQUEST, 'DELETE');
        return $this->exec();
    }

    public function head($url, $data = array())
    {
        $this->setOpt(CURLOPT_URL, $this->buildURL($url, $data));
        $this->setOpt(CURLOPT_CUSTOMREQUEST, 'HEAD');
        $this->setOpt(CURLOPT_NOBODY, true);
        return $this->exec();
    }

    public function options($url, $data = array())
    {
        $this->unsetHeader('Content-Length');
        $this->setOpt(CURLOPT_URL, $this->buildURL($url, $data));
        $this->setOpt(CURLOPT_CUSTOMREQUEST, 'OPTIONS');
        return $this->exec();
    }

    public function setResponseDecode($flag=false){
        $this->response_decode = $flag;
    }

    public function setBasicAuthentication($username, $password = '')
    {
        $this->setOpt(CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
        $this->setOpt(CURLOPT_USERPWD, $username . ':' . $password);
    }

    public function setHeader($key, $value)
    {
        $this->headers[$key] = $key . ': ' . $value;
        $this->setOpt(CURLOPT_HTTPHEADER, array_values($this->headers));
    }

    public function unsetHeader($key)
    {
        $this->setHeader($key, '');
        unset($this->headers[$key]);
    }

    public function setDefaultUserAgent()
    {
        $user_agent = 'PHP-Curl-Class/' . self::VERSION . ' (+https://github.com/php-curl-class/php-curl-class)';
        $user_agent .= ' PHP/' . PHP_VERSION;
        $curl_version = curl_version();
        $user_agent .= ' curl/' . $curl_version['version'];
        $this->setUserAgent($user_agent);
    }

    public function setUserAgent($user_agent)
    {
        $this->setOpt(CURLOPT_USERAGENT, $user_agent);
    }

    public function setReferrer($referrer)
    {
        $this->setOpt(CURLOPT_REFERER, $referrer);
    }

    public function setCookie($key, $value)
    {
        $this->cookies[$key] = $value;
        $this->setOpt(CURLOPT_COOKIE, http_build_query($this->cookies, '', '; ', PHP_QUERY_RFC3986));
    }

    public function setCookieFile($cookie_file)
    {
        $this->setOpt(CURLOPT_COOKIEFILE, $cookie_file);
    }

    public function setCookieJar($cookie_jar)
    {
        $this->setOpt(CURLOPT_COOKIEJAR, $cookie_jar);
    }

    public function setOpt($option, $value, $_ch = null)
    {
        $ch = is_null($_ch) ? $this->curl : $_ch;

        $required_options = array(
            CURLINFO_HEADER_OUT    => 'CURLINFO_HEADER_OUT',
            CURLOPT_HEADER         => 'CURLOPT_HEADER',
            CURLOPT_RETURNTRANSFER => 'CURLOPT_RETURNTRANSFER',
        );

        if (in_array($option, array_keys($required_options), true) && !($value === true)) {
            trigger_error($required_options[$option] . ' is a required option', E_USER_WARNING);
        }

        $this->options[$option] = $value;
        return curl_setopt($ch, $option, $value);
    }

    public function verbose($on = true)
    {
        $this->setOpt(CURLOPT_VERBOSE, $on);
    }

    public function close()
    {
        if ($this->multi_parent) {
            foreach ($this->curls as $curl) {
                $curl->close();
            }
        }

        if (is_resource($this->curl)) {
            curl_close($this->curl);
        }
    }

    public function beforeSend($function)
    {
        $this->before_send_function = $function;
    }

    public function success($callback)
    {
        $this->success_function = $callback;
    }

    public function error($callback)
    {
        $this->error_function = $callback;
    }

    public function complete($callback)
    {
        $this->complete_function = $callback;
    }

    private function buildURL($url, $data = array())
    {
        return $url . (empty($data) ? '' : '?' . http_build_query($data));
    }

    private function parseHeaders($raw_headers)
    {
        $raw_headers = preg_split('/\r\n/', $raw_headers, null, PREG_SPLIT_NO_EMPTY);
        $http_headers = new CaseInsensitiveArray();

        for ($i = 1; $i < count($raw_headers); $i++) {
            list($key, $value) = explode(':', $raw_headers[$i], 2);
            $key = trim($key);
            $value = trim($value);
            // Use isset() as array_key_exists() and ArrayAccess are not compatible.
            if (isset($http_headers[$key])) {
                $http_headers[$key] .= ',' . $value;
            } else {
                $http_headers[$key] = $value;
            }
        }

        return array(isset($raw_headers['0']) ? $raw_headers['0'] : '', $http_headers);
    }

    private function parseRequestHeaders($raw_headers)
    {
        $request_headers = new CaseInsensitiveArray();
        list($first_line, $headers) = $this->parseHeaders($raw_headers);
        $request_headers['Request-Line'] = $first_line;
        foreach ($headers as $key => $value) {
            $request_headers[$key] = $value;
        }
        return $request_headers;
    }

    private function parseResponse($response)
    {
        $response_headers = '';
        $raw_response = $response;
        if (!(strpos($response, "\r\n\r\n") === false)) {
            $response_array = explode("\r\n\r\n", $response);
            for ($i = count($response_array) - 1; $i >= 0; $i--) {
                if (stripos($response_array[$i], 'HTTP/') === 0) {
                    $response_header = $response_array[$i];
                    $response = implode("\r\n\r\n", array_splice($response_array, $i + 1));
                    break;
                }
            }
            $response_headers = explode("\r\n", $response_header);
            if (in_array('HTTP/1.1 100 Continue', $response_headers)) {
                list($response_header, $response) = explode("\r\n\r\n", $response, 2);
            }
            $response_headers = $this->parseResponseHeaders($response_header);
            $raw_response = $response;

            if (isset($response_headers['Content-Type'])) {
                if (preg_match('/^application\/json/i', $response_headers['Content-Type'])) {
                    $json_obj = json_decode($response, $this->response_decode);
                    if (!is_null($json_obj)) {
                        $response = $json_obj;
                    }
                } elseif (preg_match('/^application\/atom\+xml/i', $response_headers['Content-Type']) ||
                          preg_match('/^application\/rss\+xml/i', $response_headers['Content-Type']) ||
                          preg_match('/^application\/xml/i', $response_headers['Content-Type']) ||
                          preg_match('/^text\/xml/i', $response_headers['Content-Type'])) {
                    $xml_obj = @simplexml_load_string($response);
                    if (!($xml_obj === false)) {
                        $response = $xml_obj;
                    }
                }
            }
        }

        return array($response_headers, $response, $raw_response);
    }

    private function parseResponseHeaders($raw_headers)
    {
        $response_headers = new CaseInsensitiveArray();
        list($first_line, $headers) = $this->parseHeaders($raw_headers);
        $response_headers['Status-Line'] = $first_line;
        foreach ($headers as $key => $value) {
            $response_headers[$key] = $value;
        }
        return $response_headers;
    }

    private function postfields($data)
    {
        if (is_array($data)) {
            if (self::is_array_multidim($data)) {
                $data = self::http_build_multi_query($data);
            } else {
                $binary_data = false;
                foreach ($data as $key => $value) {
                    // Fix "Notice: Array to string conversion" when $value in
                    // curl_setopt($ch, CURLOPT_POSTFIELDS, $value) is an array
                    // that contains an empty array.
                    if (is_array($value) && empty($value)) {
                        $data[$key] = '';
                    // Fix "curl_setopt(): The usage of the @filename API for
                    // file uploading is deprecated. Please use the CURLFile
                    // class instead".
                    } elseif (is_string($value) && strpos($value, '@') === 0) {
                        $binary_data = true;
                        if (class_exists('CURLFile')) {
                            $data[$key] = new \CURLFile(substr($value, 1));
                        }
                    } elseif ($value instanceof \CURLFile) {
                        $binary_data = true;
                    }
                }

                if (!$binary_data) {
                    $data = http_build_query($data);
                }
            }
        }

        return $data;
    }

    protected function exec($_ch = null)
    {
        $ch = is_null($_ch) ? $this : $_ch;

        if ($ch->multi_child) {
            $ch->raw_response = curl_multi_getcontent($ch->curl);
        } else {
            $ch->raw_response = curl_exec($ch->curl);
            $ch->curl_error_code = curl_errno($ch->curl);
        }

        $ch->curl_error_message = curl_error($ch->curl);
        $ch->curl_error = !($ch->curl_error_code === 0);
        $ch->http_status_code = curl_getinfo($ch->curl, CURLINFO_HTTP_CODE);
        $ch->http_error = in_array(floor($ch->http_status_code / 100), array(4, 5));
        $ch->error = $ch->curl_error || $ch->http_error;
        $ch->error_code = $ch->error ? ($ch->curl_error ? $ch->curl_error_code : $ch->http_status_code) : 0;

        $ch->request_headers = $this->parseRequestHeaders(curl_getinfo($ch->curl, CURLINFO_HEADER_OUT));
        list($ch->response_headers, $ch->response, $ch->raw_response) = $this->parseResponse($ch->raw_response);

        $ch->http_error_message = '';
        if ($ch->error) {
            if (isset($ch->response_headers['Status-Line'])) {
                $ch->http_error_message = $ch->response_headers['Status-Line'];
            }
        }
        $ch->error_message = $ch->curl_error ? $ch->curl_error_message : $ch->http_error_message;

        if (!$ch->error) {
            $ch->call($this->success_function, $ch);
        } else {
            $ch->call($this->error_function, $ch);
        }

        $ch->call($this->complete_function, $ch);

        return $ch->response;
    }

    private function call($function)
    {
        if (is_callable($function)) {
            $args = func_get_args();
            array_shift($args);
            call_user_func_array($function, $args);
        }
    }

    public function __destruct()
    {
        $this->close();
    }

    public static function is_array_assoc($array)
    {
        return (bool)count(array_filter(array_keys($array), 'is_string'));
    }

    public static function is_array_multidim($array)
    {
        if (!is_array($array)) {
            return false;
        }

        return !(count($array) === count($array, COUNT_RECURSIVE));
    }

    public static function http_build_multi_query($data, $key = null)
    {
        $query = array();

        if (empty($data)) {
            return $key . '=';
        }

        $is_array_assoc = self::is_array_assoc($data);

        foreach ($data as $k => $value) {
            if (is_string($value) || is_numeric($value)) {
                $brackets = $is_array_assoc ? '[' . $k . ']' : '[]';
                $query[] = urlencode(is_null($key) ? $k : $key . $brackets) . '=' . rawurlencode($value);
            } elseif (is_array($value)) {
                $nested = is_null($key) ? $k : $key . '[' . $k . ']';
                $query[] = self::http_build_multi_query($value, $nested);
            }
        }

        return implode('&', $query);
    }
}

class CaseInsensitiveArray implements \ArrayAccess, \Countable, \Iterator
{
    private $container = array();

    public function offsetSet($offset, $value)
    {
        if (is_null($offset)) {
            $this->container[] = $value;
        } else {
            $index = array_search(strtolower($offset), array_keys(array_change_key_case($this->container, CASE_LOWER)));
            if (!($index === false)) {
                $keys = array_keys($this->container);
                unset($this->container[$keys[$index]]);
            }
            $this->container[$offset] = $value;
        }
    }

    public function offsetExists($offset)
    {
        return array_key_exists(strtolower($offset), array_change_key_case($this->container, CASE_LOWER));
    }

    public function offsetUnset($offset)
    {
        unset($this->container[$offset]);
    }

    public function offsetGet($offset)
    {
        $index = array_search(strtolower($offset), array_keys(array_change_key_case($this->container, CASE_LOWER)));
        if ($index === false) {
            return null;
        }

        $values = array_values($this->container);
        return $values[$index];
    }

    public function count()
    {
        return count($this->container);
    }

    public function current()
    {
        return current($this->container);
    }

    public function next()
    {
        return next($this->container);
    }

    public function key()
    {
        return key($this->container);
    }

    public function valid()
    {
        return !($this->current() === false);
    }

    public function rewind()
    {
        reset($this->container);
    }
}

猜你喜欢

转载自www.cnblogs.com/beiman/p/12693353.html