diff --git a/admin-console/src/config/env.js b/admin-console/src/config/env.js index 6013e46..d0f7c99 100644 --- a/admin-console/src/config/env.js +++ b/admin-console/src/config/env.js @@ -1,5 +1,5 @@ // Production: change to 'prod' -const ENV = 'test' +const ENV = 'prod' const API_BASES = { local: 'http://localhost:3000', diff --git a/miniprogram/config/env.js b/miniprogram/config/env.js index 5c94745..fe07f9a 100644 --- a/miniprogram/config/env.js +++ b/miniprogram/config/env.js @@ -1,5 +1,5 @@ // Production: change to 'prod' to disable debug buttons and mock endpoints -var ENV = 'test' +var ENV = 'prod' var API_BASES = { local: 'http://localhost:3000', diff --git a/miniprogram/pages/auto-scan/auto-scan.js b/miniprogram/pages/auto-scan/auto-scan.js index 583f340..ba3591a 100644 --- a/miniprogram/pages/auto-scan/auto-scan.js +++ b/miniprogram/pages/auto-scan/auto-scan.js @@ -1,6 +1,4 @@ var ble = require('../../services/ble') -var config = require('../../config/env') - Page({ data: { statusBarHeight: 44, @@ -9,8 +7,7 @@ Page({ regions: 0x7F, regionData: [], timeout: false, - error: '', - devMode: false + error: '' }, onBack: function () { @@ -25,8 +22,7 @@ Page({ var app = getApp() this.setData({ statusBarHeight: app.globalData.statusBarHeight, - regions: parseInt(options.regions) || 0x7F, - devMode: config.__DEV__ || false + regions: parseInt(options.regions) || 0x7F }) this.startScan() }, @@ -93,15 +89,4 @@ Page({ }) }, - onMockScanDone: function () { - var self = this - if (self._progressTimer) clearInterval(self._progressTimer) - var mask = parseInt(self.data.regions) || 0x7F - wx.redirectTo({ - url: '/pages/treating/treating?regions=' + mask + - '&wavelength=2' + - '&duration=600000' + - '&mode=1' - }) - } }) diff --git a/miniprogram/pages/auto-scan/auto-scan.wxml b/miniprogram/pages/auto-scan/auto-scan.wxml index 11e389b..dda66c2 100644 --- a/miniprogram/pages/auto-scan/auto-scan.wxml +++ b/miniprogram/pages/auto-scan/auto-scan.wxml @@ -17,11 +17,6 @@ 请将面罩对准面部 连接设备后可获取皮肤数据 - - 🔧 调试工具 - - - 正在扫描... {{regionData.length || 3}} 个区域 diff --git a/miniprogram/pages/ble-connect/ble-connect.js b/miniprogram/pages/ble-connect/ble-connect.js index 41573fb..2899e06 100644 --- a/miniprogram/pages/ble-connect/ble-connect.js +++ b/miniprogram/pages/ble-connect/ble-connect.js @@ -1,6 +1,5 @@ var ble = require('../../services/ble') var http = require('../../utils/request') -var config = require('../../config/env') var app = getApp() var SCAN_TIMEOUT = 15000 @@ -11,7 +10,6 @@ Page({ bindToken: '', state: 'scanning', error: '', - devMode: false }, onBack: function () { @@ -26,8 +24,7 @@ Page({ this.setData({ statusBarHeight: app.globalData.statusBarHeight }) this.setData({ deviceId: options.device_id || '', - bindToken: options.bind_token || '', - devMode: config.__DEV__ || false + bindToken: options.bind_token || '' }) this.startBleConnect() }, @@ -110,24 +107,4 @@ Page({ }, 1000) }, - onMockConnect: function () { - var self = this - clearTimeout(this._scanTimer) - ble.stopScan() - self.setData({ state: 'binding' }) - http.post('/api/v1/device/mock-bind', { - device_id: self.data.deviceId - }).then(function () { - self.setData({ state: 'done' }) - wx.redirectTo({ - url: '/pages/bind-success/bind-success?device_id=' + self.data.deviceId - }) - }).catch(function (err) { - self.setData({ state: 'error', error: err.message || '模拟绑定失败' }) - }) - }, - - onMockBindSuccess: function () { - this.onMockConnect() - } }) diff --git a/miniprogram/pages/ble-connect/ble-connect.wxml b/miniprogram/pages/ble-connect/ble-connect.wxml index 17641b8..2a2b515 100644 --- a/miniprogram/pages/ble-connect/ble-connect.wxml +++ b/miniprogram/pages/ble-connect/ble-connect.wxml @@ -28,10 +28,5 @@ - - 🔧 调试工具 - - - diff --git a/miniprogram/pages/index/index.js b/miniprogram/pages/index/index.js index d9e870f..50ca77e 100644 --- a/miniprogram/pages/index/index.js +++ b/miniprogram/pages/index/index.js @@ -1,6 +1,5 @@ var ble = require('../../services/ble') var api = require('../../utils/api') -var config = require('../../config/env') var app = getApp() Page({ @@ -14,14 +13,9 @@ Page({ bleState: 'disconnected', hasDevice: false, deviceInfo: null, - devMode: false, loading: true }, - onLoad: function () { - this.setData({ devMode: config.__DEV__ || false }) - }, - onShow: function () { this.checkState() this._onStatus = this.onBleStatus.bind(this) @@ -173,26 +167,6 @@ Page({ wx.navigateTo({ url: '/pages/wear-check/wear-check' }) }, - onMockBind: function () { - var self = this - wx.showModal({ - title: '模拟绑定', - editable: true, - placeholderText: '输入设备编号(需先在后台创建)', - success: function (res) { - if (res.confirm && res.content) { - var deviceId = res.content.trim() - api.mockBind(deviceId).then(function () { - wx.showToast({ title: '模拟绑定成功', icon: 'success' }) - self.checkState() - }).catch(function (err) { - wx.showToast({ title: err.message || '绑定失败', icon: 'none' }) - }) - } - } - }) - }, - onViewSubscription: function () { wx.navigateTo({ url: '/pages/subscribe-plans/subscribe-plans' }) } diff --git a/miniprogram/pages/index/index.wxml b/miniprogram/pages/index/index.wxml index f67e3cf..e8780b5 100644 --- a/miniprogram/pages/index/index.wxml +++ b/miniprogram/pages/index/index.wxml @@ -9,10 +9,6 @@ 📱 还没有绑定设备 - - 🔧 调试工具 - - diff --git a/miniprogram/pages/subscribe-plans/subscribe-plans.js b/miniprogram/pages/subscribe-plans/subscribe-plans.js index fb77991..bee9f51 100644 --- a/miniprogram/pages/subscribe-plans/subscribe-plans.js +++ b/miniprogram/pages/subscribe-plans/subscribe-plans.js @@ -1,5 +1,4 @@ var api = require('../../utils/api') -var config = require('../../config/env') Page({ data: { @@ -163,17 +162,12 @@ Page({ var self = this self.setData({ purchasing: true }) api.purchase(plan.key).then(function (data) { - if (data.mock || !data.payment_params) { - // Dev fallback: use mock purchase - return api.mockPurchase(plan.key).then(function () { - self.setData({ purchasing: false }) - wx.showToast({ title: '支付成功', icon: 'success' }) - setTimeout(function () { - wx.redirectTo({ url: '/pages/subscribe-success/subscribe-success?plan=' + plan.key }) - }, 1000) - }) + if (!data.payment_params) { + self.setData({ purchasing: false }) + wx.showToast({ title: '支付服务暂不可用', icon: 'none' }) + return } - // Real payment + var params = data.payment_params self._currentOrderId = data.order_id wx.requestPayment({ diff --git a/miniprogram/pages/treating/treating.js b/miniprogram/pages/treating/treating.js index 33c1f8c..64cf838 100644 --- a/miniprogram/pages/treating/treating.js +++ b/miniprogram/pages/treating/treating.js @@ -1,8 +1,6 @@ var ble = require('../../services/ble') var api = require('../../utils/api') var commandSync = require('../../services/command-sync') -var config = require('../../config/env') - Page({ data: { statusBarHeight: 44, @@ -18,7 +16,6 @@ Page({ paused: false, completed: false, startedAt: 0, - devMode: false, regionText: '全脸护理', }, @@ -34,7 +31,7 @@ Page({ onLoad: function (options) { var app = getApp() - this.setData({ statusBarHeight: app.globalData.statusBarHeight, devMode: config.__DEV__ || false }) + this.setData({ statusBarHeight: app.globalData.statusBarHeight }) this._deviceId = ble.getDeviceId() || (app.globalData.currentDevice && app.globalData.currentDevice.device_id) || '' var regions = parseInt(options.regions) || 0x7F this.setData({ @@ -259,7 +256,4 @@ Page({ }) }, - onMockComplete: function () { - this.finishAsComplete() - } }) diff --git a/miniprogram/pages/treating/treating.wxml b/miniprogram/pages/treating/treating.wxml index 90ba7d3..2c842fa 100644 --- a/miniprogram/pages/treating/treating.wxml +++ b/miniprogram/pages/treating/treating.wxml @@ -27,11 +27,6 @@ - - 🔧 调试工具 - - - diff --git a/miniprogram/pages/treatment-setup/treatment-setup.js b/miniprogram/pages/treatment-setup/treatment-setup.js index e044ce8..2a7ca97 100644 --- a/miniprogram/pages/treatment-setup/treatment-setup.js +++ b/miniprogram/pages/treatment-setup/treatment-setup.js @@ -1,6 +1,4 @@ var ble = require('../../services/ble') -var config = require('../../config/env') - Page({ data: { statusBarHeight: 44, @@ -16,8 +14,7 @@ Page({ subDays: 6, fixedDurationMs: 600000, submitting: false, - error: '', - devMode: false + error: '' }, onBack: function () { @@ -30,7 +27,7 @@ Page({ onLoad: function () { var app = getApp() - this.setData({ statusBarHeight: app.globalData.statusBarHeight, devMode: config.__DEV__ || false }) + this.setData({ statusBarHeight: app.globalData.statusBarHeight }) this.checkSubscription() }, @@ -109,17 +106,4 @@ Page({ }) }, - onMockStart: function () { - var mask = 0 - this.data.regions.forEach(function (r) { - if (r.checked) mask |= r.mask - }) - if (mask === 0) mask = 0x7F - wx.redirectTo({ - url: '/pages/treating/treating?regions=' + mask + - '&wavelength=2' + - '&duration=' + this.data.fixedDurationMs + - '&mode=' + this.data.selectedMode - }) - } }) diff --git a/miniprogram/pages/treatment-setup/treatment-setup.wxml b/miniprogram/pages/treatment-setup/treatment-setup.wxml index 97c8955..e169104 100644 --- a/miniprogram/pages/treatment-setup/treatment-setup.wxml +++ b/miniprogram/pages/treatment-setup/treatment-setup.wxml @@ -38,10 +38,5 @@ {{error}} - - - 🔧 调试工具 - - diff --git a/miniprogram/pages/wear-check/wear-check.js b/miniprogram/pages/wear-check/wear-check.js index 10ad066..636cd2a 100644 --- a/miniprogram/pages/wear-check/wear-check.js +++ b/miniprogram/pages/wear-check/wear-check.js @@ -1,13 +1,10 @@ var ble = require('../../services/ble') -var config = require('../../config/env') - Page({ data: { statusBarHeight: 44, checking: false, result: null, error: '', - devMode: false, battery: 0, connected: false }, @@ -22,7 +19,7 @@ Page({ onLoad: function () { var app = getApp() - this.setData({ statusBarHeight: app.globalData.statusBarHeight, devMode: config.__DEV__ || false }) + this.setData({ statusBarHeight: app.globalData.statusBarHeight }) var device = app.globalData.currentDevice || {} this.setData({ battery: device.battery || 0, @@ -108,7 +105,4 @@ Page({ }, 500) }, - onMockWearOk: function () { - this.setData({ checking: false, result: 'ok' }) - } }) diff --git a/miniprogram/pages/wear-check/wear-check.wxml b/miniprogram/pages/wear-check/wear-check.wxml index 84a7b71..9269d05 100644 --- a/miniprogram/pages/wear-check/wear-check.wxml +++ b/miniprogram/pages/wear-check/wear-check.wxml @@ -41,10 +41,5 @@ - - - 🔧 调试工具 - - diff --git a/miniprogram/scripts/test-ble-frame.js b/miniprogram/scripts/test-ble-frame.js deleted file mode 100644 index 4c29bb5..0000000 --- a/miniprogram/scripts/test-ble-frame.js +++ /dev/null @@ -1,63 +0,0 @@ -global.wx = global.wx || { - onBLEConnectionStateChange: function () {} -} - -const ble = require('../services/ble') - -function assert(condition, message) { - if (!condition) throw new Error(message) -} - -function bytes(buffer) { - return Array.from(new Uint8Array(buffer)) -} - -function xor(arr) { - return arr.reduce((acc, item) => acc ^ item, 0) -} - -function testBuildFrameChecksum() { - const frame = bytes(ble.buildFrame(0x02, [0x7F, 0x01])) - assert(frame[0] === 0xAA && frame[1] === 0x55, 'frame header mismatch') - assert(frame[2] === 0x02, 'frame length mismatch') - assert(frame[3] === 0x02, 'frame type mismatch') - assert(frame[frame.length - 1] === xor(frame.slice(0, -1)), 'checksum must include header, len, type, payload') -} - -function testParseStatusFrame() { - const payload = [0x02, 0x7F, 0x02, 200, 0x00, 0x09, 0x27, 0xC0, 0x00, 0x01, 86, 36, 1, 2] - const frame = ble.buildFrame(0x21, payload) - const parsed = ble.parseFrame(frame) - assert(parsed.type === 0x21, 'status type mismatch') - const status = ble.parseStatusReport(parsed.payload) - assert(status.mode_state === 0x02, 'mode_state mismatch') - assert(status.region_mask === 0x7F, 'region mask mismatch') - assert(status.remaining_ms === 600000, 'remaining_ms mismatch') - assert(status.battery === 86, 'battery mismatch') - assert(status.temperature === 36, 'temperature mismatch') -} - -function testBindPayloadLength() { - const userBytes = ble.hexToBytes('0000000000000001') - const tokenBytes = ble.hexToBytes('0011223344556677') - assert(userBytes.length === 8, 'user id must be 8 bytes') - assert(tokenBytes.length === 8, 'bind token must be 8 bytes') -} - -function testVendorCommand33() { - const command = ble.buildVendorCommand33({ - region_mask: 0x1F, - wavelength: ble.WAVELENGTH.R, - brightness: 200, - duration_ms: 600000 - }) - assert(command.length === 33, 'vendor command must be 33 bytes') - assert(command[32] === xor(command.slice(0, 32)), 'vendor command checksum mismatch') -} - -testBuildFrameChecksum() -testParseStatusFrame() -testBindPayloadLength() -testVendorCommand33() - -console.log('BLE frame tests passed') diff --git a/miniprogram/services/ble/connection.js b/miniprogram/services/ble/connection.js index 267cf83..54378d9 100644 --- a/miniprogram/services/ble/connection.js +++ b/miniprogram/services/ble/connection.js @@ -1,7 +1,6 @@ // BLE connection: scan, connect, disconnect, reconnect logic var protocol = require('./protocol') -var devConfig = require('../../config/env') var SERVICE = protocol.SERVICE var CHAR = protocol.CHAR @@ -254,10 +253,6 @@ function startScan(callbacks) { var localName = (d.localName || '').toUpperCase() var matched = name.indexOf('HOX') !== -1 || localName.indexOf('HOX') !== -1 || name.indexOf('LIGHTMASK') !== -1 || localName.indexOf('LIGHTMASK') !== -1 - // Dev board name - only match in dev mode - if (!matched && devConfig.__DEV__) { - matched = name.indexOf('SIMPLE PERIPHERAL') !== -1 || localName.indexOf('SIMPLE PERIPHERAL') !== -1 - } if (matched) { wx.stopBluetoothDevicesDiscovery({}) if (callbacks.onFound) callbacks.onFound(d) diff --git a/miniprogram/utils/api.js b/miniprogram/utils/api.js index b19d3bc..a368155 100644 --- a/miniprogram/utils/api.js +++ b/miniprogram/utils/api.js @@ -13,7 +13,6 @@ module.exports = { getDevices: function () { return http.get('/api/v1/device/list') }, bindDevice: function (deviceId) { return http.post('/api/v1/device/bind', { device_id: deviceId }) }, confirmBind: function (deviceId, token) { return http.post('/api/v1/device/bind/confirm', { device_id: deviceId, bind_token: token }) }, - mockBind: function (deviceId) { return http.post('/api/v1/device/mock-bind', { device_id: deviceId }) }, unbindDevice: function (deviceId) { return http.post('/api/v1/device/unbind', deviceId ? { device_id: deviceId } : {}) }, // Subscription @@ -21,7 +20,6 @@ module.exports = { getSubscription: function () { return http.get('/api/v1/subscription') }, activateTrial: function () { return http.post('/api/v1/subscription/trial') }, purchase: function (plan) { return http.post('/api/v1/subscription/purchase', { plan: plan }) }, - mockPurchase: function (plan) { return http.post('/api/v1/subscription/mock-purchase', { plan: plan }) }, // Payment getPaymentOrder: function (orderId) { return http.get('/api/v1/payment/orders/' + orderId) }, diff --git a/miniprogram/utils/mock.js b/miniprogram/utils/mock.js deleted file mode 100644 index 7dd57bc..0000000 --- a/miniprogram/utils/mock.js +++ /dev/null @@ -1,145 +0,0 @@ -var MOCK_TOKEN = 'mock_token_dev_' + Date.now() - -var MOCK_USER = { - user_id: 10001, - open_id: 'mock_open_id_12345', - nickname: '测试用户', - avatar_url: '', - phone: '', - gender: 0, - created_at: '2025-01-01T00:00:00.000Z' -} - -var MOCK_DEVICE = { - device_id: 'DEV001', - name: '我的光子美容仪', - firmware_version: '1.0.0', - battery_level: 85, - status: 'online', - bind_time: '2025-01-01T00:00:00.000Z' -} - -var MOCK_SUBSCRIPTION = { - plan_type: 'trial', - status: 'active', - start_time: '2025-01-01T00:00:00.000Z', - end_time: '2025-02-01T00:00:00.000Z', - remaining_days: 30 -} - -var MOCK_TREATMENTS = [ - { - session_id: 'S20250101001', - device_id: 'DEV001', - regions: [1, 2], - wavelength: 630, - brightness: 5, - duration: 600000, - mode: 1, - avg_pd: 128, - created_at: '2025-01-15T10:30:00.000Z' - }, - { - session_id: 'S20250102002', - device_id: 'DEV001', - regions: [1], - wavelength: 850, - brightness: 3, - duration: 300000, - mode: 2, - avg_pd: 96, - created_at: '2025-01-14T08:00:00.000Z' - } -] - -var mockHandlers = { - 'POST /api/v1/auth/login': function () { - return { - code: 0, - data: { - token: MOCK_TOKEN, - user_id: MOCK_USER.user_id, - user_info: MOCK_USER - } - } - }, - - 'POST /api/v1/auth/refresh': function () { - return { code: 0, data: { token: MOCK_TOKEN } } - }, - - 'GET /api/v1/user/profile': function () { - return { code: 0, data: MOCK_USER } - }, - - 'PUT /api/v1/user/profile': function (data) { - Object.assign(MOCK_USER, data) - return { code: 0, data: MOCK_USER } - }, - - 'POST /api/v1/device/bind': function (data) { - var d = Object.assign({}, MOCK_DEVICE, { device_id: data.device_id || 'DEV001' }) - return { - code: 0, - data: { - device: d, - bind_token: 'mock_bind_token_' + Date.now(), - subscription: MOCK_SUBSCRIPTION - } - } - }, - - 'POST /api/v1/device/unbind': function () { - return { code: 0, data: {} } - }, - - 'GET /api/v1/device/list': function () { - return { code: 0, data: { devices: [MOCK_DEVICE], total: 1 } } - }, - - 'GET /api/v1/device/detail': function () { - return { code: 0, data: MOCK_DEVICE } - }, - - 'GET /api/v1/subscription/status': function () { - return { code: 0, data: MOCK_SUBSCRIPTION } - }, - - 'POST /api/v1/subscription/purchase': function (data) { - return { - code: 0, - data: { - order_id: 'ORD' + Date.now(), - plan_type: data.plan_type, - status: 'paid' - } - } - }, - - 'POST /api/v1/subscription/verify': function () { - return { code: 0, data: { valid: true } } - }, - - 'POST /api/v1/treatment/sync': function (data) { - return { code: 0, data: { session_id: data.session_id || 'S' + Date.now() } } - }, - - 'GET /api/v1/treatment/history': function () { - return { code: 0, data: { records: MOCK_TREATMENTS, total: MOCK_TREATMENTS.length } } - } -} - -function handle(method, path, data) { - var key = method + ' ' + path - var handler = mockHandlers[key] - if (!handler) { - return { code: -1, message: 'mock: 未定义的接口 ' + key } - } - return handler(data) -} - -module.exports = { - handle: handle, - MOCK_TOKEN: MOCK_TOKEN, - enabled: false -} diff --git a/server/src/config.js b/server/src/config.js index 1ae40a6..0df644c 100644 --- a/server/src/config.js +++ b/server/src/config.js @@ -1,7 +1,7 @@ require('dotenv').config() const config = { - nodeEnv: process.env.NODE_ENV || 'development', + nodeEnv: process.env.NODE_ENV || 'production', port: parseInt(process.env.PORT, 10) || 3000, region: process.env.TENCENT_REGION || 'ap-guangzhou', db: { diff --git a/server/src/dao/binding.dao.js b/server/src/dao/binding.dao.js index 543e94d..7c02196 100644 --- a/server/src/dao/binding.dao.js +++ b/server/src/dao/binding.dao.js @@ -101,38 +101,6 @@ async function confirmBind(userId, deviceId, bindToken) { }) } -/** - * Mock bind (dev/test only): directly bind with status=1, auto-trial - * @param {number} userId - * @param {string} deviceId - * @returns {Promise<{success?: boolean, duplicated?: boolean, device_id?: string, invalid?: boolean}>} - */ -async function mockBind(userId, deviceId) { - return transaction(async conn => { - const [active] = await conn.execute( - 'SELECT device_id FROM bindings WHERE user_id = ? AND bind_status = 1 LIMIT 1', - [userId] - ) - if (active.length > 0) return { duplicated: true, device_id: active[0].device_id } - const [devices] = await conn.execute( - 'SELECT * FROM devices WHERE device_id = ? AND status <> 4 LIMIT 1', - [deviceId] - ) - if (devices.length === 0) return { invalid: true } - await conn.execute( - 'UPDATE bindings SET bind_status = 2 WHERE user_id = ? AND bind_status = 3', - [userId] - ) - await conn.execute( - "INSERT INTO bindings (user_id, device_id, bind_token, bind_expires, bind_status, bind_time) VALUES (?, ?, 'mock', NOW(), 1, NOW())", - [userId, deviceId] - ) - const subscriptionDao = require('./subscription.dao') - await subscriptionDao.grantTrialIfEligible(userId, conn) - return { success: true } - }) -} - /** * Unbind device(s) for a user * @param {number} userId @@ -197,7 +165,6 @@ module.exports = { createPending, closeExpiredPending, confirmBind, - mockBind, unbindByUser, getHistoryByDevice, findUserDeviceBinding, diff --git a/server/src/lib/wechat.js b/server/src/lib/wechat.js index 180fa44..f3c2233 100644 --- a/server/src/lib/wechat.js +++ b/server/src/lib/wechat.js @@ -51,11 +51,7 @@ async function getAccessToken() { } async function code2Session(code) { - if (config.nodeEnv === 'development' && (!code || code === 'local' || String(code).indexOf('dev_') === 0)) { - return { openid: 'dev_openid_' + String(code || 'local').slice(-8) } - } if (!config.wechat.appid || !config.wechat.secret) { - if (config.nodeEnv === 'development') return { openid: 'dev_openid_' + String(code || 'local').slice(-8) } throw new Error('WECHAT_APPID or WECHAT_SECRET is not configured') } const url = 'https://api.weixin.qq.com/sns/jscode2session?appid=' + encodeURIComponent(config.wechat.appid) + '&secret=' + encodeURIComponent(config.wechat.secret) + '&js_code=' + encodeURIComponent(code) + '&grant_type=authorization_code' diff --git a/server/src/routes/device.js b/server/src/routes/device.js index 38a830e..953184a 100644 --- a/server/src/routes/device.js +++ b/server/src/routes/device.js @@ -56,23 +56,6 @@ router.post('/device/bind/confirm', requireUser, wrap(async (req, res) => { })) })) -router.post('/device/mock-bind', requireUser, wrap(async (req, res) => { - const config = require('../config') - if (config.nodeEnv === 'production') return res.json(fail(2001, 'not available in production')) - const deviceId = String(req.body.device_id || '').trim() - if (!deviceId) return res.json(fail(2001, 'device_id required')) - - const active = await bindingDao.findActiveByUser(req.user.user_id) - if (active) return res.json(fail(2001, '已绑定设备', { device_id: active.device_id })) - - const device = await bindingDao.findDeviceExists(deviceId) - if (!device) return res.json(fail(1005, 'DEVICE_NOT_FOUND')) - - await bindingDao.mockBind(req.user.user_id, deviceId) - await logDao.write({ user_id: req.user.user_id, action: 'device_bind_confirm', detail: '模拟绑定设备: ' + deviceId, ip: req.ip }) - res.json(ok({ message: 'success', device_id: deviceId })) -})) - router.post('/device/unbind', requireUser, wrap(async (req, res) => { const deviceId = req.body.device_id || null await bindingDao.unbindByUser(req.user.user_id, deviceId) diff --git a/server/src/routes/subscription.js b/server/src/routes/subscription.js index 88d422d..09acbc6 100644 --- a/server/src/routes/subscription.js +++ b/server/src/routes/subscription.js @@ -46,11 +46,8 @@ router.post('/subscription/purchase', requireUser, wrap(async (req, res) => { if (!PLANS[plan] || plan === 'trial') return res.json(fail(2001, 'invalid plan')) const wxpay = require('../lib/wxpay') - const config = require('../config') if (!wxpay.isConfigured()) { - if (config.nodeEnv === 'production') return res.json(fail(2001, 'payment not configured')) - const orderId = 'ORD' + Date.now() - return res.json(ok({ order_id: orderId, payment_params: null, mock: true, plan, amount: PLANS[plan].amount })) + return res.json(fail(2001, 'payment not configured')) } const paymentOrderDao = require('../dao/payment-order.dao') @@ -82,19 +79,6 @@ router.post('/subscription/purchase', requireUser, wrap(async (req, res) => { res.json(ok({ order_id: orderId, payment_params: paymentParams, plan, amount: priceYuan })) })) -router.post('/subscription/mock-purchase', requireUser, wrap(async (req, res) => { - const config = require('../config') - if (config.nodeEnv === 'production') return res.json(fail(2001, 'not available in production')) - const plan = req.body.plan || req.body.plan_type - if (!PLANS[plan] || plan === 'trial') return res.json(fail(2001, 'invalid plan')) - const p = PLANS[plan] - const orderId = 'MOCK' + Date.now() - await subscriptionDao.purchase(req.user.user_id, plan, p.amount, orderId, p.days) - await logDao.write({ user_id: req.user.user_id, action: 'subscription_mock_purchase', detail: '模拟购买: ' + plan, ip: req.ip }) - const sub = await subscriptionDao.findActive(req.user.user_id) - res.json(ok({ status: 'active', plan, remaining_days: sub ? sub.remaining_days : p.days })) -})) - router.post('/subscription/trial', requireUser, wrap(async (req, res) => { const usedTrial = await subscriptionDao.findTrial(req.user.user_id) if (usedTrial) return res.json(fail(2001, '已使用过试用'))