
简介本资源为Discuz点微同城30.0全功能插件套件面向基于Discuz平台构建本地生活服务类网站的开发者与运营方提供覆盖同城分类信息、招聘、房产、婚恋、拼团、优惠抢购、小程序对接等20余核心业务场景的一站式扩展能力。压缩包含2000个文件主体为4117个PHP后端逻辑文件、1987个HTM/HTML前端模板、2033个PNG及437个JPG/GIF图片资源、613个JS交互脚本与256个CSS样式文件辅以WXSS/WXML等微信小程序适配文件整体体积72.68MB结构完整、模块解耦清晰可直接部署升级。已有1403人学习下载适用于需快速搭建高定制化同城服务平台的技术团队。用户可获得全部47个官方插件源码含疫情地图、子站点、电话本、红包系统等稀缺模块以及H5与小程序双端兼容的前端资源、标准化接口调用示例和weui.css等UI基础支持显著降低二次开发门槛。1. Discuz 点微同城 30.0 全套插件47个不是“一键安装包”而是 H5 与小程序双端协同的本地化服务系统底座Discuz 点微同城 30.0 全套插件含 47 个独立功能模块本质是一套深度耦合 Discuz! X3.4 核心的本地生活服务扩展体系其 H5 前端并非简单响应式页面而是基于 WeUI.css 规范构建、适配微信内嵌 WebView 的轻量级单页应用其小程序前端也非独立生态而是严格遵循微信小程序基础库 2.25.2 要求、通过wx.request与 Discuz 后端 RESTful 接口通信的原生方案。这套插件组合解决的是社区型平台从论坛向“附近服务”转型时最痛的三个断层用户身份无法跨 H5/小程序复用、商家入驻流程在两端不一致、订单状态在不同入口下不同步。它适合已有 Discuz! X3.4 或 X3.5 站点、且已备案主体具备微信小程序认证资质的技术团队——不是买来就能跑的成品商城而是需要你亲手把discuz_plugin_dianwei_tongcheng目录注入/source/plugin/、逐个启用并配置 API Token 的可定制服务中台。如果你正被“小程序备案备注信息怎么填”卡住或发现“打包为app连接不了”说明你还没完成这套插件最关键的后端网关对齐。2. 拆解点微同城 30.0 插件架构47 个模块如何分工支撑 H5 与小程序双端能力点微同城 30.0 的 47 个插件并非平铺罗列而是按职责划分为 5 类核心能力层每类都直接影响 H5 页面渲染逻辑与小程序 API 调用路径。理解这个分层是避免“H5 游戏逆向”式盲目修改的前提。2.1 基础支撑层12 个插件决定 H5 是否能加载、小程序能否获取用户定位这类插件提供底层通信协议与权限桥接例如dwtc_api统一 API 网关、dwtc_wxauth微信授权中间件、dwtc_location地理位置服务封装。它们直接修改 Discuz 的common.inc.php加载链并在 H5 端注入weui.cssweui.min.js在小程序端暴露wx.getLocation()封装方法。关键动作是启用dwtc_wxauth后H5 页面必须在head中引入https://res.wx.qq.com/open/js/jweixin-1.6.0.js并在onLoad阶段调用wx.config()小程序则需在app.js的onLaunch中执行wx.login()并将 code 传给dwtc_api接口/api/wx/login。提示若 H5 页面在微信内打开时提示“config:invalid signature”不是签名算法错而是dwtc_wxauth插件未正确读取 Discuz 后台「站点 URL」设置——必须与公众号 JS 安全域名完全一致含 http/https 协议且不能带端口。2.1.1 dwtc_api 插件的 3 个必调参数控制 H5 与小程序数据一致性dwtc_api是整套系统的神经中枢其后台配置页有 3 个影响双端行为的关键字段参数名默认值H5 端影响小程序端影响修改建议api_domain空H5 发起 AJAX 请求的基础域名若填https://api.example.com所有$.get(/v1/shop)实际请求https://api.example.com/v1/shop小程序wx.request({url: /v1/shop})会自动拼接此域名必须与小程序服务器域名白名单一致填写与 Discuz 主站同域的二级域名如api.bbs.example.com避免跨域拦截token_expire7200H5 登录态 JWT Token 过期时间秒过期后跳转/member.php?modloggingactionlogin小程序wx.setStorageSync(token, ...)存储的 token 有效期超时后wx.request返回 401生产环境建议设为 3600配合小程序wx.checkSession()定期刷新h5_redirect_url/plugin.php?iddwtc_h5:indexH5 用户点击“立即下单”后跳转的落地页路径该路径由dwtc_h5插件提供路由小程序wx.navigateTo({url: /pages/order/index})仅跳转本地页面此参数不影响小程序若需 H5 订单页支持微信支付此处必须指向含wx.config初始化的页面2.2 业务功能层23 个插件H5 与小程序共用同一套数据模型但渲染逻辑分离这类插件实现具体业务如dwtc_shop商家管理、dwtc_order订单中心、dwtc_coupon优惠券。它们共享 Discuz 的pre_dwtc_*数据表但前端呈现方式截然不同H5 使用 jQuery Handlebars 模板位于/template/default/dwtc/小程序使用 WXML WXSS位于/plugin/dwtc_xxx/template/。以dwtc_shop为例H5 列表页通过$.get(/plugin.php?iddwtc_shop:apioplist)获取 JSON小程序则调用wx.request({url: /api/shop/list})—— 接口返回结构完全相同但 H5 侧需手动处理weui-flex布局小程序侧直接绑定wx:for。2.2.1 H5 端 weui.css 的 2 处必须覆盖的样式冲突WeUI.css 在 Discuz 默认模板中常与common.css冲突导致按钮圆角失效、列表间距错乱。必须在 H5 页面head中追加以下 CSS 覆盖style /* 修复 WeUI 按钮在 Discuz 表单中的高度塌陷 */ .weui-btn { line-height: 1.5; padding: 0.8em 1.2em; } /* 修复 WeUI 列表项在 Discuz 评论区内的边距溢出 */ .weui-cells__title { margin-top: 0.5em; margin-bottom: 0.3em; } /style这段代码需硬编码在dwtc_h5插件的index.htm模板中不能依赖外部 CSS 文件——因为 Discuz 的template缓存机制会导致weui.css加载顺序不可控。2.3 小程序专用层8 个插件补足原生能力解决“uniapp开发h5嵌入微信公众号中获取定位”的兼容问题这部分插件专为小程序设计如dwtc_wxpay微信支付封装、dwtc_wxmap高德地图 SDK 桥接、dwtc_wxshare自定义分享卡片。它们不提供 H5 功能但其 PHP 后端逻辑如生成支付 prepay_id被 H5 和小程序共同调用。典型场景是H5 页面调用微信 JS-SDK 发起支付而小程序调用wx.requestPayment()两者均需先请求dwtc_wxpay的/api/wxpay/create接口获取签名参数。注意dwtc_wxmap插件要求 Discuz 后台填写高德 Web 服务 API Key且 H5 端需在index.htm中引入script srchttps://webapi.amap.com/maps?v1.4.15keyYOUR_KEY/script小程序端则无需引入由插件自动注入wx.openLocation()调用逻辑。3. H5 与小程序前端部署实操从本地调试到线上发布的关键步骤部署不是复制粘贴文件而是建立三重校验链Discuz 后端接口可访问 → H5 页面能正确初始化 WeUI 组件 → 小程序能稳定调用wx.request。任何一环断裂都会导致“websocket运行到h5可以连接,打包为app连接不了”这类现象。3.1 H5 前端最小可运行命令用 PHP 内置服务器验证基础链路不要直接扔进生产环境 Nginx先用 PHP 内置服务快速验证。进入 Discuz 根目录执行php -S localhost:8000 -t ./source/plugin/dwtc_h5/ ./source/plugin/dwtc_h5/router.php此命令启动一个仅服务于dwtc_h5插件的轻量服务器router.php是自定义路由文件内容如下?php // source/plugin/dwtc_h5/router.php if (preg_match(/\.(?:png|jpg|jpeg|gif|css|js|woff|woff2|ttf|eot)$/, $_SERVER[REQUEST_URI])) { return false; // 静态资源直接返回 } else { // 所有 PHP 请求转发给 index.php include __DIR__ . /index.php; }访问http://localhost:8000/若看到 WeUI 风格的首页且控制台无Failed to load resource: net::ERR_CONNECTION_REFUSED错误说明 H5 静态资源与 PHP 路由通路正常。3.1.1 H5 页面调试必备的 3 个 Chrome DevTools 技巧Network 标签页过滤xhr检查plugin.php?iddwtc_api:...请求是否返回 200响应体是否含{code:0,data:{...}}结构Application 标签页查看localStorage确认dwtc_token字段存在且未过期exp时间戳大于当前时间Console 执行weui.alert(test)验证 WeUI.js 是否成功加载若报错weui is not defined说明weui.min.js路径错误或被 Discuz 的common.js覆盖。3.2 小程序前端构建避开uniapp开发h5嵌入微信公众号中获取定位的常见陷阱点微同城 30.0 小程序前端是原生开发非 UniApp 封装。构建前必须完成三项配置在project.config.json中添加libVersionlibVersion: 2.25.2,此版本号必须与dwtc_wxauth插件声明的最低基础库一致否则wx.getLocation()会静默失败。在app.js的onLaunch中强制校验登录态App({ onLaunch() { wx.checkSession({ success: () { /* session 有效直接拉取用户信息 */ }, fail: () { // session 失效重新登录 wx.login({ success: res { wx.request({ url: https://your-discuz.com/plugin.php?iddwtc_api:wxlogin, method: POST, data: { code: res.code }, success: r { wx.setStorageSync(token, r.data.token); } }); } }); } }); } });在pages/index/index.js中处理onPullDownRefresh时的 token 自动续期Page({ onPullDownRefresh() { const token wx.getStorageSync(token); if (Date.now() / 1000 JSON.parse(atob(token.split(.)[1])).exp) { // token 过期触发重新登录流程 this.onLoad(); } else { // 正常刷新数据 this.loadList(); } } });提示若小程序wx.request返回request:fail ssl hand shake error不是证书问题而是dwtc_api插件的api_domain配置了 HTTP 协议——微信小程序强制 HTTPS必须改为https://开头。4. 双端联调排错定位“H5 能连 WebSocket打包为 APP 连不了”的根本原因当 H5 在微信内运行正常但打包成 APP 后网络请求全部失败问题几乎 100% 出在客户端网络栈与 Discuz 后端的 TLS 协商层面而非代码逻辑。点微同城 30.0 的 47 个插件中只有dwtc_api和dwtc_wxpay涉及 HTTPS 请求因此排查必须聚焦在这两个插件的 SSL 配置。4.1 Discuz 后端 SSL 配置的 3 个致命细节很多团队以为只要 Nginx 配置了 HTTPS 就万事大吉却忽略了 Discuz 自身对 HTTPS 的感知逻辑config/config_global.php中$_config[cookie][domain]必须为空或精确匹配若填.example.comH5 在https://m.example.com下可读 cookie但 APP 内 WebView 访问https://api.example.com时因 domain 不匹配无法携带 cookie导致dwtc_api接口返回 401。正确做法是留空让 Discuz 自动根据$_SERVER[HTTP_HOST]设置。source/class/discuz/discuz_application.php第 123 行必须强制识别 HTTPS默认 Discuz 依赖$_SERVER[HTTPS]判断协议但某些负载均衡器如阿里云 SLB会将 HTTPS 流量转为 HTTP 到后端此时$_SERVER[HTTPS]为空。需在此处插入if ($_SERVER[HTTP_X_FORWARDED_PROTO] https) { $_SERVER[HTTPS] on; }dwtc_api插件的api_domain必须与 APP WebView 的loadUrl协议严格一致若 APP 使用https://m.example.com加载 H5api_domain却配置为http://api.example.comAndroid WebView 会因混合内容Mixed Content策略阻止请求。必须统一为https://api.example.com且该域名需有合法 SSL 证书Lets Encrypt 证书需包含api.example.comSAN 条目。4.1.1 APP 内 WebView 调试的终极方案抓包定位 SSL 握手失败点Android APP 内 WebView 的网络请求无法用 Chrome DevTools 查看必须用抓包工具。推荐方案PC 端 Wireshark 手机代理手机 WiFi 设置代理指向 PC 的 IP 和端口如 8888Wireshark 过滤tls.handshake.type 1观察 Client Hello 后是否有 Server Hello若无 Server Hello说明服务器未响应 TLS 握手检查 Nginx 的ssl_protocols TLSv1.2 TLSv1.3;是否启用旧版 OpenSSL 可能不支持 TLSv1.3若有 Server Hello 但后续失败检查证书链是否完整用openssl s_client -connect api.example.com:443 -showcerts验证。4.2 小程序端wx.request超时的 2 种真实场景与对应参数调整小程序wx.request默认超时 60 秒但在点微同城场景下常需更精细控制场景表现根本原因解决方案dwtc_shop:list接口耗时 60s小程序白屏控制台报request:fail timeout商家数据量过大Discuz 查询未加索引在dwtc_shop插件的model/shop.php中为pre_dwtc_shop表的status和cityid字段添加复合索引ALTER TABLE pre_dwtc_shop ADD INDEX idx_status_city (status, cityid);dwtc_order:create接口偶发超时H5 下单成功小程序下单失败dwtc_wxpay插件调用高德 API 获取配送距离时网络抖动在小程序pages/order/create.js中为wx.request显式设置timeout: 15000wx.request({ url: /api/order/create, timeout: 15000, ... })注意timeout参数只在基础库 2.10.0 支持低于此版本需降级处理——在fail回调中判断errMsg是否含timeout字符串然后重试一次。5. 进阶技巧用 Discuz 模板机制动态注入小程序所需的数据预加载脚本点微同城 30.0 的 H5 页面常需在onLoad时立即获取用户位置但wx.getLocation()是异步的导致页面闪动。最佳实践是利用 Discuz 的模板变量在 PHP 层就完成地理围栏计算将结果直接注入 HTML。5.1 在dwtc_h5/index.htm中嵌入预计算的商圈数据修改dwtc_h5插件的模板文件找到body开始处插入script // Discuz 模板变量由 PHP 后端计算得出 const PRELOAD商圈 {$dwtc_preload商圈|default:[]}; const USER_LOCATION {$dwtc_user_location|default:null}; /script对应地在dwtc_h5/index.php中于include template(dwtc_h5/index);前添加// 根据用户 IP 或 cookie 中的 last_location查询最近 3 个商圈 $ip $_SERVER[REMOTE_ADDR]; $商圈数据 DB::fetch_all(SELECT id,name,lng,lat FROM .DB::table(dwtc_business_district). WHERE distance 5000 ORDER BY distance LIMIT 3); $商圈JSON json_encode($商圈数据); // 注入模板变量 $tpl-assign(dwtc_preload商圈, $商圈JSON); // 若用户已授权位置则直接注入 if ($user_location dwtc_get_user_location()) { $tpl-assign(dwtc_user_location, json_encode($user_location)); } else { $tpl-assign(dwtc_user_location, null); }这样H5 页面加载时PRELOAD商圈已是可用数组无需等待wx.getLocation()大幅提升首屏体验。而小程序端仍走标准wx.getLocation()流程保持精度——双端策略差异恰是点微同城 30.0 插件体系的设计哲学H5 重速度与兼容性小程序重精度与原生能力。本文还有配套的精品资源点击获取