一个分享WordPress、Zblog、Emlog、Typecho等主流博客的教程网站!
当前位置:网站首页 > 编程知识 > 正文

php+mysql实现微信小程序首次访问自动静默注册

作者:xlnxin发布时间:2026-10-23分类:编程知识浏览:18


导读:需求:在微信小程序中实现首次访问自动记录访问用户信息openid信息。数据库表CREATE TABLE IF NOT EXISTS ...

需求:在微信小程序中实现首次访问自动记录访问用户信息openid信息。

数据库表

CREATE TABLE IF NOT EXISTS `user` (
  `id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  `openid` VARCHAR(64) NOT NULL UNIQUE,
  `name` VARCHAR(128) DEFAULT '',
  `created_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
  `updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

PHP服务端代码api/login.php

<?php
header('Content-Type: application/json; charset=utf-8');

$appid  = '你的小程序AppID';
$secret = '你的小程序AppSecret';

$code = isset($_POST['code']) ? trim($_POST['code']) : '';
$name = isset($_POST['name']) ? trim($_POST['name']) : '';

if ($code === '') {
    echo json_encode(['code' => 400, 'msg' => '缺少 code']);
    exit;
}

// 用 code 换取 openid
$url = 'https://api.weixin.qq.com/sns/jscode2session'
     . '?appid=' . urlencode($appid)
     . '&secret=' . urlencode($secret)
     . '&js_code=' . urlencode($code)
     . '&grant_type=authorization_code';

$response = file_get_contents($url);
$data = json_decode($response, true);

if (!$data || !isset($data['openid'])) {
    echo json_encode(['code' => 500, 'msg' => '获取 openid 失败']);
    exit;
}

$openid = $data['openid'];

// 连接 MySQL
$host = '127.0.0.1';
$db   = 'your_database';
$user = 'root';
$pass = '';

$conn = new mysqli($host, $user, $pass, $db);
$conn->set_charset('utf8mb4');

if ($conn->connect_error) {
    echo json_encode(['code' => 500, 'msg' => '数据库连接失败']);
    exit;
}

// 查询用户是否存在
$stmt = $conn->prepare('SELECT id, openid, name FROM user WHERE openid = ? LIMIT 1');
$stmt->bind_param('s', $openid);
$stmt->execute();
$result = $stmt->get_result();
$row = $result->fetch_assoc();
$stmt->close();

if ($row) {
    // 已存在,直接返回
    echo json_encode([
        'code' => 0,
        'msg'  => '登录成功',
        'data' => [
            'id'     => (int)$row['id'],
            'openid' => $row['openid'],
            'name'   => $row['name'],
            'isNew'  => false
        ]
    ]);
} else {
    // 首次访问,自动注册
    $stmt = $conn->prepare('INSERT INTO user (openid, name) VALUES (?, ?)');
    $stmt->bind_param('ss', $openid, $name);
    $stmt->execute();

    $newId = $stmt->insert_id;
    $stmt->close();

    echo json_encode([
        'code' => 0,
        'msg'  => '注册成功',
        'data' => [
            'id'     => (int)$newId,
            'openid' => $openid,
            'name'   => $name,
            'isNew'  => true
        ]
    ]);
}

$conn->close();

微信小程序端app.js

App({
  globalData: {
    baseUrl: 'https://your-domain.com' // 替换成你的后端域名
  },

  onLaunch() {
    this.autoLogin();
  },

  autoLogin() {
    const that = this;

    wx.login({
      success(res) {
        if (!res.code) {
          console.error('wx.login 失败', res.errMsg);
          return;
        }

        wx.request({
          url: that.globalData.baseUrl + '/api/login.php',
          method: 'POST',
          data: {
            code: res.code,
            name: '' // 首次注册时 name 可以为空
          },
          success(resp) {
            if (resp.data && resp.data.code === 0) {
              wx.setStorageSync('openid', resp.data.data.openid);
              wx.setStorageSync('userId', resp.data.data.id);
              wx.setStorageSync('userName', resp.data.data.name);
              console.log('自动登录/注册成功', resp.data.data);
            } else {
              console.error('登录失败', resp.data);
            }
          },
          fail(err) {
            console.error('请求失败', err);
          }
        });
      }
    });
  }
});

标签:域名程序数据库mysql小程序phpjs