前几天看到payjs不给个人用户充值了，就想着把早就想好的TePass插件本地域名授权给做出来，防止哪天我的网站或者接口挂了，用户不能使用，既然用户花钱买了，就算我的网站挂了，用户也应该有资格继续使用。 于是今天就做了出来，要实现的功能很简单，下面讲一下：一个简单的PHP页面为了让用户使用简单，不能给用户带来太多的麻烦，我就做了一个简单的PHP页面，用户只需要将页面放到网站的根目录，通过下面的地址访问即可打开：你的网址/tepass_verify.php这里将你的网址改为你网址的地址，比如我的https://pangsuan.com，而tepass_verify.php就是授权信息的PHP页面，如果你更改了名称，记得也要做相应更改才能访问。 比如我的就是https://pangsuan.com/tepass_verify.php当然为了防止任何人都可以更改授权，或者说知道你的授权信息，这里限制了只有ID为1的用户才可以进入页面，修改信息。页面操作逻辑ID为1的用户登录网站后，打开页面就会看到验证信息，授权接口等相关情况，如果授权接口断开了，可以通过自己之前保存的授权信息，输入到本地授权信息里面，更新后，TePass插件也能正常使用。TePass插件授权待更新目前TePass插件对应的授权验证还未更新，这里只是做了一个域名授权的页面，后面找时间更新TePass插件的，那么到时候就不再依赖在线授权接口了。虽说现在基本也用不到，因为只要激活了插件，就不再验证授权信息了。tepass_verify.php代码下面是tepass_verify.php代码，复制之后放在网站根目录即可。<?php require_once 'config.inc.php'; /** 载入API支持 */ require_once 'var/Typecho/Common.php'; /** 初始化组件 */ Typecho_Widget::widget('Widget_Init'); /** 程序初始化 */ Typecho_Common::init(); // 用户验证 - 只有用户ID为1才能访问 Typecho_Widget::widget('Widget_User')->to($user); Typecho_Widget::widget('Widget_Options')->to($options); if (!$user->hasLogin() || $user->uid != "1") { // 未登录或不是ID为1的用户，跳转到登录页面 echo(" "); exit; } // 增加安全性检查 session_start(); if (!isset($_SESSION['csrf_token'])) { $_SESSION['csrf_token'] = bin2hex(random_bytes(32)); } $current_domain = trim($_SERVER['HTTP_HOST']); // 获取远程授权信息 function getRemoteAuthInfo() { try { $servername = trim($_SERVER['HTTP_HOST']); $api_url = 'https://api.pangsuan.com/authority.php?indentify=tepass&domain=' . $servername; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $api_url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_TIMEOUT, 10); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_USERAGENT, 'TePass-Auth-Verifier/1.0'); $response = curl_exec($ch); $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); $error = curl_error($ch); curl_close($ch); if ($http_code != 200) { return [ 'status' => 'error', 'error_type' => 'http_error', 'http_code' => $http_code, 'message' => '接口请求失败，HTTP状态码：' . $http_code, 'timestamp' => time() ]; } if ($response === false) { return [ 'status' => 'error', 'error_type' => 'curl_error', 'message' => '接口连接失败：' . $error, 'timestamp' => time() ]; } $authority = json_decode($response, true); if (json_last_error() !== JSON_ERROR_NONE) { return [ 'status' => 'error', 'error_type' => 'json_error', 'message' => '接口返回数据解析失败：' . json_last_error_msg(), 'timestamp' => time() ]; } if (isset($authority["status"]) && $authority["status"] === 'ok') { return [ 'status' => 'success', 'domain' => $_SERVER['HTTP_HOST'] ?? $servername, 'auth_data' => $authority["key"] ?? '', 'api_response' => $authority, 'timestamp' => time() ]; } else { return [ 'status' => 'api_error', 'error_type' => 'api_status', 'message' => '接口返回状态异常', 'api_response' => $authority, 'timestamp' => time() ]; } } catch (Exception $e) { return [ 'status' => 'error', 'error_type' => 'exception', 'message' => '接口请求异常：' . $e->getMessage(), 'timestamp' => time() ]; } } // 获取本地授权信息 function getLocalAuthInfo() { try { $db = Typecho_Db::get(); $rstepassValidation = $db->fetchRow($db->select()->from('table.options')->where('name = ?', "tepassValidation")->limit(1)); if ($rstepassValidation && isset($rstepassValidation['value'])) { return $rstepassValidation['value']; } return ''; } catch (Exception $e) { return ''; } } // 更新本地授权信息 function updateLocalAuthInfo($auth_data) { try { $db = Typecho_Db::get(); $existing = $db->fetchRow($db->select()->from('table.options')->where('name = ?', "tepassValidation")->limit(1)); if ($existing) { $result = $db->query($db->update('table.options')->rows(array('value' => $auth_data))->where('name = ?', "tepassValidation")); } else { $result = $db->query($db->insert('table.options')->rows(array( 'name' => 'tepassValidation', 'value' => $auth_data, 'user' => 0 ))); } return $result !== false; } catch (Exception $e) { return false; } } // 验证授权格式 function validateAuthFormat($auth_data) { if (empty($auth_data)) { return false; } if (strlen($auth_data) < 10) { return false; } return true; } // 验证CSRF令牌 function validateCSRFToken($token) { return isset($_SESSION['csrf_token']) && hash_equals($_SESSION['csrf_token'], $token); } // 处理Ajax请求 if (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest') { header('Content-Type: application/json'); // 首先验证用户权限 if (!$user->hasLogin() || $user->uid != "1") { echo json_encode([ 'success' => false, 'message' => '用户权限不足，请重新登录', 'type' => 'error', 'redirect' => '/tepass/signin' ]); exit; } // 验证CSRF令牌 $csrf_token = $_POST['csrf_token'] ?? ''; if (!validateCSRFToken($csrf_token)) { echo json_encode([ 'success' => false, 'message' => '安全令牌验证失败', 'type' => 'error' ]); exit; } $action = $_POST['action'] ?? ''; $response = ['success' => false, 'message' => '未知操作']; switch ($action) { case 'refresh_remote': $remote_data = getRemoteAuthInfo(); $api_status = $remote_data['status']; if ($api_status === 'success') { $response = [ 'success' => true, 'message' => '远程授权信息刷新成功', 'type' => 'success', 'data' => [ 'remote_auth' => $remote_data['auth_data'], 'api_status' => $api_status, 'timestamp' => date('Y-m-d H:i:s', $remote_data['timestamp']), 'status_text' => '接口连接正常' ] ]; } else { $response = [ 'success' => false, 'message' => '远程授权信息刷新失败：' . ($remote_data['message'] ?? '未知错误'), 'type' => 'error', 'data' => [ 'api_status' => $api_status, 'error_detail' => $remote_data['message'] ?? '未知错误', 'status_text' => '接口连接异常' ] ]; } break; case 'update_local': $new_auth = trim($_POST['local_auth'] ?? ''); if (empty($new_auth)) { $response = [ 'success' => false, 'message' => '授权信息不能为空', 'type' => 'error' ]; break; } if (!validateAuthFormat($new_auth)) { $response = [ 'success' => false, 'message' => '授权信息格式不正确，应为至少10位的字符串', 'type' => 'error' ]; break; } if (updateLocalAuthInfo($new_auth)) { // 获取最新远程信息进行对比 $remote_data = getRemoteAuthInfo(); $api_status = $remote_data['status']; $remote_auth = ($api_status === 'success') ? $remote_data['auth_data'] : ''; $comparison_result = ($remote_auth === $new_auth) ? 'match' : 'mismatch'; $response = [ 'success' => true, 'message' => '本地授权信息已更新' . ($comparison_result === 'match' ? '，且与远程信息一致！' : '，但与远程信息不一致。'), 'type' => 'success', 'data' => [ 'local_auth' => $new_auth, 'remote_auth' => $remote_auth, 'api_status' => $api_status, 'comparison_result' => $comparison_result, 'timestamp' => date('Y-m-d H:i:s') ] ]; } else { $response = [ 'success' => false, 'message' => '更新失败，数据库错误', 'type' => 'error' ]; } break; case 'verify_auth': $local_auth = getLocalAuthInfo(); $remote_data = getRemoteAuthInfo(); $api_status = $remote_data['status']; $remote_auth = ($api_status === 'success') ? $remote_data['auth_data'] : ''; if ($api_status === 'success') { if (empty($local_auth)) { $comparison_result = 'no_local'; $message = '本地未找到授权信息'; } else { $comparison_result = ($remote_auth === $local_auth) ? 'match' : 'mismatch'; $message = ($remote_auth === $local_auth) ? '授权信息一致' : '授权信息不一致'; } $response = [ 'success' => true, 'message' => $message, 'type' => $comparison_result === 'match' ? 'success' : 'warning', 'data' => [ 'local_auth' => $local_auth, 'remote_auth' => $remote_auth, 'api_status' => $api_status, 'comparison_result' => $comparison_result, 'timestamp' => date('Y-m-d H:i:s') ] ]; } else { $response = [ 'success' => false, 'message' => '接口连接失败：' . ($remote_data['message'] ?? '未知错误'), 'type' => 'error', 'data' => [ 'local_auth' => $local_auth, 'api_status' => $api_status, 'comparison_result' => 'api_error' ] ]; } break; default: $response = ['success' => false, 'message' => '无效的操作类型', 'type' => 'error']; } echo json_encode($response); exit; } // 初始化变量 - 仅用于首次页面加载 $comparison_result = ""; $remote_auth = ""; $local_auth = ""; $message = ""; $message_type = ""; $api_status = "unknown"; $api_error_detail = ""; $last_checked = ""; $remote_timestamp = ""; // 页面首次加载时获取授权信息 $local_auth = getLocalAuthInfo(); $remote_data = getRemoteAuthInfo(); $api_status = $remote_data['status']; $remote_timestamp = isset($remote_data['timestamp']) ? $remote_data['timestamp'] : time(); $last_checked = date('Y-m-d H:i:s'); if ($api_status === 'success') { $remote_auth = $remote_data['auth_data']; $api_error_detail = ""; if (empty($local_auth)) { $comparison_result = 'no_local'; } else { $comparison_result = ($remote_auth === $local_auth) ? 'match' : 'mismatch'; } } else { $comparison_result = 'api_error'; $api_error_detail = isset($remote_data['message']) ? $remote_data['message'] : '未知错误'; } ?> TePass插件域名授权验证系统 - 管理员 TePass插件域名授权验证系统 安全、可靠的授权验证与管理工具 管理员：<?php echo htmlspecialchars($user->screenName); ?> (ID: <?php echo $user->uid; ?>) <a href="<?php $options->logoutUrl() ?>" title="退出登录" 退出 重要安全提醒： 请妥善保管您的授权信息，不要泄露给他人。授权信息是您使用TePass插件的唯一凭证，丢失可能导致服务中断。建议您将授权信息备份到安全的地方。 接口状态 <?php if ($api_status === 'success'): ?> 正常 <?php elseif ($api_status === 'error' || $api_status === 'api_error'): ?> 异常 <?php else: ?> 未知 <?php endif; ?> <?php if ($api_error_detail): ?> <?php echo htmlspecialchars($api_error_detail); ?> <?php else: ?> <i class="fas <?php echo $api_status === 'success' ? 'fa-wifi' : 'fa-wifi-slash'; ?>"> <?php echo $api_status === 'success' ? '授权接口连接正常' : '无法连接授权接口'; ?> <?php endif; ?> 授权状态 <?php if ($comparison_result === 'match'): ?> 已验证 <?php elseif ($comparison_result === 'mismatch'): ?> 不一致 <?php elseif ($comparison_result === 'no_local'): ?> 未配置 <?php elseif ($comparison_result === 'api_error'): ?> 待验证 <?php else: ?> 检查中... <?php endif; ?> <?php if ($comparison_result === 'match') { echo ' 远程与本地授权信息一致'; } elseif ($comparison_result === 'mismatch') { echo ' 远程与本地授权信息不一致'; } elseif ($comparison_result === 'no_local') { echo ' 本地未找到授权信息'; } elseif ($comparison_result === 'api_error') { echo ' 接口异常，无法验证'; } else { echo ' 正在验证授权信息...'; } ?> 域名信息 <?php echo htmlspecialchars($current_domain); ?> 最后检查: <?php echo $last_checked; ?> 远程授权信息 <?php if ($api_status === 'success'): ?> <?php echo date('H:i:s', $remote_timestamp); ?> <?php endif; ?> 从授权接口获取的信息 <input type="text" id="remote_auth" class="auth-input" value="<?php echo htmlspecialchars($remote_auth); ?>" readonly placeholder="<?php echo $api_status !== 'success' ? '接口连接失败，无法获取远程授权信息' : ''; ?>" > <?php if ($remote_auth): ?> 复制 <?php endif; ?> <?php if ($api_status !== 'success'): ?> 授权接口连接失败时，请手动输入正确的授权信息保存到本地 <?php endif; ?> 刷新远程信息 本地授权信息 <?php if ($local_auth): ?> 已保存 <?php endif; ?> 本地数据库保存的授权信息 <input type="text" id="local_auth" class="auth-input" value="<?php echo htmlspecialchars($local_auth); ?>" placeholder="请输入正确的授权信息" autocomplete="off" > <?php if ($local_auth): ?> 复制 <?php endif; ?> 当授权接口断开时，请在此处输入正确的授权信息并保存到本地 保存到本地 使用说明与安全注意事项 访问权限：只有管理员（用户ID为1）可以访问和操作此系统 自动验证：页面加载时会自动获取远程和本地授权信息并进行对比验证 安全提醒：授权信息是您使用TePass插件的唯一凭证，请勿泄露给他人，并建议做好备份 无刷新操作：刷新远程信息和保存本地信息均采用Ajax方式，无需刷新整个页面 实时状态更新：所有操作后状态面板会实时更新，显示最新状态 复制功能：点击右侧复制按钮可快速复制授权信息 注意事项：请确保输入的授权信息格式正确，授权信息丢失可能导致服务中断 快捷操作：使用 Ctrl+R 刷新远程信息，Ctrl+S 保存本地信息 TePass插件域名授权验证系统 © <?php echo date('Y'); ?> 最后检查时间: <?php echo $last_checked; ?> 当前域名: <?php echo htmlspecialchars($current_domain); ?> 处理中... 确认保存授权信息 您确定要保存授权信息到本地数据库吗？ 重要提醒：请确保这是正确的授权信息，错误的授权信息可能导致插件无法正常工作。 取消 确认保存 保存成功 授权信息已成功保存到本地数据库！ 确定 保存失败 授权信息保存失败，请检查后重试。 重试 当然我也会发送一份到我的TePass交流群，可以从群文件获取。
前两天听群里说payjs的充值功能不可用，充值不了，今天我登录看了，我的也充值不了，那也就是说等我里面的豆豆完了应该就用不了payjs来收款了。 为什么要充值？充值的目的是为了购买豆豆，因为用payjs收款是有手续费的，一般的是2%，我的是1%，见上图，应该算是最低的那一批了，这个手续费就是从豆豆里面扣的。以前是可以通过登录，打卡签到，介绍用户，参与开发等等活动获取豆豆，我由于TePass插件的原因，他们也送过我豆豆，但是后面都没有了，只能通过充值获取豆豆。现在如果豆豆用完了，无法充值，没有豆豆了，那么可能后面账户就不能收款了。谈谈我认识的payjs的历史我是在2020年认识payjs的，我的账号就是他们送的，正常注册需要300元钱的，但是当时有活动，通过我的链接可以获取100到150元的优惠。有了payjs可以收款后，我就开发了TePass这款插件，到现在五年了。为什么要用payjs呢？要在网站收款，你只放个人微信收款码是不行的，你收到款了，当时网站访问用户不知道，付款了也不能进行下面的流程，需要联系你，才能获取到交易，这样无论对用户还是网站站长都是很麻烦的。要解决这个问题可以用微信的官方支付，商户的形式，就可以像淘宝购物一样，继续下面的流程，发货等。但是商户需要企业资质，个人无法使用，去开个企业资质维护也是很麻烦的事情，在这种情况下，payjs诞生了，它利用小微商户的方式，让个人也可以有资质实现网站收款对接。它应该是国内第一家这么实现的，我有幸作为种子用户获取到了账号，接下来就开发了TePass插件。后来payjs关闭了个人注册后来由于监管的原因，payjs关闭了个人注册，但是此时国内已经有很多商家做出了payjs这样的平台，就我比较熟悉的虎皮椒支付，然后联系他们，他们也给我一个微信支付的账号，我就给TePass插件增加了虎皮椒支付的功能。 后面我又给TePass插件增加了微信的官方支付收款和V免签收款。接下来应该怎么办？如果我payjs豆豆用完了，又不能充值，那么payjs肯定用不了，但是TePass插件还支持虎皮椒支付、微信官方支付和V免签。微信官方支付我的商户自己去注销了，所以肯定用不了；V免签需要电脑和手机挂机，考虑到为了收那么一点钱，浪费这个时间折腾，没必要，也不打算用了，当然如果你收款多，还是可以考虑的；虎皮椒是一个好的方式，跟payjs类似，但是估计我也不会考虑了。那么最后就只剩下支付宝了，TePass插件是可以设置单独使用支付宝的，所以我可能会把插件简化一下，移除微信支付相关，只留一个支付宝收款功能，毕竟现在也没有什么收款的需求了。下面是我这五年来写的payjs相关文章祝贺Payjs全面开通支付宝收款功能payjs庆国庆中秋开户优惠150元优惠码payjs开户优惠100元优惠码喜讯：payjs 个人微信收款开始 H5 公测啦TePass 插件支持 payjs 的 H5 支付啦！！！好消息：Payjs 可以修改商户简称啦~~成功拿到payjs的开户返现金额200元关于下架 payjs 优惠码的决定写在最后什么都有说再见的时候，五年了，没想到最后是以这样的方式结束，可能也过不了多久，但是回想这五年，还是挺感谢payjs的，因为它让我认识了很多网友，因为它让我这五年在坚持折腾一个东西，不断完善它，到现在都没办法进一步优化了。 我相信payjs关闭应该有迫不得已的原因，怎样的结果我都能理解。
很久没更新了，一直都很稳定，偶尔有小小的修改，所以就迟迟没发布，这次更新主要是解决购买用户id的问题，有些用户打开新标签登录，然后在旧页面付款，导致订单没有uid。 升级内容：1、解决购买用户id的问题，有些用户打开新标签登录，然后在旧页面付款，导致订单没有uid；2、修改付费记录时uid为空，备注为空自填补充；3、完善回调页面错误提现；4、修复修改付费订单下拉框的问题；5、修复一些其它小的问题。升级操作步骤：备份现有网站的数据库，禁用现有插件，现有插件文件夹改名备用，再上传新版本插件，解压后启用，测试没问题，再删除旧版本。特别说明：如何你在启用插件的时候，发现页面是空白的，很大可能性就是SG11版本太低了，这个版本的TePass插件需要SG扩展为14的版本（因为兼容PHP8.2的原因），宝塔面板卸载SG11扩展后重新安装即可，其它的在本站搜索教程更新。更新完SG11扩展后可重启一下PHP，再去启用插件就正常了。温馨提示：1、如果你在插件上进行了二次开发，请先备份，启用新版本插件后，再将你二次开发的文件覆盖插件相关文件。2、再次提醒微信模板消息下架，可转到我的小蒜子来接收提醒：https://developers.weixin.qq.com/community/develop/doc/000a4e1df800d82acb9b7fb5e5b001?page=1
很久没更新了，一来没有什么可更新的，二来更新又涉及到版本兼容问题，所以就迟迟没发布，这次更新设计到版本兼容的先不发布了，等等再说，先更新一点不痛不痒的。 升级内容：1、付费阅读界面增加VIP会员身份显示，续费购买VIP会员时间问题等；2、调整付费界面的图片为背景图的样式，这样一些主题缩略图或页面打开js冲突问题得到解决；3、修复购买会员页面微信支付宝图标显示问题；4、修复用户只设置了微信支付，而默认首选是支付宝导致图标显示的问题；5、修复一些其它小的问题。升级操作步骤：备份现有网站的数据库，禁用现有插件，现有插件文件夹改名备用，再上传新版本插件，解压后启用，测试没问题，再删除旧版本。特别说明：如何你在启用插件的时候，发现页面是空白的，很大可能性就是SG11版本太低了，这个版本的TePass插件需要SG扩展为14的版本（因为兼容PHP8.2的原因），宝塔面板卸载SG11扩展后重新安装即可，其它的在本站搜索教程更新。更新完SG11扩展后可重启一下PHP，再去启用插件就正常了。温馨提示：1、如果你在插件上进行了二次开发，请先备份，启用新版本插件后，再将你二次开发的文件覆盖插件相关文件。2、再次提醒微信模板消息下架，可转到我的小蒜子来接收提醒：https://developers.weixin.qq.com/community/develop/doc/000a4e1df800d82acb9b7fb5e5b001?page=1
今天突然想到一个问题，TePass插件购买会员界面，用户购买成功后，能看到付款成功，但是不能在显著位置提醒购买会员结果，只能去后台或者购买东西的适合看到打折了。于是我就在购买界面增加了显著的提示，这样就方便多了。修改后的购买VIP界面逻辑逻辑是这样的，当你未购买VIP会员服务的时候，显示的是默认界面，跟之前一样，如下图： 当你购买了VIP会员后，在这个购买界面下面增加了如图的提示文字： 里面包含了VIP会员服务什么时候到期，已经购买过，现在到期了也会显示，目的是告诉你在什么时候到期了，继续购买VIP会员，可延长到期时间。 而如果你购买的是终身会员服务，显示的界面就发生了很大的变化，如下图： 因为你都购买了终身会员，所以就没必要显示购买界面了。如何调用购买VIP会员服务见这篇文章《如何利用TePass插件在网站主题中实现购买会员功能？》，如果你不会弄也没关系，用户进入后面购买也行，界面也随着调整了。
TePass付费阅读插件1.5.6版本的微信社交登录设置方法
TePass插件的微信社交登录，最开始采用的payjs的方式，后面因为payjs关闭了用户的注册，改成了企业微信的方式，最近发现企业微信的方式也存在一些问题，故又做了一些调整。 请先看这篇文章《关于更换胖蒜网微信扫码登录的说明》，接着看这篇文章《关于TePass使用企业微信登录出现应用被临时停用的问题》，就能明白我的良苦用心了，企业微信方式不是不能用，是用的很不爽。 于是我作了一下调整，在TePass插件后台，第37项的设置，如果你填写的是payjs的商户号，那么就采用payjs调用openid的方式登录；如果你没有，那么只能用企业微信的方式，那么看这篇文章《使用企业微信API获取个人微信的openid实现网站微信扫码登录》，设置方法为：格式：CorpID---AgentId---Secret，见：https://pangsuan.com/p/qywx_login.html采用这样，实属无奈，个人没有正规的微信社交登录方式，其它的所有方法都让用户体验很不好，当然可能我寡闻了，如果你有适合个人的微信社交登录方式，并且体验很好，欢迎联系我提供。
这个版本调整了微信扫码登录的方式，payjs与企业微信方式二选一，见《TePass付费阅读插件1.5.6版本的微信社交登录设置方法》，修复了一些存在的小问题，同时不再兼任PHP5.6环境，建议全部升级。 升级内容：1、调整微信社交登录的方式，见《关于TePass使用企业微信登录出现应用被临时停用的问题》； 2、修复点击购买会员跳转的问题； 3、调整对PHP环境的兼容，不再兼容PHP5.6； 4、去掉付费阅读框右上角的图标，改为文字，简洁不容易出错； 5、修复一些其它小的问题。升级操作步骤：备份现有网站的数据库，禁用现有插件，现有插件文件夹改名备用，再上传新版本插件，解压后启用，测试没问题，再删除旧版本。 特别说明：如何你在启用插件的时候，发现页面是空白的，很大可能性就是SG11版本太低了，这个版本的TePass插件需要SG扩展为14的版本（因为兼容PHP8.2的原因），宝塔面板卸载SG11扩展后重新安装即可，其它的在本站搜索教程更新。更新完SG11扩展后可重启一下PHP，再去启用插件就正常了。温馨提示：1、如果你在插件上进行了二次开发，请先备份，启用新版本插件后，再将你二次开发的文件覆盖插件相关文件。2、再次提醒微信模板消息下架，可转到我的小蒜子来接收提醒：https://developers.weixin.qq.com/community/develop/doc/000a4e1df800d82acb9b7fb5e5b001?page=1
关于TePass使用企业微信登录出现应用被临时停用的问题
在上个版本的TePass插件，我把微信登录改为了使用企业微信的方式，见《关于更换胖蒜网微信扫码登录的说明》，使用方法见《使用企业微信API获取个人微信的openid实现网站微信扫码登录》，确实解决了个人用户微信登录的问题，但是用了一段时间后带来了一个困扰，就是如果企业微信应用长时间不用，就会被临时停止，需要去手动点击启用。 长时间没有的情况下，打开微信扫码，会出现下面的界面，点击启用后，就恢复正常了。 这样搞的话就很不方便了，用户来扫码绑定社交登录时体验很差。 但是个人用户又没有其它好的解决办法，于是我又用回了payjs的模式，不过这次动了点脑筋，就是如果你填payjs的设置，那么使用的就是payjs的方式来微信登录，填企业微信格式的参数，就使用企业微信的登录方式。
这个版本更新了微信扫码登录的方式，修复了购买终身会员回调不成功的问题，同时不再兼任PHP5.6环境，建议全部升级。 升级内容：1、修复QQ登录时候出现session已经存在的问题； 2、清理微信登录，用户打开页面不扫码，造成垃圾数据； 3、调整对PHP环境的兼容，不再兼容PHP5.6； 4、修复一些其它小的问题。升级操作步骤：备份现有网站的数据库，禁用现有插件，现有插件文件夹改名备用，再上传新版本插件，解压后启用，测试没问题，再删除旧版本。 特别说明：如何你在启用插件的时候，发现页面是空白的，很大可能性就是SG11版本太低了，这个版本的TePass插件需要SG扩展为14的版本（因为兼容PHP8.2的原因），宝塔面板卸载SG11扩展后重新安装即可，其它的在本站搜索教程更新。更新完SG11扩展后可重启一下PHP，再去启用插件就正常了。温馨提示：1、如果你在插件上进行了二次开发，请先备份，启用新版本插件后，再将你二次开发的文件覆盖插件相关文件。2、再次提醒微信模板消息下架，可转到我的小蒜子来接收提醒：https://developers.weixin.qq.com/community/develop/doc/000a4e1df800d82acb9b7fb5e5b001?page=1
这个版本更新了微信扫码登录的方式，修复了购买终身会员回调不成功的问题，同时不再兼任PHP5.6环境，建议全部升级。 升级内容：1、更改微信扫码登录通过企业微信的方式，见《关于更换胖蒜网微信扫码登录的说明》，企业微信设置见《使用企业微信API获取个人微信的openid实现网站微信扫码登录》； 2、修复在部分环境下，购买终身VIP时，回调不成功的问题； 3、优化各种方式回调部分的代码； 4、调整对PHP环境的兼容，不再兼容PHP5.6； 5、修复一些其它小的问题。升级操作步骤：备份现有网站的数据库，禁用现有插件，现有插件文件夹改名备用，再上传新版本插件，解压后启用，测试没问题，再删除旧版本。 特别说明：如何你在启用插件的时候，发现页面是空白的，很大可能性就是SG11版本太低了，这个版本的TePass插件需要SG扩展为14的版本（因为兼容PHP8.2的原因），宝塔面板卸载SG11扩展后重新安装即可，其它的在本站搜索教程更新。更新完SG11扩展后可重启一下PHP，再去启用插件就正常了。温馨提示：1、如果你在插件上进行了二次开发，请先备份，启用新版本插件后，再将你二次开发的文件覆盖插件相关文件。2、再次提醒微信模板消息下架，可转到我的小蒜子来接收提醒：https://developers.weixin.qq.com/community/develop/doc/000a4e1df800d82acb9b7fb5e5b001?page=1