首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我正在使用opencart 3浏览器关闭客户注销,如何停止客户注销甚至浏览器关闭

我正在使用opencart 3浏览器关闭客户注销,如何停止客户注销甚至浏览器关闭
EN

Stack Overflow用户
提问于 2022-05-31 14:10:26
回答 1查看 143关注 0票数 0

我正在使用opencart 3,我的问题是,当客户关闭浏览器,再次打开客户是注销时,我想改变这种行为,当客户一旦登录时,他/她不应该退出,直到他/她单击注销按钮,即使他/她关闭浏览器,并再次打开,他/她应该保持登录。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-01 10:12:18

您必须在OpenCart中修改3个文件才能完成这一任务。

/catalog/controller/account/login.php

在登录过程中,您必须将客户ID和电子邮件存储在cookie中。有必要把它们储存起来。电子邮件是不够的,因为您必须检查存储的客户ID是否属于存储的电子邮件。

代码语言:javascript
复制
  public function index() {
    [...]
    if (($this->request->server['REQUEST_METHOD'] == 'POST') && $this->validate()) {
      // Unset guest
      unset($this->session->data['guest']);

      // store customer ID and email encrypted
      $my_customer_id = $this->customer->getId();
      $my_customer_id_crypted = $this->encrypt($my_customer_id, "your_key_for_customer_id_encryption");

      $my_email = $this->request->post['email'];
      $my_email_crypted = $this->encrypt($this->request->post['email'], "your_key_for_email_encryption");

      setcookie("MyCustomerID", $my_customer_id_crypted , time() + (365 * 24 * 60 * 60) , "/");
      setcookie("MyEmail", $my_email_crypted , time() + (365 * 24 * 60 * 60) , "/");
      [...]
    }
    [...]
  }

  [...]

  // https://www.phpcluster.com/simple-two-way-encryption-in-php/
  // you can use other encryption if you want, just an example
  protected function encrypt($plainText, $key) {
    $secretKey = md5($key);
    $iv = substr( hash( 'sha256', "aaaabbbbcccccddddeweee" ), 0, 16 );
    $encryptedText = openssl_encrypt($plainText, 'AES-128-CBC', $secretKey, OPENSSL_RAW_DATA, $iv);
    return base64_encode($encryptedText);
  }

/catalog/controller/account/logout.php

在注销过程中,您必须删除客户ID和电子邮件cookie。

代码语言:javascript
复制
  public function index() {
    if ($this->customer->isLogged()) {
      $this->customer->logout();

      // delete cookies
      unset($_COOKIE['MyCustomerID']);
      unset($_COOKIE['MyEmail']);

      setcookie("MyCustomerID", "", 0, "/");
      setcookie("MyEmail", "", 0, "/");
      [...]
    }
    [...]
  }

/catalog/controller/common/footer.php

在这个文件中,如果一切正常,您可以自动登录客户,并延长cookie生存期,在每次加载页面时都使用页脚,所以我的意思是,这是一种很好的方式。

代码语言:javascript
复制
  public function index() {
    [...]
    $data['scripts'] = $this->document->getScripts('footer');
    $data['styles'] = $this->document->getStyles('footer');

    if (isset($_COOKIE["MyCustomerID"]) && isset($_COOKIE["MyEmail"]) && $_COOKIE["MyCustomerID"] != '' && $_COOKIE["MyEmail"] != '') {
      $my_customer_id_crypted = $_COOKIE["MyCustomerID"];
      $my_customer_id = $this->decrypt($my_customer_id_crypted, "your_key_for_customer_id_encryption");

      $my_email_crypted = $_COOKIE["MyEmail"];
      $my_email = $this->decrypt($my_email_crypted, "your_key_for_email_encryption");

      $config = new Config();
      $config->load('default');

      if ( $my_customer_id != "" && $my_email != "" && $my_customer_id == (int)$my_customer_id ) {
        if ( !$this->customer->isLogged() ) {          
          if ( $my_customer_id == $this->getCustomerIdByEmailAddress( $my_email ) ) { // auto login, when customer ID belongs to this email address
            $this->customer->login($my_email, "", true); // we use OpenCart override log in method
            //$this->log->write('customer logged in automatically');

            $this->load->model('account/address');

            if ($this->config->get('config_tax_customer') == 'payment') {
              $this->session->data['payment_address'] = $this->model_account_address->getAddress($this->customer->getAddressId());
            }

            if ($this->config->get('config_tax_customer') == 'shipping') {
              $this->session->data['shipping_address'] = $this->model_account_address->getAddress($this->customer->getAddressId());
            }

            // extend cookies lifetime
            setcookie("MyCustomerID", $my_customer_id_crypted , time() + (365 * 24 * 60 * 60) , "/");
            setcookie("MyEmail", $my_email_crypted , time() + (365 * 24 * 60 * 60) , "/");

            $this->response->redirect($_SERVER['REQUEST_URI']);
          }
        }
      }
    }
    [...]
  }

  // https://www.phpcluster.com/simple-two-way-encryption-in-php/
  // decrypt function for previous used encryption
  protected function decrypt($encryptedText, $key) {
    $key = md5($key);
    $iv = substr( hash( 'sha256', "aaaabbbbcccccddddeweee" ), 0, 16 );
    $decryptedText = openssl_decrypt(base64_decode($encryptedText), 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv);
    return $decryptedText;
  }

  protected function getCustomerIdByEmailAddress($email) {
    $sql_txt = "";
    $sql_txt .= "SELECT customer_id";
    $sql_txt .= "  FROM ".DB_PREFIX."customer";
    $sql_txt .= " WHERE LOWER(email) = '".$this->db->escape(utf8_strtolower($email))."'";
    $customer_query = $this->db->query($sql_txt);

    if ($customer_query->num_rows)
    {
      return $customer_query->row['customer_id'];
    }
    else
    {
      return -1;
    }
  }

如果需要,可以改进此代码,目前我使用此方法自动登录客户。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72449382

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档