You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于WordPress与MyCred实现扫码登录用户积分添加及二维码有效期设置

实现步骤

1. 前端扫码后的参数处理

你已经用jsQR实现扫码功能,扫码成功后解析链接参数并发起后端请求:

// 假设扫码得到的链接为scanUrl
const urlParams = new URLSearchParams(new URL(scanUrl).search);
const action = urlParams.get('action');
const points = urlParams.get('points');
const shop = urlParams.get('shop');
const expireDate = urlParams.get('date');

// 基础参数校验
if (action === 'setpoints' && points && shop && expireDate) {
  fetch(window.location.origin + '/wp-admin/admin-ajax.php', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/x-www-form-urlencoded',
      'X-WP-Nonce': wpApiSettings.nonce
    },
    body: new URLSearchParams({
      action: 'handle_set_points',
      points: points,
      shop: shop,
      expire_date: expireDate
    })
  })
  .then(response => response.json())
  .then(data => {
    alert(data.success ? '积分添加成功!' : data.message || '操作失败');
  })
  .catch(() => alert('网络错误,请重试'));
} else {
  alert('二维码无效,请扫描正确的商店二维码');
}

需要在主题functions.php中添加前端nonce验证支持:

function enqueue_scan_script() {
  wp_enqueue_script('scan-handler', get_template_directory_uri() . '/js/scan-handler.js', ['jquery'], '1.0', true);
  wp_localize_script('scan-handler', 'wpApiSettings', [
    'nonce' => wp_create_nonce('wp_rest')
  ]);
}
add_action('wp_enqueue_scripts', 'enqueue_scan_script');

2. 后端核心逻辑处理

在主题functions.php或自定义插件中添加以下代码,处理积分添加请求:

2.1 注册AJAX处理函数

// 仅登录用户可调用
add_action('wp_ajax_handle_set_points', 'handle_set_points');

function handle_set_points() {
  // CSRF验证
  if (!wp_verify_nonce($_POST['nonce'], 'wp_rest')) {
    wp_send_json_error('非法请求');
  }

  // 检查登录状态
  if (!is_user_logged_in()) {
    wp_send_json_error('请先登录');
  }

  // 过滤并校验参数
  $points = intval($_POST['points']);
  $shop_id = intval($_POST['shop']);
  $expire_date = sanitize_text_field($_POST['expire_date']);

  if ($points <= 0 || $shop_id <= 0 || strlen($expire_date) !== 8) {
    wp_send_json_error('二维码参数无效');
  }

  // 验证有效期
  $current_date = date('Ymd');
  if ($current_date > $expire_date) {
    wp_send_json_error('二维码已过期');
  }

  // 防重复:检查用户今日是否已扫过该商店二维码
  $user_id = get_current_user_id();
  $today_meta_key = 'shop_scanned_' . $shop_id . '_' . date('Ymd');
  if (get_user_meta($user_id, $today_meta_key, true)) {
    wp_send_json_error('今日已领取过该商店积分');
  }

  // 更新用户积分(假设用自定义meta键`user_points`存储积分)
  $current_points = get_user_meta($user_id, 'user_points', true);
  $current_points = $current_points ? intval($current_points) : 0;
  $new_points = $current_points + $points;

  update_user_meta($user_id, 'user_points', $new_points);
  update_user_meta($user_id, $today_meta_key, '1');

  // 可选:记录扫描日志
  global $wpdb;
  $wpdb->insert(
    $wpdb->prefix . 'shop_scan_logs',
    [
      'user_id' => $user_id,
      'shop_id' => $shop_id,
      'points_added' => $points,
      'scan_date' => current_time('mysql')
    ],
    ['%d', '%d', '%d', '%s']
  );

  wp_send_json_success('积分添加成功,当前积分:' . $new_points);
}

2.2 可选:创建扫描日志表

如果需要记录扫描记录,添加表初始化代码:

function create_scan_logs_table() {
  global $wpdb;
  $table_name = $wpdb->prefix . 'shop_scan_logs';
  $charset_collate = $wpdb->get_charset_collate();

  $sql = "CREATE TABLE $table_name (
    id mediumint(9) NOT NULL AUTO_INCREMENT,
    user_id mediumint(9) NOT NULL,
    shop_id mediumint(9) NOT NULL,
    points_added mediumint(9) NOT NULL,
    scan_date datetime NOT NULL,
    PRIMARY KEY  (id)
  ) $charset_collate;";

  require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
  dbDelta($sql);
}
// 主题激活时执行
add_action('after_switch_theme', 'create_scan_logs_table');

3. 二维码生成规则

严格按照你指定的格式生成链接:

http://www.anysite.com/shop-page?action=setpoints&points=10&shop=1&date=20231030
  • date必须为Ymd格式(如20231030)
  • points和shop必须为正整数
  • 生成二维码前建议对链接做URL编码,避免特殊字符干扰

4. 安全优化建议

  • 可额外校验shop_id是否存在于你的商店数据库中,防止非法参数
  • 增加IP限制,避免同一IP短时间内多次请求
  • 若使用第三方积分插件,替换代码中get_user_meta和update_user_meta为对应插件的积分操作函数

内容的提问来源于stack exchange,提问作者Jim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 17:53:25