├── .babelrc ├── .eslintrc.js ├── .gitignore ├── .npmignore ├── LICENSE ├── README.md ├── gulpfile.js ├── index.d.ts ├── instructions.md ├── package.json ├── src └── index.js ├── test ├── index.test.js ├── utils.js └── wx.test.js └── tools ├── build.js ├── checkcomponents.js ├── checkwxss.js ├── config.js ├── demo ├── app.js ├── app.json ├── app.wxss ├── package.json ├── pages │ └── index │ │ ├── index.js │ │ ├── index.json │ │ ├── index.wxml │ │ └── index.wxss └── project.config.json └── utils.js /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "plugins": [ 3 | ["module-resolver", { 4 | "root": ["./src"], 5 | "alias": {} 6 | }] 7 | ], 8 | "presets": [ 9 | ["env", {"loose": true, "modules": "commonjs"}] 10 | ] 11 | } -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'extends': [ 3 | 'airbnb-base', 4 | 'plugin:promise/recommended' 5 | ], 6 | 'parserOptions': { 7 | 'ecmaVersion': 9, 8 | 'ecmaFeatures': { 9 | 'jsx': false 10 | }, 11 | 'sourceType': 'module' 12 | }, 13 | 'env': { 14 | 'es6': true, 15 | 'node': true, 16 | 'jest': true 17 | }, 18 | 'plugins': [ 19 | 'import', 20 | 'node', 21 | 'promise' 22 | ], 23 | 'rules': { 24 | 'arrow-parens': 'off', 25 | 'comma-dangle': [ 26 | 'error', 27 | 'only-multiline' 28 | ], 29 | 'complexity': ['error', 10], 30 | 'func-names': 'off', 31 | 'global-require': 'off', 32 | 'handle-callback-err': [ 33 | 'error', 34 | '^(err|error)$' 35 | ], 36 | 'import/no-unresolved': [ 37 | 'error', 38 | { 39 | 'caseSensitive': true, 40 | 'commonjs': true, 41 | 'ignore': ['^[^.]'] 42 | } 43 | ], 44 | 'import/prefer-default-export': 'off', 45 | 'linebreak-style': 'off', 46 | 'no-catch-shadow': 'error', 47 | 'no-continue': 'off', 48 | 'no-div-regex': 'warn', 49 | 'no-else-return': 'off', 50 | 'no-param-reassign': 'off', 51 | 'no-plusplus': 'off', 52 | 'no-shadow': 'off', 53 | 'no-multi-assign': 'off', 54 | 'no-underscore-dangle': 'off', 55 | 'node/no-deprecated-api': 'error', 56 | 'node/process-exit-as-throw': 'error', 57 | 'object-curly-spacing': [ 58 | 'error', 59 | 'never' 60 | ], 61 | 'operator-linebreak': [ 62 | 'error', 63 | 'after', 64 | { 65 | 'overrides': { 66 | ':': 'before', 67 | '?': 'before' 68 | } 69 | } 70 | ], 71 | 'prefer-arrow-callback': 'off', 72 | 'prefer-destructuring': 'off', 73 | 'prefer-template': 'off', 74 | 'quote-props': [ 75 | 1, 76 | 'as-needed', 77 | { 78 | 'unnecessary': true 79 | } 80 | ], 81 | 'semi': [ 82 | 'error', 83 | 'never' 84 | ], 85 | 'no-await-in-loop': 'off', 86 | 'no-restricted-syntax': 'off', 87 | 'promise/always-return': 'off', 88 | }, 89 | 'globals': { 90 | 'window': true, 91 | 'document': true, 92 | 'App': true, 93 | 'Page': true, 94 | 'Component': true, 95 | 'Behavior': true, 96 | 'wx': true, 97 | 'getCurrentPages': true, 98 | } 99 | } 100 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | .DS_Store 3 | package-lock.json 4 | 5 | logs 6 | *.log 7 | npm-debug.log* 8 | yarn-debug.log* 9 | yarn-error.log* 10 | 11 | miniprogram_dist 12 | miniprogram_dev 13 | node_modules 14 | coverage -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | .idea 2 | .DS_Store 3 | package-lock.json 4 | 5 | logs 6 | *.log 7 | npm-debug.log* 8 | yarn-debug.log* 9 | yarn-error.log* 10 | 11 | test 12 | tools 13 | docs 14 | miniprogram_dev 15 | node_modules 16 | coverage -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 gooking 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 功能介绍 2 | 3 | 微信小程序接口工具包,无需服务器,无需开发后台,开箱即用,轻松开发小程序 4 | 5 | 交流 QQ 群: 6 | 7 | - 群1: 629639122 (已满) 8 | 9 | - 群2: 534721253 10 | 11 | 欢迎大家进群交流,文档持续更新中... 12 | 13 | # 其他镜像 14 | 15 | - [Github](https://github.com/gooking/apifm-wxapi) 16 | - [码云](https://gitee.com/javazj/apifm-wxapi) 17 | 18 | # 平台支持 19 | 20 | * [微信小程序开发](https://github.com/gooking/apifm-wxapi) 21 | * [web/h5 网站开发](https://github.com/gooking/apifm-webapi) 22 | * [Flutter 开发](https://github.com/gooking/apifm-flutter) 23 | 24 | # 使用方法 25 | 26 | ## 安装 27 | 28 | ``` 29 | npm install apifm-wxapi 30 | ``` 31 | 32 | *如果你的项目还不支持 npm (检查根目录下有没有 package.json 文件),请先初始化:* 33 | 34 | ``` 35 | npm init 36 | ``` 37 | 38 | ## 构建 npm 模块 39 | 40 | 小程序安装的 npm 模块,还不能直接使用,你需要在开发工具: “工具” --> “构建 npm” ,提示构建成功后,才能使用! 41 | 42 | ## 小程序调用 43 | 44 | 1. js文件头部引入插件: 45 | 46 | ``` 47 | const WXAPI = require('apifm-wxapi') 48 | WXAPI.init('gooking') 49 | ``` 50 | 51 | 2. js文件直接调用方法: 52 | 53 | ``` 54 | WXAPI.banners().then(res => { 55 | if (res.code == 0) { 56 | this.setData({ 57 | banners: res.data 58 | }) 59 | } 60 | }) 61 | ``` 62 | 63 | *上述例子完成了读取后台的 banner 轮播图片的数据,后台发布轮播图,小程序端直接这样简单调用即可~* 64 | 65 | # 返回值说明 66 | 67 | WXAPI 方法返回数据主要包含 3 个内容: 68 | 69 | 1. code 错误码,0 代表操作重构,其他数字均表示错误,具体错误描述请查看 msg; 70 | 2. msg 如果上面的code不为0,那么 msg 将会返回具体的错误说明描述 71 | 3. data 字段保存了 code 为0 时候的数据,一起你需要的数据,都保存在 data 中返回给你 72 | 73 | # 相关资源 74 | 75 | [「5分钟使用教程」](https://www.yuque.com/apifm/doc/mdldsd) 76 | [「Demo程序下载」](https://github.com/gooking/apifm-wxapi-demo) 77 | [「功能说明文档」](instructions.md) 78 | [「api接口文档」](https://api.it120.cc/doc.html) 79 | 80 | # TA们在用 81 | 82 | | 天使童装| 舔果果小铺 | 面馆风格小程序 | AI名片 | 83 | | :------:| :------: | :------: | :------: | 84 | | | | | | 85 | | [开源地址](https://github.com/EastWorld/wechat-app-mall) | [开源地址](hhttps://github.com/walcer/TianguoguoXiaopu) | [开源地址](https://gitee.com/javazj/noodle_shop_procedures) | [开源地址](https://github.com/gooking/visitingCard) | 86 | 87 |   88 | 89 | | fire-shop-lite| 培训机构 | 面馆风格小程序 | AI名片 | 90 | | :------:| :------: | :------: | :------: | 91 | | | | | | 92 | | [开源地址](https://github.com/thundersword/fire-shop-lite) | [开源地址](https://github.com/fukcup/lofter) | [开源地址](https://gitee.com/javazj/noodle_shop_procedures) | [开源地址](https://github.com/gooking/visitingCard) | 93 | 94 | # 联系作者 95 | 96 | | ➕微信 | ➕支付宝 | ➕QQ | 97 | | :------: | :------: | :------: | 98 | | | | | 99 | 100 | # 授权协议 101 | 102 | [MIT License](LICENSE) -------------------------------------------------------------------------------- /gulpfile.js: -------------------------------------------------------------------------------- 1 | const gulp = require('gulp') 2 | const clean = require('gulp-clean') 3 | 4 | const config = require('./tools/config') 5 | const BuildTask = require('./tools/build') 6 | const id = require('./package.json').name || 'miniprogram-custom-component' 7 | 8 | // 构建任务实例 9 | // eslint-disable-next-line no-new 10 | new BuildTask(id, config.entry) 11 | 12 | // 清空生成目录和文件 13 | gulp.task('clean', gulp.series(() => gulp.src(config.distPath, {read: false, allowEmpty: true}).pipe(clean()), done => { 14 | if (config.isDev) { 15 | return gulp.src(config.demoDist, {read: false, allowEmpty: true}) 16 | .pipe(clean()) 17 | } 18 | 19 | return done() 20 | })) 21 | // 监听文件变化并进行开发模式构建 22 | gulp.task('watch', gulp.series(`${id}-watch`)) 23 | // 开发模式构建 24 | gulp.task('dev', gulp.series(`${id}-dev`)) 25 | // 生产模式构建 26 | gulp.task('default', gulp.series(`${id}-default`)) 27 | -------------------------------------------------------------------------------- /index.d.ts: -------------------------------------------------------------------------------- 1 | type Request = (url: string, needSubDomain: boolean, method: 'OPTIONS' | 'GET' | 'HEAD' | 'POST' | 'PUT' | 'DELETE' | 'TRACE' | 'CONNECT', data: any) => Promise<{ 2 | code: number 3 | data: any 4 | [key: string]: any 5 | }> 6 | 7 | type Token = { 8 | token: string, 9 | } 10 | 11 | type Pagination = { 12 | page?: number, 13 | pageSize?: number, 14 | } 15 | 16 | type DateQuery = { 17 | /** 18 | * 添加时间起,格式 2018-05-16 19 | * 20 | * @type {string} 21 | */ 22 | dateAddBegin?: string, 23 | /** 24 | * 添加时间起,格式 2018-05-16 25 | * 26 | * @type {string} 27 | */ 28 | dateAddEnd?: string, 29 | } 30 | 31 | declare interface WXAPI> { 32 | /** 33 | * 34 | * 初始化 35 | * @param {string} subDomain 子域名 36 | */ 37 | init: (subDomain: string) => void 38 | 39 | /** 40 | * 41 | * 初始化 42 | * @param {string} API_BASE_URL 主域名 43 | * @param {string} subDomain 子域名 44 | */ 45 | init2: (API_BASE_URL: string, subDomain: string) => void 46 | 47 | /** 48 | * 49 | * 初始化 50 | * @param {string} apiBaseUrl 主域名 51 | * @param {string} subDomain 子域名 52 | */ 53 | init3: (options: { 54 | apiBaseUrl?: string, 55 | subDomain: string, 56 | request?: (...args: Parameters) => RequestResult, 57 | }) => void 58 | 59 | /** 60 | * 61 | * 请求工具函数 62 | * @param {string} url 请求 url 63 | * @param {string} needSubDomain 是否需要子域名 64 | * @param {string} method 请求方式 'OPTIONS' | 'GET' | 'HEAD' | 'POST' | 'PUT' | 'DELETE' | 'TRACE' | 'CONNECT' 65 | */ 66 | request: Request 67 | 68 | /** 69 | * 70 | * 查询手机号码归属地 71 | * @method GET 72 | * @param {string} mobile 手机号码 73 | */ 74 | queryMobileLocation: (mobile: string) => RequestResult 75 | 76 | /** 77 | * 78 | * 获取指定城市的下一个号段 79 | * @method POST 80 | * @param {string} segment 当前号段,要获取第一个号段请传入0 81 | * @param {string} cityName 所属城市,eg:杭州 82 | * @param {string} province 所属省份,eg:浙江 83 | * @param {string} segmentName 包含的运营商相关信息,例如:中国联通、移动 84 | */ 85 | nextMobileSegment: (data: { 86 | /** 所属城市,eg:杭州 */ 87 | segment: string, 88 | cityName?: string, 89 | province?: string, 90 | segmentName?: string, 91 | }) => RequestResult 92 | 93 | /** 94 | * 95 | * 读取系统参数 96 | * @method GET 97 | * @param {string} key 参数参数 98 | */ 99 | queryConfigValue: (key: string) => RequestResult 100 | 101 | /** 102 | * 103 | * 批量读取系统参数 104 | * @method GET 105 | * @param {string} keys 参数参数 106 | */ 107 | queryConfigBatch: (keys: string[]) => RequestResult 108 | 109 | /** 110 | * 111 | * 积分赠送规则 112 | * @method POST 113 | * @param {string} data.code 编码 114 | */ 115 | scoreRules: (data: { code?: string }) => RequestResult 116 | 117 | /** 118 | * 119 | * 获取签到赠送积分规则 120 | * @method GET 121 | */ 122 | scoreSignRules: () => RequestResult 123 | 124 | /** 125 | * 126 | * 签到 127 | * @method POST 128 | * @param {string} token 登录接口返回的token 129 | */ 130 | scoreSign: (token: string) => RequestResult 131 | 132 | /** 133 | * 134 | * 签到记录 135 | * @method POST 136 | * @param {string} dateAddBegin 起始时间筛选,2017-11-22 137 | * @param {string} dateAddEnd 截止时间筛选,2017-11-22 138 | * @param {number} page 获取第几页数据 139 | * @param {number} pageSize 每页显示多少数据 140 | * @param {string} token 登录接口返回的token 141 | */ 142 | scoreSignLogs: (data: { 143 | token: string, 144 | } & Pagination & DateQuery) => RequestResult 145 | 146 | /** 147 | * 148 | * 今日签到记录 149 | * @method GET 150 | * @param {string} token 登录接口返回的token 151 | */ 152 | scoreTodaySignedInfo: (token: string) => RequestResult 153 | 154 | /** 155 | * 156 | * 积分券兑换积分 157 | * @method POST 158 | * @param {string} token 登录接口返回的token 159 | * @param {string} number 券号 160 | */ 161 | scoreExchange: (token: string, number: string) => RequestResult 162 | 163 | /** 164 | * 165 | * 积分兑换成现金 166 | * @method POST 167 | * @param {string} token 登录接口返回的token 168 | * @param {string} deductionScore 抵扣积分数量 169 | */ 170 | scoreExchangeCash: (token: string, deductionScore: string) => RequestResult 171 | 172 | /** 173 | * 174 | * 积分明细记录 175 | * @method POST 176 | * @param {string} behavior 收支方式 0 收入 1 支出 177 | * @param {string} dateAddBegin 起始时间筛选,2017-11-22 178 | * @param {string} dateAddEnd 截止时间筛选,2017-11-22 179 | * @param {number} page 获取第几页数据 180 | * @param {number} pageSize 每页显示多少数据 181 | * @param {number} remark 备注关键词搜索 182 | * @param {string} type 类型 0 注册 1 邀请好友 2 每日签到 3 兑换优惠券 4 管理员调整 5充值送 6 消费返 183 | * @param {string} token 登录接口返回的token 184 | */ 185 | scoreLogs: (data: { 186 | behavior?: 0 | 1, 187 | remark?: string, 188 | type?: 0 | 1 | 2 | 3 | 4 | 5 | 6, 189 | token: string, 190 | } & Pagination & DateQuery) => RequestResult 191 | 192 | /** 193 | * 194 | * 小程序分享到微信群赠送积分 195 | * @method POST 196 | * @param {string} code 小程序登录时候获得的code临时凭证 197 | * @param {string} referrer 分享人的用户id 198 | * @param {any} encryptedData 微信登录接口返回的 加密用户信息 199 | * @param {string} iv 小程序api:wx.getShareInfo 获得 200 | */ 201 | shareGroupGetScore: (code: string, referrer: string, encryptedData: any, iv: string) => RequestResult 202 | 203 | /** 204 | * 205 | * 获取砍价设置 206 | * @method GET 207 | * @param {string} goodsId 商品id,多个商品使用英文逗号分隔 208 | */ 209 | kanjiaSet: (goodsId: string) => RequestResult 210 | 211 | /** 212 | * 213 | * 加入砍价 214 | * @method POST 215 | * @param {string} kjid 砍价ID 216 | * @param {string} token 登录接口返回的token 217 | */ 218 | kanjiaJoin: (token: string, kjid: string) => RequestResult 219 | 220 | /** 221 | * 222 | * 砍价详情 223 | * @method GET 224 | * @param {string} kjid 砍价ID 225 | * @param {string} joiner 参与者ID 226 | */ 227 | kanjiaDetail: (kjid: string, joiner: string) => RequestResult 228 | 229 | /** 230 | * 231 | * 帮人砍一刀 232 | * @method POST 233 | * @param {string} token 登录接口返回的token 234 | * @param {string} kjid 砍价ID 235 | * @param {string} joiner 砍价参与用户ID 236 | * @param {string} remark 砍价留言,选填项 237 | */ 238 | kanjiaHelp: (token: string, kjid: string, joiner: string, remark?: string) => RequestResult 239 | 240 | /** 241 | * 242 | * 删除砍价[删除后,你依然可以重新发起砍价] 243 | * @method POST 244 | * @param {string} token 登录接口返回的token 245 | * @param {string} kjid 砍价ID 246 | */ 247 | kanjiaClear: (token: string, kjid: string) => RequestResult 248 | 249 | /** 250 | * 251 | * 我的砍价 252 | * @method GET 253 | * @param {string} token 登录接口返回的token 254 | * @param {string} kjid 砍价ID 255 | */ 256 | kanjiaMyJoinInfo: (token: string, kjid: string) => RequestResult 257 | 258 | /** 259 | * 260 | * 帮忙砍价信息 261 | * @method GET 262 | * @param {string} token 登录接口返回的token 263 | * @param {string} kjid 砍价ID 264 | * @param {string} joiner 砍价参与用户ID 265 | */ 266 | kanjiaHelpDetail: (token: string, kjid: string, joiner: string) => RequestResult 267 | 268 | /** 269 | * 270 | * 检测登录token是否有效 271 | * @method GET 272 | * @param {string} token 登录接口返回的token 273 | */ 274 | checkToken: (token: string) => RequestResult 275 | 276 | /** 277 | * 278 | * 检测referrer[邀请码]是否有效 279 | * @method GET 280 | * @param {string} referrer 邀请码 281 | */ 282 | checkReferrer: (referrer: string) => RequestResult 283 | 284 | /** 285 | * 286 | * 小程序支付 287 | * @method POST 288 | * @param {number} money 支付金额 289 | * @param {string} nextAction 支付成功后的后续工作,具体详见: https://www.it120.cc/help/aetmlb.html 290 | * @param {string} payName 微信支付弹出页面显示的支付名目 291 | * @param {string} remark 支付备注说明 292 | * @param {string} token 登录接口返回的token 293 | */ 294 | wxpay: (data: { 295 | money: number, 296 | nextAction?: string, 297 | payName?: string, 298 | remark?: string, 299 | token: string, 300 | }) => RequestResult 301 | 302 | /** 303 | * 304 | * 头条/抖音小程序支付 305 | * @method POST 306 | * @param {number} money 支付金额 307 | * @param {string} nextAction 支付成功后的后续工作,具体详见: https://www.it120.cc/help/aetmlb.html 308 | * @param {string} payName 微信支付弹出页面显示的支付名目 309 | * @param {string} remark 支付备注说明 310 | * @param {string} token 登录接口返回的token 311 | */ 312 | ttpay: typeof WXAPI.wxpay 313 | 314 | /** 315 | * 316 | * 查询在线支付状态 317 | * @method GET 318 | * @param {number} outTradeId 支付订单号 319 | * @param {string} token 登录接口返回的token 320 | */ 321 | payQuery: (token: string, outTradeId: string) => RequestResult 322 | 323 | /** 324 | * 325 | * 查询在线支付状态 326 | * @method GET 327 | * @param {number} outTradeId 支付订单号 328 | * @param {string} token 登录接口返回的token 329 | */ 330 | 331 | // wxpaySaobei: (data) => { 332 | // return request('/pay/lcsw/wxapp', true, 'post', data) 333 | // }, 334 | 335 | /** 336 | * 337 | * 小程序支付[wepayez] 338 | * @method POST 339 | * @param {number} money 支付金额 340 | * @param {string} nextAction 支付成功后的后续工作,具体详见: https://www.it120.cc/help/aetmlb.html 341 | * @param {string} payName 微信支付弹出页面显示的支付名目 342 | * @param {string} remark 支付备注说明 343 | * @param {string} token 登录接口返回的token 344 | */ 345 | wxpayWepayez: typeof WXAPI.wxpay 346 | 347 | /** 348 | * 349 | * [支付宝半自动转账]获取支付地址 350 | * @method POST 351 | * @param {number} money 支付金额 352 | * @param {string} nextAction 支付成功后的后续工作,具体详见: https://www.it120.cc/help/aetmlb.html 353 | * @param {string} remark 支付备注说明 354 | * @param {string} token 登录接口返回的token 355 | */ 356 | alipay: (data: { 357 | money: number, 358 | nextAction?: string, 359 | remark?: string, 360 | token: string, 361 | }) => RequestResult 362 | 363 | /** 364 | * 365 | * 微信小程序登录 366 | * @method POST 367 | * @param {string} code string 368 | */ 369 | login_wx: (code: string) => RequestResult 370 | 371 | /** 372 | * 373 | * 通过微信绑定的手机号码登录 374 | * @method POST 375 | * @param {string} code 小程序登录时候获得的code临时凭证 376 | * @param {any} encryptedData 微信登录接口返回的 加密用户信息 377 | * @param {string} iv 小程序api:wx.getShareInfo 获得 378 | */ 379 | loginWxaMobile: (code: string, encryptedData: any, iv: string) => RequestResult 380 | 381 | /** 382 | * 383 | * 用户登录 384 | * @method POST 385 | * @param {string} deviceId 登录设备ID,自定义即可 386 | * @param {string} deviceName 登录设备名称, 自定义即可 387 | * @param {string} pwd 登录密码 388 | * @param {string} username 用户名 389 | */ 390 | login_username: (data: { 391 | deviceId?: string, 392 | deviceName?: string, 393 | pwd: string, 394 | username: string, 395 | }) => RequestResult 396 | 397 | /** 398 | * 399 | * 设置用户名 400 | * @method POST 401 | * @param {string} token 登录接口返回的token 402 | * @param {string} pwd 登录密码 403 | * @param {string} username 用户名 404 | */ 405 | bindUsername: (token: string, username: string, pwd?: string) => RequestResult 406 | 407 | /** 408 | * 409 | * 用户登录 410 | * @method POST 411 | * @param {string} mobile 登录接口返回的token 412 | * @param {string} pwd 登录密码 413 | * @param {string} deviceId 设备 id 414 | * @param {string} deviceName 登录设备名称, 自定义即可 415 | */ 416 | login_mobile: (mobile: string, pwd: string, deviceId: string, deviceName?: string) => RequestResult 417 | 418 | /** 419 | * 420 | * 重设密码[手机找回密码] 421 | * @method POST 422 | * @param {string} mobile 手机号码 423 | * @param {string} pwd 登录密码 424 | * @param {string} code 短信验证码 425 | */ 426 | resetPwdUseMobileCode: (mobile: string, pwd: string, code: string) => RequestResult 427 | 428 | /** 429 | * 430 | * 重设密码[邮箱找回密码] 431 | * @method POST 432 | * @param {string} email 邮件地址 433 | * @param {string} pwd 登录密码 434 | * @param {string} code 邮件验证码 435 | */ 436 | resetPwdUseEmailCode: (email: string, pwd: string, code: string) => RequestResult 437 | 438 | /** 439 | * 440 | * 微信小程序用户详细注册 441 | * @method POST 442 | * @param {string} code 小程序登录时候获得的code临时凭证 443 | * @param {string} referrer 分享人的用户id 444 | * @param {any} encryptedData 微信登录接口返回的 加密用户信息 445 | * @param {string} iv 小程序api:wx.getShareInfo 获得 446 | * @param {string} postJsonString 用户的扩展数据,必须是 json 格式 447 | */ 448 | register_complex: (data: { 449 | code: string, 450 | encryptedData: any, 451 | iv: string, 452 | referrer?: string, 453 | postJsonString?: string 454 | }) => RequestResult 455 | 456 | /** 457 | * 458 | * 微信小程序用户快速注册 459 | * @method POST 460 | * @param {string} code 小程序登录时候获得的code临时凭证 461 | * @param {string} referrer 分享人的用户id 462 | * @param {string} postJsonString 用户的扩展数据,必须是 json 格式 463 | */ 464 | register_simple: (data: { 465 | code: string, 466 | referrer?: string, 467 | postJsonString?: string 468 | }) => RequestResult 469 | 470 | /** 471 | * 472 | * 用户注册[用户名注册] 473 | * @method POST 474 | * @param {string} pwd 密码 475 | * @param {string} username 用户名 476 | * @param {boolean} autoLogin true / false 是否在注册后自动完成登录【对于之前已注册的用户,自动完成登录】 477 | * @param {string} city 所属城市 478 | * @param {string} nick 昵称 479 | * @param {string} postJsonString 用户的扩展数据,必须是 json 格式 480 | * @param {string} province 所属省份 481 | * @param {string} referrer 邀请人的用户id 482 | */ 483 | register_username: (data: { 484 | pwd: string, 485 | username: string, 486 | autoLogin?: boolean, 487 | city?: string, 488 | nick?: string, 489 | postJsonString?: string, 490 | province?: string, 491 | referrer?: string, 492 | }) => RequestResult 493 | 494 | /** 495 | * 496 | * 用户注册[手机号] 497 | * @method POST 498 | * @param {string} code 短信验证码 499 | * @param {string} mobile 手机号码 500 | * @param {string} pwd 密码 501 | * @param {string} username 用户名 502 | * @param {boolean} autoLogin true / false 是否在注册后自动完成登录【对于之前已注册的用户,自动完成登录】 503 | * @param {string} city 所属城市 504 | * @param {string} nick 昵称 505 | * @param {string} postJsonString 用户的扩展数据,必须是 json 格式 506 | * @param {string} province 所属省份 507 | * @param {string} referrer 邀请人的用户id 508 | */ 509 | register_mobile: (data: { 510 | code: string, 511 | mobile: string, 512 | pwd: string, 513 | autoLogin?: boolean, 514 | city?: string, 515 | nick?: string, 516 | postJsonString?: string, 517 | province?: string, 518 | referrer?: string, 519 | }) => RequestResult 520 | 521 | /** 522 | * 523 | * Banner列表 524 | * @method GET 525 | * @param {string} type 类型,多个类型请用英文逗号隔开 526 | */ 527 | banners: (data: { 528 | type?: string, 529 | }) => RequestResult 530 | 531 | /** 532 | * 533 | * 商品类别 534 | * @method GET 535 | */ 536 | goodsCategory: () => RequestResult 537 | 538 | /** 539 | * 540 | * 分类详情 541 | * @method GET 542 | * @param {string} id 分类id 543 | * 544 | */ 545 | goodsCategoryDetail: (id: string) => RequestResult 546 | 547 | /** 548 | * 549 | * 商品列表 550 | * @method POST 551 | * @param {string} barCode 商品条码 552 | * @param {string} categoryId 获取指定分类下的商品 553 | * @param {string} day 格式: yyyy-MM-dd,是指配置了按天定价后查找某天还有库存的商品 554 | * @param {string} hidden 传1读取所有的隐藏商品,否则只获取不隐藏的商品 555 | * @param {string} k 搜索关键词,高度模糊匹配标题、标签、介绍 556 | * @param {string} kanjia true 为拉取支持砍价的商品 557 | * @param {string} miaosha true 为拉取支持秒杀的商品 558 | * @param {string} nameLike nameLike 559 | * @param {string} orderBy 排序规则:priceUp 价格升序,priceDown 价格倒序,ordersUp 销量升序,ordersDown 销量降序,addedUp 发布时间升序,addedDown 发布时间倒序, nameUp 商品名称升序 560 | * @param {string} page 获取第几页数据 561 | * @param {string} pageSize 每页显示多少数据 562 | * @param {string} pingtuan true 为拉取支持拼团的商品 563 | * @param {string} priceMax 金额搜索最大值 564 | * @param {string} priceMin 金额搜索最小值 565 | * @param {string} recommendStatus 推荐状态:不传该参数获取所有商品;0为一般商品;1为推荐商品 566 | * @param {string} shopId 获取指定店铺的商品数据,不传获取全部商品;0获取未归类店铺商品;其他数字为指定的店铺编号下的商品 567 | * @param {string} status -1 全部状态 0 上架 1 下架 568 | * @param {string} tagsLike 商品标签搜索 569 | */ 570 | goods: (data: { 571 | barCode?: string, 572 | categoryId?: string, 573 | day?: string, 574 | hidden?: number, 575 | k?: string, 576 | kanjia?: boolean, 577 | miaosha?: boolean, 578 | nameLike?: string, 579 | orderBy?: 'priceUp' | 'priceDown' | 'ordersUp' | 'ordersDown' | 'addedUp' | 'addedDown' | 'nameUp', 580 | pingtuan?: boolean, 581 | priceMax?: number, 582 | priceMin?: number, 583 | recommendStatus?: 0 | 1, 584 | shopId?: string, 585 | status?: -1 | 0 | 1, 586 | tagsLike?: string, 587 | } & Pagination) => RequestResult 588 | 589 | /** 590 | * 591 | * 商品详情 592 | * @method GET 593 | * @param {string} id 商品id 594 | * 595 | */ 596 | goodsDetail: (id: string) => RequestResult 597 | 598 | /** 599 | * 600 | * 读取商品的限购设置列表 601 | * @method GET 602 | * @param {string} goodsId 商品id 603 | * @param {string} priceId 规格尺寸记录信息的ID 604 | * 605 | */ 606 | goodsLimitations: (goodsId: string, priceId?: string) => RequestResult 607 | 608 | /** 609 | * 610 | * 获取商品价格 611 | * @method POST 612 | * @param {string} goodsId 商品id 613 | * @param {string} propertyChildIds 选择的规格尺寸信息:如:4:15,2:10,1:4 。多个规格请用英文的逗号分割,4:15 中的 4 获取代表颜色,15 或许代表 土豪金 614 | * 615 | */ 616 | goodsPrice: (goodsId: string, propertyChildIds: string) => RequestResult 617 | 618 | /** 619 | * 620 | * 读取商品的按天定价数据列表 621 | * @method GET 622 | * @param {string} goodsId 商品id 623 | * @param {string} priceId 规格尺寸记录信息的ID 624 | * 625 | */ 626 | goodsPriceDaily: (goodsId: string, priceId?: string) => RequestResult 627 | 628 | /** 629 | * 630 | * 获取物流费用 631 | * @method GET 632 | * @param {string} templateId 运费模板编号,可通过商品列表、商品详情接口获取 633 | * @param {number} type 快递方式:0 快递 1 EMS 2 平邮 634 | * @param {string} cityId 用户城市编号 635 | * @param {string} districtId 用户区县编号 636 | * @param {string} provinceId 用户省份编号 637 | * 638 | */ 639 | goodsPriceFreight: (data: { 640 | templateId?: string, 641 | type?: number, 642 | cityId?: string, 643 | districtId?: string, 644 | provinceId?: string, 645 | }) => RequestResult 646 | 647 | /** 648 | * 649 | * 获取商品的会员折扣 650 | * @method GET 651 | * @param {string} goodsId 商品id 652 | * @param {string} token 登录接口返回的token 653 | * 654 | */ 655 | goodsRebate: (token: string, goodsId: string) => RequestResult 656 | 657 | /** 658 | * 659 | * 获取商品评价列表 660 | * @method POST 661 | * @param {string} goodsId 商品id 662 | * @param {string} page 获取第几页数据 663 | * @param {string} pageSize 每页显示多少数据 664 | * 665 | */ 666 | goodsReputation: (data: { 667 | goodsId: string, 668 | } & Pagination) => RequestResult 669 | 670 | /** 671 | * 672 | * 商品收藏列表 673 | * @method POST 674 | * @param {string} nameLike 商品标题模糊搜索关键词 675 | * @param {string} page 获取第几页数据 676 | * @param {string} pageSize 每页显示多少数据 677 | * @param {string} token 登录接口返回的token 678 | * 679 | */ 680 | goodsFavList: (data: { 681 | nameLike: string, 682 | } & Pagination & Token) => RequestResult 683 | 684 | /** 685 | * 686 | * 获取购买过的商品列表 687 | * @method POST 688 | * @param {string} page 获取第几页数据 689 | * @param {string} pageSize 每页显示多少数据 690 | * @param {string} token 登录接口返回的token 691 | * 692 | */ 693 | myBuyGoodsHis: (data: Pagination & Token) => RequestResult 694 | 695 | /** 696 | * 697 | * 删除商品历史购买记录 698 | * @method POST 699 | * @param {string} goodsId 商品id,2个参数任意传一个就行 700 | * @param {string} id 记录id 2个参数任意传一个就行 701 | * @param {string} token 登录接口返回的token 702 | * 703 | */ 704 | myBuyGoodsHisDelete: (token: string, id?: string, goodsId?: string) => RequestResult 705 | 706 | /** 707 | * 708 | * 添加商品收藏 709 | * @method POST 710 | * @param {string} goodsId 商品id 711 | * @param {string} token 登录接口返回的token 712 | * 713 | */ 714 | goodsFavPut: (token: string, goodsId: string) => RequestResult 715 | 716 | /** 717 | * 718 | * 检测是否已收藏 719 | * @method GET 720 | * @param {string} goodsId 商品id 721 | * @param {string} token 登录接口返回的token 722 | * 723 | */ 724 | goodsFavCheck: (token: string, goodsId) => RequestResult 725 | 726 | /** 727 | * 728 | * 删除商品收藏 729 | * @method POST 730 | * @param {string} goodsId 商品id,2个参数任意传一个就行 731 | * @param {string} id 记录id 2个参数任意传一个就行 732 | * @param {string} token 登录接口返回的token 733 | * 734 | */ 735 | goodsFavDelete: (token: string, id?: string, goodsId?: string) => RequestResult 736 | 737 | /** 738 | * 739 | * 获取可领取优惠券列表 740 | * @method GET 741 | * @param {string} refId 优惠券使用对象 742 | * @param {string} type 优惠券类型 743 | * @param {string} token 登录接口返回的token 744 | * 745 | */ 746 | coupons: (data: { 747 | refId?: string, 748 | type?: string, 749 | token?: string, 750 | }) => RequestResult 751 | 752 | /** 753 | * 754 | * 优惠券规格详情 755 | * @method GET 756 | * @param {string} id 优惠券规则id 757 | * 758 | */ 759 | couponDetail: (id: string) => RequestResult 760 | 761 | /** 762 | * 763 | * 我的优惠券 764 | * @method GET 765 | * @param {string} consumAmount 当前消费金额,传了该参数,将拉取满足使用条件的优惠券 766 | * @param {string} status 优惠券状态:0 正常 1 失效 2 过期已结束 3 已使用;同时多种状态,请用英文逗号隔开即可 767 | * @param {string} token 登录接口返回的token 768 | * 769 | */ 770 | myCoupons: (data: { 771 | consumAmount?: string, 772 | status?: string, 773 | token: string, 774 | }) => RequestResult 775 | 776 | 777 | /** 778 | * 779 | * 获取优惠券合并规则 780 | * @method GET 781 | * 782 | */ 783 | mergeCouponsRules: () => RequestResult 784 | 785 | /** 786 | * 787 | * 优惠券合并 788 | * @method POST 789 | * @param {string} couponIds 用来合并的优惠券ID,多张用英文逗号分隔 790 | * @param {string} mergeId 合并规则id 791 | * @param {string} token 登录接口返回的token 792 | * 793 | */ 794 | mergeCoupons: (data: { 795 | couponIds: string, 796 | mergeId: string, 797 | token?: string, 798 | }) => RequestResult 799 | 800 | 801 | /** 802 | * 803 | * 领取优惠券 804 | * @method POST 805 | * @param {string} detect 如果传了该参数,并且是 true ,则不获取优惠券,而是检测当前用户是否可以获取 806 | * @param {string} id 优惠券ID 807 | * @param {string} pwd 优惠券口令 808 | * @param {string} token 登录接口返回的token 809 | * 810 | */ 811 | fetchCoupons: (data: { 812 | detect: string, 813 | id: string, 814 | pwd?: string, 815 | token: string, 816 | }) => RequestResult 817 | 818 | 819 | /** 820 | * 821 | * 赠送优惠券 822 | * @method POST 823 | * @param {string} mobile 受赠人手机号码 824 | * @param {string} id 优惠券ID 825 | * @param {string} uid 受赠人用户ID 826 | * @param {string} token 登录接口返回的token 827 | * 828 | */ 829 | sendCoupons: (data: { 830 | mobile?: string, 831 | id?: string, 832 | uid?: string, 833 | token?: string, 834 | }) => RequestResult 835 | 836 | /** 837 | * 838 | * 使用优惠券/红包的动态口令兑换优惠券 839 | * @method POST 840 | * @param {string} number 号码 841 | * @param {string} pwd 密码 842 | * @param {string} extJsonStr 扩展数据JSON 843 | * @param {string} token 登录接口返回的token 844 | * 845 | */ 846 | exchangeCoupons: (token: string, number: string, pwd: string, extJsonStr?: string) => RequestResult 847 | 848 | /** 849 | * 850 | * 获取公告列表 851 | * @method POST 852 | * @param {number} page 获取第几页数据 853 | * @param {number} pageSize 每页显示多少数据 854 | * @param {string} token 登录接口返回的token 855 | * @param {string} type 公告自定义类型 856 | * 857 | */ 858 | noticeList: (data: { 859 | type?: string, 860 | } & Pagination) => RequestResult 861 | 862 | 863 | /** 864 | * 865 | * 获取公告列表 866 | * @method GET 867 | * @param {string} type 公告自定义类型 868 | * 869 | */ 870 | noticeLastOne: (type?: string) => RequestResult 871 | 872 | /** 873 | * 874 | * 获取公告详情 875 | * @method GET 876 | * @param {string} id 公告id 877 | * 878 | */ 879 | noticeDetail: (id: string) => RequestResult 880 | 881 | /** 882 | * 883 | * 添加收货地址 884 | * @method POST 885 | * @param {string} address 详细地址 886 | * @param {string} cityId 所属城市编码 887 | * @param {string} linkMan 联系人 888 | * @param {string} mobile 手机号码 889 | * @param {string} provinceId 所属省份编码 890 | * @param {string} code 邮编 891 | * @param {string} districtId 所属区县编码 892 | * @param {string} extJsonStr 扩展属性信息,JSON格式 893 | * @param {string} idcard 身份证号码,国际件使用 894 | * @param {boolean} isDefault 是否设置为默认收货地址,true 为设置;false 或者不传该参数为 不设置 895 | * @param {string} latitude 坐标 纬度 896 | * @param {string} longitude 坐标 经度 897 | * @param {string} status 状态:0 为正常 1 为停用 898 | * @param {string} token 登录接口返回的token 899 | * 900 | */ 901 | addAddress: (data: { 902 | address: string, 903 | cityId: string, 904 | linkMan: string, 905 | mobile: string, 906 | provinceId: string, 907 | code?: string, 908 | districtId?: string, 909 | extJsonStr?: string, 910 | idcard?: string, 911 | isDefault?: boolean, 912 | latitude?: string, 913 | longitude?: string, 914 | status?: 0 | 1, 915 | token: string, 916 | }) => RequestResult 917 | 918 | /** 919 | * 920 | * 修改收货地址 921 | * @method POST 922 | * @param {string} address 详细地址 923 | * @param {string} cityId 所属城市编码 924 | * @param {string} linkMan 联系人 925 | * @param {string} mobile 手机号码 926 | * @param {string} provinceId 所属省份编码 927 | * @param {string} code 邮编 928 | * @param {string} districtId 所属区县编码 929 | * @param {string} extJsonStr 扩展属性信息,JSON格式 930 | * @param {string} idcard 身份证号码,国际件使用 931 | * @param {boolean} isDefault 是否设置为默认收货地址,true 为设置;false 或者不传该参数为 不设置 932 | * @param {string} latitude 坐标 纬度 933 | * @param {string} longitude 坐标 经度 934 | * @param {string} status 状态:0 为正常 1 为停用 935 | * @param {string} token 登录接口返回的token 936 | * 937 | */ 938 | updateAddress: (...args: Parameters) => RequestResult 939 | 940 | /** 941 | * 942 | * 删除收货地址 943 | * @method POST 944 | * @param {string} id 地址id 945 | * @param {string} token 登录接口返回的token 946 | * 947 | */ 948 | deleteAddress: (token: string, id: string) => RequestResult 949 | 950 | /** 951 | * 952 | * 获取所有的收货地址 953 | * @method GET 954 | * @param {string} token 登录接口返回的token 955 | * 956 | */ 957 | queryAddress: (token: string) => RequestResult 958 | 959 | /** 960 | * 961 | * 获取默认收货地址 962 | * @method GET 963 | * @param {string} token 登录接口返回的token 964 | * 965 | */ 966 | defaultAddress: (token: string) => RequestResult 967 | 968 | /** 969 | * 970 | * 收货地址详情 971 | * @method GET 972 | * @param {string} id 地址 id 973 | * @param {string} token 登录接口返回的token 974 | * 975 | */ 976 | addressDetail: (token: string, id: string) => RequestResult 977 | 978 | /** 979 | * 980 | * 获取拼团设置 981 | * @method GET 982 | * @param {string} goodsId 商品id 983 | * 984 | */ 985 | pingtuanSet: (goodsId: string) => RequestResult 986 | 987 | /** 988 | * 989 | * 获取拼团设置(批量接口) 990 | * @method GET 991 | * @param {Array} goodsIdArray 商品id 992 | * 993 | */ 994 | pingtuanSets: (goodsIdArray: string[]) => RequestResult 995 | 996 | /** 997 | * 998 | * 开团接口 999 | * @method POST 1000 | * @param {string} goodsId 商品id 1001 | * @param {string} token 登录接口返回的token 1002 | * 1003 | */ 1004 | pingtuanOpen: (token: string, goodsId: string) => RequestResult 1005 | 1006 | /** 1007 | * 1008 | * 获取所有进行中的团购 1009 | * @method POST 1010 | * @param {string} goodsId 商品id 1011 | * @param {string} status 拼团状态 1012 | * @param {number} page 获取第几页数据 1013 | * @param {number} pageSize 每页显示多少数据 1014 | * 1015 | */ 1016 | pingtuanList: (data: { 1017 | goodsId: string 1018 | status: number, 1019 | } & Pagination) => RequestResult 1020 | 1021 | /** 1022 | * 1023 | * 查看某团的所有参与用户 1024 | * @method GET 1025 | * @param {string} tuanId 团号,请注意不是拼团id,是每个人开团后的团号 1026 | * 1027 | */ 1028 | pingtuanJoinUsers: (tuanId: string) => RequestResult 1029 | 1030 | /** 1031 | * 1032 | * 我的拼团记录 1033 | * @method POST 1034 | * @param {string} goodsId 商品id 1035 | * @param {string} orderId 订单id 1036 | * @param {number} page 获取第几页数据 1037 | * @param {number} pageSize 每页显示多少数据 1038 | * @param {string} pingtuanId 拼团id 1039 | * @param {string} tuanId 团号,请注意不是拼团id,是每个人开团后的团号 1040 | * 1041 | */ 1042 | pingtuanMyJoined: (data: { 1043 | goodsId?: string, 1044 | orderId?: string, 1045 | pingtuanId?: string, 1046 | tuanId?: string, 1047 | } & Pagination) => RequestResult 1048 | 1049 | /** 1050 | * 1051 | * 友情链接列表 1052 | * @method POST 1053 | * @param {string} type 类型 1054 | * 1055 | */ 1056 | friendlyPartnerList: (type?: string) => RequestResult 1057 | 1058 | /** 1059 | * 1060 | * 获取我的好友列表 1061 | * @method POST 1062 | * @param {string} dateAddBegin 起始时间筛选,2017-11-22 1063 | * @param {string} dateAddEnd 截止时间筛选,2017-11-22 1064 | * @param {number} page 获取第几页数据 1065 | * @param {number} pageSize 每页显示多少数据 1066 | * @param {number} token 登录接口返回的token 1067 | * @param {number} uids 好友用户编号 1068 | */ 1069 | friendList: (data: { 1070 | uids?: string, 1071 | } & DateQuery & Pagination & Token) => RequestResult 1072 | 1073 | /** 1074 | * 1075 | * 添加某人为好友 1076 | * @method POST 1077 | * @param {string} token 登录接口返回的token 1078 | * @param {string} uids 好友用户编号 1079 | */ 1080 | addFriend: (token: string, uid: string) => RequestResult 1081 | 1082 | /** 1083 | * 1084 | * 查看好友用户详情 1085 | * @method GET 1086 | * @param {string} token 登录接口返回的token 1087 | * @param {string} uids 好友用户编号 1088 | */ 1089 | friendUserDetail: (token: string, uid: string) => RequestResult 1090 | 1091 | /** 1092 | * 1093 | * 获取视频素材详情 1094 | * @method GET 1095 | * @param {string} videoId 视频编号 1096 | */ 1097 | videoDetail: (videoId: string) => RequestResult 1098 | 1099 | /** 1100 | * 1101 | * 小程序绑定手机号码 1102 | * @method POST 1103 | * @param {string} pwd 设置登录密码 1104 | * @param {any} encryptedData 微信登录接口返回的 加密用户信息 1105 | * @param {string} iv 小程序api:wx.getShareInfo 获得 1106 | * @param {string} token 登录接口返回的token 1107 | */ 1108 | bindMobileWxa: (token: string, encryptedData: string, iv: string, pwd?: string) => RequestResult 1109 | 1110 | bindMobileSms: (token: string, mobile: string, code: string, pwd?: string) => RequestResult 1111 | 1112 | userDetail: (token: string) => RequestResult 1113 | 1114 | userWxinfo: (token: string) => RequestResult 1115 | 1116 | userAmount: (token: string) => RequestResult 1117 | 1118 | /** 1119 | * 1120 | * 创建订单[下单] 1121 | * @method POST 1122 | * @param {string} goodsJsonStr 购买的商品、规格尺寸、数量信息的数组,如:[{"goodsId":11,"number":2,"propertyChildIds":"","logisticsType":0, "days": ["2019-07-26", "2019-07-27"]}, {"goodsId":8,"number":3,"propertyChildIds":"2:9","logisticsType":0, "inviter_id":邀请用户ID, "days": ["2019-07-26", "2019-07-27"]}] 1123 | * @param {string} address 收货地址详细地址 1124 | * @param {boolean} autoDeliver 是否自动发货,true 启用,需要开通自动发货插件后方可使用 1125 | * @param {boolean} calculate true 不实际下单,而是返回价格计算 1126 | * @param {string} cityId 收货地址城市编码 1127 | * @param {string} code 收货地址邮政编码 1128 | * @param {string} couponId 使用的优惠券编号,多张优惠券请用英文的逗号分隔 1129 | * @param {string} dadaLat 达达收货地址的纬度 1130 | * @param {string} dadaLng 达达收货地址的经度 1131 | * @param {string} dadaShopNo 达达商户ID 1132 | * @param {string} deductionScore 用多少积分来抵扣本次交易,请配合后台积分抵扣规则使用 1133 | * @param {string} districtId 收货地址区县编码 1134 | * @param {string} expireMinutes expireMinutes 1135 | * @param {number} integer (int32) 1136 | * @param {string} extJsonStr 订单扩展属性信息,JSON格式 1137 | * @param {string} idcard 身份证号码【国际件使用】 1138 | * @param {boolean} isCanHx 是否支持核销,true 支持,默认不支持 1139 | * @param {string} kjid 砍价编号,可直接购买砍价商品 1140 | * @param {string} linkMan 收货地址联系人信息 1141 | * @param {string} mobile 收货地址联系人手机号码 1142 | * @param {string} orderPeriod 周期订单参数: {"unit":1,"duration":1,"dateStart":"2020-05-05 11:47:19"}, unit: 0 天 1 月 2 年 1143 | * @param {number} payOnDelivery 1 为货到付款,其他数字为先支付 1144 | * @param {string} peisongType 配送类型,kd 代表快递;zq代表到店自取; keloop 快跑者 1145 | * @param {string} pingtuanOpenId 拼团购买的团号 1146 | * @param {string} provinceId 收货地址省份编码 1147 | * @param {string} remark 下单备注信息 1148 | * @param {string} shopIdZt 自提门店id 1149 | * @param {string} shopNameZt 自提门店名称 1150 | * @param {string} token 登录接口返回的token 1151 | * @param {string} trips 小费金额,用户可自行输入小费金额 1152 | */ 1153 | orderCreate: (data: { 1154 | goodsJsonStr: string, 1155 | address?: string, 1156 | autoDeliver?: boolean, 1157 | calculate?: string, 1158 | cityId?: string, 1159 | code?: string, 1160 | couponId?: string, 1161 | dadaLat?: string, 1162 | dadaLng?: string, 1163 | dadaShopNo?: string, 1164 | deductionScore?: string, 1165 | districtId?: string, 1166 | expireMinutes?: string, 1167 | integer?: number, 1168 | extJsonStr?: string, 1169 | idcard?: string, 1170 | isCanHx?: boolean, 1171 | kjid?: string, 1172 | linkMan?: string, 1173 | mobile?: string, 1174 | orderPeriod?: string, 1175 | payOnDelivery?: number, 1176 | peisongType?: 'kd' | 'zq' | 'keloop', 1177 | pingtuanOpenId?: string, 1178 | provinceId?: string, 1179 | remark?: string, 1180 | shopIdZt?: string, 1181 | shopNameZt?: string, 1182 | token?: string, 1183 | trips?: string, 1184 | }) => RequestResult 1185 | 1186 | /** 1187 | * 1188 | * 订单列表 1189 | * @method POST 1190 | * @param {number} goodReputation 评价状态:0 差评 1 中评 2 好评 1191 | * @param {boolean} hasRefund true / false ,读取是否有退款的订单 1192 | * @param {string} orderNumber 订单编号,如:OD1703281618955938 1193 | * @param {string} shopId 所属门店ID,用于查询该门店下的订单 1194 | * @param {number} status 订单状态,-1 已关闭 0 待支付 1 已支付待发货 2 已发货待确认 3 确认收货待评价 4 已评价 1195 | * @param {number} statusBatch 状态之间用逗号隔开,-1 已关闭 0 待支付 1 已支付待发货 2 已发货待确认 3 确认收货待评价 4 已评价 1196 | * @param {string} token 登录接口返回的token 1197 | */ 1198 | orderList: (data: { 1199 | goodReputation?: 0 | 1 | 2, 1200 | hasRefund?: boolean, 1201 | orderNumber?: string, 1202 | shopId?: string, 1203 | status?: number, 1204 | statusBatch?: number, 1205 | } & Pagination & Token) => RequestResult 1206 | 1207 | 1208 | orderDetail: (token: string, id: string, hxNumber?: string) => RequestResult 1209 | 1210 | 1211 | orderDelivery: (token: string, orderId: string) => RequestResult 1212 | 1213 | /** 1214 | * 1215 | * 评价接口 1216 | * @method POST 1217 | * @param {string} postJsonString 格式: {token:"登录接口获取的登录凭证",orderId:"数字订单号,订单接口的id,不是 orderNumber",reputations:[{id:"订单归属的商品列表数据的id字段",reputation:"0 差评 1 中评 2 好评",remark:"评价备注,限200字符", pics: ["1.jpg", "2.jpg"]},{id:"订单归属的商品列表数据的id字段",reputation:"0 差评 1 中评 2 好评",remark:"评价备注,限200字符", pics: ["1.jpg", "2.jpg"]}]} 1218 | */ 1219 | orderReputation: (data: { 1220 | postJsonString: string, 1221 | }) => RequestResult 1222 | 1223 | 1224 | orderClose: (token: string, orderId: string) => RequestResult 1225 | 1226 | orderDelete: (token: string, orderId: string) => RequestResult 1227 | 1228 | orderPay: (token: string, orderId: string) => RequestResult 1229 | 1230 | orderHX: (hxNumber: string) => RequestResult 1231 | 1232 | orderStatistics: (token: string) => RequestResult 1233 | 1234 | orderRefunds: (token: string, orderId: string) => RequestResult 1235 | 1236 | withDrawApply: (token: string, money: string | number) => RequestResult 1237 | 1238 | withDrawDetail: (token: string, id: string) => RequestResult 1239 | 1240 | withDrawLogs: (data: Pagination & Token) => RequestResult 1241 | 1242 | province: () => RequestResult 1243 | 1244 | nextRegion: (pid: string) => RequestResult 1245 | 1246 | /** 1247 | * 1248 | * 用户资金流水 1249 | * @method POST 1250 | * @param {string} postJsonString 格式: {token:"登录接口获取的登录凭证",orderId:"数字订单号,订单接口的id,不是 orderNumber",reputations:[{id:"订单归属的商品列表数据的id字段",reputation:"0 差评 1 中评 2 好评",remark:"评价备注,限200字符", pics: ["1.jpg", "2.jpg"]},{id:"订单归属的商品列表数据的id字段",reputation:"0 差评 1 中评 2 好评",remark:"评价备注,限200字符", pics: ["1.jpg", "2.jpg"]}]} 1251 | * @param {number} behavior 0 收入; 1 支出 1252 | * @param {string} dateAddBegin 支付时间起,格式 2018-05-16 1253 | * @param {string} dateAddEnd 支付时间起,格式 2018-05-16 1254 | * @param {string} orderId 业务订单号 1255 | * @param {string} page 获取第几页数据 1256 | * @param {string} pageSize 每页显示多少数据 1257 | * @param {string} token 登录接口返回的token 1258 | * @param {number} type 交易类型 0 充值 11 提现申请 12 提现失败 1 提现成功 2 支付订单 3 退款 4支付预约报名费 5 知识付费 6分销返佣 7 分享商品奖励; 8 优惠买单; 100 押金;101 押金退还; 110 购买会员; 120 货款收入; 130 分润收入; 140 积分兑换 1259 | * @param {string} types 交易类型,同时获取多种类型请用英文逗号分隔 1260 | * 1261 | */ 1262 | cashLogs: (data: { 1263 | postJsonString?: string 1264 | behavior?: number 1265 | orderId?: string 1266 | type?: number 1267 | types?: string 1268 | } & DateQuery & Pagination & Token) => RequestResult 1269 | 1270 | /** 1271 | * 1272 | * 用户资金流水 1273 | * @method POST 1274 | * @param {string} postJsonString 格式: {token:"登录接口获取的登录凭证",orderId:"数字订单号,订单接口的id,不是 orderNumber",reputations:[{id:"订单归属的商品列表数据的id字段",reputation:"0 差评 1 中评 2 好评",remark:"评价备注,限200字符", pics: ["1.jpg", "2.jpg"]},{id:"订单归属的商品列表数据的id字段",reputation:"0 差评 1 中评 2 好评",remark:"评价备注,限200字符", pics: ["1.jpg", "2.jpg"]}]} 1275 | * @param {number} behavior 0 收入; 1 支出 1276 | * @param {string} dateAddBegin 支付时间起,格式 2018-05-16 1277 | * @param {string} dateAddEnd 支付时间起,格式 2018-05-16 1278 | * @param {string} orderId 业务订单号 1279 | * @param {string} page 获取第几页数据 1280 | * @param {string} pageSize 每页显示多少数据 1281 | * @param {string} token 登录接口返回的token 1282 | * @param {number} type 交易类型 0 充值 11 提现申请 12 提现失败 1 提现成功 2 支付订单 3 退款 4支付预约报名费 5 知识付费 6分销返佣 7 分享商品奖励; 8 优惠买单; 100 押金;101 押金退还; 110 购买会员; 120 货款收入; 130 分润收入; 140 积分兑换 1283 | * @param {string} types 交易类型,同时获取多种类型请用英文逗号分隔 1284 | * 1285 | */ 1286 | cashLogsV2: (data: { 1287 | postJsonString?: string 1288 | behavior?: number 1289 | orderId?: string 1290 | type?: number 1291 | types?: string 1292 | } & DateQuery & Pagination & Token) => RequestResult 1293 | 1294 | payLogs: (data: Pagination & Token) => RequestResult 1295 | 1296 | rechargeSendRules: () => RequestResult 1297 | 1298 | payBillDiscounts: () => RequestResult 1299 | 1300 | payBill: (token: string, money: number | string) => RequestResult 1301 | 1302 | vipLevel: () => RequestResult 1303 | 1304 | fxApply: (token: string, name: string, mobile: string) => RequestResult 1305 | 1306 | fxApplyProgress: (token: string) => RequestResult 1307 | 1308 | /** 1309 | * 1310 | * 团队管理 1311 | * @method POST 1312 | * @param {string} dateAddBegin 支付时间起,格式 2018-05-16 1313 | * @param {string} dateAddEnd 支付时间起,格式 2018-05-16 1314 | * @param {number} level 直接发展为1,间接发展为2 1315 | * @param {string} page 获取第几页数据 1316 | * @param {string} pageSize 每页显示多少数据 1317 | * @param {string} token登录接口返回的token 1318 | * @param {number} uids 团队成员用户id 1319 | * 1320 | */ 1321 | fxMembers: (data: { 1322 | level?: 1 | 2, 1323 | uids?: string, 1324 | } & DateQuery & Pagination & Token) => RequestResult 1325 | 1326 | /** 1327 | * 1328 | * 佣金明细 1329 | * @method POST 1330 | * @param {string} dateAddBegin 支付时间起,格式 2018-05-16 1331 | * @param {string} dateAddEnd 支付时间起,格式 2018-05-16 1332 | * @param {boolean} isSettlement true / false 是否结算 1333 | * @param {number} level 分销级别,1,2,3 1334 | * @param {number} unit 0 现金返佣 1 积分返佣 1335 | * @param {string} page 获取第几页数据 1336 | * @param {string} pageSize 每页显示多少数据 1337 | * @param {string} token登录接口返回的token 1338 | * @param {number} uids 团队成员用户id 1339 | * 1340 | */ 1341 | fxCommisionLog: (data: { 1342 | isSettlement?: boolean, 1343 | level?: number, 1344 | unit?: 0 | 1, 1345 | uids?: string, 1346 | } & DateQuery & Pagination & Token) => RequestResult 1347 | 1348 | /** 1349 | * 1350 | * 无限生成小程序码 1351 | * @method POST 1352 | * @param {string} scene 小程序码参数,具体详见小程序文档 1353 | * @param {boolean} autoColor 自动配置线条颜色,默认 false 1354 | * @param {string} expireHours 多少小时后自动删除该图片,不传该参数则不删除 1355 | * @param {boolean} is_hyaline 是否需要透明底色,为 true 时,生成透明底色的小程序,默认 false 1356 | * @param {string} page 例如 "pages/index/index" ,根路径前不要填加'/',不能携带参数(参数请放在scene字段里),如果不填写这个字段,默认跳主页面 1357 | * @param {string} postJsonString 线条颜色,auto_color 为 false 时生效,使用 rgb 设置颜色 例如 {"r":"xxx","g":"xxx","b":"xxx"} 1358 | * @param {string} width 二维码的宽度,默认430 1359 | * 1360 | */ 1361 | wxaQrcode: (data: { 1362 | scene: string, 1363 | autoColor?: boolean, 1364 | expireHours?: string, 1365 | is_hyaline?: boolean, 1366 | page?: string, 1367 | postJsonString?: string, 1368 | width?: string, 1369 | }) => RequestResult 1370 | 1371 | uploadFile: (token: string, tempFilePath: string, expireHours?: string) => RequestResult 1372 | 1373 | uploadFileFromUrl: (remoteFileUrl?: string, ext?: string) => RequestResult 1374 | 1375 | uploadFileList: (path?: string) => RequestResult 1376 | 1377 | /** 1378 | * 1379 | * 无限生成小程序码 1380 | * @method POST 1381 | * @param {number} amount 退款、退货填写金额;换货请传0 1382 | * @param {number} logisticsStatus 0 未收到货 1 已收到货 1383 | * @param {string} orderId 订单ID 1384 | * @param {string} reason 退换货原因 1385 | * @param {number} type 0 仅退款 1 退款退货 2 换货 1386 | * @param {string} pic 可提交多张截图的图片地址 1387 | * @param {string} remark 退换货描述 1388 | * 1389 | */ 1390 | refundApply: (data: { 1391 | amount: number, 1392 | logisticsStatus: 0 | 1, 1393 | orderId: string, 1394 | reason: string, 1395 | type: 0 | 1 | 2, 1396 | pic?: string, 1397 | remark?: string, 1398 | }) => RequestResult 1399 | 1400 | refundApplyDetail: (token: string, orderId: string) => RequestResult 1401 | 1402 | refundApplyCancel: (token: string, orderId: string) => RequestResult 1403 | 1404 | cmsCategories: () => RequestResult 1405 | 1406 | cmsCategoryDetail: (id: string) => RequestResult 1407 | 1408 | cmsArticles: (data: { 1409 | categoryId?: string, 1410 | dateUpdateBegin?: string, 1411 | dateUpdateEnd?: string, 1412 | id?: string, 1413 | isRecommend?: boolean, 1414 | keywordsLike?: string, 1415 | orderBy?: string, 1416 | tagsLike?: string, 1417 | titleLike?: string, 1418 | token?: string, 1419 | } & Pagination & DateQuery) => RequestResult 1420 | 1421 | cmsArticleUsefulLogs: (data: { 1422 | id: string, 1423 | } & Pagination) => RequestResult 1424 | 1425 | cmsArticleDetail: (id: string) => RequestResult 1426 | cmsArticlePreNext: (id: string) => RequestResult 1427 | 1428 | cmsArticleCreate: (data: { 1429 | categoryId?: string, 1430 | content?: string, 1431 | descript?: string, 1432 | title?: string, 1433 | author?: string, 1434 | id?: string, 1435 | income?: string, 1436 | keywords?: string, 1437 | paixu?: string, 1438 | pic?: string, 1439 | postJsonString?: string, 1440 | tags?: string, 1441 | token?: string, 1442 | }) => RequestResult 1443 | 1444 | cmsArticleDelete: (token: string, id: string) => RequestResult 1445 | 1446 | cmsArticleUseless: (data: { 1447 | id: string, 1448 | isCheck?: boolean, 1449 | isUseful?: boolean 1450 | token?: string, 1451 | }) => RequestResult 1452 | 1453 | cmsPage: (key: string) => RequestResult 1454 | 1455 | cmsTags: () => RequestResult 1456 | 1457 | invoiceList: (data: { 1458 | token?: string, 1459 | } & Pagination) => RequestResult 1460 | 1461 | invoiceApply: (data: { 1462 | amount?: number, 1463 | comName?: string, 1464 | consumption?: string, 1465 | extJsonStr?: string, 1466 | orderId?: string, 1467 | remark?: string, 1468 | tfn?: string, 1469 | }) => RequestResult 1470 | 1471 | invoiceDetail: (token: string, id: string) => RequestResult 1472 | 1473 | depositList: (data: { 1474 | status?: 0 | 1 | 2 1475 | } & Pagination & Token) => RequestResult 1476 | 1477 | payDeposit: (data: { 1478 | amount: number, 1479 | extJsonStr?: string, 1480 | refCode?: string, 1481 | remark?: string, 1482 | } & Token) => RequestResult 1483 | 1484 | depositInfo: (token: string, id: string) => RequestResult 1485 | 1486 | depositBackApply: (token: string, id: string) => RequestResult 1487 | 1488 | fetchShops: (data: { 1489 | cityId?: string, 1490 | curlatitude?: string, 1491 | curlongitude?: string, 1492 | nameLike?: string, 1493 | districtId?: string, 1494 | provinceId?: string, 1495 | type?: string, 1496 | } & Pagination) => RequestResult 1497 | 1498 | fetchMyShops: (token: string) => RequestResult 1499 | 1500 | shopSubdetail: (id: string) => RequestResult 1501 | 1502 | shopSubApply: (data: { 1503 | address: string, 1504 | cityId: string, 1505 | districtId: string, 1506 | latitude: string, 1507 | longitude: string, 1508 | name: string, 1509 | provinceId: string, 1510 | status: string, 1511 | activity?: string, 1512 | characteristic?: string, 1513 | expressType?: string, 1514 | extJsonStr?: string, 1515 | introduce?: string, 1516 | linkPhone?: string, 1517 | number?: string, 1518 | paixu?: string, 1519 | pic?: string, 1520 | token?: string, 1521 | type?: string, 1522 | }) => RequestResult 1523 | 1524 | addComment: (data: { 1525 | content?: string, 1526 | extJsonStr?: string, 1527 | pid?: string, 1528 | refId?: string, 1529 | type?: string, 1530 | token?: string, 1531 | }) => RequestResult 1532 | 1533 | commentList: (data: { 1534 | isReply?: boolean, 1535 | pid?: string, 1536 | refId?: string, 1537 | type?: string, 1538 | st?: string, 1539 | status?: 0 | 1 | 2, 1540 | uid?: string, 1541 | token?: string, 1542 | } & Pagination) => RequestResult 1543 | 1544 | modifyUserInfo: (data: { 1545 | avatarUrl?: string, 1546 | city?: string, 1547 | nick?: string, 1548 | birthday?: string, 1549 | extJsonStr?: string, 1550 | gender?: string, 1551 | token: string, 1552 | }) => RequestResult 1553 | 1554 | modifyUserPassword: (token: string, pwdOld: string, pwdNew: string) => RequestResult 1555 | 1556 | uniqueId: (type?: string) => RequestResult 1557 | 1558 | queryBarcode: (barcode?: string) => RequestResult 1559 | 1560 | luckyInfo: (id: string) => RequestResult 1561 | 1562 | luckyInfoJoin: (id: string, token: string) => RequestResult 1563 | 1564 | luckyInfoJoinMy: (id: string, token: string) => RequestResult 1565 | 1566 | luckyInfoJoinLogs: (data: { 1567 | lid: string, 1568 | token?: string, 1569 | } & Pagination) => RequestResult 1570 | 1571 | jsonList: (data: { 1572 | id?: string, 1573 | refId?: string, 1574 | type?: string, 1575 | } & Pagination) => RequestResult 1576 | 1577 | jsonSet: (data: { 1578 | content: string, 1579 | id?: string, 1580 | refId?: string, 1581 | type?: string, 1582 | }) => RequestResult 1583 | 1584 | jsonDelete: (token: string, id: string) => RequestResult 1585 | 1586 | graphValidateCodeUrl: (key?: number | string) => RequestResult 1587 | 1588 | graphValidateCodeCheck: (code: string, key?: number | string) => RequestResult 1589 | 1590 | shortUrl: (url?: string) => RequestResult 1591 | 1592 | smsValidateCode: (mobile: string, key?: string, picCode?: string) => RequestResult 1593 | 1594 | smsValidateCodeCheck: (mobile: string, code: string) => RequestResult 1595 | 1596 | mailValidateCode: (mail: string) => RequestResult 1597 | 1598 | mailValidateCodeCheck: (mail: string, code: string) => RequestResult 1599 | 1600 | mapDistance: (lat1: string | number, lng1: string | number, lat2: string | number, lng2: string | number) => RequestResult 1601 | 1602 | mapQQAddress: (location?: string, coord_type?: string) => RequestResult 1603 | 1604 | mapQQSearch: (data: { 1605 | boundary: string, 1606 | keyword: string, 1607 | } & Pagination) => RequestResult 1608 | 1609 | virtualTraderList: (data: { 1610 | status?: 0 | 1, 1611 | } & Pagination) => RequestResult 1612 | 1613 | virtualTraderDetail: (token: string, id: string) => RequestResult 1614 | 1615 | virtualTraderBuy: (token: string, id: string) => RequestResult 1616 | 1617 | virtualTraderMyBuyLogs: (data: Pagination & Token) => RequestResult 1618 | 1619 | queuingTypes: (status?: string) => RequestResult 1620 | 1621 | queuingGet: (token: string, typeId: string, mobile?: string) => RequestResult 1622 | 1623 | queuingMy: (token: string, typeId?: string, status?: string) => RequestResult 1624 | 1625 | idcardCheck: (token: string, name: string, idCardNo: string) => RequestResult 1626 | 1627 | loginout: (token: string) => RequestResult 1628 | 1629 | userLevelList: (data: Pagination) => RequestResult 1630 | 1631 | userLevelDetail: (levelId: string) => RequestResult 1632 | 1633 | userLevelPrices: (levelId: string) => RequestResult 1634 | 1635 | userLevelBuy: (token: string, priceId: string, isAutoRenew: boolean, remark?: string) => RequestResult 1636 | 1637 | userLevelBuyLogs: (data: Pagination & Token) => RequestResult 1638 | 1639 | messageList: (data: { 1640 | isRead?: boolean, 1641 | mod?: 0 | 1, 1642 | source?: 0 | 1 | 2, 1643 | token: string, 1644 | type?: string, 1645 | } & Pagination) => RequestResult 1646 | 1647 | messageRead: (token: string, id: string) => RequestResult 1648 | 1649 | messageDelete: (token: string, id: string) => RequestResult 1650 | 1651 | bindOpenid: (token: string, code: string) => RequestResult 1652 | 1653 | encryptedData: (code: string, encryptedData: string, iv: string) => RequestResult 1654 | 1655 | scoreDeductionRules: (type?: string) => RequestResult 1656 | 1657 | voteItems: (data: { 1658 | status?: 0 | 1, 1659 | } & Pagination) => RequestResult 1660 | 1661 | voteItemDetail: (id: string) => RequestResult 1662 | 1663 | vote: (token: string, voteId: string, items: string[], remark: string) => RequestResult 1664 | 1665 | myVote: (token: string, voteId: string) => RequestResult 1666 | 1667 | voteLogs: (data: { 1668 | voteId: string, 1669 | } & Pagination & Token) => RequestResult 1670 | 1671 | yuyueItems: (data: { 1672 | status?: 0 | 2, 1673 | } & Pagination & Token) => RequestResult 1674 | 1675 | yuyueItemDetail: (id: string) => RequestResult 1676 | 1677 | yuyueJoin: (data: { 1678 | yuyueId: string, 1679 | extJsonStr?: string, 1680 | remark?: string, 1681 | teamId?: string, 1682 | teamName?: string, 1683 | } & Token) => RequestResult 1684 | 1685 | yuyueJoinPay: (token: string, joinId: string) => RequestResult 1686 | 1687 | yuyueJoinUpdate: (token: string, joinId: string, extJsonStr: string) => RequestResult 1688 | 1689 | yuyueMyJoinInfo: (token: string, joinId: string) => RequestResult 1690 | 1691 | yuyueMyJoinLogs: (data: Pagination & Token) => RequestResult 1692 | 1693 | yuyueTeams: (data: { 1694 | yuyueId: string, 1695 | token?: string, 1696 | } & Pagination) => RequestResult 1697 | 1698 | yuyueTeamDetail: (teamId: string) => RequestResult 1699 | 1700 | yuyueTeamMembers: (data: { 1701 | teamId: string, 1702 | token?: string, 1703 | } & Pagination) => RequestResult 1704 | 1705 | yuyueTeamDeleteMember: (token: string, joinId: string) => RequestResult 1706 | 1707 | /** 1708 | * 1709 | * 用户注册[邮箱注册] 1710 | * @method POST 1711 | * @param {string} code 邮件验证码 1712 | * @param {string} email 电子邮件 1713 | * @param {string} pwd 密码 1714 | * @param {boolean} autoLogin true / false 是否在注册后自动完成登录【对于之前已注册的用户,自动完成登录】 1715 | * @param {string} city 所属城市 1716 | * @param {string} nick 昵称 1717 | * @param {string} postJsonString 用户的扩展数据,必须是 json 格式 1718 | * @param {string} province 所属省份 1719 | * @param {string} referrer 邀请人的用户id 1720 | */ 1721 | register_email: (data: { 1722 | code: string, 1723 | email: string, 1724 | pwd: string, 1725 | autoLogin?: boolean, 1726 | city?: string, 1727 | nick?: string, 1728 | postJsonString?: string, 1729 | province?: string, 1730 | referrer?: string, 1731 | }) => RequestResult 1732 | 1733 | /** 1734 | * 1735 | * 用户登录[邮箱登录] 1736 | * @method POST 1737 | * @param {string} email 登录接口返回的token 1738 | * @param {string} pwd 登录密码 1739 | * @param {string} deviceId 设备 id 1740 | * @param {string} deviceName 登录设备名称, 自定义即可 1741 | */ 1742 | login_email: (data: { 1743 | email: string, 1744 | pwd: string, 1745 | deviceId?: string, 1746 | deviceName?: string, 1747 | }) => RequestResult 1748 | 1749 | bindEmail: (token: string, email: string, code: string, pwd?: string) => RequestResult 1750 | 1751 | siteStatistics: () => RequestResult 1752 | 1753 | goodsDynamic: (type: any) => RequestResult 1754 | 1755 | fetchSubDomainByWxappAppid: (appid: string) => RequestResult 1756 | 1757 | cmsArticleFavPut: (token: string, newsId: string) => RequestResult 1758 | 1759 | cmsArticleFavCheck: (token: string, newsId: string) => RequestResult 1760 | 1761 | cmsArticleFavList: (data: { 1762 | titleLike?: string 1763 | } & Pagination & Token) => RequestResult 1764 | 1765 | cmsArticleFavDeleteById: (token: string, id: string) => RequestResult 1766 | 1767 | cmsArticleFavDeleteByNewsId: (token: string, newsId: string) => RequestResult 1768 | 1769 | shippingCarInfo: (token: string) => RequestResult 1770 | 1771 | shippingCarInfoAddItem: (token: string, goodsId: string, number: number, sku: string) => RequestResult 1772 | 1773 | shippingCarInfoModifyNumber: (token: string, key: string, number: number) => RequestResult 1774 | 1775 | shippingCarInfoRemoveItem: (token: string, key: string) => RequestResult 1776 | 1777 | shippingCarInfoRemoveAll: (token: string) => RequestResult 1778 | 1779 | growthLogs: (data: { 1780 | behavior?: 0 | 1, 1781 | remark?: string, 1782 | type?: number, 1783 | } & DateQuery & Pagination & Token) => RequestResult 1784 | 1785 | exchangeScoreToGrowth: (token: string, deductionScore: any) => RequestResult 1786 | 1787 | wxaMpLiveRooms: () => RequestResult 1788 | 1789 | wxaMpLiveRoomHisVedios: (roomId: string) => RequestResult 1790 | } 1791 | 1792 | declare var WXAPI: WXAPI 1793 | export default WXAPI 1794 | -------------------------------------------------------------------------------- /instructions.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | - [站点信息](#站点信息) 4 | - [站点信息统计](#站点信息统计) 5 | - [通过微信小程序appid获取专属域名](#通过微信小程序appid获取专属域名) 6 | - [订单统计](#订单统计) 7 | - [获取每日销售额](#获取每日销售额) 8 | - [基础运维](#基础运维) 9 | - [省市区/行政区数据](#省市区行政区数据) 10 | - [读取所有省份](#读取所有省份) 11 | - [读取下级省市区数据](#读取下级省市区数据) 12 | - [读取 Banner 列表](#读取-banner-列表) 13 | - [公告管理](#公告管理) 14 | - [读取最新的一条公告](#读取最新的一条公告) 15 | - [获取公告列表](#获取公告列表) 16 | - [获取公告详情](#获取公告详情) 17 | - [读取后台vip等级(用于判断是免费后台还是专业后台)](#读取后台vip等级用于判断是免费后台还是专业后台) 18 | - [系统参数](#系统参数) 19 | - [读取系统参数](#读取系统参数) 20 | - [批量读取系统参数](#批量读取系统参数) 21 | - [获取友情链接/合作伙伴](#获取友情链接合作伙伴) 22 | - [JSON数据云存储](#json数据云存储) 23 | - [设置 JSON 数据](#设置-json-数据) 24 | - [读取设置的 JSON 数据列表](#读取设置的-json-数据列表) 25 | - [删除 JSON 数据](#删除-json-数据) 26 | - [分布式文件管理](#分布式文件管理) 27 | - [上传本地文件](#上传本地文件) 28 | - [下载远程文件](#下载远程文件) 29 | - [获取文件列表](#获取文件列表) 30 | - [安全中心](#安全中心) 31 | - [图形验证码](#图形验证码) 32 | - [获取验证码图片地址](#获取验证码图片地址) 33 | - [校验输入验证码是否正确](#校验输入验证码是否正确) 34 | - [短信验证码](#短信验证码) 35 | - [获取验证码(发送短信)](#获取验证码发送短信) 36 | - [校验输入验证码是否正确](#校验输入验证码是否正确-1) 37 | - [邮箱验证码](#邮箱验证码) 38 | - [获取验证码(发送邮件)](#获取验证码发送邮件) 39 | - [校验输入验证码是否正确](#校验输入验证码是否正确-2) 40 | - [登录 & 注册](#登录--注册) 41 | - [用户注册](#用户注册) 42 | - [检测 referrer 邀请码是否正确](#检测-referrer-邀请码是否正确) 43 | - [小程序静默授权](#小程序静默授权) 44 | - [小程序静默授权[服务商模式]](#小程序静默授权服务商模式) 45 | - [小程序简单注册](#小程序简单注册) 46 | - [小程序简单注册[服务商模式]](#小程序简单注册服务商模式) 47 | - [小程序详细注册](#小程序详细注册) 48 | - [小程序详细注册[服务商模式]](#小程序详细注册服务商模式) 49 | - [用户名注册](#用户名注册) 50 | - [邮箱注册](#邮箱注册) 51 | - [手机号注册](#手机号注册) 52 | - [用户登录](#用户登录) 53 | - [微信小程序登陆](#微信小程序登陆) 54 | - [微信小程序登陆[服务商模式]](#微信小程序登陆服务商模式) 55 | - [微信小程序一键手机号登录](#微信小程序一键手机号登录) 56 | - [微信小程序一键手机号登录[服务商模式]](#微信小程序一键手机号登录服务商模式) 57 | - [用户名登录](#用户名登录) 58 | - [邮箱登录](#邮箱登录) 59 | - [手机号码登录](#手机号码登录) 60 | - [短信验证码登录](#短信验证码登录) 61 | - [检测登录 token 是否有效](#检测登录-token-是否有效) 62 | - [重置密码](#重置密码) 63 | - [用手机找回密码](#用手机找回密码) 64 | - [用邮箱找回密码](#用邮箱找回密码) 65 | - [退出登录](#退出登录) 66 | - [用户管理](#用户管理) 67 | - [绑定手机号码](#绑定手机号码) 68 | - [小程序](#小程序) 69 | - [小程序[服务商]](#小程序服务商) 70 | - [短信验证码认证](#短信验证码认证) 71 | - [设置用户名](#设置用户名) 72 | - [设置邮箱地址](#设置邮箱地址) 73 | - [绑定小程序](#绑定小程序) 74 | - [绑定小程序[服务商模式]](#绑定小程序服务商模式) 75 | - [获取用户信息](#获取用户信息) 76 | - [获取用户id、openid、unionid](#获取用户idopenidunionid) 77 | - [修改用户资料](#修改用户资料) 78 | - [实名认证](#实名认证) 79 | - [会员体系](#会员体系) 80 | - [获取所有的会员等级](#获取所有的会员等级) 81 | - [查看会员等级详情](#查看会员等级详情) 82 | - [会员等级收费列表](#会员等级收费列表) 83 | - [购买会员](#购买会员) 84 | - [获取我的购买 / 续费记录](#获取我的购买--续费记录) 85 | - [收货地址管理](#收货地址管理) 86 | - [获取所有的收货地址](#获取所有的收货地址) 87 | - [添加收货地址](#添加收货地址) 88 | - [更新收货地址](#更新收货地址) 89 | - [获取默认的地址](#获取默认的地址) 90 | - [读取地址详细](#读取地址详细) 91 | - [删除收货地址](#删除收货地址) 92 | - [CMS模块](#cms模块) 93 | - [分类管理](#分类管理) 94 | - [获取所有分类](#获取所有分类) 95 | - [获取分类详情](#获取分类详情) 96 | - [文章管理](#文章管理) 97 | - [文章列表](#文章列表) 98 | - [文章详情](#文章详情) 99 | - [读取上一篇和下一篇文章](#读取上一篇和下一篇文章) 100 | - [用户发布文章](#用户发布文章) 101 | - [文章收藏](#文章收藏) 102 | - [收藏](#收藏) 103 | - [检测当前用户是否已收藏](#检测当前用户是否已收藏) 104 | - [读取收藏列表数据](#读取收藏列表数据) 105 | - [根据收藏记录的ID删除收藏](#根据收藏记录的id删除收藏) 106 | - [根据文章的ID删除收藏](#根据文章的id删除收藏) 107 | - [点赞/踩一下](#点赞踩一下) 108 | - [发表态度](#发表态度) 109 | - [读取点赞记录](#读取点赞记录) 110 | - [单页信息(关于我们/联系我们/...)](#单页信息关于我们联系我们) 111 | - [获取文章标签列表(用于展示类似“标签云”)](#获取文章标签列表用于展示类似标签云) 112 | - [留言 & 反馈](#留言--反馈) 113 | - [提交留言反馈](#提交留言反馈) 114 | - [读取留言 & 评论列表](#读取留言--评论列表) 115 | - [商城模块](#商城模块) 116 | - [门店管理](#门店管理) 117 | - [读取所有的门店列表](#读取所有的门店列表) 118 | - [门店详情](#门店详情) 119 | - [门店申请入驻](#门店申请入驻) 120 | - [获取我的门店列表](#获取我的门店列表) 121 | - [获取取货点列表(自提点)](#获取取货点列表自提点) 122 | - [商品分类](#商品分类) 123 | - [获取所有的分类](#获取所有的分类) 124 | - [获取分类详情](#获取分类详情-1) 125 | - [商品管理](#商品管理) 126 | - [获取商品列表](#获取商品列表) 127 | - [获取商品详情信息](#获取商品详情信息) 128 | - [获取商品的限购设置](#获取商品的限购设置) 129 | - [读取商品可选配件列表](#读取商品可选配件列表) 130 | - [获取商品价格「一般用在选择不同规格尺寸后需要实时显示售价」](#获取商品价格一般用在选择不同规格尺寸后需要实时显示售价) 131 | - [获取商品的每日价格&每日库存「适用酒店预订、票务预订类」](#获取商品的每日价格每日库存适用酒店预订票务预订类) 132 | - [时段定价-拉取可选的日期](#时段定价-拉取可选的日期) 133 | - [时段定价-拉取某天的所有时段定价信息](#时段定价-拉取某天的所有时段定价信息) 134 | - [计算物流/快递模板费用计算方法](#计算物流快递模板费用计算方法) 135 | - [拉取当前会员可以显示的折扣信息](#拉取当前会员可以显示的折扣信息) 136 | - [获取商品的评价](#获取商品的评价) 137 | - [商品购买动态](#商品购买动态) 138 | - [用户发布商品](#用户发布商品) 139 | - [删除自己发布的商品](#删除自己发布的商品) 140 | - [我的购买历史商品](#我的购买历史商品) 141 | - [获取购买过的历史商品列表](#获取购买过的历史商品列表) 142 | - [删除购买记录](#删除购买记录) 143 | - [商品收藏](#商品收藏) 144 | - [收藏某个商品](#收藏某个商品) 145 | - [检测当前商品是否已被收藏](#检测当前商品是否已被收藏) 146 | - [获取收藏的商品](#获取收藏的商品) 147 | - [删除收藏的某个商品](#删除收藏的某个商品) 148 | - [购物车](#购物车) 149 | - [读取购物车数据](#读取购物车数据) 150 | - [添加商品到购物车](#添加商品到购物车) 151 | - [修改购物车商品数量](#修改购物车商品数量) 152 | - [删除购物车中某条记录](#删除购物车中某条记录) 153 | - [购物车中某条记录选中/取消选中](#购物车中某条记录选中取消选中) 154 | - [一键清空购物车](#一键清空购物车) 155 | - [订单管理](#订单管理) 156 | - [创建订单](#创建订单) 157 | - [关闭订单](#关闭订单) 158 | - [删除订单](#删除订单) 159 | - [支付订单[使用余额]](#支付订单使用余额) 160 | - [确认收货](#确认收货) 161 | - [订单核销](#订单核销) 162 | - [获取所有订单](#获取所有订单) 163 | - [订单详情](#订单详情) 164 | - [评价接口](#评价接口) 165 | - [申请退换货[售后]](#申请退换货售后) 166 | - [申请退换货详情](#申请退换货详情) 167 | - [撤销退换货申请](#撤销退换货申请) 168 | - [拉取某订单的所有售后记录](#拉取某订单的所有售后记录) 169 | - [虚拟物品交易[知识付费]](#虚拟物品交易知识付费) 170 | - [商品列表](#商品列表) 171 | - [商品详情](#商品详情) 172 | - [购买商品](#购买商品) 173 | - [我的购买记录](#我的购买记录) 174 | - [根据视频编号读取视频详情](#根据视频编号读取视频详情) 175 | - [营销工具](#营销工具) 176 | - [优惠券管理](#优惠券管理) 177 | - [获取系统所有优惠券列表](#获取系统所有优惠券列表) 178 | - [查看优惠券详情](#查看优惠券详情) 179 | - [领取优惠券](#领取优惠券) 180 | - [我的所有优惠券](#我的所有优惠券) 181 | - [拉取优惠券合成规则](#拉取优惠券合成规则) 182 | - [优惠券合成](#优惠券合成) 183 | - [赠送优惠券给他人](#赠送优惠券给他人) 184 | - [使用动态口令领取优惠券](#使用动态口令领取优惠券) 185 | - [商品砍价](#商品砍价) 186 | - [获取商品砍价设置](#获取商品砍价设置) 187 | - [发起[创建]砍价,继而邀请好友来帮自己砍到底价](#发起创建砍价继而邀请好友来帮自己砍到底价) 188 | - [我发起[创建]的砍价详情](#我发起创建的砍价详情) 189 | - [放弃上一次砍价](#放弃上一次砍价) 190 | - [砍价详情](#砍价详情) 191 | - [帮好友砍价](#帮好友砍价) 192 | - [查询我帮好友砍掉的金额](#查询我帮好友砍掉的金额) 193 | - [拼团功能](#拼团功能) 194 | - [获取某一个商品的拼团配置](#获取某一个商品的拼团配置) 195 | - [批量获取一组商品的拼团配置](#批量获取一组商品的拼团配置) 196 | - [读取商品的默认团信息](#读取商品的默认团信息) 197 | - [拉取商品多级拼团价格信息](#拉取商品多级拼团价格信息) 198 | - [开团[我发起一个团购,我是团长,让别人来参加]](#开团我发起一个团购我是团长让别人来参加) 199 | - [获取某个商品当前进行中的所有拼团](#获取某个商品当前进行中的所有拼团) 200 | - [获取某个团购的参与用户列表](#获取某个团购的参与用户列表) 201 | - [读取我参与过的所有团购记录](#读取我参与过的所有团购记录) 202 | - [三级分销](#三级分销) 203 | - [直接购买分销商资格](#直接购买分销商资格) 204 | - [直接购买分销商资格](#直接购买分销商资格-1) 205 | - [申请成为分销商](#申请成为分销商) 206 | - [申请进度查询](#申请进度查询) 207 | - [团队管理](#团队管理) 208 | - [佣金记录[返佣明细]](#佣金记录返佣明细) 209 | - [分销商累计销售额排行榜](#分销商累计销售额排行榜) 210 | - [分销商某天的销售额排行榜](#分销商某天的销售额排行榜) 211 | - [名下团队成员人数统计](#名下团队成员人数统计) 212 | - [我的佣金统计](#我的佣金统计) 213 | - [用户绑定分销商](#用户绑定分销商) 214 | - [合伙人/团队长/ 二级分销](#合伙人团队长-二级分销) 215 | - [读取合伙人分销设置](#读取合伙人分销设置) 216 | - [用户绑定团队长成为团队成员](#用户绑定团队长成为团队成员) 217 | - [团队成员购买升级为团队长](#团队成员购买升级为团队长) 218 | - [团队成员统计](#团队成员统计) 219 | - [团队成员列表接口](#团队成员列表接口) 220 | - [积分模块](#积分模块) 221 | - [积分抵扣规则](#积分抵扣规则) 222 | - [积分赠送规则](#积分赠送规则) 223 | - [签到送积分](#签到送积分) 224 | - [签到规则](#签到规则) 225 | - [签到](#签到) 226 | - [读取今日签到信息](#读取今日签到信息) 227 | - [签到记录](#签到记录) 228 | - [使用积分券兑换积分](#使用积分券兑换积分) 229 | - [将积分兑换成余额](#将积分兑换成余额) 230 | - [转发微信群获得积分奖励](#转发微信群获得积分奖励) 231 | - [积分明细](#积分明细) 232 | - [成长值](#成长值) 233 | - [用积分兑换成长值](#用积分兑换成长值) 234 | - [成长值变动明细](#成长值变动明细) 235 | - [资金 / 财务 相关](#资金--财务-相关) 236 | - [交易密码](#交易密码) 237 | - [设置交易密码](#设置交易密码) 238 | - [修改交易密码](#修改交易密码) 239 | - [重置交易密码](#重置交易密码) 240 | - [获取资产信息(余额、可用积分)](#获取资产信息余额可用积分) 241 | - [在线支付(充值)](#在线支付充值) 242 | - [获取充值规则(满多少送多少)](#获取充值规则满多少送多少) 243 | - [微信小程序支付](#微信小程序支付) 244 | - [微信小程序支付[FOMO跨境支付]](#微信小程序支付fomo跨境支付) 245 | - [payNow跨境支付](#paynow跨境支付) 246 | - [FOMO网关支付](#fomo网关支付) 247 | - [微信小程序支付[服务商版本]](#微信小程序支付服务商版本) 248 | - [扫呗在线支付](#扫呗在线支付) 249 | - [wepayez境外支付](#wepayez境外支付) 250 | - [intelsalon云美集付](#intelsalon云美集付) 251 | - [支付宝支付(半自动)](#支付宝支付半自动) 252 | - [充值记录](#充值记录) 253 | - [查询支付结果](#查询支付结果) 254 | - [优惠买单](#优惠买单) 255 | - [获取买单优惠](#获取买单优惠) 256 | - [买单](#买单) 257 | - [资金流水](#资金流水) 258 | - [提现管理](#提现管理) 259 | - [申请提现](#申请提现) 260 | - [提现记录](#提现记录) 261 | - [提现记录详情](#提现记录详情) 262 | - [发票管理](#发票管理) 263 | - [申请发票](#申请发票) 264 | - [申请的发票列表](#申请的发票列表) 265 | - [发票详情](#发票详情) 266 | - [押金管理](#押金管理) 267 | - [支付押金](#支付押金) 268 | - [获取押金记录](#获取押金记录) 269 | - [押金详情](#押金详情) 270 | - [申请退回押金](#申请退回押金) 271 | - [小程序工具类](#小程序工具类) 272 | - [无限获取二维码](#无限获取二维码) 273 | - [小程序数据解密](#小程序数据解密) 274 | - [小程序数据解密[服务商模式]](#小程序数据解密服务商模式) 275 | - [模板消息](#模板消息) 276 | - [保存 formid/预支付Id](#保存-formid预支付id) 277 | - [给用户发送模板消息](#给用户发送模板消息) 278 | - [活动 & 工具](#活动--工具) 279 | - [在线获取二维码](#在线获取二维码) 280 | - [分布式系统唯一ID](#分布式系统唯一id) 281 | - [手机号段服务](#手机号段服务) 282 | - [归属地查询](#归属地查询) 283 | - [读取下一个号段](#读取下一个号段) 284 | - [抽奖功能](#抽奖功能) 285 | - [抽奖项目详情](#抽奖项目详情) 286 | - [参与抽奖](#参与抽奖) 287 | - [我的抽奖信息](#我的抽奖信息) 288 | - [抽奖项目的所有抽奖记录明细](#抽奖项目的所有抽奖记录明细) 289 | - [预约/报名](#预约报名) 290 | - [读取所有的预约/报名项目](#读取所有的预约报名项目) 291 | - [项目详情](#项目详情) 292 | - [进行预约或者在线报名](#进行预约或者在线报名) 293 | - [支付报名费](#支付报名费) 294 | - [更新预约/报名信息](#更新预约报名信息) 295 | - [我的报名信息](#我的报名信息) 296 | - [我所有的预约记录/报名记录](#我所有的预约记录报名记录) 297 | - [读取某个项目的所有报名团队列表](#读取某个项目的所有报名团队列表) 298 | - [查看团队详情](#查看团队详情) 299 | - [拉取团队成员列表](#拉取团队成员列表) 300 | - [团队长删除[踢]团队成员](#团队长删除踢团队成员) 301 | - [投票功能](#投票功能) 302 | - [投票项目](#投票项目) 303 | - [投票详情](#投票详情) 304 | - [我的投票](#我的投票) 305 | - [我要投票](#我要投票) 306 | - [查看投票明细](#查看投票明细) 307 | - [商品条码查询](#商品条码查询) 308 | - [短链接服务](#短链接服务) 309 | - [地图工具](#地图工具) 310 | - [计算2个坐标之间的直线距离](#计算2个坐标之间的直线距离) 311 | - [计算2个坐标之间的导航距离](#计算2个坐标之间的导航距离) 312 | - [将坐标地址转换为详细地址](#将坐标地址转换为详细地址) 313 | - [地图上搜索](#地图上搜索) 314 | - [排队叫号](#排队叫号) 315 | - [获取所有的队列](#获取所有的队列) 316 | - [取号](#取号) 317 | - [我的取号情况](#我的取号情况) 318 | - [社交通讯](#社交通讯) 319 | - [好友管理](#好友管理) 320 | - [读取好友列表](#读取好友列表) 321 | - [添加好友](#添加好友) 322 | - [查看好友详情](#查看好友详情) 323 | - [站内信管理](#站内信管理) 324 | - [站内消息列表](#站内消息列表) 325 | - [设置为已读](#设置为已读) 326 | - [删除站内信](#删除站内信) 327 | - [用户关注](#用户关注) 328 | - [判断是否关注某人](#判断是否关注某人) 329 | - [关注某人](#关注某人) 330 | - [取消关注某人](#取消关注某人) 331 | - [读取用户详情](#读取用户详情) 332 | - [我关注的用户列表](#我关注的用户列表) 333 | - [我的粉丝列表](#我的粉丝列表) 334 | - [关注统计](#关注统计) 335 | - [扫码点餐](#扫码点餐) 336 | - [扫桌码获取token](#扫桌码获取token) 337 | - [下单(厨) / 加菜](#下单厨--加菜) 338 | - [购买课程模块](#购买课程模块) 339 | - [获取课程列表](#获取课程列表) 340 | - [获取课程详情](#获取课程详情) 341 | - [获取某个课程的报名用户信息](#获取某个课程的报名用户信息) 342 | - [获取我的报名记录](#获取我的报名记录) 343 | - [课程购买订单详情](#课程购买订单详情) 344 | - [购买课程](#购买课程) 345 | - [用余额支付购买课程订单](#用余额支付购买课程订单) 346 | - [关闭课程订单](#关闭课程订单) 347 | - [删除课程订单](#删除课程订单) 348 | 349 | 350 | 351 | # 站点信息 352 | 353 | ## 站点信息统计 354 | 355 | ```js 356 | WXAPI.siteStatistics() 357 | ``` 358 | 359 | 读取当前站点的数据统计,示例如下: 360 | 361 | ```json 362 | { 363 | "code": 0, 364 | "data": { 365 | "dfs": { 366 | "capacity": 6668237, 367 | "capacityLeft": 0, 368 | "capacityLeftStr": "0 B", 369 | "capacityStr": "6.36 MB", // 当前占用文件空间大小 370 | "count": 23, // 文件数量 371 | "id": 7709, 372 | "isFixed": true 373 | }, 374 | "wxAppid": "wxa46b09d413fbcaff", // 当前后台配置的微信公众号的Appid 375 | "cmsArticle": { 376 | "comments": 0, // 评论数 377 | "numbers": 10, // 文章数量 378 | "fav": 0, // 收藏数量 379 | "views": 120 // 浏览量 380 | } 381 | }, 382 | "msg": "success" 383 | } 384 | ``` 385 | 386 | ## 通过微信小程序appid获取专属域名 387 | 388 | ```js 389 | WXAPI.fetchSubDomainByWxappAppid(appid) 390 | ``` 391 | 392 | ## 订单统计 393 | 394 | ```js 395 | WXAPI.orderStatisticsv2(Object object) 396 | ``` 397 | 参数: 398 | - token 用户登陆token 399 | - isNeedLogistics : true / false ,是否需要快递 400 | 401 | 订单统计,用以显示订单统计或者是订单类型小红点,该方法将会返回一下几个数据: 402 | 403 | 1. count_id_no_pay: 待支付订单数量 404 | 2. count_id_no_transfer: 已支付等待商家发货订单数量 405 | 3. count_id_no_confirm: 商家已发货,等待确认收货订单数量 406 | 4. count_id_no_reputation: 交易成功,等待评价的订单数量 407 | 5. count_id_success: 交易成功,且已评价的订单数量 408 | 6. count_id_close: 关闭的订单数量 409 | 410 | ## 获取每日销售额 411 | 412 | ```js 413 | WXAPI.siteStatisticsSaleroom(Object object) 414 | ``` 415 | 416 | 当前接口,必须在系统参数中开启 statistics_saleroom_open 开关类型的参数,才能正常使用 417 | 418 | 需要如下参数: 419 | 1. token 用户对登陆token 420 | 2. dateBegin 开始日期,如:2020-06-29 421 | 3. dateEnd 开始日期,如:2020-06-29 422 | 423 | # 基础运维 424 | 425 | ## 省市区/行政区数据 426 | 427 | ### 读取所有省份 428 | 429 | > WXAPI.province() 430 | 431 | ### 读取下级省市区数据 432 | 433 | > WXAPI.nextRegion(pid) 434 | 435 | ## 读取 Banner 列表 436 | 437 | > WXAPI.banners(Object object) 438 | 439 | ## 公告管理 440 | 441 | ### 读取最新的一条公告 442 | 443 | > WXAPI.noticeLastOne(type) 444 | 445 | ### 获取公告列表 446 | 447 | > WXAPI.noticeList(Object object) 448 | 449 | ### 获取公告详情 450 | 451 | > WXAPI.noticeDetail(id) 452 | 453 | ## 读取后台vip等级(用于判断是免费后台还是专业后台) 454 | 455 | > WXAPI.vipLevel() 456 | 457 | ## 系统参数 458 | 459 | ### 读取系统参数 460 | 461 | ```js 462 | WXAPI.queryConfigValue(key) 463 | ``` 464 | 465 | ### 批量读取系统参数 466 | 467 | ```js 468 | WXAPI.queryConfigBatch(keys) 469 | ``` 470 | 471 | 多个key用英文的逗号分隔开 472 | 473 | ## 获取友情链接/合作伙伴 474 | 475 | > WXAPI.friendlyPartnerList(type) 476 | 477 | ## JSON数据云存储 478 | 479 | ### 设置 JSON 数据 480 | 481 | ```js 482 | WXAPI.jsonSet(Object object) 483 | ``` 484 | 485 | 486 | ### 读取设置的 JSON 数据列表 487 | 488 | ```js 489 | WXAPI.jsonList(Object object) 490 | ``` 491 | 492 | ### 删除 JSON 数据 493 | 494 | ```js 495 | WXAPI.jsonDelete(token, id) 496 | ``` 497 | 498 | ## 分布式文件管理 499 | 500 | ### 上传本地文件 501 | 502 | > WXAPI.uploadFile(token, tempFilePath) 503 | 504 | ### 下载远程文件 505 | 506 | > WXAPI.uploadFileFromUrl(remoteFileUrl, ext) 507 | 508 | ### 获取文件列表 509 | 510 | > WXAPI.uploadFileList(path) 511 | 512 | # 安全中心 513 | 514 | ## 图形验证码 515 | 516 | ### 获取验证码图片地址 517 | 518 | ``` 519 | WXAPI.graphValidateCodeUrl(key) 520 | ``` 521 | > 将该图片地址直接显示在图片控件上即可; 522 | > 523 | > key 为随机数,下面的校验方法需要用到 524 | 525 | ### 校验输入验证码是否正确 526 | 527 | ``` 528 | WXAPI.graphValidateCodeCheck(key, code) 529 | ``` 530 | > key为上面获取方法的key,必须保持一致,否则一直会显示错误; 531 | > 532 | > code 为用户输入的验证码内容 533 | 534 | ## 短信验证码 535 | 536 | ### 获取验证码(发送短信) 537 | 538 | ``` 539 | WXAPI.smsValidateCode(mobile, key, picCode) 540 | ``` 541 | > 短信验证码自动下发到 mobile 对应的手机号码; 542 | > 543 | > 当后台设置了发送短信验证码必须开启图形验证码校验时,必须传 key 和 picCode 参数,否则不用传; 544 | > 545 | > key 和 picCode 参数,请查阅图形验证码接口 546 | 547 | ### 校验输入验证码是否正确 548 | 549 | ``` 550 | WXAPI.smsValidateCodeCheck(mobile, code) 551 | ``` 552 | > code 为用户手机上收到的验证码 553 | 554 | ## 邮箱验证码 555 | 556 | ### 获取验证码(发送邮件) 557 | 558 | ```js 559 | WXAPI.mailValidateCode(mail) 560 | ``` 561 | 562 | ### 校验输入验证码是否正确 563 | 564 | ```js 565 | WXAPI.mailValidateCodeCheck(mail, code) 566 | ``` 567 | 568 | # 登录 & 注册 569 | 570 | ## 用户注册 571 | 572 | ### 检测 referrer 邀请码是否正确 573 | 574 | ```js 575 | WXAPI.checkReferrer(referrer) 576 | ``` 577 | 578 | 注册的时候,让用户填写邀请码,通过该接口,检测邀请码是否填写正确 579 | - code == 0 ,邀请码正确 580 | - code == 700 ,邀请码错误 581 | 582 | ### 小程序静默授权 583 | 584 | 用户无感知授权,可实现自动登陆、注册。所以使用该接口,就无需再使用注册、登陆接口了 585 | 586 | ```js 587 | WXAPI.authorize(Object object) 588 | ``` 589 | 590 | 参数说明: 591 | 592 | - code 临时凭证,请通过小程序官方接口 wx.login 获取 593 | - referrer [可选] 邀请人用户id 594 | - postJsonString [可选] Json格式的用户扩展数据 595 | 596 | ### 小程序静默授权[服务商模式] 597 | 598 | 用户无感知授权,可实现自动登陆、注册。所以使用该接口,就无需再使用注册、登陆接口了 599 | 600 | ```js 601 | WXAPI.wxappServiceAuthorize(Object object) 602 | ``` 603 | 604 | 参数说明: 605 | 606 | - code 临时凭证,请通过小程序官方接口 wx.login 获取 607 | - referrer [可选] 邀请人用户id 608 | - postJsonString [可选] Json格式的用户扩展数据 609 | 610 | ### 小程序简单注册 611 | 612 | ```js 613 | WXAPI.register_simple(Object object) 614 | ``` 615 | 616 | 参数说明: 617 | - code wx.login 获取的 code 618 | - referrer [可选] 邀请人用户id 619 | - postJsonString [可选] Json格式的用户扩展数据 620 | 621 | ### 小程序简单注册[服务商模式] 622 | 623 | ```js 624 | WXAPI.wxappServiceRegisterSimple(Object object) 625 | ``` 626 | 627 | 参数说明: 628 | - code wx.login 获取的 code 629 | - referrer [可选] 邀请人用户id 630 | - postJsonString [可选] Json格式的用户扩展数据 631 | 632 | ### 小程序详细注册 633 | 634 | ```js 635 | WXAPI.register_complex(Object object) 636 | ``` 637 | 638 | 参数说明: 639 | - code wx.login 获取的 code 640 | - encryptedData 微信登录接口返回的 加密用户信息 641 | - iv 微信登录接口返回的加密偏移数据 642 | - referrer [可选] 邀请人用户id 643 | - postJsonString [可选] Json格式的用户扩展数据 644 | 645 | ### 小程序详细注册[服务商模式] 646 | 647 | ```js 648 | WXAPI.wxappServiceRegisterComplex(Object object) 649 | ``` 650 | 651 | 参数说明: 652 | - code wx.login 获取的 code 653 | - encryptedData 微信登录接口返回的 加密用户信息 654 | - iv 微信登录接口返回的加密偏移数据 655 | - referrer [可选] 邀请人用户id 656 | - postJsonString [可选] Json格式的用户扩展数据 657 | 658 | ### 用户名注册 659 | 660 | ```js 661 | WXAPI.register_username(Object object) 662 | ``` 663 | 664 | ### 邮箱注册 665 | 666 | ```js 667 | WXAPI.register_email(Object object) 668 | ``` 669 | 670 | ### 手机号注册 671 | 672 | ```js 673 | WXAPI.register_mobile(Object object) 674 | ``` 675 | 676 | > 最常用的一种注册方式,输入手机号码,获取短信验证码,回填校验通过后即可完成注册 677 | > 678 | > 具体参数说明请查阅接口文档说明 679 | 680 | ## 用户登录 681 | 682 | ### 微信小程序登陆 683 | 684 | ```js 685 | WXAPI.login_wx(code) 686 | ``` 687 | 688 | 689 | ### 微信小程序登陆[服务商模式] 690 | 691 | ```js 692 | WXAPI.wxappServiceLogin(Object object) 693 | ``` 694 | 695 | 参数说明: 696 | - code wx.login 获取的 code 697 | - autoReg 设置为true,会自动完成新用户注册后再登陆,默认为 false 698 | - referrer [可选] 邀请人用户id 699 | - postJsonString [可选] Json格式的用户扩展数据 700 | 701 | ### 微信小程序一键手机号登录 702 | 703 | ```js 704 | WXAPI.loginWxaMobileV2(code, encryptedData, iv) 705 | ``` 706 | 707 | 该方法会匹配系统中该手机号码的用户,继而实现登录 708 | 709 | - code 小程序 wx.login 方法返回的临时凭证 710 | - encryptedData iv 是小程序读取手机号码授权返回的加密数据 711 | - autoReg 如果传true,用户不存在的情况下,会自动注册新用户 712 | - referrer 邀请人用户编号,注册时候会奖励邀请关系[登陆无效] 713 | - postJsonString 用户扩展属性,注册时候使用[登陆无效] 714 | 715 | ### 微信小程序一键手机号登录[服务商模式] 716 | 717 | ```js 718 | WXAPI.wxappServiceLoginWxaMobile(Object object) 719 | ``` 720 | 721 | 参数说明: 722 | - code wx.login 获取的 code 723 | - encryptedData 微信登录接口返回的 加密用户信息 724 | - iv 微信登录接口返回的加密偏移数据 725 | 726 | ### 用户名登录 727 | 728 | ```js 729 | WXAPI.login_username(Object object) 730 | ``` 731 | 732 | ### 邮箱登录 733 | 734 | ```js 735 | WXAPI.login_email(Object object) 736 | ``` 737 | 738 | ### 手机号码登录 739 | 740 | ```js 741 | WXAPI.login_mobile(mobile, pwd, deviceId, deviceName) 742 | ``` 743 | 744 | deviceId、deviceName 参数用来表示登录的设备信息比如手机序列号、手机型号,小程序调用该方法,可随便传参即可; 745 | 746 | ### 短信验证码登录 747 | 748 | ```js 749 | WXAPI.loginMobileSmsCode(Object object) 750 | ``` 751 | 752 | autoReg 参数,可传 true,实现用户不存在时候自动注册 753 | 754 | ## 检测登录 token 是否有效 755 | 756 | ```js 757 | WXAPI.checkToken(token) 758 | ``` 759 | 760 | ## 重置密码 761 | 762 | ### 用手机找回密码 763 | 764 | ```js 765 | WXAPI.resetPwdUseMobileCode(mobile, pwd, code) 766 | ``` 767 | 768 | 用于忘记密码找回,重置密码时候使用 769 | 770 | 填写手机号码,系统下发短信验证码,回填正确的验证码后完成新密码的设置 771 | 772 | ### 用邮箱找回密码 773 | 774 | ```js 775 | WXAPI.resetPwdUseEmailCode(email, pwd, code) 776 | ``` 777 | 778 | 用于忘记密码找回,重置密码时候使用 779 | 780 | 填写邮箱地址,系统下发邮件验证码,回填正确的验证码后完成新密码的设置 781 | 782 | ## 退出登录 783 | 784 | ```js 785 | WXAPI.loginout(token) 786 | ``` 787 | 788 | > 退出后,当前token将立刻失效 789 | 790 | # 用户管理 791 | 792 | ## 绑定手机号码 793 | 794 | ### 小程序 795 | 796 | ```js 797 | WXAPI.bindMobileWxapp(token, code, encryptedData, iv, pwd) 798 | ``` 799 | 800 | > 结合小程序获取用户手机号码接口实现用户绑定手机号码 801 | > 802 | > pwd 为可选参数,如果传了该参数,当前的登录密码将会被重置成传入的新密码 803 | > 804 | > 小程序规定,只有通过认证的企业身份的小程序,才能使用获取手机号码接口 805 | 806 | *如果你没法使用小程序绑定手机号码接口,你可以使用下面的短信验证码认证方式绑定手机号码* 807 | 808 | ### 小程序[服务商] 809 | 810 | ```js 811 | WXAPI.wxappServiceBindMobile(Object object) 812 | ``` 813 | 814 | 参数说明: 815 | - code wx.login 获取的 code 816 | - encryptedData 微信登录接口返回的 加密用户信息 817 | - iv 微信登录接口返回的加密偏移数据 818 | - pwd [选填] 传了该参数以后将会重置登陆密码 819 | 820 | ### 短信验证码认证 821 | 822 | ```js 823 | WXAPI.bindMobileSms(token, mobile, code, pwd) 824 | ``` 825 | 826 | > 请结合本文档中的短信验证码安全认证相关方法实现该功能 827 | > 828 | > pwd 为可选参数,如果传了该参数,当前的登录密码将会被重置成传入的新密码 829 | 830 | ## 设置用户名 831 | 832 | ```js 833 | WXAPI.bindUsername(token, username, pwd) 834 | ``` 835 | 836 | > 设置用户名后,将可使用该用户名进行登录;用户名在系统中是唯一的; 837 | > 838 | > pwd 为可选参数,如果传了该参数,当前的登录密码将会被重置成传入的新密码 839 | 840 | ## 设置邮箱地址 841 | 842 | ```js 843 | WXAPI.bindEmail(token, email, code, pwd) 844 | ``` 845 | 846 | 通过邮箱验证码校验后,绑定用户的邮箱地址 847 | 848 | ## 绑定小程序 849 | 850 | ```js 851 | WXAPI.bindOpenid(token, code) 852 | ``` 853 | 854 | > 手机号码、用户名等方式注册的用户,通过该方法绑定小程序,后期将可以使用小程序登录 855 | > 856 | > code 为小程序登录的临时凭证 857 | 858 | ## 绑定小程序[服务商模式] 859 | 860 | ```js 861 | WXAPI.wxappServiceBindOpenid(Object object) 862 | ``` 863 | 864 | 参数说明: 865 | - code wx.login 获取的 code 866 | 867 | ## 获取用户信息 868 | 869 | ```js 870 | WXAPI.userDetail(token) 871 | ``` 872 | 873 | > base 数据存放了用户的基础信息; 874 | > 875 | > idcard 数据存放了用户的实名认证信息[如果用户有通过实名认证的话] 876 | > 877 | > ext 数据存放了用户的扩展属性 878 | 879 | ## 获取用户id、openid、unionid 880 | 881 | ```js 882 | WXAPI.userWxinfo(token) 883 | ``` 884 | 885 | > 获取当前登录用户的用户id、openid、unionid 886 | 887 | ## 修改用户资料 888 | 889 | ```js 890 | WXAPI.modifyUserInfo(Object object) 891 | ``` 892 | 893 | ## 实名认证 894 | 895 | ```js 896 | WXAPI.idcardCheck(token, name, idCardNo) 897 | ``` 898 | 899 | > 身份证实名认证方法,校验姓名和身份证号码是否匹配 900 | > 901 | > name 为真实姓名;idCardNo 为身份证号码 902 | 903 | ## 会员体系 904 | 905 | ### 获取所有的会员等级 906 | 907 | ```js 908 | WXAPI.userLevelList(Object object) 909 | ``` 910 | 911 | > 读取后台设置的所有的会员等级;具体参数请查阅接口文档 912 | 913 | ### 查看会员等级详情 914 | 915 | ```js 916 | WXAPI.userLevelDetail(levelId) 917 | ``` 918 | 919 | > levelId 为会员等级的id 920 | 921 | ### 会员等级收费列表 922 | 923 | ```js 924 | WXAPI.userLevelPrices(levelId) 925 | ``` 926 | 927 | > levelId 为会员等级的id,该方法可获得指定的某一个会员等级(比如:钻石会员)的收费列表 928 | 929 | *比如:免费使用7天、30元一个月、70元买一个季度、200元买一年* 930 | 931 | 用户根据自己的需要,使用下面的方法购买会员,购买后,当前用户立即现有对应的会员等级,直到有效期截止 932 | 933 | ### 购买会员 934 | 935 | ```js 936 | WXAPI.userLevelBuy(token, priceId, isAutoRenew, remark) 937 | ``` 938 | 939 | > priceId 为上面获取的收费列表的id 940 | > 941 | > isAutoRenew = true / false ;用来标识会员到期后是否自动续费,开通自动续费后将会在到期日自动用可用余额完成续费 942 | > 943 | > remark 为购买时候提交的备注信息 944 | 945 | ### 获取我的购买 / 续费记录 946 | 947 | ```js 948 | WXAPI.userLevelBuyLogs(Object object) 949 | ``` 950 | 951 | > 具体参数请查阅接口文档 952 | 953 | 954 | ## 收货地址管理 955 | 956 | ### 获取所有的收货地址 957 | 958 | ```js 959 | WXAPI.queryAddressV2(Object object) 960 | ``` 961 | 962 | 参数说明: 963 | - token 当前登陆用户的token 964 | - page 获取第几页数据 965 | - pageSize 每页显示多少数据 966 | - nameLike 收货人姓名模糊搜索 967 | - mobileLike 手机号码模糊搜索 968 | 969 | ### 添加收货地址 970 | 971 | ```js 972 | WXAPI.addAddress(Object object) 973 | ``` 974 | 975 | > 你也可以结合小程序自带的读取收货地址接口,实现快速添加收货地址功能 976 | 977 | ### 更新收货地址 978 | 979 | ```js 980 | WXAPI.updateAddress(Object object) 981 | ``` 982 | 983 | ### 获取默认的地址 984 | 985 | ```js 986 | WXAPI.defaultAddress(token) 987 | ``` 988 | 989 | ### 读取地址详细 990 | 991 | ```js 992 | WXAPI.addressDetail(token, id) 993 | ``` 994 | 995 | ### 删除收货地址 996 | 997 | ```js 998 | WXAPI.deleteAddress(token, id) 999 | ``` 1000 | 1001 | # CMS模块 1002 | 1003 | ## 分类管理 1004 | 1005 | ### 获取所有分类 1006 | 1007 | ```js 1008 | WXAPI.cmsCategories() 1009 | ``` 1010 | 1011 | ### 获取分类详情 1012 | 1013 | ```js 1014 | WXAPI.cmsCategoryDetail(id) 1015 | ``` 1016 | 1017 | - info 中返回分类的基础信息 1018 | - extJson 中返回后台设置的扩展属性 1019 | 1020 | ## 文章管理 1021 | 1022 | ### 文章列表 1023 | 1024 | ```js 1025 | WXAPI.cmsArticles(Object object) 1026 | ``` 1027 | 1028 | ### 文章详情 1029 | 1030 | ```js 1031 | WXAPI.cmsArticleDetailV2(id) 1032 | ``` 1033 | 1034 | ### 读取上一篇和下一篇文章 1035 | 1036 | ```js 1037 | WXAPI.cmsArticlePreNext(id) 1038 | ``` 1039 | 1040 | ### 用户发布文章 1041 | 1042 | ```js 1043 | WXAPI.cmsArticleCreate(Object object) 1044 | ``` 1045 | 1046 | 具体参数请参阅接口文档说明 1047 | 1048 | ### 文章收藏 1049 | 1050 | #### 收藏 1051 | 1052 | ```js 1053 | WXAPI.cmsArticleFavPut(token, newsId) 1054 | ``` 1055 | 1056 | #### 检测当前用户是否已收藏 1057 | 1058 | ```js 1059 | WXAPI.cmsArticleFavCheck(token, newsId) 1060 | ``` 1061 | 1062 | 根据返回码(code)判断是否已收藏: 1063 | - 0 代表已收藏 1064 | - -1 代表未收藏 1065 | 1066 | #### 读取收藏列表数据 1067 | 1068 | ```js 1069 | WXAPI.cmsArticleFavList(Object object) 1070 | ``` 1071 | 1072 | #### 根据收藏记录的ID删除收藏 1073 | 1074 | ```js 1075 | WXAPI.cmsArticleFavDeleteById(token, id) 1076 | ``` 1077 | 1078 | #### 根据文章的ID删除收藏 1079 | 1080 | ```js 1081 | WXAPI.cmsArticleFavDeleteByNewsId(token, newsId) 1082 | ``` 1083 | 1084 | ### 点赞/踩一下 1085 | 1086 | #### 发表态度 1087 | 1088 | ```js 1089 | WXAPI.cmsArticleUseless(Object object) 1090 | ``` 1091 | 1092 | 参数说明: 1093 | - token 用户登录凭证,登录后才可以表态,防止作弊 1094 | - id 文章id 1095 | - isUseful 传入 true / false ,分别代表2种态度 1096 | - isCheck 传入 true ,进行模拟点赞,并不会生效 1097 | 1098 | #### 读取点赞记录 1099 | 1100 | ```js 1101 | WXAPI.cmsArticleUsefulLogs(Object object) 1102 | ``` 1103 | 1104 | ## 单页信息(关于我们/联系我们/...) 1105 | 1106 | ```js 1107 | WXAPI.cmsPage(key) 1108 | ``` 1109 | 1110 | key 为后台发布的单页信息的编号 1111 | 1112 | ## 获取文章标签列表(用于展示类似“标签云”) 1113 | 1114 | > WXAPI.cmsTags() 1115 | 1116 | ## 留言 & 反馈 1117 | 1118 | ### 提交留言反馈 1119 | 1120 | ```js 1121 | WXAPI.addComment(Object object) 1122 | ``` 1123 | 1124 | ### 读取留言 & 评论列表 1125 | 1126 | ```js 1127 | WXAPI.commentList(Object object) 1128 | ``` 1129 | 1130 | # 商城模块 1131 | 1132 | ## 门店管理 1133 | 1134 | ### 读取所有的门店列表 1135 | 1136 | ```js 1137 | WXAPI.fetchShops(Object object) 1138 | ``` 1139 | 1140 | **接口返回示例:** 1141 | 1142 | ```json 1143 | { 1144 | "code": 0, 1145 | "data": [ 1146 | { 1147 | "cityId": "150200000000", 1148 | "dateAdd": "2019-07-18 17:45:26", 1149 | "dateUpdate": "2019-07-29 09:37:19", 1150 | "districtId": "150205000000", 1151 | "id": 4963, 1152 | "latitude": 39.916527, 1153 | "linkPhone": "11", 1154 | "longitude": 116.397128, 1155 | "name": "111", 1156 | "numberGoodReputation": 0, 1157 | "numberOrder": 0, 1158 | "paixu": 0, 1159 | "provinceId": "150000000000", 1160 | "status": 0, 1161 | "statusStr": "正常", 1162 | "userId": 2 1163 | } 1164 | ], 1165 | "msg": "success" 1166 | } 1167 | ``` 1168 | 1169 | ### 门店详情 1170 | 1171 | ```js 1172 | WXAPI.shopSubdetail(id) 1173 | ``` 1174 | 1175 | id 参数为门店列表返回数据中的 id 字段 1176 | 1177 | 该方法可以读取到门店后台设置的扩展属性信息 1178 | 1179 | **接口返回示例:** 1180 | 1181 | ```json 1182 | { 1183 | "code": 0, 1184 | "data": { 1185 | "extJson": { 1186 | "证书编号": "", 1187 | "3C产品型号": "", 1188 | "电压": "", 1189 | "电源方式": "" 1190 | }, 1191 | "info": { 1192 | "activity": "", 1193 | "address": "杭州市拱墅区登云路和赵伍路交叉口", 1194 | "characteristic": "量贩式水果超市", 1195 | "cityId": "330100000000", 1196 | "dateAdd": "2017-03-20 20:27:36", 1197 | "dateUpdate": "2019-03-05 12:27:25", 1198 | "districtId": "330105000000", 1199 | "expressType": "", 1200 | "id": 1, 1201 | "introduce": "简单介绍一下吧", 1202 | "latitude": 30.307559, 1203 | "linkPhone": "1234", 1204 | "longitude": 120.130023, 1205 | "name": "鲜丰水果登云路店", 1206 | "number": "", 1207 | "numberGoodReputation": 0, 1208 | "numberOrder": 0, 1209 | "paixu": 0, 1210 | "pic": "https://cdn.it120.cc/apifactory/2017/03/20/0f4b625100de82467f3e193d1bf3577d.png", 1211 | "provinceId": "330000000000", 1212 | "status": 0, 1213 | "statusStr": "正常", 1214 | "type": "", 1215 | "userId": 2 1216 | } 1217 | }, 1218 | "msg": "success" 1219 | } 1220 | ``` 1221 | 1222 | ### 门店申请入驻 1223 | 1224 | ```js 1225 | WXAPI.shopSubApply(Object object) 1226 | ``` 1227 | 1228 | 具体参数请查阅接口文档说明 1229 | 1230 | ### 获取我的门店列表 1231 | 1232 | ```js 1233 | WXAPI.fetchMyShops(token) 1234 | ``` 1235 | 1236 | 读取我申请入驻的所有门店的列表数据 1237 | 1238 | ### 获取取货点列表(自提点) 1239 | 1240 | ```js 1241 | WXAPI.pickPoints(Object object) 1242 | ``` 1243 | 1244 | 用户选择自提到时候,可通过该方法可以获取到自提点列表数据 1245 | 1246 | ## 商品分类 1247 | 1248 | ### 获取所有的分类 1249 | 1250 | ```js 1251 | WXAPI.goodsCategory() 1252 | ``` 1253 | 1254 | 读取后台设置的所有分类数据,分类之间的上下级关系请使用 level 和 pid 进行管理 1255 | 1256 | level = 1 表示 1级类目;2 表示 2级类目,以此类推 1257 | 1258 | pid 代表该类目的上级类目ID(一级类目的 pid = 0) 1259 | 1260 | *分类的目录树,可以根据上述2个字段,采用 js 在本地实现* 1261 | 1262 | **接口返回示例:** 1263 | 1264 | ```json 1265 | { 1266 | "code": 0, 1267 | "data": [ 1268 | { 1269 | "dateAdd": "2017-09-12 11:07:32", 1270 | "dateUpdate": "2019-04-10 11:24:32", 1271 | "icon": "https://cdn.it120.cc/apifactory/2019/04/09/f89753a227d26a3fe9ccc6f975857bb6.png", 1272 | "id": 1872, 1273 | "isUse": true, 1274 | "key": "1", 1275 | "level": 1, 1276 | "name": "上装", 1277 | "paixu": 0, 1278 | "pid": 0, 1279 | "type": "", 1280 | "userId": 951 1281 | } 1282 | ], 1283 | "msg": "success" 1284 | } 1285 | ``` 1286 | 1287 | ### 获取分类详情 1288 | 1289 | ```js 1290 | WXAPI.goodsCategoryDetail(id) 1291 | ``` 1292 | 1293 | - info 中返回分类的基础信息 1294 | - extJson 中返回后台设置的扩展属性 1295 | 1296 | ## 商品管理 1297 | 1298 | ### 获取商品列表 1299 | 1300 | ```js 1301 | WXAPI.goods(Object object) 1302 | ``` 1303 | 1304 | > 读取所有的商品数据,以分页的形式展示,支持按照多种方式进行排序 1305 | > 1306 | > 具体参数的说明,请查阅接口文档 1307 | 1308 | **接口返回示例:** 1309 | 1310 | ```json 1311 | { 1312 | "code": 0, 1313 | "data": [ 1314 | { 1315 | "categoryId": 1875, 1316 | "characteristic": "享受vip尊享服务,使用专业版后台,功能更强,体验更好", 1317 | "commission": 0, 1318 | "commissionType": 0, 1319 | "dateAdd": "2019-03-19 09:51:08", 1320 | "dateUpdate": "2019-08-14 09:49:34", 1321 | "gotScore": 0, 1322 | "gotScoreType": 0, 1323 | "id": 124305, 1324 | "kanjia": true, 1325 | "kanjiaPrice": 49, 1326 | "limitation": false, 1327 | "logisticsId": 0, 1328 | "miaosha": false, 1329 | "minPrice": 198, 1330 | "minScore": 0, 1331 | "name": "api工厂1年vip会员", 1332 | "numberFav": 0, 1333 | "numberGoodReputation": 1, 1334 | "numberOrders": 1, 1335 | "numberSells": 1, 1336 | "originalPrice": 198, 1337 | "paixu": 0, 1338 | "pic": "https://cdn.it120.cc/apifactory/2019/03/19/6828c1ced4a74e11b532c8cbd864245a.png", 1339 | "pingtuan": false, 1340 | "pingtuanPrice": 0, 1341 | "recommendStatus": 1, 1342 | "recommendStatusStr": "推荐", 1343 | "shopId": 0, 1344 | "status": 0, 1345 | "statusStr": "上架", 1346 | "stores": 9999998, 1347 | "userId": 951, 1348 | "views": 15955, 1349 | "weight": 0 1350 | }, 1351 | { 1352 | "categoryId": 2054, 1353 | "commission": 0, 1354 | "commissionType": 0, 1355 | "dateAdd": "2019-03-11 13:02:39", 1356 | "dateUpdate": "2019-08-14 09:36:24", 1357 | "gotScore": 0, 1358 | "gotScoreType": 0, 1359 | "id": 122843, 1360 | "kanjia": false, 1361 | "kanjiaPrice": 0, 1362 | "limitation": false, 1363 | "logisticsId": 386, 1364 | "miaosha": false, 1365 | "minPrice": 600, 1366 | "minScore": 0, 1367 | "name": "WIFI 58mm 热敏打印机工厂定制版", 1368 | "numberFav": 0, 1369 | "numberGoodReputation": 8, 1370 | "numberOrders": 894, 1371 | "numberSells": 872, 1372 | "originalPrice": 800, 1373 | "paixu": 0, 1374 | "pic": "https://cdn.it120.cc/apifactory/2019/03/07/133eb6294e3853ebe4eb8551359a26dc.png", 1375 | "pingtuan": false, 1376 | "pingtuanPrice": 0, 1377 | "recommendStatus": 1, 1378 | "recommendStatusStr": "推荐", 1379 | "shopId": 0, 1380 | "status": 0, 1381 | "statusStr": "上架", 1382 | "stores": 9999984, 1383 | "tags": "打印机", 1384 | "userId": 951, 1385 | "views": 18044, 1386 | "weight": 0 1387 | } 1388 | ], 1389 | "msg": "success" 1390 | } 1391 | ``` 1392 | 1393 | ### 获取商品详情信息 1394 | 1395 | ```js 1396 | WXAPI.goodsDetail(id) 1397 | ``` 1398 | 1399 | > id 参数为上面商品列表方法返回数据里的 id 字段 1400 | > 1401 | > 访问该方法会增加商品的浏览量 1402 | > 1403 | > 该方法获取商品基础信息、商品图文详细介绍、商品图片、可选的规格尺寸、所属分类、快递物流设置信息、商品扩展属性 1404 | 1405 | **接口返回示例:** 1406 | 1407 | ```json 1408 | { 1409 | "code": 0, 1410 | "data": { 1411 | "logistics": { 1412 | "isFree": true, 1413 | "feeType": 0, 1414 | "feeTypeStr": "按件数", 1415 | "details": [ 1416 | { 1417 | "addAmount": 0, 1418 | "addNumber": 1, 1419 | "firstAmount": 8, 1420 | "firstNumber": 100, 1421 | "type": 0, 1422 | "userId": 951 1423 | } 1424 | ] 1425 | }, 1426 | "extJson": {}, 1427 | "category": { 1428 | "dateAdd": "2017-09-17 19:55:09", 1429 | "dateUpdate": "2019-04-10 11:27:49", 1430 | "icon": "https://cdn.it120.cc/apifactory/2019/04/09/9a7356187fce687ce568ba7381685299.png", 1431 | "id": 2054, 1432 | "isUse": true, 1433 | "key": "8", 1434 | "name": "秒杀", 1435 | "paixu": 0, 1436 | "pid": 0, 1437 | "type": "", 1438 | "userId": 951 1439 | }, 1440 | "pics": [ 1441 | { 1442 | "goodsId": 122843, 1443 | "id": 899846, 1444 | "pic": "https://cdn.it120.cc/apifactory/2019/03/07/133eb6294e3853ebe4eb8551359a26dc.png", 1445 | "userId": 951 1446 | } 1447 | ], 1448 | "content": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
主体 
名称WiFi无线打印机
型号FP-V58W(58mm、不带切刀)
传输方式WiFi网络
下单方式Internet网络接口/手机应用
集成方式API/驱动集成
监控管理在线、缺纸状态查询
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
打印 
打印方式直接行式热敏
自动切刀
图形支持二维码,条码,LOGO打印
打印宽度58毫米
点密度384点/行(203×203dpi)
打印速度120毫米/秒
打印纸57.5 ± 0.5毫米
行间距3.75毫米(可用命令调整行间距)
列数58mm纸:Font A 32列/Font B 42列/简繁体16列
字符大小ANK字符,Font A 1.5×3.0mm(12×24点)Font B 1.1×2.1mm(9×17点)简繁体 3.0×3.0mm(24×24点)
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
物理属性 
输入缓冲32K Bytes
NV Flash64 K Bytes
电源输入AC 110V/220V,50~60Hz
电源适配器DC12V/2.6A
重量0.66千克
外观尺寸160×120×100毫米(长×宽×高)
工作环境温度:0~45℃ 湿度:10~80%
存储环境温度:-10~60℃ 湿度:10~90%(不结露)
使用寿命50公里
产品认证3C
质量标准ISO9001
", 1449 | "basicInfo": { 1450 | "categoryId": 2054, 1451 | "commission": 0, 1452 | "commissionType": 0, 1453 | "dateAdd": "2019-03-11 13:02:39", 1454 | "dateUpdate": "2019-08-14 09:17:23", 1455 | "gotScore": 0, 1456 | "gotScoreType": 0, 1457 | "id": 122843, 1458 | "kanjia": false, 1459 | "kanjiaPrice": 0, 1460 | "limitation": false, 1461 | "logisticsId": 386, 1462 | "miaosha": false, 1463 | "minPrice": 600, 1464 | "minScore": 0, 1465 | "name": "WIFI 58mm 热敏打印机工厂定制版", 1466 | "numberFav": 0, 1467 | "numberGoodReputation": 8, 1468 | "numberOrders": 894, 1469 | "numberSells": 872, 1470 | "originalPrice": 800, 1471 | "paixu": 0, 1472 | "pic": "https://cdn.it120.cc/apifactory/2019/03/07/133eb6294e3853ebe4eb8551359a26dc.png", 1473 | "pingtuan": false, 1474 | "pingtuanPrice": 0, 1475 | "recommendStatus": 1, 1476 | "recommendStatusStr": "推荐", 1477 | "shopId": 0, 1478 | "status": 0, 1479 | "statusStr": "上架", 1480 | "stores": 9999984, 1481 | "tags": "打印机", 1482 | "userId": 951, 1483 | "views": 18040, 1484 | "weight": 0 1485 | } 1486 | }, 1487 | "msg": "success" 1488 | } 1489 | ``` 1490 | 1491 | ### 获取商品的限购设置 1492 | 1493 | ```js 1494 | WXAPI.goodsLimitations(goodsId, priceId) 1495 | ``` 1496 | 1497 | 如果商品(列表、详情)信息中 **limitation** 字段为 **true**,说明该商品开启了限购,只有设置中的会员等级用户才可以在约定时间内购买不超过指定数量 1498 | 1499 | 该方法接收2个参数,**goodsId** 参数是必填的,代表商品id; **priceId** 参数非必填,只有在用户购买时候选择了指定的规格尺寸时候才需要传 1500 | 1501 | 你可以根据当前登录用户的会员等级,在商品详情页面进行相应的交互展示 1502 | 1503 | **接口返回示例:** 1504 | 1505 | ```json 1506 | { 1507 | "code": 0, 1508 | "data": [ 1509 | { 1510 | "buyNumbers": 22, 1511 | "duration": 11, 1512 | "goodsId": 145565, 1513 | "id": 6, 1514 | "priceId": 1279085, 1515 | "unit": 0, 1516 | "unitStr": "自然日", 1517 | "userId": 2, 1518 | "userLevelId": 1, 1519 | "userLevelName": "黄金会员" 1520 | }, 1521 | { 1522 | "buyNumbers": 3, 1523 | "duration": 1, 1524 | "goodsId": 145565, 1525 | "id": 2, 1526 | "priceId": 1279084, 1527 | "unit": 2, 1528 | "unitStr": "自然年", 1529 | "userId": 2, 1530 | "userLevelId": 1, 1531 | "userLevelName": "黄金会员" 1532 | }, 1533 | { 1534 | "buyNumbers": 4, 1535 | "duration": 3, 1536 | "goodsId": 145565, 1537 | "id": 1, 1538 | "priceId": 1279084, 1539 | "unit": 0, 1540 | "unitStr": "自然日", 1541 | "userId": 2, 1542 | "userLevelId": 0, 1543 | "userLevelName": "无分组用户" 1544 | } 1545 | ], 1546 | "msg": "success" 1547 | } 1548 | ``` 1549 | 1550 | ### 读取商品可选配件列表 1551 | 1552 | ```js 1553 | WXAPI.goodsAddition(goodsId) 1554 | ``` 1555 | 1556 | 返回数据示例: 1557 | 1558 | ```json 1559 | { 1560 | "code": 0, 1561 | "data": [ 1562 | { 1563 | "id": 7, 1564 | "items": [ 1565 | { 1566 | "id": 3, 1567 | "name": "不辣", 1568 | "pid": 7, 1569 | "price": 0 1570 | }, 1571 | { 1572 | "id": 4, 1573 | "name": "微辣", 1574 | "pid": 7, 1575 | "price": 0 1576 | }, 1577 | { 1578 | "id": 5, 1579 | "name": "多辣", 1580 | "pid": 7, 1581 | "price": 0 1582 | }, 1583 | { 1584 | "id": 6, 1585 | "name": "特辣", 1586 | "pid": 7, 1587 | "price": 0 1588 | } 1589 | ], 1590 | "name": "口味", 1591 | "required": true, 1592 | "type": 0 1593 | }, 1594 | { 1595 | "id": 9, 1596 | "items": [ 1597 | { 1598 | "id": 7, 1599 | "name": "青菜", 1600 | "pid": 9, 1601 | "price": 3 1602 | }, 1603 | { 1604 | "id": 8, 1605 | "name": "土豆", 1606 | "pid": 9, 1607 | "price": 3 1608 | }, 1609 | { 1610 | "id": 9, 1611 | "name": "鸡蛋", 1612 | "pid": 9, 1613 | "price": 5 1614 | }, 1615 | { 1616 | "id": 10, 1617 | "name": "大排", 1618 | "pid": 9, 1619 | "price": 12 1620 | } 1621 | ], 1622 | "name": "加料", 1623 | "required": false, 1624 | "type": 1 1625 | } 1626 | ], 1627 | "msg": "success" 1628 | } 1629 | ``` 1630 | 1631 | 简单说明一下几个参数: 1632 | - required 说明这个配件是否是必选项 1633 | - type 0 代表是单选的;1 代表是可以多选的 1634 | - price 代表选择了该配件以后,需要增加多少费用 1635 | 1636 | ### 获取商品价格「一般用在选择不同规格尺寸后需要实时显示售价」 1637 | 1638 | ```js 1639 | WXAPI.goodsPriceV2(Object object) 1640 | ``` 1641 | 1642 | - token 可选项目,如果传入,将会返回给用户所属会员等级的会员价 1643 | - goodsId 商品id 1644 | - propertyChildIds 参数为用户选择的规格尺寸数据,多个规格尺寸数据用因为逗号分隔,该参数的格式为: 规格id:子属性id,比如: 4:15,2:10 (分别对应了 颜色:红色,内存:256G) 1645 | 1646 | **接口返回示例:** 1647 | 1648 | ```json 1649 | { 1650 | "code": 0, 1651 | "data": { 1652 | "goodsId": 139421, 1653 | "id": 1330668, 1654 | "originalPrice": 566, 1655 | "pingtuanPrice": 0, 1656 | "price": 123, 1657 | "propertyChildIds": "1:1,", 1658 | "propertyChildNames": "颜色:薄荷绿,", 1659 | "score": 0, 1660 | "stores": 99999, 1661 | "userId": 2 1662 | }, 1663 | "msg": "success" 1664 | } 1665 | ``` 1666 | 1667 | ### 获取商品的每日价格&每日库存「适用酒店预订、票务预订类」 1668 | 1669 | ```js 1670 | WXAPI.goodsPriceDaily(goodsId, priceId) 1671 | ``` 1672 | 1673 | > goodsId 为商品id 1674 | > 1675 | > priceId 为选择的商品规格尺寸记录id,无规格尺寸的商品,无需传该参数 1676 | 1677 | **接口返回示例:** 1678 | 1679 | ```json 1680 | { 1681 | "code": 0, 1682 | "data": [ 1683 | { 1684 | "day": "2019-08-14", 1685 | "goodsId": 139421, 1686 | "id": 255, 1687 | "price": 1, 1688 | "stores": 1, 1689 | "userId": 2 1690 | }, 1691 | { 1692 | "day": "2019-08-15", 1693 | "goodsId": 139421, 1694 | "id": 256, 1695 | "price": 1, 1696 | "stores": 1, 1697 | "userId": 2 1698 | } 1699 | ], 1700 | "msg": "success" 1701 | } 1702 | ``` 1703 | 1704 | ### 时段定价-拉取可选的日期 1705 | 1706 | ```js 1707 | WXAPI.goodsTimesDays(goodsId, propertyChildIds) 1708 | ``` 1709 | 1710 | 参数说明: 1711 | 1712 | - goodsId 商品id 1713 | - propertyChildIds 商品的规格尺寸信息,如: 49180:510817,49178:510860, 1714 | 1715 | 如果商品没有规格尺寸,可不传propertyChildIds参数,如果传的话,最后的逗号是必须的 1716 | 1717 | ### 时段定价-拉取某天的所有时段定价信息 1718 | 1719 | ```js 1720 | WXAPI.goodsTimesDayItems(day, goodsId, propertyChildIds) 1721 | ``` 1722 | 1723 | 参数说明: 1724 | 1725 | - day 指定的日期,格式如: 2020-10-12 1726 | - goodsId 商品id 1727 | - propertyChildIds 商品的规格尺寸信息,如: 49180:510817,49178:510860, 1728 | 1729 | 如果商品没有规格尺寸,可不传propertyChildIds参数,如果传的话,最后的逗号是必须的 1730 | 1731 | ### 计算物流/快递模板费用计算方法 1732 | 1733 | ```js 1734 | WXAPI.goodsPriceFreight(Object object) 1735 | ``` 1736 | 1737 | > 具体参数请查阅接口文档 1738 | > 1739 | > 提供快递地址,本方法可计算出本次会计的计费方式 1740 | 1741 | *比如: a 件(重量)内 x 元,之后每增加 b 件(重量)额外加收 y 元* 1742 | 1743 | **接口返回示例:** 1744 | 1745 | ```json 1746 | { 1747 | "code": 0, 1748 | "data": { 1749 | "firstNumber": 1, 1750 | "addAmount": 1, 1751 | "firstAmount": 1, 1752 | "addNumber": 1 1753 | }, 1754 | "msg": "success" 1755 | } 1756 | ``` 1757 | 1758 | ### 拉取当前会员可以显示的折扣信息 1759 | 1760 | ```js 1761 | WXAPI.goodsRebate(token, goodsId) 1762 | ``` 1763 | 1764 | > token 为当前登录用户的登录 token 1765 | > 1766 | > goodsId 为商品id 1767 | 1768 | **接口返回示例:** 1769 | 1770 | ```json 1771 | { 1772 | "code": 0, 1773 | "data": 10, 1774 | "msg": "success" 1775 | } 1776 | ``` 1777 | *上面的 10 意思就是 10折,也就是不打折的意思;* 1778 | 1779 | ### 获取商品的评价 1780 | 1781 | ```js 1782 | WXAPI.goodsReputation(Object object) 1783 | ``` 1784 | 1785 | > 读取当前商品用户的所有评价数据 1786 | > 1787 | > 具体参数说明请查阅接口文档 1788 | 1789 | **接口返回示例:** 1790 | 1791 | ```json 1792 | { 1793 | "code": 0, 1794 | "data": [ 1795 | { 1796 | "goods": { 1797 | "amount": 600, 1798 | "dateReputation": "2019-07-23 14:20:00", 1799 | "goodReputation": 2, 1800 | "goodReputationRemark": "系统默认好评", 1801 | "goodReputationStr": "好评", 1802 | "goodsId": 122843, 1803 | "goodsName": "WIFI 58mm 热敏打印机工厂定制版", 1804 | "id": 372497, 1805 | "number": 1, 1806 | "orderId": 325214, 1807 | "pic": "https://cdn.it120.cc/apifactory/2019/03/07/133eb6294e3853ebe4eb8551359a26dc.png", 1808 | "score": 0, 1809 | "uid": 762217, 1810 | "userId": 951 1811 | }, 1812 | "user": { 1813 | "avatarUrl": "https://wx.qlogo.cn/mmopen/vi_32/Q0j4TwGTfTLJpYuZ0hOPlEzOXUpibibAtELrHnoRNib5tiaicpb1ZfZT8FHWcJulH189UhmaxicKKia22LXnwt8ibLYCVw/132", 1814 | "city": "", 1815 | "dateAdd": "2019-03-17 10:12:22", 1816 | "dateLogin": "2019-07-09 14:40:09", 1817 | "id": 762217, 1818 | "ipAdd": "118.114.6.203", 1819 | "ipLogin": "171.209.166.143", 1820 | "isIdcardCheck": false, 1821 | "isSeller": false, 1822 | "levelRenew": false, 1823 | "mobile": "13688059703", 1824 | "nick": "阳大锤", 1825 | "province": "Dublin", 1826 | "source": 0, 1827 | "sourceStr": "小程序", 1828 | "status": 0, 1829 | "statusStr": "默认" 1830 | } 1831 | } 1832 | ], 1833 | "msg": "success" 1834 | } 1835 | ``` 1836 | 1837 | ### 商品购买动态 1838 | 1839 | 读取最近的成交信息 1840 | 1841 | ```js 1842 | WXAPI.goodsDynamic(type) 1843 | ``` 1844 | 1845 | type: 0 下单; 1 支付 1846 | 1847 | ### 用户发布商品 1848 | 1849 | 适用于C2C类业务模式,用户可以发布自己的商品,管理员审核以后即可上架销售 1850 | 1851 | ```js 1852 | WXAPI.pushNewGoods(Object object) 1853 | ``` 1854 | 1855 | ### 删除自己发布的商品 1856 | 1857 | ```js 1858 | WXAPI.deleteMyGoods(token, id) 1859 | ``` 1860 | 1861 | - token 登陆后获得的登陆凭证 1862 | - id 商品id 1863 | 1864 | ## 我的购买历史商品 1865 | 1866 | ### 获取购买过的历史商品列表 1867 | 1868 | ```js 1869 | WXAPI.myBuyGoodsHis(Object object) 1870 | ``` 1871 | 1872 | ### 删除购买记录 1873 | 1874 | ```js 1875 | WXAPI.myBuyGoodsHisDelete(token, id, goodsId) 1876 | ``` 1877 | 1878 | id 参数为列表数据中的记录id 1879 | 1880 | goodsId 为商品id 1881 | 1882 | 以上2个参数至少要填写1个 1883 | 1884 | ## 商品收藏 1885 | 1886 | ### 收藏某个商品 1887 | 1888 | ```js 1889 | WXAPI.goodsFavPut(token, goodsId) 1890 | ``` 1891 | 1892 | **接口返回示例:** 1893 | 1894 | ```json 1895 | { 1896 | "code": 0, 1897 | "msg": "success" 1898 | } 1899 | ``` 1900 | 1901 | ### 检测当前商品是否已被收藏 1902 | 1903 | ```js 1904 | WXAPI.goodsFavCheck(token, goodsId) 1905 | ``` 1906 | 1907 | **接口返回示例:** 1908 | 1909 | *已收藏* 1910 | ```json 1911 | { 1912 | "code": 0, 1913 | "data": "已收藏" 1914 | } 1915 | ``` 1916 | 1917 | *未收藏* 1918 | ```json 1919 | { 1920 | "code": -1, 1921 | "data": "未收藏" 1922 | } 1923 | ``` 1924 | 1925 | ### 获取收藏的商品 1926 | 1927 | ```js 1928 | WXAPI.goodsFavList(Object object) 1929 | ``` 1930 | 1931 | > 具体参数说明请查阅接口文档 1932 | > 1933 | > 支持分页读取、关键词搜索商品 1934 | 1935 | **接口返回示例:** 1936 | 1937 | ```json 1938 | { 1939 | "code": 0, 1940 | "data": [ 1941 | { 1942 | "dateAdd": "2019-08-14 10:53:44", 1943 | "dateUpdate": "2019-08-14 11:01:02", 1944 | "goodsId": 139421, 1945 | "goodsName": "111", 1946 | "id": 12537, 1947 | "pic": "https://cdn.it120.cc/apifactory/2019/05/10/fa52e312-c8a9-4558-8280-7d67224b6f67.png" 1948 | } 1949 | ], 1950 | "msg": "success" 1951 | } 1952 | ``` 1953 | 1954 | ### 删除收藏的某个商品 1955 | 1956 | ```js 1957 | WXAPI.goodsFavDelete(token, id, goodsId) 1958 | ``` 1959 | 1960 | > id 参数为收藏列表数据中的记录id 1961 | > 1962 | > goodsId 为商品id 1963 | > 1964 | > 以上2个参数至少要填写1个 1965 | 1966 | **接口返回示例:** 1967 | 1968 | ```json 1969 | { 1970 | "code": 0, 1971 | "msg": "success" 1972 | } 1973 | ``` 1974 | 1975 | ## 购物车 1976 | 1977 | ### 读取购物车数据 1978 | 1979 | ```js 1980 | WXAPI.shippingCarInfo(token, type) 1981 | ``` 1982 | 1983 | - type 自定义购物车类型,可用来区分多个购物车 1984 | 1985 | 获取当前购物车的数据,数据结构如下: 1986 | 1987 | ```json 1988 | { 1989 | "code": 0, 1990 | "data": { 1991 | "number": 6, 1992 | "score": 0, 1993 | "price": 700, 1994 | "items": [ 1995 | { 1996 | "key": "e65eb6ba3701c107cdd1eb43da31f6e2", 1997 | "goodsId": 122843, 1998 | "number": 1, 1999 | "price": 600, 2000 | "score": 0, 2001 | "pic": "https://cdn.it120.cc/apifactory/2019/03/07/133eb6294e3853ebe4eb8551359a26dc.png", 2002 | "name": "WIFI 58mm 热敏打印机工厂定制版", 2003 | "logisticsId": 386 2004 | }, 2005 | { 2006 | "key": "2131619ef0f15d1991ad95e7bd158de8", 2007 | "goodsId": 235853, 2008 | "number": 2, 2009 | "sku": [ 2010 | { 2011 | "optionId": 869, 2012 | "optionValueId": 1698, 2013 | "optionName": "花色", 2014 | "optionValueName": "粉色叶子" 2015 | }, 2016 | { 2017 | "optionId": 871, 2018 | "optionValueId": 1589, 2019 | "optionName": "颜色", 2020 | "optionValueName": "黄色" 2021 | } 2022 | ], 2023 | "price": 50, 2024 | "score": 0, 2025 | "pic": "https://dcdn.it120.cc/2019/12/06/ebf49ac6-4521-4bcc-92fd-8bbbd4131167.jpg", 2026 | "name": "3分钟沙漏「儿童刷牙计时器」", 2027 | "logisticsId": 386 2028 | }, 2029 | { 2030 | "key": "c1212386b114f05e62bf2441d03e4440", 2031 | "goodsId": 235853, 2032 | "number": 3, 2033 | "sku": [ 2034 | { 2035 | "optionId": 869, 2036 | "optionValueId": 1699, 2037 | "optionName": "花色", 2038 | "optionValueName": "淡灰小船" 2039 | }, 2040 | { 2041 | "optionId": 871, 2042 | "optionValueId": 1588, 2043 | "optionName": "颜色", 2044 | "optionValueName": "红色" 2045 | } 2046 | ], 2047 | "price": 50, 2048 | "score": 0, 2049 | "pic": "https://dcdn.it120.cc/2019/12/06/ebf49ac6-4521-4bcc-92fd-8bbbd4131167.jpg", 2050 | "name": "3分钟沙漏「儿童刷牙计时器」", 2051 | "logisticsId": 386 2052 | } 2053 | ] 2054 | }, 2055 | "msg": "success" 2056 | } 2057 | ``` 2058 | 2059 | ### 添加商品到购物车 2060 | 2061 | ```js 2062 | WXAPI.shippingCarInfoAddItem(token, goodsId, number, sku, addition, type) 2063 | ``` 2064 | 2065 | - goodsId 商品编号,数字类型 2066 | - number 购买数量 2067 | - sku 商品的规格尺寸信息,json数组,示例如下: 2068 | 2069 | ```json 2070 | [ 2071 | { 2072 | "optionId": 869, 2073 | "optionValueId": 1699 2074 | }, 2075 | { 2076 | "optionId": 871, 2077 | "optionValueId": 1588 2078 | } 2079 | ] 2080 | ``` 2081 | 2082 | - addition商品的可选配件信息,json数组,示例如下: 2083 | 2084 | ```json 2085 | [ 2086 | { 2087 | "id": 869, 2088 | "pid": 1699 2089 | }, 2090 | { 2091 | "id": 871, 2092 | "pid": 1588 2093 | } 2094 | ] 2095 | ``` 2096 | 2097 | - type 自定义购物车类型,可用来区分多个购物车 2098 | 2099 | ### 修改购物车商品数量 2100 | 2101 | ```js 2102 | WXAPI.shippingCarInfoModifyNumber(token, key, number, type) 2103 | ``` 2104 | 2105 | 修改购物车中key对应的那条记录的商品数量为number指定的数值 2106 | - token 用户登陆凭证 2107 | - key 购物车中记录条目的key编号 2108 | - number 商品数量 2109 | - type 自定义购物车类型,可用来区分多个购物车 2110 | 2111 | ### 删除购物车中某条记录 2112 | 2113 | ```js 2114 | WXAPI.shippingCarInfoRemoveItem(token, key, type) 2115 | ``` 2116 | 2117 | 删除购物车中key对应的那条记录,多个key,请使用英文多逗号隔开即可实现批量删除 2118 | - token 用户登陆凭证 2119 | - key 购物车中记录条目的key编号 2120 | - type 自定义购物车类型,可用来区分多个购物车 2121 | 2122 | ### 购物车中某条记录选中/取消选中 2123 | 2124 | ```js 2125 | WXAPI.shippingCartSelected(token, key, selected, type) 2126 | ``` 2127 | 2128 | - 多个key,请使用英文多逗号隔开即可实现批量操作 2129 | - selected 为 true / false,代表选中或者不选中 2130 | - type 自定义购物车类型,可用来区分多个购物车 2131 | 2132 | 2133 | ### 一键清空购物车 2134 | 2135 | ```js 2136 | WXAPI.shippingCarInfoRemoveAll(token, type) 2137 | ``` 2138 | 2139 | - token 用户登陆凭证 2140 | - type 自定义购物车类型,可用来区分多个购物车 2141 | 2142 | ## 订单管理 2143 | 2144 | ### 创建订单 2145 | 2146 | ```js 2147 | WXAPI.orderCreate(Object object) 2148 | ``` 2149 | 2150 | > 具体参数说明请查看api接口文档 2151 | 2152 | **主要参数说明:** 2153 | 2154 | 1. calculate 2155 | 2156 | *传 true 可以实现预下单,预下单不会真正下单,而是会返回是否允许下单,以及费用[货款、运费]金额的计算* 2157 | 2158 | 2. deductionScore 2159 | 2160 | *这个参数指定本次订单使用多少积分进行抵扣;你需要先通过积分抵扣规则、读取资产2个方法自行计算好需要抵扣的积分,订单生产后会自动计算剩余应该支付的金额* 2161 | 2162 | ### 关闭订单 2163 | 2164 | ```js 2165 | WXAPI.orderClose(token, orderId) 2166 | ``` 2167 | 2168 | ### 删除订单 2169 | 2170 | ```js 2171 | WXAPI.orderDelete(token, orderId) 2172 | ``` 2173 | 2174 | > 用户删除订单,只是用户自己看不到,管理员在后台还是可以看到该订单的 2175 | 2176 | ### 支付订单[使用余额] 2177 | 2178 | ```js 2179 | WXAPI.orderPay(token, orderId) 2180 | ``` 2181 | 2182 | > 使用用户的钱包余额完成订单的支付 2183 | > 2184 | > 如果使用微信在线支付完成订单支付,请回顾 「微信在线支付章节」 ,通过传递 nextAction 参数实现 2185 | 2186 | ### 确认收货 2187 | 2188 | ```js 2189 | WXAPI.orderDelivery(token, orderId) 2190 | ``` 2191 | 2192 | > 管理员针对下单进行发货操作,用户在确认收到包裹检查无误后,通过该方法来确认本次订单的收货 2193 | > 2194 | > 确认收货后,订单将进入评价阶段,用户可实事求是的针对本次购物体验进行评价、买家秀截图等等 2195 | 2196 | ### 订单核销 2197 | 2198 | ```js 2199 | WXAPI.orderHXV2(Object object) 2200 | ``` 2201 | 2202 | 支持以下参数: 2203 | - token 传当前核销人员的登陆token 2204 | - hxNumber 核销码,商家依据核销码进行核销 2205 | - extJsonStr 扩展属性,会出现在订单详情的扩展属性信息中 2206 | 2207 | 订单默认不会生成核销码,如果需要开启核销功能,请在创建订单方法参数中增加 isCanHx=true 2208 | 2209 | 核销后,订单即交易成功,转为待评价状态 2210 | 2211 | ### 获取所有订单 2212 | 2213 | ```js 2214 | WXAPI.orderList(Object object) 2215 | ``` 2216 | 2217 | > 具体参数请查阅api接口文档 2218 | > 2219 | > 可根据订单状态、好差评等条件筛选进行分页显示 2220 | 2221 | ### 订单详情 2222 | 2223 | ```js 2224 | WXAPI.orderDetail(token, id, hxNumber) 2225 | ``` 2226 | 2227 | 读取订单详情数据:订单信息、购物清单、订单日志记录、物流跟踪信息、库存明细、扩展属性 2228 | 2229 | 根据你自己的需要进行UI设计及合理展示 2230 | 2231 | 订单id 和 核销码同时传的话,核销码优先 2232 | 2233 | ### 评价接口 2234 | 2235 | ```js 2236 | WXAPI.orderReputation(Object object) 2237 | ``` 2238 | 2239 | > 订单评价,进行 好、中、差评;留言备注;截图买家秀 2240 | > 2241 | > 具体参数请查阅接口文档说明 2242 | 2243 | ### 申请退换货[售后] 2244 | 2245 | ```js 2246 | WXAPI.refundApply(Object object) 2247 | ``` 2248 | 2249 | > 用户维权通道,通过该方法实现订单的退款、退货、换货等售后处理 2250 | > 2251 | > 具体参数请查阅接口文档说明 2252 | 2253 | ### 申请退换货详情 2254 | 2255 | ```js 2256 | WXAPI.refundApplyDetail(token, orderId) 2257 | ``` 2258 | 2259 | > 用以展示退换货详细数据 2260 | 2261 | ### 撤销退换货申请 2262 | 2263 | ```js 2264 | WXAPI.refundApplyCancel(token, orderId) 2265 | ``` 2266 | 2267 | > 撤销 / 取消 维权 2268 | 2269 | ### 拉取某订单的所有售后记录 2270 | 2271 | ```js 2272 | WXAPI.orderRefunds(token, orderId) 2273 | ``` 2274 | 2275 | > 一个订单允许多次退换货,该方法可以拉取到所有的售后记录 2276 | 2277 | ## 虚拟物品交易[知识付费] 2278 | 2279 | ### 商品列表 2280 | 2281 | ```js 2282 | WXAPI.virtualTraderList(Object object) 2283 | ``` 2284 | 2285 | 建议该功能结合 CMS 系统一起使用,这样可以实现更好的购买前的信息展示,给用户足够的参考继而考虑购买 2286 | 2287 | ### 商品详情 2288 | 2289 | ```js 2290 | WXAPI.virtualTraderDetail(token, id) 2291 | ``` 2292 | 2293 | 读取商品详情数据 2294 | 2295 | 购买后,才会返回付费属性、付费详情说明 2296 | 2297 | 所以你可以使用该功能来实现购后阅读、购后播放的应用 2298 | 2299 | ### 购买商品 2300 | 2301 | ```js 2302 | WXAPI.virtualTraderBuy(token, id) 2303 | ``` 2304 | 2305 | 使用用户余额购买知识付费商品 2306 | 2307 | 如何使用在线支付,请查看在线支付功能中 nextAction 的使用说明 2308 | 2309 | ### 我的购买记录 2310 | 2311 | ```js 2312 | WXAPI.virtualTraderMyBuyLogs(Object object) 2313 | ``` 2314 | 2315 | 我购买过的所有知识付费记录 2316 | 2317 | # 根据视频编号读取视频详情 2318 | 2319 | > WXAPI.videoDetail(videoId) 2320 | 2321 | # 营销工具 2322 | 2323 | ## 优惠券管理 2324 | 2325 | ### 获取系统所有优惠券列表 2326 | 2327 | ```js 2328 | WXAPI.coupons(Object object) 2329 | ``` 2330 | 2331 | ### 查看优惠券详情 2332 | 2333 | ```js 2334 | WXAPI.couponDetail(id) 2335 | ``` 2336 | 2337 | ### 领取优惠券 2338 | 2339 | ```js 2340 | WXAPI.fetchCoupons(Object object) 2341 | ``` 2342 | 2343 | ### 我的所有优惠券 2344 | 2345 | ```js 2346 | WXAPI.myCoupons(Object object) 2347 | ``` 2348 | 2349 | ### 拉取优惠券合成规则 2350 | 2351 | ```js 2352 | WXAPI.mergeCouponsRules() 2353 | ``` 2354 | 2355 | ### 优惠券合成 2356 | 2357 | ```js 2358 | WXAPI.mergeCoupons(Object object) 2359 | ``` 2360 | 2361 | ### 赠送优惠券给他人 2362 | 2363 | ```js 2364 | WXAPI.sendCoupons(Object object) 2365 | ``` 2366 | 2367 | ### 使用动态口令领取优惠券 2368 | 2369 | ```js 2370 | WXAPI.exchangeCoupons(token, number, pwd, extJsonStr) 2371 | ``` 2372 | 2373 | 使用动态口令兑换优惠券,兑换后卡密失效,请妥善保管 2374 | 2375 | 参数说明: 2376 | - token 当前登陆用户的token 2377 | - number 动态口令的号码 2378 | - pwd 动态口令的密码 2379 | - extJsonStr [选填] 扩展属性,必须是 Json 格式的数据 2380 | 2381 | 2382 | 2383 | ## 商品砍价 2384 | 2385 | ### 获取商品砍价设置 2386 | 2387 | ```js 2388 | WXAPI.kanjiaSet(goodsId) 2389 | ``` 2390 | 2391 | 读取某个商品的砍价设置信息:总份数、底价、每次能砍掉的(随机)金额以及开始结束时间 2392 | 同时读取多个商品的设置,请用英文逗号分隔开就行 2393 | 2394 | **接口返回示例:** 2395 | 2396 | ```json 2397 | { 2398 | "code": 0, 2399 | "data": [{ 2400 | "dateAdd": "2019-08-14 15:35:29", 2401 | "dateEnd": "2019-08-31 15:35:24", 2402 | "helpPriceMax": 56, 2403 | "helpPriceMin": 12, 2404 | "id": 1067, 2405 | "minPrice": 8, 2406 | "number": 999, 2407 | "numberBuy": 0, 2408 | "originalPrice": 888, 2409 | "status": 0, 2410 | "statusStr": "正常" 2411 | }], 2412 | "msg": "success" 2413 | } 2414 | ``` 2415 | 2416 | **上面示例接口返回数据中的 id 非常关键,下面诸多砍价方法中使用到的 kjid 参数就是这个值 1067** 2417 | 2418 | **为什么下面的砍价方法要以 kjid 为参数,而不用商品id为参数呢?** 2419 | 2420 | *那是因为,同一个商品可能会在后台发布多个砍价项目,有的底价低但是砍价难度大需要更多的人帮忙;有的底价高但是比较容易砍到底价;甚至会根据开始/结束时间不同同一个商品设置好几场同时进行砍价* 2421 | 2422 | ### 发起[创建]砍价,继而邀请好友来帮自己砍到底价 2423 | 2424 | ```js 2425 | WXAPI.kanjiaJoin(token, kjid) 2426 | ``` 2427 | 2428 | > 每个用户针对同一个 kjid 只能参与一次,多次调用本方法将返回上一次砍价的信息 2429 | > 2430 | > 如果用户对上次砍价结果不太满意,可以调用下面的 **clear** 方法,清空上一次砍价记录,重新发起砍价 2431 | 2432 | **接口返回示例:** 2433 | 2434 | ```json 2435 | { 2436 | "code": 0, 2437 | "data": { 2438 | "curPrice": 888, 2439 | "goodsId": 139421, 2440 | "kjId": 1067, 2441 | "minPrice": 8, 2442 | "uid": 979527 2443 | }, 2444 | "msg": "success" 2445 | } 2446 | ``` 2447 | 2448 | ### 我发起[创建]的砍价详情 2449 | 2450 | ```js 2451 | WXAPI.kanjiaMyJoinInfo(token, kjid) 2452 | ``` 2453 | 2454 | > 查看我发起的砍价目前的进展[进度]情况 2455 | > 2456 | > 也可以作为判断是否有参与砍价的依据 2457 | 2458 | **接口返回示例:** 2459 | 2460 | ```json 2461 | { 2462 | "code": 0, 2463 | "data": { 2464 | "curPrice": 888, 2465 | "dateAdd": "2019-08-14 15:46:22", 2466 | "dateUpdate": "2019-08-14 15:46:22", 2467 | "goodsId": 139421, 2468 | "helpNumber": 0, 2469 | "kjId": 1067, 2470 | "minPrice": 8, 2471 | "status": 0, 2472 | "statusStr": "进行中", 2473 | "uid": 979527 2474 | }, 2475 | "msg": "success" 2476 | } 2477 | ``` 2478 | 2479 | ### 放弃上一次砍价 2480 | 2481 | ```js 2482 | WXAPI.kanjiaClear(token, kjid) 2483 | ``` 2484 | 2485 | > 因为每个用户针对同一个 kjid 只能参与一次,如果用户希望再次发起砍价,则必须要先放弃前一次砍价才能进行 2486 | > 2487 | > 本次操作后,你针对当前 kjid 将查不到砍价记录,砍价数据清空,你可重新调用 **kanjiaJoin** 方法创建一个新的砍价 2488 | 2489 | ### 砍价详情 2490 | 2491 | ```js 2492 | WXAPI.kanjiaDetail(kjid, joiner) 2493 | ``` 2494 | 2495 | > joiner 参数为发起[创建]砍价的那个用户的 uid,在上述例子中,joiner = 979527 2496 | > 2497 | > 可查看某人创建的砍价的进度情况,看看多少人参与、目前的价格砍到多少了 2498 | 2499 | **接口返回示例:** 2500 | 2501 | ```json 2502 | { 2503 | "code": 0, 2504 | "data": { 2505 | "kanjiaInfo": { 2506 | "curPrice": 888, 2507 | "dateAdd": "2019-08-14 15:46:22", 2508 | "dateUpdate": "2019-08-14 15:46:22", 2509 | "goodsId": 139421, 2510 | "helpNumber": 0, 2511 | "kjId": 1067, 2512 | "minPrice": 8, 2513 | "status": 0, 2514 | "statusStr": "进行中", 2515 | "uid": 979527 2516 | }, 2517 | "joiner": { 2518 | "nick": "gooking", 2519 | "avatarUrl": "https://wx.qlogo.cn/mmopen/vi_32/DYAIOgq83eriagnYJN3GtiaruhqTFkdpYHtQicwLiaFrwbuSInE7HN7UGw2icxPm3jibWrX9ezXROl7Gn2bHGic4nJbsw/132" 2520 | }, 2521 | "helps": [] 2522 | }, 2523 | "msg": "success" 2524 | } 2525 | ``` 2526 | 2527 | ### 帮好友砍价 2528 | 2529 | ```js 2530 | WXAPI.kanjiaHelp(token, kjid, joiner, remark) 2531 | ``` 2532 | 2533 | > 帮助好友砍价,调用该方法后,将使得好友的当前价格越来越接近底价 2534 | > 2535 | > joiner 参数为发起[创建]砍价的那个用户的 uid,在上述例子中,joiner = 979527 2536 | > 2537 | > 被砍到底价、或者截止时间到期后,你将无法再帮助好友进行砍价 2538 | 2539 | **接口返回示例:** 2540 | 2541 | ```json 2542 | { 2543 | "code": 0, 2544 | "data": { 2545 | "cutPrice": 26.39, 2546 | "goodsId": 139421, 2547 | "remark": "记得请我吃饭", 2548 | "uid": 979527 2549 | }, 2550 | "msg": "success" 2551 | } 2552 | ``` 2553 | 2554 | *每个用户只能帮忙砍价一次,多次帮忙砍价将返回之前砍价的数据* 2555 | 2556 | ### 查询我帮好友砍掉的金额 2557 | 2558 | ```js 2559 | WXAPI.kanjiaHelpDetail(token, kjid, joiner) 2560 | ``` 2561 | 2562 | > 查询针对当前 kjid ,我帮忙砍掉的金额 2563 | > 2564 | > joiner 参数为发起[创建]砍价的那个用户的 uid,在上述例子中,joiner = 979527 2565 | 2566 | **接口返回示例:** 2567 | 2568 | ```json 2569 | { 2570 | "code": 0, 2571 | "data": { 2572 | "cutPrice": 26.39, 2573 | "dateAdd": "2019-08-14 16:31:45", 2574 | "goodsId": 139421, 2575 | "remark": "记得请我吃饭", 2576 | "uid": 979527 2577 | }, 2578 | "msg": "success" 2579 | } 2580 | ``` 2581 | 2582 | ## 拼团功能 2583 | 2584 | ### 获取某一个商品的拼团配置 2585 | 2586 | ```js 2587 | WXAPI.pingtuanSet(goodsId) 2588 | ``` 2589 | 2590 | > 读取团购的几个重要设置:几人成团、超时时间、超时未成团后如何退款等等 2591 | 2592 | **接口返回示例:** 2593 | 2594 | ```json 2595 | { 2596 | "code": 0, 2597 | "data": { 2598 | "dateAdd": "2018-04-27 17:39:49", 2599 | "dateEnd": "2028-05-12 17:39:59", 2600 | "id": 2, 2601 | "numberDoing": 1, 2602 | "numberPersion": 2, 2603 | "numberSucccess": 0, 2604 | "refundType": 0, 2605 | "refundTypeStr": "用户钱包余额", 2606 | "status": 0, 2607 | "statusStr": "正常", 2608 | "timeoutHours": 24 2609 | }, 2610 | "msg": "success" 2611 | } 2612 | ``` 2613 | 2614 | ### 批量获取一组商品的拼团配置 2615 | 2616 | ```js 2617 | WXAPI.pingtuanSets(goodsIdArray) 2618 | ``` 2619 | 2620 | > 针对上面方法的补充,在有必要的场合可以一次性的读取多个商品的团购配置信息 2621 | > 2622 | > goodsIdArray 为商品ID的数组: [1,2,3,4,5] 2623 | 2624 | **接口返回示例:** 2625 | 2626 | ```json 2627 | { 2628 | "code": 0, 2629 | "data": [ 2630 | { 2631 | "dateAdd": "2019-08-15 07:57:19", 2632 | "dateEnd": "2029-08-15 07:57:16", 2633 | "goodsId": 145565, 2634 | "id": 1569, 2635 | "numberDoing": 0, 2636 | "numberPersion": 2, 2637 | "numberSucccess": 0, 2638 | "refundType": 0, 2639 | "refundTypeStr": "用户钱包余额", 2640 | "status": 0, 2641 | "statusStr": "正常", 2642 | "timeoutHours": 24 2643 | }, 2644 | { 2645 | "dateAdd": "2018-04-27 17:39:49", 2646 | "dateEnd": "2028-05-12 17:39:59", 2647 | "goodsId": 139421, 2648 | "id": 2, 2649 | "numberDoing": 1, 2650 | "numberPersion": 2, 2651 | "numberSucccess": 0, 2652 | "refundType": 0, 2653 | "refundTypeStr": "用户钱包余额", 2654 | "status": 0, 2655 | "statusStr": "正常", 2656 | "timeoutHours": 24 2657 | } 2658 | ], 2659 | "msg": "success" 2660 | } 2661 | ``` 2662 | 2663 | ### 读取商品的默认团信息 2664 | 2665 | ```js 2666 | WXAPI.goodsDefaultPingtuan(goodsId) 2667 | ``` 2668 | 2669 | 商品设置团购信息以后,系统会开一个默认团,用户可以去参与这个默认团 2670 | 2671 | ### 拉取商品多级拼团价格信息 2672 | 2673 | ```js 2674 | WXAPI.pingtuanMultilevel(goodsId) 2675 | ``` 2676 | 2677 | 如果设置了多级拼团价格,通过该方法,可以拉取到所有到阶段、销量、价格信息 2678 | 2679 | ### 开团[我发起一个团购,我是团长,让别人来参加] 2680 | 2681 | ```js 2682 | WXAPI.pingtuanOpen(token, goodsId) 2683 | ``` 2684 | 2685 | > 开团成功后,团长要先自己下单并且完成支付,团才算是真正开启成功! 2686 | > 2687 | > 仅开团,团长自己不支付,后台可以看见开团信息,但是其他用户看不到该团购,团长完成支付后才可以看见并参与 2688 | 2689 | **接口返回示例:** 2690 | 2691 | ```json 2692 | { 2693 | "code": 0, 2694 | "data": { 2695 | "dateEnd": "2019-08-16 07:45:34", 2696 | "goodsId": 139421, 2697 | "id": 7380, 2698 | "pingtuanId": 2 2699 | }, 2700 | "msg": "success" 2701 | } 2702 | ``` 2703 | 2704 | **上面的 id 非常重要, 7380 代表的是针对 pingtuanId=2 这个团购设置下的具体某一个团购!针对后台配置的某一个团购设置(pingtuanId=2),可以有N个进行中的拼团,我们暂且把这个 id=7380叫做团号吧~** 2705 | 2706 | *一定要明确区分,拼团ID 和 团号的区别,也就是上面 pingtuanId 和 id 的区别,否则下面的方法使用过程中恒容易出错!* 2707 | 2708 | ### 获取某个商品当前进行中的所有拼团 2709 | 2710 | ```js 2711 | WXAPI.pingtuanList(Object object) 2712 | ``` 2713 | 2714 | > 拉取某个商品当前所有的开团列表数据,用于展示当前商品的多组进行中/已完成的团购数据,你也可以选择其中一个团购加入购买以便可以早点成团 2715 | > 2716 | > 当然你也可以自己新开一个团购队列,让别人来参与,这个时候本方法将能多返回你刚刚开的团的信息 **团长必须完成支付后才能在这里显示** 2717 | 2718 | ### 获取某个团购的参与用户列表 2719 | 2720 | ```js 2721 | WXAPI.pingtuanJoinUsers(tuanId) 2722 | ``` 2723 | 2724 | > tuanId 为上述例子中的团号,也就是 7380,不是 2 2725 | 2726 | ### 读取我参与过的所有团购记录 2727 | 2728 | ```js 2729 | WXAPI.pingtuanMyJoined(Object object) 2730 | ``` 2731 | 2732 | > 具体参数请查阅接口文档 2733 | > 2734 | > 用以展示在个人中心 --> 我参与的所有团购,可分页 2735 | 2736 | ## 三级分销 2737 | 2738 | ### 直接购买分销商资格 2739 | 2740 | ```js 2741 | WXAPI.fxSetting() 2742 | ``` 2743 | 2744 | 读取后台的分销设置 2745 | 2746 | ### 直接购买分销商资格 2747 | 2748 | ```js 2749 | WXAPI.fxBuy(token) 2750 | ``` 2751 | 2752 | 无需管理员审核,用户直接购买分销商身份,支付后立即成为分销商 2753 | 2754 | ### 申请成为分销商 2755 | 2756 | ```js 2757 | WXAPI.fxApply(token, name, mobile) 2758 | ``` 2759 | 2760 | ### 申请进度查询 2761 | 2762 | ```js 2763 | WXAPI.fxApplyProgress(token) 2764 | ``` 2765 | 2766 | ### 团队管理 2767 | 2768 | ```js 2769 | WXAPI.fxMembers(Object object) 2770 | ``` 2771 | 2772 | > 查看你的1级/2级团队列表 2773 | > 2774 | > 具体参数说明请查阅接口文档 2775 | 2776 | *你的一级团队完成销售,你将可获得二级返佣佣金奖励;你的二级团队完成销售,你将可获得三级返佣佣金奖励* 2777 | 2778 | ### 佣金记录[返佣明细] 2779 | 2780 | ```js 2781 | WXAPI.fxCommisionLog(Object object) 2782 | ``` 2783 | 2784 | ### 分销商累计销售额排行榜 2785 | 2786 | ```js 2787 | WXAPI.fxSaleroomRankTotal(page, pageSize) 2788 | ``` 2789 | 2790 | 系统参数中添加开关类型参数 statistics_saleroom_open 才有效 2791 | 2792 | ### 分销商某天的销售额排行榜 2793 | 2794 | ```js 2795 | WXAPI.fxSaleroomRankDaily(page, pageSize, day) 2796 | ``` 2797 | 2798 | 系统参数中添加开关类型参数 statistics_saleroom_open 才有效 2799 | 2800 | ### 名下团队成员人数统计 2801 | 2802 | ```js 2803 | WXAPI.fxMembersStatistics(token) 2804 | ``` 2805 | 2806 | 接口返回如下数据: 2807 | - totleFans 全部粉丝数量 2808 | - totleChildFxs 全部分销商数量 2809 | - totleChildFxsLevel1 全部直属分销商数量 2810 | - totleChildFxsLevel2 全部间接分销商数量 2811 | 2812 | ### 我的佣金统计 2813 | 2814 | ```js 2815 | WXAPI.fxMyCommisionStatistics(token, days) 2816 | ``` 2817 | 参数说明: 2818 | - token 当前用户的登陆token 2819 | - days 统计的日期,多个日期用英文逗号分割,0 代表全部,日期格式如: 2820 | 2821 | 0,2021,202107,20210707 分别可以统计全部、某年、某月、某天 2822 | 2823 | ### 用户绑定分销商 2824 | 2825 | ```js 2826 | WXAPI.bindSeller(Object object) 2827 | ``` 2828 | 2829 | 参数说明: 2830 | - token 当前登陆的token 2831 | - uid 对方用户编号,可填分销商的用户编号 2832 | - traceSeller 这是一个 boolean 参数,传true的话,如果 uid 不是分销商,那么将会绑定到 uid 这个用户的上级分销商名下 2833 | 2834 | ## 合伙人/团队长/ 二级分销 2835 | 2836 | ### 读取合伙人分销设置 2837 | 2838 | ```js 2839 | WXAPI.partnerSetting() 2840 | ``` 2841 | 2842 | - isOpen 功能是否开启 2843 | - pPartner 合伙人返佣比例 2844 | - pLeader 团队长返佣比例 2845 | - priceLeader 团队长购买费用,可购买升级 2846 | - leaderUserLevelId 升级为团队长自动绑定会员等级 2847 | - memberUserLevelId 升级为团队成员自动绑定会员等级 2848 | 2849 | ### 用户绑定团队长成为团队成员 2850 | 2851 | ```js 2852 | WXAPI.partnerBindTeamLeader(token, uid) 2853 | ``` 2854 | 2855 | - uid 为团队长的用户编号 2856 | 2857 | 绑定后即可加入团队长所在的团队 2858 | 2859 | ### 团队成员购买升级为团队长 2860 | 2861 | ```js 2862 | WXAPI.partnerBuyTeamLeader(token) 2863 | ``` 2864 | 2865 | 购买成功后,立即成为团队长; 2866 | 2867 | 本接口是使用用户余额购买团队长,如果希望使用微信支付方式购买,请参考微信支付接口,通过设置 nextAction 实现在线支付购买团队长。 2868 | 2869 | ### 团队成员统计 2870 | 2871 | ```js 2872 | WXAPI.partnerMembersStatistics(token) 2873 | ``` 2874 | 2875 | 该接口会返回: 2876 | - leaders 名下名下团队长的数量(针对合伙人身份) 2877 | - members 名下团队成员的数量 2878 | 2879 | ### 团队成员列表接口 2880 | 2881 | ```js 2882 | WXAPI.partnerMembers(Object object) 2883 | ``` 2884 | 2885 | # 积分模块 2886 | 2887 | ## 积分抵扣规则 2888 | 2889 | ```js 2890 | WXAPI.scoreDeductionRules(type) 2891 | ``` 2892 | 2893 | 积分可用于抵扣金额,用于商城购物消费;也可以用来兑换成长值; 2894 | 2895 | **type参数:** 2896 | 2897 | 传0,获取所有的积分抵扣金额的规则; 2898 | 2899 | 传1,获取所有的积分抵扣成长值的规则; 2900 | 2901 | 不传type参数,着获取所有的抵扣规则 2902 | 2903 | ## 积分赠送规则 2904 | 2905 | ```js 2906 | WXAPI.scoreRules(Object object) 2907 | ``` 2908 | 2909 | ## 签到送积分 2910 | 2911 | ### 签到规则 2912 | 2913 | ```js 2914 | WXAPI.scoreSignRules() 2915 | ``` 2916 | 2917 | > 读取签到一次送多少积分;连续签到x天赠送y积分 2918 | 2919 | ### 签到 2920 | 2921 | ```js 2922 | WXAPI.scoreSign(token) 2923 | ``` 2924 | 2925 | ### 读取今日签到信息 2926 | 2927 | ```js 2928 | WXAPI.scoreTodaySignedInfo(token) 2929 | ``` 2930 | 2931 | > 判断今天有没有签到 2932 | > 2933 | > 错误码返回 700 表示未签到;错误码返回 0 表示已经签到 2934 | 2935 | ### 签到记录 2936 | 2937 | ```js 2938 | WXAPI.scoreSignLogs(Object object) 2939 | ``` 2940 | 2941 | > 读取历史签到记录 2942 | > 2943 | > 分页展示,具体参数详见接口文档说明 2944 | 2945 | ## 使用积分券兑换积分 2946 | 2947 | ```js 2948 | WXAPI.scoreExchange(token, number) 2949 | ``` 2950 | 2951 | number 为积分券的券号,兑换积分 2952 | 2953 | ## 将积分兑换成余额 2954 | 2955 | ```js 2956 | WXAPI.scoreExchangeCash(token, deductionScore) 2957 | ``` 2958 | 2959 | 根据后台设定的积分兑换现金的规则,使用该方法,用户将积分兑换成余额 2960 | 2961 | deductionScore 为需要兑换的积分数量 2962 | 2963 | ## 转发微信群获得积分奖励 2964 | 2965 | ```js 2966 | WXAPI.shareGroupGetScore(code, referrer, encryptedData, iv) 2967 | ``` 2968 | 2969 | **referrer** 2970 | 2971 | *分享人的用户id* 2972 | 2973 | **encryptedData** 2974 | 2975 | *小程序api:wx.getShareInfo 获得* 2976 | 2977 | **iv** 2978 | 2979 | *小程序api:wx.getShareInfo 获得* 2980 | 2981 | ## 积分明细 2982 | 2983 | ```js 2984 | WXAPI.scoreLogs(Object object) 2985 | ``` 2986 | 2987 | 详细记录你的每一次积分变动 2988 | 2989 | ## 成长值 2990 | 2991 | ### 用积分兑换成长值 2992 | 2993 | ```js 2994 | WXAPI.exchangeScoreToGrowth(token, deductionScore) 2995 | ``` 2996 | 2997 | deductionScore 参数为你希望消耗多少积分用来兑换成长值,请根据积分兑换规则,自行计算你打算消耗的积分数量 2998 | 2999 | ### 成长值变动明细 3000 | 3001 | ```js 3002 | WXAPI.growthLogs(Object object) 3003 | ``` 3004 | 3005 | 详细记录每一次成长值的变化情况 3006 | 3007 | # 资金 / 财务 相关 3008 | 3009 | 3010 | ## 交易密码 3011 | 3012 | ### 设置交易密码 3013 | 3014 | 适用于用户第一次设置交易密码,如果用户已经设置过交易密码,该接口无效,请使用修改交易密码接口或者用短信验证码重置交易密码接口 3015 | 3016 | ```js 3017 | WXAPI.setPayPassword(token, pwd) 3018 | ``` 3019 | 3020 | - token 用户登陆的token 3021 | - pwd 交易密码 3022 | 3023 | ### 修改交易密码 3024 | 3025 | ```js 3026 | WXAPI.modifyPayPassword(token, pwdOld, pwdNew) 3027 | ``` 3028 | 3029 | - token 用户登陆的token 3030 | - pwdOld 原来的交易密码 3031 | - pwdNew 新的交易密码 3032 | 3033 | ### 重置交易密码 3034 | 3035 | 配合短信验证码接口,利用当前手机号码急短信验证码,重置交易密码 3036 | 3037 | ```js 3038 | WXAPI.resetPayPassword(mobile, code, pwd) 3039 | ``` 3040 | 3041 | - mobile 当前账户绑定的手机号码 3042 | - code 手机收到的短信验证码 3043 | - pwd 新的交易密码 3044 | 3045 | ## 获取资产信息(余额、可用积分) 3046 | 3047 | ```js 3048 | WXAPI.userAmount(token) 3049 | ``` 3050 | 3051 | **返回字段说明:** 3052 | 3053 | balance 可用余额 3054 | 3055 | freeze 冻结金额 3056 | 3057 | score 可用积分 3058 | 3059 | growth 当前成长值 3060 | 3061 | totleConsumed 累计消费金额 3062 | 3063 | 3064 | ## 在线支付(充值) 3065 | 3066 | ### 获取充值规则(满多少送多少) 3067 | 3068 | ```js 3069 | WXAPI.rechargeSendRules() 3070 | ``` 3071 | 3072 | ### 微信小程序支付 3073 | 3074 | ```js 3075 | WXAPI.wxpay(Object object) 3076 | ``` 3077 | 3078 | 调用该方法后,可获得用于发起微信支付的所有数据,请将返回值根据小程序的微信支付文档唤起支付功能即可,参考代码如下: 3079 | 3080 | ```js 3081 | WXAPI.wxpay({ 3082 | token: '登录token', 3083 | money: 100, 3084 | payName: '支付测试', 3085 | nextAction: '{"type": 0, "id": 1}' 3086 | }).then(function (res) { 3087 | if (res.code == 0) { 3088 | // 小程序代码发起支付 3089 | wx.requestPayment({ 3090 | timeStamp: res.data.timeStamp, 3091 | nonceStr: res.data.nonceStr, 3092 | package: res.data.package, 3093 | signType: res.data.signType, 3094 | paySign: res.data.paySign, 3095 | fail: function (aaa) { 3096 | wx.showToast({ 3097 | title: '支付失败:' + aaa 3098 | }) 3099 | }, 3100 | success: function () { 3101 | // 提示支付成功 3102 | wx.showToast({ 3103 | title: '支付成功' 3104 | }) 3105 | } 3106 | }) 3107 | } 3108 | }) 3109 | ``` 3110 | 3111 | ### 微信小程序支付[FOMO跨境支付] 3112 | 3113 | ```js 3114 | WXAPI.wxpayFOMO(Object object) 3115 | ``` 3116 | 3117 | 调用该方法后,可获得用于发起微信支付的所有数据,请将返回值根据小程序的微信支付文档唤起支付功能即可,参考代码如下: 3118 | 3119 | ```js 3120 | WXAPI.wxpay({ 3121 | token: '登录token', 3122 | money: 100, 3123 | payName: '支付测试', 3124 | nextAction: '{"type": 0, "id": 1}' 3125 | }).then(function (res) { 3126 | if (res.code == 0) { 3127 | // 小程序代码发起支付 3128 | wx.requestPayment({ 3129 | timeStamp: res.data.timeStamp, 3130 | nonceStr: res.data.nonceStr, 3131 | package: res.data.package, 3132 | signType: res.data.signType, 3133 | paySign: res.data.paySign, 3134 | fail: function (aaa) { 3135 | wx.showToast({ 3136 | title: '支付失败:' + aaa 3137 | }) 3138 | }, 3139 | success: function () { 3140 | // 提示支付成功 3141 | wx.showToast({ 3142 | title: '支付成功' 3143 | }) 3144 | } 3145 | }) 3146 | } 3147 | }) 3148 | ``` 3149 | 3150 | ### payNow跨境支付 3151 | 3152 | ```js 3153 | WXAPI.payNow(Object object) 3154 | ``` 3155 | 3156 | 该接口返回: 3157 | 3158 | ```json 3159 | { 3160 | "code": 0, 3161 | "data": { 3162 | "createdAt": 1605784207, 3163 | "codeUrl": "00020101021226580009SG.PAYNOW010120213201543956D0020301004142020111919400752045999530370254041.005802SG5918FOMO PAY PTE. LTD.6009SINGAPORE62260122QY03022020111940207560630422F3", 3164 | "outTradeId": "ZF2011191756701253", 3165 | "amount": "1.00", 3166 | "orderNo": "ZF2011191756701253", 3167 | "subject": "在线支付", 3168 | "id": "100500220201119402077271", 3169 | "primaryTransactionId": "100510120201119402078121", 3170 | "currencyCode": "SGD", 3171 | "status": "CREATED" 3172 | }, 3173 | "msg": "success" 3174 | } 3175 | ``` 3176 | 3177 | 然后你只需要将 codeUrl 的内容生成二维码即可 3178 | 3179 | ### FOMO网关支付 3180 | 3181 | ```js 3182 | WXAPI.fomoCheckout(Object object) 3183 | ``` 3184 | 3185 | 该接口返回: 3186 | 3187 | ```json 3188 | { 3189 | "code": 0, 3190 | "data": { 3191 | "createdAt": 1605862553, 3192 | "outTradeId": "ZF2011200763243499", 3193 | "amount": "0.10", 3194 | "orderNo": "ZF2011200763243499", 3195 | "subject": "在线支付", 3196 | "id": "100500120201120321535852", 3197 | "returnUrl": "https://www.fomopay.com/", 3198 | "currencyCode": "SGD", 3199 | "url": "https://ipg.fomopay.net/web/100500120201120321535852?p=e....", 3200 | "status": "CREATED" 3201 | }, 3202 | "msg": "success" 3203 | } 3204 | ``` 3205 | 3206 | 然后你只需要让用户复制 url 字段的地址,在浏览器中打开这个地址完成支付即可 3207 | 3208 | ### 微信小程序支付[服务商版本] 3209 | 3210 | ```js 3211 | WXAPI.wxpayFWS(Object object) 3212 | ``` 3213 | 3214 | 调用该方法后,可获得用于发起微信支付的所有数据,请将返回值根据小程序的微信支付文档唤起支付功能即可,参考代码如下: 3215 | 3216 | ```js 3217 | WXAPI.wxpayFWS({ 3218 | token: '登录token', 3219 | money: 100, 3220 | payName: '支付测试', 3221 | nextAction: '{"type": 0, "id": 1}' 3222 | }).then(function (res) { 3223 | if (res.code == 0) { 3224 | // 小程序代码发起支付 3225 | wx.requestPayment({ 3226 | timeStamp: res.data.timeStamp, 3227 | nonceStr: res.data.nonceStr, 3228 | package: 'prepay_id=' + res.data.prepayId, 3229 | signType: 'MD5', 3230 | paySign: res.data.sign, 3231 | fail: function (aaa) { 3232 | wx.showToast({ 3233 | title: '支付失败:' + aaa 3234 | }) 3235 | }, 3236 | success: function () { 3237 | // 提示支付成功 3238 | wx.showToast({ 3239 | title: '支付成功' 3240 | }) 3241 | } 3242 | }) 3243 | } 3244 | }) 3245 | ``` 3246 | 3247 | 具体参数请查阅接口文档说明,尤其要注意 **nextAction** 参数的使用 3248 | 3249 | ### 扫呗在线支付 3250 | 3251 | ```js 3252 | WXAPI.wxpaySaobei(Object object) 3253 | ``` 3254 | 3255 | 参数以及如何调用发起小程序支付方法同上 3256 | 3257 | ### wepayez境外支付 3258 | 3259 | ```js 3260 | WXAPI.wxpayWepayez(Object object) 3261 | ``` 3262 | 3263 | 参数以及如何调用发起小程序支付方法同上 3264 | 3265 | ### intelsalon云美集付 3266 | 3267 | ```js 3268 | WXAPI.wxpayIntelsalon(Object object) 3269 | ``` 3270 | 3271 | 参数以及如何调用发起小程序支付方法同上 3272 | 3273 | ### 支付宝支付(半自动) 3274 | 3275 | ```js 3276 | WXAPI.alipay(Object object)` 3277 | ``` 3278 | 3279 | ### 充值记录 3280 | 3281 | ```js 3282 | WXAPI.payLogs(Object object) 3283 | ``` 3284 | 3285 | ### 查询支付结果 3286 | 3287 | ```js 3288 | WXAPI.payQuery(token, outTradeId) 3289 | ``` 3290 | 3291 | 查询 outTradeId 这笔在线支付的状态,有的时候,客户端会有这个需求,定期轮询检测在线支付状态 3292 | 3293 | ## 优惠买单 3294 | 3295 | 到店消费后,使用该功能完成现场消费;询问服务员消费金额后,用户自主输入消费金额后完成在线消费;系统自动按照后台设置的优惠买单规则进行满减 3296 | 3297 | ### 获取买单优惠 3298 | 3299 | ```js 3300 | WXAPI.payBillDiscounts() 3301 | ``` 3302 | 3303 | > 读取后台设置的满减设置列表 3304 | 3305 | ### 买单 3306 | 3307 | ```js 3308 | WXAPI.payBillV2(Object object) 3309 | ``` 3310 | 3311 | ## 资金流水 3312 | 3313 | ```js 3314 | WXAPI.cashLogsV2(Object object) 3315 | ``` 3316 | 3317 | ## 提现管理 3318 | 3319 | ### 申请提现 3320 | 3321 | WXAPI.withDrawApplyV2(Object object) 3322 | 3323 | ### 提现记录 3324 | 3325 | > WXAPI.withDrawLogs(Object object) 3326 | 3327 | ### 提现记录详情 3328 | 3329 | > WXAPI.withDrawDetail(token, id) 3330 | 3331 | ## 发票管理 3332 | 3333 | ### 申请发票 3334 | > WXAPI.invoiceApply(Object object) 3335 | ### 申请的发票列表 3336 | > WXAPI.invoiceList(Object object) 3337 | ### 发票详情 3338 | > WXAPI.invoiceDetail(token, id) 3339 | 3340 | ## 押金管理 3341 | 3342 | ### 支付押金 3343 | 3344 | ```js 3345 | WXAPI.payDeposit(Object object) 3346 | ``` 3347 | 3348 | ### 获取押金记录 3349 | 3350 | ```js 3351 | WXAPI.depositList(Object object) 3352 | ``` 3353 | 3354 | ### 押金详情 3355 | 3356 | ```js 3357 | WXAPI.depositInfo(token, id) 3358 | ``` 3359 | 3360 | ### 申请退回押金 3361 | 3362 | ```js 3363 | WXAPI.depositBackApply(token, id) 3364 | ``` 3365 | 3366 | # 小程序工具类 3367 | 3368 | ## 无限获取二维码 3369 | 3370 | ```js 3371 | WXAPI.wxaQrcode(Object object) 3372 | ``` 3373 | 3374 | > 微信有规定,只有正式上线的小程序才可以获取小程序码,所以如果你获取到的小程序码无法打开,请不要惊讶 3375 | 3376 | *如果生成的小程序码无法打开,请将图片保存到本地后,用记事本打开来,里面就可以看到失败原因了的* 3377 | 3378 | ## 小程序数据解密 3379 | 3380 | ```js 3381 | WXAPI.encryptedData(code, encryptedData, iv) 3382 | ``` 3383 | 3384 | > 类似微信运动之类的数据,都可以通过该方法解密成明文 3385 | > 3386 | > code 为登录临时凭证 3387 | 3388 | ## 小程序数据解密[服务商模式] 3389 | 3390 | ```js 3391 | WXAPI.wxappServiceEncryptedData(Object object) 3392 | ``` 3393 | 3394 | 参数说明: 3395 | - code wx.login 获取的 code 3396 | - encryptedData 微信登录接口返回的 加密用户信息 3397 | - iv 微信登录接口返回的加密偏移数据 3398 | 3399 | ## 模板消息 3400 | 3401 | ### 保存 formid/预支付Id 3402 | 3403 | ```js 3404 | WXAPI.addTempleMsgFormid(token, type, formId) 3405 | ``` 3406 | 3407 | > type: form/pay ,分别代表支付还是表单提交 3408 | > 3409 | > formId: 表单提交场景下,为 submit 事件带上的 formId;支付场景下,为支付的 prepay_id 3410 | 3411 | 小程序给用户发送模板消息有特殊规定: 3412 | [https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/template-message.html](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/template-message.html) 3413 | 3414 | 1. 当用户在小程序内完成过支付行为,可允许开发者向用户在7天内推送有限条数的模板消息(1次支付可下发3条,多次支付下发条数独立,互相不影响) 3415 | 2. 当用户在小程序内发生过提交表单行为且该表单声明为要发模板消息的,开发者需要向用户提供服务时,可允许开发者向用户在7天内推送有限条数的模板消息(1次提交表单可下发1条,多次提交下发条数独立,相互不影响) 3416 | 3417 | *所以为了突破这个数量限制,我们预先收集很多的 formid/预支付Id ,这样就可以不受限制的给用户发送模板消息了* 3418 | 3419 | **小程序模板消息调试请使用手机,开发工具获取到的formid 是一个 mock(模拟的),无法用来真正发送模板消息** 3420 | 3421 | ### 给用户发送模板消息 3422 | 3423 | ```js 3424 | WXAPI.sendTempleMsg(Object object) 3425 | ``` 3426 | 3427 | > 具体参数说明详见接口文档 3428 | > 3429 | > 可实现立即发送消息;按照条件触发发送消息 3430 | 3431 | 本方法可以指定一个 formid/预支付Id ,也可以不传该参数,那么系统将自动从上面的方法存储的 formid/预支付Id 里面获取一个用来发送模板消息 3432 | 3433 | # 活动 & 工具 3434 | 3435 | ## 在线获取二维码 3436 | 3437 | ```js 3438 | WXAPI.commonQrcode(Object object) 3439 | ``` 3440 | 3441 | 参数说明: 3442 | - content 二维码的内容 3443 | - width 二维码的宽度,不传默认为 300 3444 | - expireHours 图片几小时后自动删除,不传则不会删除图片 3445 | 3446 | ## 分布式系统唯一ID 3447 | 3448 | > WXAPI.uniqueId(type) 3449 | 3450 | ## 手机号段服务 3451 | 3452 | ### 归属地查询 3453 | 3454 | ```js 3455 | WXAPI.queryMobileLocation(mobile) 3456 | ``` 3457 | 3458 | ### 读取下一个号段 3459 | 3460 | ```js 3461 | WXAPI.nextMobileSegment(Object object) 3462 | ``` 3463 | 3464 | ## 抽奖功能 3465 | 3466 | ### 抽奖项目详情 3467 | 3468 | > WXAPI.luckyInfo(id) 3469 | 3470 | ### 参与抽奖 3471 | 3472 | > WXAPI.luckyInfoJoin(id, token) 3473 | 3474 | ### 我的抽奖信息 3475 | 3476 | > WXAPI.luckyInfoJoinMy(id, token) 3477 | 3478 | ### 抽奖项目的所有抽奖记录明细 3479 | 3480 | > WXAPI.luckyInfoJoinLogs(Object object) 3481 | 3482 | ## 预约/报名 3483 | 3484 | ### 读取所有的预约/报名项目 3485 | 3486 | ```js 3487 | WXAPI.yuyueItems(Object object) 3488 | ``` 3489 | 3490 | > 拉取后台设置的所有预约/报名项目,小程序端可展示所有的项目、进度等情况 3491 | > 3492 | > 具体参数详见接口文档 3493 | 3494 | ### 项目详情 3495 | 3496 | ```js 3497 | WXAPI.yuyueItemDetail(id) 3498 | ``` 3499 | 3500 | > 读取指定 id 的预约/报名项目详情、后台设置的扩展属性 3501 | 3502 | ### 进行预约或者在线报名 3503 | 3504 | ```js 3505 | WXAPI.yuyueJoin(Object object) 3506 | ``` 3507 | 3508 | > 具体参数详见接口文档 3509 | 3510 | **可作为团队/个人直接报名,也可以加入指定的某一个团队进行报名** 3511 | 3512 | 参数说明: 3513 | 3514 | **个人/团队报名:** 3515 | 3516 | **yuyueId** 报名项目ID 3517 | 3518 | **teamName** 团队名称[也可以不传] 3519 | 3520 | **remark** 报名备注 3521 | 3522 | **extJsonStr** 报名扩展属性 3523 | 3524 | **加入某个团队:** 3525 | 3526 | **yuyueId** 报名项目ID 3527 | 3528 | **teamId** 团队ID 3529 | 3530 | **remark** 报名备注 3531 | 3532 | **extJsonStr** 报名扩展属性 3533 | 3534 | **成功预约/报名后将会给你返回报名ID,也就是下述方法中使用到的 joinId 参数** 3535 | 3536 | ### 支付报名费 3537 | 3538 | ```js 3539 | WXAPI.yuyueJoinPay(token, joinId) 3540 | ``` 3541 | 3542 | > 如果后台设置的预约/报名项目需要支付一定的费用,那么用户需要通过该方法完成报名费的支付才能完成预约/报名 3543 | 3544 | ### 更新预约/报名信息 3545 | 3546 | ```js 3547 | WXAPI.yuyueJoinUpdate(token, joinId, extJsonStr) 3548 | ``` 3549 | 3550 | > 修改预约/报名的扩展信息,必须是非匿名情况下才能使用,否则没法确认修改者用户身份 3551 | 3552 | ### 我的报名信息 3553 | 3554 | ```js 3555 | WXAPI.yuyueMyJoinInfo(token, joinId) 3556 | ``` 3557 | 3558 | ### 我所有的预约记录/报名记录 3559 | 3560 | ```js 3561 | WXAPI.yuyueMyJoinLogs(Object object) 3562 | ``` 3563 | 3564 | > 该方法将分页展示用户的参与历史记录,具体参数详见接口文档 3565 | 3566 | ### 读取某个项目的所有报名团队列表 3567 | 3568 | ```js 3569 | WXAPI.yuyueTeams(Object object) 3570 | ``` 3571 | 3572 | ### 查看团队详情 3573 | 3574 | ```js 3575 | WXAPI.yuyueTeamDetail(teamId) 3576 | ``` 3577 | 3578 | > 上述方法中获取到的团队ID 3579 | 3580 | ### 拉取团队成员列表 3581 | 3582 | ```js 3583 | WXAPI.yuyueTeamMembers(Object object) 3584 | ``` 3585 | 3586 | ### 团队长删除[踢]团队成员 3587 | 3588 | ```js 3589 | WXAPI.yuyueTeamDeleteMember(token, joinId) 3590 | ``` 3591 | 3592 | ## 投票功能 3593 | 3594 | 后台新建投票项目,在该投票项目下可设置多个投票选项,用可根据后台设置的 单选/多选 设置进行投票,最后查看总体投票情况以及投票明细(非匿名的话) 3595 | 3596 | ### 投票项目 3597 | 3598 | ```js 3599 | WXAPI.voteItems(Object object) 3600 | ``` 3601 | 3602 | > 读取所有的投票项目,下面的方法均是针对其中某一个投票项目进行参与 3603 | > 3604 | > 具体参数详见接口文档 3605 | 3606 | ### 投票详情 3607 | 3608 | ```js 3609 | WXAPI.voteItemDetail(id) 3610 | ``` 3611 | 3612 | > 投票项目的详细数据 3613 | > 3614 | > 拉取当前投票项目的所有投票选项 3615 | > 3616 | > 同时也将返回后台设置的当前投票项目的扩展属性数据 3617 | 3618 | ### 我的投票 3619 | 3620 | ```js 3621 | WXAPI.myVote(token, voteId) 3622 | ``` 3623 | 3624 | > 查看针对 voteId 这个投票项目,我的投票情况 3625 | > 3626 | > 如果返回 700 ,说明你还没投票,用该方法可用来判断我有没有投票 3627 | 3628 | ### 我要投票 3629 | 3630 | ```js 3631 | WXAPI.vote(token, voteId, items, remark) 3632 | ``` 3633 | 3634 | > 投票动作,具体参数说明: 3635 | 3636 | **voteId** *上述的投票项目id* 3637 | 3638 | **items** *选择的投票选项数组,单选的话就一个选项,多选的话就是你选择几个就几个* 3639 | 3640 | **remark** *投票备注* 3641 | 3642 | ### 查看投票明细 3643 | 3644 | ```js 3645 | WXAPI.voteLogs(Object object) 3646 | ``` 3647 | 3648 | > 查询某个投票项目所有的参与者名录、以及具体的投票选项 3649 | > 3650 | > 具体参数详见接口文档 3651 | 3652 | ## 商品条码查询 3653 | 3654 | ```js 3655 | WXAPI.queryBarcode(barcode) 3656 | ``` 3657 | > barcode 为商品的条码,可以利用小程序的扫码api、扫码枪等实现快速识别条码 3658 | 3659 | 3660 | ## 短链接服务 3661 | 3662 | > 将长链接生成短链接 3663 | > **** 3664 | > url 参数为原始的长链接地址 3665 | 3666 | ``` 3667 | WXAPI.shortUrl(url) 3668 | ``` 3669 | 3670 | ## 地图工具 3671 | 3672 | ### 计算2个坐标之间的直线距离 3673 | 3674 | ```js 3675 | WXAPI.mapDistance(lat1, lng1, lat2, lng2) 3676 | ``` 3677 | 3678 | ### 计算2个坐标之间的导航距离 3679 | 3680 | ```js 3681 | WXAPI.mapDistanceNavigation(key, mode, from, to) 3682 | ``` 3683 | 3684 | - key 请登陆 https://lbs.qq.com/ 后,左侧菜单的“key管理”自行创建一个key即可;此key需要设置启用WebserviceAPI 3685 | - mode 计算方式:driving(驾车)、walking(步行)、bicycling(自行车) 3686 | - from 起点坐标,39.071510,117.190091 3687 | - to 终点坐标,39.071510,117.190091 3688 | 3689 | ### 将坐标地址转换为详细地址 3690 | 3691 | 比如可将 30.274085,120.15507 这个坐标翻译成: 3692 | 3693 | 浙江省杭州市拱墅区环城北路318号 3694 | 3695 | ```js 3696 | WXAPI.mapQQAddress(location, coord_type) 3697 | ``` 3698 | 3699 | ### 地图上搜索 3700 | 3701 | ``` 3702 | WXAPI.mapQQSearch(Object object) 3703 | ``` 3704 | 3705 | > 在地图上搜索地理位置,例如找肯德基,找星巴克等等; 3706 | > 3707 | > 参数说明: 3708 | 3709 | **keyword** 3710 | 3711 | *关键词,比如: kfc、星巴克、瑞幸咖啡* 3712 | 3713 | **boundary** 3714 | 3715 | *搜索范围,目前支持以下3种方式:* 3716 | 1. 在城市类查找所有: region(北京,0) 3717 | 2. 在当前定位为圆心范围内搜索: nearby(39.908491,116.374328,1000) 3718 | 3. 指定的区域内搜索: rectangle(39.9072,116.3689,39.9149,116.3793) 3719 | 3720 | **page** 3721 | 3722 | *读取第几页数据,不传该参数默认取第一页* 3723 | 3724 | **pageSize** 3725 | 3726 | *每页显示几条数据,不传该参数默认取10条,该参数最多数字为20* 3727 | 3728 | ## 排队叫号 3729 | 3730 | ### 获取所有的队列 3731 | 3732 | ```js 3733 | WXAPI.queuingTypes(status) 3734 | ``` 3735 | 3736 | > 获取所有的叫号队列 3737 | > 3738 | > status 参数代表(0 正常 1 关闭 2 名额已满),不传该参数则获取所有的队列 3739 | 3740 | *比如餐饮里面的: 2人桌、4人桌、大圆桌;这3个队列是独立叫号的,用户根据自己的实际情况到对应的队列里面去取号排队;* 3741 | 3742 | *还比如银行办事大厅的队列:个人业务、对公业务、现金业务;这3个队列也是独立叫号的;* 3743 | 3744 | ### 取号 3745 | 3746 | ```js 3747 | WXAPI.queuingGet(token, typeId, mobile) 3748 | ``` 3749 | 3750 | > 用户需要登录后才能取号,所以请提供正确的 token 3751 | > 3752 | > typeId 为你要取号的队列的id,请根据上面的方法获取 3753 | > 3754 | > mobile 为取号手机号码,非必填,后续你可以向这个手机号码推送队列进度情况及排队提醒 3755 | 3756 | ### 我的取号情况 3757 | 3758 | ```js 3759 | WXAPI.queuingMy(token, typeId, status) 3760 | ``` 3761 | 3762 | > typeId 为你要取号的队列的id,如果不传则获取所有队列的取号信息 3763 | > 3764 | > status 代表(0 排队中 1 受理中 2 已处理 3 已过号)不传该参数则读取所有的取号记录 3765 | 3766 | # 社交通讯 3767 | 3768 | ## 好友管理 3769 | 3770 | ### 读取好友列表 3771 | 3772 | ```js 3773 | WXAPI.friendList(Object object) 3774 | ``` 3775 | 3776 | > 拉取我的好友列表,分页展示 3777 | > 3778 | > 具体参数请查阅接口文档 3779 | 3780 | ### 添加好友 3781 | 3782 | ```js 3783 | WXAPI.addFriend(token, uid) 3784 | ``` 3785 | 3786 | > 添加 uid 指定用户编号的用户为好友 3787 | 3788 | ### 查看好友详情 3789 | 3790 | ```js 3791 | WXAPI.friendUserDetail(token, uid) 3792 | ``` 3793 | 3794 | **后台系统参数中的开关参数ALLOW_VIEW_FRIEND设置为打开状态才能调用该接口** 3795 | 3796 | token 为非必填参数,允许游客调用该接口 3797 | 3798 | uid 指定用户编号的好友用户资料 3799 | 3800 | 游客可以查看用户分组为 **aicard** 的用户的信息,以便兼容AI名片应用,其他分组的用户只能登录用户才能查看 3801 | 3802 | ## 站内信管理 3803 | 3804 | ### 站内消息列表 3805 | 3806 | ```js 3807 | WXAPI.messageList(Object object) 3808 | ``` 3809 | 3810 | > 具体参数请查阅接口文档 3811 | 3812 | ### 设置为已读 3813 | 3814 | ```js 3815 | WXAPI.messageRead(token, id) 3816 | ``` 3817 | 3818 | ### 删除站内信 3819 | 3820 | ```js 3821 | WXAPI.messageDelete(token, id) 3822 | ``` 3823 | 3824 | ## 用户关注 3825 | 3826 | ### 判断是否关注某人 3827 | 3828 | ```js 3829 | WXAPI.userAttentioncheck(token, uid) 3830 | ``` 3831 | 3832 | ### 关注某人 3833 | 3834 | ```js 3835 | WXAPI.userAttentionAdd(token, uid) 3836 | ``` 3837 | 3838 | ### 取消关注某人 3839 | 3840 | ```js 3841 | WXAPI.userAttentionRemove(token, uid) 3842 | ``` 3843 | 3844 | ### 读取用户详情 3845 | 3846 | ```js 3847 | WXAPI.userAttentionDetail(token, uid) 3848 | ``` 3849 | 3850 | ### 我关注的用户列表 3851 | 3852 | ```js 3853 | WXAPI.userMyAttentionList(Object object) 3854 | ``` 3855 | 3856 | ### 我的粉丝列表 3857 | 3858 | ```js 3859 | WXAPI.userAttentionMeList(Object object) 3860 | ``` 3861 | 3862 | ### 关注统计 3863 | 3864 | ```js 3865 | WXAPI.userAttentionStatistics(token) 3866 | ``` 3867 | 3868 | 该接口返回关注和被关注的数据统计: 3869 | 3870 | ```json 3871 | { 3872 | myAttentionCount: 10, 3873 | attentionMeCount: 100 3874 | } 3875 | ``` 3876 | 3877 | # 扫码点餐 3878 | 3879 | ## 扫桌码获取token 3880 | 3881 | ```js 3882 | WXAPI.cyTableToken(tableId, key) 3883 | ``` 3884 | 3885 | 参数说明: 3886 | 3887 | - tableId 后台餐桌管理,每个桌子的id 3888 | - key 桌子密钥,后台管理 3889 | 3890 | 功能介绍: 3891 | 3892 | 适用于餐饮领域扫码点餐,针对同一个桌码,不同的用户扫码后可共享同一个购物车、可以看到同一份订单数据、任意一个用户均可发起买单。 3893 | 3894 | 接口返回 token,后续购物车以及查看订单信息时候需要使用该token 3895 | 3896 | ## 下单(厨) / 加菜 3897 | 3898 | ```js 3899 | WXAPI.cyTableAddOrder(Object object) 3900 | ``` 3901 | 3902 | 参数说明: 3903 | 3904 | - token 扫桌码接口返回的token 3905 | - goodsJsonStr 本次下单的菜品数据,如下: 3906 | 3907 | ```json 3908 | [ 3909 | { 3910 | "goodsId": 11, // 商品id 3911 | "number": 2, // 数量 3912 | "propertyChildIds": "" // sku 信息 3913 | }, 3914 | { 3915 | "goodsId": 8, 3916 | "number": 3, 3917 | "propertyChildIds": "2:9" 3918 | } 3919 | ] 3920 | ``` 3921 | 3922 | # 购买课程模块 3923 | 3924 | ## 获取课程列表 3925 | 3926 | ```js 3927 | WXAPI.courseInfoList(Object object) 3928 | ``` 3929 | 3930 | 参数说明: 3931 | 3932 | - page 获取第几页数据,初始1 3933 | - pageSize 每页显示多少条数据 3934 | 3935 | ## 获取课程详情 3936 | 3937 | ```js 3938 | WXAPI.courseInfo(id) 3939 | ``` 3940 | 3941 | 参数说明: 3942 | 3943 | - id 课程ID 3944 | 3945 | ## 获取某个课程的报名用户信息 3946 | 3947 | ```js 3948 | WXAPI.courseBuyLogPublic(Object object) 3949 | ``` 3950 | 3951 | 参数说明: 3952 | 3953 | - page 获取第几页数据,初始1 3954 | - pageSize 每页显示多少条数据 3955 | - courseId 课程ID 3956 | 3957 | ## 获取我的报名记录 3958 | 3959 | ```js 3960 | WXAPI.courseBuyLogMy(Object object) 3961 | ``` 3962 | 3963 | 参数说明: 3964 | 3965 | - token 用户登陆token 3966 | - page 获取第几页数据,初始1 3967 | - pageSize 每页显示多少条数据 3968 | - courseId 课程ID, 不传则获取所有的课程报名记录 3969 | 3970 | ## 课程购买订单详情 3971 | 3972 | ```js 3973 | WXAPI.courseInfoBuyLogDetail(token, id, hxNumber) 3974 | ``` 3975 | 3976 | 参数说明: 3977 | 3978 | - token 用户登陆token 3979 | - id 订单id,并非课程id 3980 | - hxNumber 核销码 3981 | 3982 | ## 购买课程 3983 | 3984 | ```js 3985 | WXAPI.courseInfoBuy(Object object) 3986 | ``` 3987 | 3988 | 参数说明: 3989 | 3990 | - token 用户登陆token 3991 | - courseId 课程ID 3992 | - shopId 门店ID 3993 | - sessionId 场次ID 3994 | - name 姓名 3995 | - mobile 手机号码 3996 | - number 购买数量 3997 | 3998 | ## 用余额支付购买课程订单 3999 | 4000 | ```js 4001 | WXAPI.courseInfoBuyLogPay(token, orderId) 4002 | ``` 4003 | 4004 | 参数说明: 4005 | 4006 | - token 用户登陆token 4007 | - orderId 课程购买记录的ID,并非课程ID 4008 | 4009 | ## 关闭课程订单 4010 | 4011 | ```js 4012 | WXAPI.courseInfoBuyLogClose(token, orderId) 4013 | ``` 4014 | 4015 | 参数说明: 4016 | 4017 | - token 用户登陆token 4018 | - orderId 课程购买记录的ID,并非课程ID 4019 | 4020 | ## 删除课程订单 4021 | 4022 | ```js 4023 | WXAPI.courseInfoBuyLogDelete(token, orderId) 4024 | ``` 4025 | 4026 | 参数说明: 4027 | 4028 | - token 用户登陆token 4029 | - orderId 课程购买记录的ID,并非课程ID -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "apifm-wxapi", 3 | "version": "25.05.13", 4 | "description": "接口升级", 5 | "main": "miniprogram_dist/index.js", 6 | "scripts": { 7 | "dev": "gulp dev --develop", 8 | "watch": "gulp watch --develop --watch", 9 | "build": "gulp", 10 | "dist": "npm run build", 11 | "clean-dev": "gulp clean --develop", 12 | "clean": "gulp clean", 13 | "test": "jest --bail", 14 | "test-debug": "node --inspect-brk ./node_modules/jest/bin/jest.js --runInBand --bail", 15 | "coverage": "jest ./test/* --coverage --bail", 16 | "lint": "eslint \"src/**/*.js\" --fix", 17 | "lint-tools": "eslint \"tools/**/*.js\" --rule \"import/no-extraneous-dependencies: false\" --fix" 18 | }, 19 | "types": "index.d.ts", 20 | "miniprogram": "miniprogram_dist", 21 | "jest": { 22 | "testEnvironment": "jsdom", 23 | "testURL": "https://jest.test", 24 | "collectCoverageFrom": [ 25 | "src/**/*.js" 26 | ], 27 | "moduleDirectories": [ 28 | "node_modules", 29 | "src" 30 | ] 31 | }, 32 | "repository": { 33 | "type": "git", 34 | "url": "https://github.com/gooking/apifm-wxapi" 35 | }, 36 | "author": "gooking", 37 | "license": "MIT", 38 | "devDependencies": { 39 | "babel-core": "^6.26.3", 40 | "babel-loader": "^7.1.5", 41 | "babel-plugin-module-resolver": "^3.2.0", 42 | "babel-preset-env": "^1.7.0", 43 | "colors": "^1.3.1", 44 | "eslint": "^5.14.1", 45 | "eslint-config-airbnb-base": "13.1.0", 46 | "eslint-loader": "^2.1.2", 47 | "eslint-plugin-import": "^2.16.0", 48 | "eslint-plugin-node": "^7.0.1", 49 | "eslint-plugin-promise": "^3.8.0", 50 | "gulp": "^4.0.0", 51 | "gulp-clean": "^0.4.0", 52 | "gulp-if": "^2.0.2", 53 | "gulp-install": "^1.1.0", 54 | "gulp-less": "^4.0.1", 55 | "gulp-rename": "^1.4.0", 56 | "gulp-sourcemaps": "^2.6.5", 57 | "jest": "^23.5.0", 58 | "miniprogram-simulate": "^1.0.0", 59 | "through2": "^2.0.3", 60 | "vinyl": "^2.2.0", 61 | "webpack": "^4.29.5", 62 | "webpack-node-externals": "^1.7.2" 63 | }, 64 | "dependencies": {} 65 | } 66 | -------------------------------------------------------------------------------- /test/index.test.js: -------------------------------------------------------------------------------- 1 | const _ = require('./utils') 2 | 3 | test('render', async () => { 4 | const componentId = _.load('index', 'comp') 5 | const component = _.render(componentId, {prop: 'index.test.properties'}) 6 | 7 | const parent = document.createElement('parent-wrapper') 8 | component.attach(parent) 9 | 10 | expect(_.match(component.dom, 'index.test.properties-false')).toBe(true) 11 | 12 | await _.sleep(10) 13 | 14 | expect(_.match(component.dom, 'index.test.properties-true')).toBe(true) 15 | }) 16 | -------------------------------------------------------------------------------- /test/utils.js: -------------------------------------------------------------------------------- 1 | const path = require('path') 2 | const simulate = require('miniprogram-simulate') 3 | 4 | const config = require('../tools/config') 5 | 6 | const srcPath = config.srcPath 7 | const oldLoad = simulate.load 8 | simulate.load = function (componentPath, ...args) { 9 | if (typeof componentPath === 'string') componentPath = path.join(srcPath, componentPath) 10 | return oldLoad(componentPath, ...args) 11 | } 12 | 13 | module.exports = simulate 14 | 15 | // adjust the simulated wx api 16 | const oldGetSystemInfoSync = global.wx.getSystemInfoSync 17 | global.wx.getSystemInfoSync = function() { 18 | const res = oldGetSystemInfoSync() 19 | res.SDKVersion = '2.4.1' 20 | 21 | return res 22 | } 23 | -------------------------------------------------------------------------------- /test/wx.test.js: -------------------------------------------------------------------------------- 1 | const _ = require('./utils') 2 | 3 | test('wx.getSystemInfo', async () => { 4 | wx.getSystemInfo({ 5 | success(res) { 6 | expect(res.errMsg).toBe('getSystemInfo:ok') 7 | }, 8 | complete(res) { 9 | expect(res.errMsg).toBe('getSystemInfo:ok') 10 | }, 11 | }) 12 | }) 13 | 14 | test('wx.getSystemInfoSync', async () => { 15 | const info = wx.getSystemInfoSync() 16 | expect(info.SDKVersion).toBe('2.4.1') 17 | expect(info.version).toBe('6.6.3') 18 | }) 19 | -------------------------------------------------------------------------------- /tools/build.js: -------------------------------------------------------------------------------- 1 | const path = require('path') 2 | const fs = require('fs') 3 | 4 | const gulp = require('gulp') 5 | const clean = require('gulp-clean') 6 | const less = require('gulp-less') 7 | const rename = require('gulp-rename') 8 | const gulpif = require('gulp-if') 9 | const sourcemaps = require('gulp-sourcemaps') 10 | const webpack = require('webpack') 11 | const gulpInstall = require('gulp-install') 12 | 13 | const config = require('./config') 14 | const checkComponents = require('./checkcomponents') 15 | const checkWxss = require('./checkwxss') 16 | const _ = require('./utils') 17 | 18 | const jsConfig = config.js || {} 19 | const wxssConfig = config.wxss || {} 20 | const srcPath = config.srcPath 21 | const distPath = config.distPath 22 | 23 | /** 24 | * 获取 wxss 流 25 | */ 26 | function wxss(wxssFileList) { 27 | if (!wxssFileList.length) return false 28 | 29 | return gulp.src(wxssFileList, {cwd: srcPath, base: srcPath}) 30 | .pipe(checkWxss.start()) // 开始处理 import 31 | .pipe(gulpif(wxssConfig.less && wxssConfig.sourcemap, sourcemaps.init())) 32 | .pipe(gulpif(wxssConfig.less, less({paths: [srcPath]}))) 33 | .pipe(checkWxss.end()) // 结束处理 import 34 | .pipe(rename({extname: '.wxss'})) 35 | .pipe(gulpif(wxssConfig.less && wxssConfig.sourcemap, sourcemaps.write('./'))) 36 | .pipe(_.logger(wxssConfig.less ? 'generate' : undefined)) 37 | .pipe(gulp.dest(distPath)) 38 | } 39 | 40 | /** 41 | * 获取 js 流 42 | */ 43 | function js(jsFileMap, scope) { 44 | const webpackConfig = config.webpack 45 | const webpackCallback = (err, stats) => { 46 | if (!err) { 47 | // eslint-disable-next-line no-console 48 | console.log(stats.toString({ 49 | assets: true, 50 | cached: false, 51 | colors: true, 52 | children: false, 53 | errors: true, 54 | warnings: true, 55 | version: true, 56 | modules: false, 57 | publicPath: true, 58 | })) 59 | } else { 60 | // eslint-disable-next-line no-console 61 | console.log(err) 62 | } 63 | } 64 | 65 | webpackConfig.entry = jsFileMap 66 | webpackConfig.output.path = distPath 67 | 68 | if (scope.webpackWatcher) { 69 | scope.webpackWatcher.close() 70 | scope.webpackWatcher = null 71 | } 72 | 73 | if (config.isWatch) { 74 | scope.webpackWatcher = webpack(webpackConfig).watch({ 75 | ignored: /node_modules/, 76 | }, webpackCallback) 77 | } else { 78 | webpack(webpackConfig).run(webpackCallback) 79 | } 80 | } 81 | 82 | /** 83 | * 拷贝文件 84 | */ 85 | function copy(copyFileList) { 86 | if (!copyFileList.length) return false 87 | 88 | return gulp.src(copyFileList, {cwd: srcPath, base: srcPath}) 89 | .pipe(_.logger()) 90 | .pipe(gulp.dest(distPath)) 91 | } 92 | 93 | /** 94 | * 安装依赖包 95 | */ 96 | function install() { 97 | return gulp.series(async () => { 98 | const demoDist = config.demoDist 99 | const demoPackageJsonPath = path.join(demoDist, 'package.json') 100 | const packageJson = _.readJson(path.resolve(__dirname, '../package.json')) 101 | const dependencies = packageJson.dependencies || {} 102 | 103 | await _.writeFile(demoPackageJsonPath, JSON.stringify({dependencies}, null, '\t')) // write dev demo's package.json 104 | }, () => { 105 | const demoDist = config.demoDist 106 | const demoPackageJsonPath = path.join(demoDist, 'package.json') 107 | 108 | return gulp.src(demoPackageJsonPath) 109 | .pipe(gulpInstall({production: true})) 110 | }) 111 | } 112 | 113 | class BuildTask { 114 | constructor(id, entry) { 115 | if (!entry) return 116 | 117 | this.id = id 118 | this.entries = Array.isArray(config.entry) ? config.entry : [config.entry] 119 | this.copyList = Array.isArray(config.copy) ? config.copy : [] 120 | this.componentListMap = {} 121 | this.cachedComponentListMap = {} 122 | 123 | this.init() 124 | } 125 | 126 | init() { 127 | const id = this.id 128 | 129 | /** 130 | * 清空目标目录 131 | */ 132 | gulp.task(`${id}-clean-dist`, () => gulp.src(distPath, {read: false, allowEmpty: true}).pipe(clean())) 133 | 134 | /** 135 | * 拷贝 demo 到目标目录 136 | */ 137 | let isDemoExists = false 138 | gulp.task(`${id}-demo`, gulp.series(async () => { 139 | const demoDist = config.demoDist 140 | 141 | isDemoExists = await _.checkFileExists(path.join(demoDist, 'project.config.json')) 142 | }, done => { 143 | if (!isDemoExists) { 144 | const demoSrc = config.demoSrc 145 | const demoDist = config.demoDist 146 | 147 | return gulp.src('**/*', {cwd: demoSrc, base: demoSrc}) 148 | .pipe(gulp.dest(demoDist)) 149 | } 150 | 151 | return done() 152 | })) 153 | 154 | /** 155 | * 安装依赖包 156 | */ 157 | gulp.task(`${id}-install`, install()) 158 | 159 | /** 160 | * 检查自定义组件 161 | */ 162 | gulp.task(`${id}-component-check`, async () => { 163 | const entries = this.entries 164 | const mergeComponentListMap = {} 165 | for (let i = 0, len = entries.length; i < len; i++) { 166 | let entry = entries[i] 167 | entry = path.join(srcPath, `${entry}.json`) 168 | const newComponentListMap = await checkComponents(entry) 169 | 170 | _.merge(mergeComponentListMap, newComponentListMap) 171 | } 172 | 173 | this.cachedComponentListMap = this.componentListMap 174 | this.componentListMap = mergeComponentListMap 175 | }) 176 | 177 | /** 178 | * 写 json 文件到目标目录 179 | */ 180 | gulp.task(`${id}-component-json`, done => { 181 | const jsonFileList = this.componentListMap.jsonFileList 182 | 183 | if (jsonFileList && jsonFileList.length) { 184 | return copy(this.componentListMap.jsonFileList) 185 | } 186 | 187 | return done() 188 | }) 189 | 190 | /** 191 | * 拷贝 wxml 文件到目标目录 192 | */ 193 | gulp.task(`${id}-component-wxml`, done => { 194 | const wxmlFileList = this.componentListMap.wxmlFileList 195 | 196 | if (wxmlFileList && 197 | wxmlFileList.length && 198 | !_.compareArray(this.cachedComponentListMap.wxmlFileList, wxmlFileList)) { 199 | return copy(wxmlFileList) 200 | } 201 | 202 | return done() 203 | }) 204 | 205 | /** 206 | * 生成 wxss 文件到目标目录 207 | */ 208 | gulp.task(`${id}-component-wxss`, done => { 209 | const wxssFileList = this.componentListMap.wxssFileList 210 | 211 | if (wxssFileList && 212 | wxssFileList.length && 213 | !_.compareArray(this.cachedComponentListMap.wxssFileList, wxssFileList)) { 214 | return wxss(wxssFileList, srcPath, distPath) 215 | } 216 | 217 | return done() 218 | }) 219 | 220 | /** 221 | * 生成 js 文件到目标目录 222 | */ 223 | gulp.task(`${id}-component-js`, done => { 224 | const jsFileList = this.componentListMap.jsFileList 225 | 226 | if (jsFileList && 227 | jsFileList.length && 228 | !_.compareArray(this.cachedComponentListMap.jsFileList, jsFileList)) { 229 | if (jsConfig.webpack) { 230 | js(this.componentListMap.jsFileMap, this) 231 | } else { 232 | return copy(jsFileList) 233 | } 234 | } 235 | 236 | return done() 237 | }) 238 | 239 | /** 240 | * 拷贝相关资源到目标目录 241 | */ 242 | gulp.task(`${id}-copy`, gulp.parallel(done => { 243 | const copyList = this.copyList 244 | const copyFileList = copyList.map(copyFilePath => { 245 | try { 246 | if (fs.statSync(path.join(srcPath, copyFilePath)).isDirectory()) { 247 | return path.join(copyFilePath, '**/*.!(wxss)') 248 | } else { 249 | return copyFilePath 250 | } 251 | } catch (err) { 252 | // eslint-disable-next-line no-console 253 | console.error(err) 254 | return null 255 | } 256 | }).filter(copyFilePath => !!copyFilePath) 257 | 258 | if (copyFileList.length) return copy(copyFileList) 259 | 260 | return done() 261 | }, done => { 262 | const copyList = this.copyList 263 | const copyFileList = copyList.map(copyFilePath => { 264 | try { 265 | if (fs.statSync(path.join(srcPath, copyFilePath)).isDirectory()) { 266 | return path.join(copyFilePath, '**/*.wxss') 267 | } else if (copyFilePath.slice(-5) === '.wxss') { 268 | return copyFilePath 269 | } else { 270 | return null 271 | } 272 | } catch (err) { 273 | // eslint-disable-next-line no-console 274 | console.error(err) 275 | return null 276 | } 277 | }).filter(copyFilePath => !!copyFilePath) 278 | 279 | if (copyFileList.length) return wxss(copyFileList, srcPath, distPath) 280 | 281 | return done() 282 | })) 283 | 284 | /** 285 | * 监听 js 变化 286 | */ 287 | gulp.task(`${id}-watch-js`, done => { 288 | if (!jsConfig.webpack) { 289 | return gulp.watch(this.componentListMap.jsFileList, {cwd: srcPath, base: srcPath}, gulp.series(`${id}-component-js`)) 290 | } 291 | 292 | return done() 293 | }) 294 | 295 | /** 296 | * 监听 json 变化 297 | */ 298 | gulp.task(`${id}-watch-json`, () => gulp.watch(this.componentListMap.jsonFileList, {cwd: srcPath, base: srcPath}, gulp.series(`${id}-component-check`, gulp.parallel(`${id}-component-wxml`, `${id}-component-wxss`, `${id}-component-js`, `${id}-component-json`)))) 299 | 300 | /** 301 | * 监听 wxml 变化 302 | */ 303 | gulp.task(`${id}-watch-wxml`, () => { 304 | this.cachedComponentListMap.wxmlFileList = null 305 | return gulp.watch(this.componentListMap.wxmlFileList, {cwd: srcPath, base: srcPath}, gulp.series(`${id}-component-wxml`)) 306 | }) 307 | 308 | /** 309 | * 监听 wxss 变化 310 | */ 311 | gulp.task(`${id}-watch-wxss`, () => { 312 | this.cachedComponentListMap.wxssFileList = null 313 | return gulp.watch('**/*.wxss', {cwd: srcPath, base: srcPath}, gulp.series(`${id}-component-wxss`)) 314 | }) 315 | 316 | /** 317 | * 监听相关资源变化 318 | */ 319 | gulp.task(`${id}-watch-copy`, () => { 320 | const copyList = this.copyList 321 | const copyFileList = copyList.map(copyFilePath => { 322 | try { 323 | if (fs.statSync(path.join(srcPath, copyFilePath)).isDirectory()) { 324 | return path.join(copyFilePath, '**/*') 325 | } else { 326 | return copyFilePath 327 | } 328 | } catch (err) { 329 | // eslint-disable-next-line no-console 330 | console.error(err) 331 | return null 332 | } 333 | }).filter(copyFilePath => !!copyFilePath) 334 | const watchCallback = filePath => copy([filePath]) 335 | 336 | return gulp.watch(copyFileList, {cwd: srcPath, base: srcPath}) 337 | .on('change', watchCallback) 338 | .on('add', watchCallback) 339 | .on('unlink', watchCallback) 340 | }) 341 | 342 | /** 343 | * 监听 demo 变化 344 | */ 345 | gulp.task(`${id}-watch-demo`, () => { 346 | const demoSrc = config.demoSrc 347 | const demoDist = config.demoDist 348 | const watchCallback = filePath => gulp.src(filePath, {cwd: demoSrc, base: demoSrc}) 349 | .pipe(gulp.dest(demoDist)) 350 | 351 | return gulp.watch('**/*', {cwd: demoSrc, base: demoSrc}) 352 | .on('change', watchCallback) 353 | .on('add', watchCallback) 354 | .on('unlink', watchCallback) 355 | }) 356 | 357 | /** 358 | * 监听安装包列表变化 359 | */ 360 | gulp.task(`${id}-watch-install`, () => gulp.watch(path.resolve(__dirname, '../package.json'), install())) 361 | 362 | /** 363 | * 构建相关任务 364 | */ 365 | gulp.task(`${id}-build`, gulp.series(`${id}-clean-dist`, `${id}-component-check`, gulp.parallel(`${id}-component-wxml`, `${id}-component-wxss`, `${id}-component-js`, `${id}-component-json`, `${id}-copy`))) 366 | 367 | gulp.task(`${id}-watch`, gulp.series(`${id}-build`, `${id}-demo`, `${id}-install`, gulp.parallel(`${id}-watch-wxml`, `${id}-watch-wxss`, `${id}-watch-js`, `${id}-watch-json`, `${id}-watch-copy`, `${id}-watch-install`, `${id}-watch-demo`))) 368 | 369 | gulp.task(`${id}-dev`, gulp.series(`${id}-build`, `${id}-demo`, `${id}-install`)) 370 | 371 | gulp.task(`${id}-default`, gulp.series(`${id}-build`)) 372 | } 373 | } 374 | 375 | module.exports = BuildTask 376 | -------------------------------------------------------------------------------- /tools/checkcomponents.js: -------------------------------------------------------------------------------- 1 | const path = require('path') 2 | 3 | const _ = require('./utils') 4 | const config = require('./config') 5 | 6 | const srcPath = config.srcPath 7 | 8 | /** 9 | * 获取 json 路径相关信息 10 | */ 11 | function getJsonPathInfo(jsonPath) { 12 | const dirPath = path.dirname(jsonPath) 13 | const fileName = path.basename(jsonPath, '.json') 14 | const relative = path.relative(srcPath, dirPath) 15 | const fileBase = path.join(relative, fileName) 16 | 17 | return { 18 | dirPath, fileName, relative, fileBase 19 | } 20 | } 21 | 22 | /** 23 | * 检测是否包含其他自定义组件 24 | */ 25 | const checkProps = ['usingComponents', 'componentGenerics'] 26 | const hasCheckMap = {} 27 | async function checkIncludedComponents(jsonPath, componentListMap) { 28 | const json = _.readJson(jsonPath) 29 | if (!json) throw new Error(`json is not valid: "${jsonPath}"`) 30 | 31 | const {dirPath, fileName, fileBase} = getJsonPathInfo(jsonPath) 32 | if (hasCheckMap[fileBase]) return 33 | hasCheckMap[fileBase] = true 34 | 35 | for (let i = 0, len = checkProps.length; i < len; i++) { 36 | const checkProp = checkProps[i] 37 | const checkPropValue = json[checkProp] || {} 38 | const keys = Object.keys(checkPropValue) 39 | 40 | for (let j = 0, jlen = keys.length; j < jlen; j++) { 41 | const key = keys[j] 42 | let value = typeof checkPropValue[key] === 'object' ? checkPropValue[key].default : checkPropValue[key] 43 | if (!value) continue 44 | 45 | value = _.transformPath(value, path.sep) 46 | 47 | // 检查相对路径 48 | const componentPath = `${path.join(dirPath, value)}.json` 49 | const isExists = await _.checkFileExists(componentPath) 50 | if (isExists) { 51 | await checkIncludedComponents(componentPath, componentListMap) 52 | } 53 | } 54 | } 55 | 56 | // 进入存储 57 | componentListMap.wxmlFileList.push(`${fileBase}.wxml`) 58 | componentListMap.wxssFileList.push(`${fileBase}.wxss`) 59 | componentListMap.jsonFileList.push(`${fileBase}.json`) 60 | componentListMap.jsFileList.push(`${fileBase}.js`) 61 | 62 | componentListMap.jsFileMap[fileBase] = `${path.join(dirPath, fileName)}.js` 63 | } 64 | 65 | module.exports = async function (entry) { 66 | const componentListMap = { 67 | wxmlFileList: [], 68 | wxssFileList: [], 69 | jsonFileList: [], 70 | jsFileList: [], 71 | 72 | jsFileMap: {}, // 为 webpack entry 所用 73 | } 74 | 75 | const isExists = await _.checkFileExists(entry) 76 | if (!isExists) { 77 | const {dirPath, fileName, fileBase} = getJsonPathInfo(entry) 78 | 79 | componentListMap.jsFileList.push(`${fileBase}.js`) 80 | componentListMap.jsFileMap[fileBase] = `${path.join(dirPath, fileName)}.js` 81 | 82 | return componentListMap 83 | } 84 | 85 | await checkIncludedComponents(entry, componentListMap) 86 | 87 | return componentListMap 88 | } 89 | -------------------------------------------------------------------------------- /tools/checkwxss.js: -------------------------------------------------------------------------------- 1 | const path = require('path') 2 | const through = require('through2') 3 | const Vinyl = require('vinyl') 4 | 5 | const _ = require('./utils') 6 | 7 | /** 8 | * 获取 import 列表 9 | */ 10 | function getImportList(wxss, filePath) { 11 | const reg = /@import\s+(?:(?:"([^"]+)")|(?:'([^']+)'));/ig 12 | const importList = [] 13 | let execRes = reg.exec(wxss) 14 | 15 | while (execRes && (execRes[1] || execRes[2])) { 16 | importList.push({ 17 | code: execRes[0], 18 | path: path.join(path.dirname(filePath), execRes[1] || execRes[2]), 19 | }) 20 | execRes = reg.exec(wxss) 21 | } 22 | 23 | return importList 24 | } 25 | 26 | /** 27 | * 获取 wxss 内容 28 | */ 29 | async function getContent(wxss, filePath, cwd) { 30 | let importList = [] 31 | 32 | if (wxss) { 33 | const currentImportList = getImportList(wxss, filePath) 34 | 35 | for (const item of currentImportList) { 36 | // 替换掉 import 语句,不让 less 编译 37 | wxss = wxss.replace(item.code, `/* *updated for miniprogram-custom-component* ${item.code} */`) 38 | 39 | // 处理依赖的 wxss 40 | const importWxss = await _.readFile(item.path) 41 | const importInfo = await getContent(importWxss, item.path, cwd) 42 | 43 | // 获取依赖列表 44 | importList.push(new Vinyl({ 45 | cwd, 46 | path: item.path, 47 | contents: Buffer.from(importInfo.wxss, 'utf8'), 48 | })) 49 | importList = importList.concat(importInfo.importList) 50 | } 51 | } 52 | 53 | return { 54 | wxss, 55 | importList, 56 | } 57 | } 58 | 59 | module.exports = { 60 | start() { 61 | return through.obj(function (file, enc, cb) { 62 | if (file.isBuffer()) { 63 | getContent(file.contents.toString('utf8'), file.path, file.cwd).then(res => { 64 | const {wxss, importList} = res 65 | 66 | importList.forEach(importFile => this.push(importFile)) 67 | 68 | file.contents = Buffer.from(wxss, 'utf8') 69 | this.push(file) 70 | // eslint-disable-next-line promise/no-callback-in-promise 71 | cb() 72 | }).catch(err => { 73 | // eslint-disable-next-line no-console 74 | console.warn(`deal with ${file.path} failed: ${err.stack}`) 75 | this.push(file) 76 | // eslint-disable-next-line promise/no-callback-in-promise 77 | cb() 78 | }) 79 | } else { 80 | this.push(file) 81 | cb() 82 | } 83 | }) 84 | }, 85 | 86 | end() { 87 | return through.obj(function (file, enc, cb) { 88 | if (file.isBuffer) { 89 | const reg = /\/\*\s\*updated for miniprogram-custom-component\*\s(@import\s+(?:(?:"([^"]+)")|(?:'([^"]+)'));)\s\*\//ig 90 | const wxss = file.contents.toString('utf8').replace(reg, (all, $1) => $1) 91 | 92 | file.contents = Buffer.from(wxss, 'utf8') 93 | this.push(file) 94 | cb() 95 | } else { 96 | this.push(file) 97 | cb() 98 | } 99 | }) 100 | }, 101 | } 102 | -------------------------------------------------------------------------------- /tools/config.js: -------------------------------------------------------------------------------- 1 | const path = require('path') 2 | 3 | const webpack = require('webpack') 4 | const nodeExternals = require('webpack-node-externals') 5 | 6 | const isDev = process.argv.indexOf('--develop') >= 0 7 | const isWatch = process.argv.indexOf('--watch') >= 0 8 | const demoSrc = path.resolve(__dirname, './demo') 9 | const demoDist = path.resolve(__dirname, '../miniprogram_dev') 10 | const src = path.resolve(__dirname, '../src') 11 | const dev = path.join(demoDist, 'components') 12 | const dist = path.resolve(__dirname, '../miniprogram_dist') 13 | 14 | module.exports = { 15 | entry: ['index'], 16 | 17 | isDev, 18 | isWatch, 19 | srcPath: src, // 源目录 20 | distPath: isDev ? dev : dist, // 目标目录 21 | 22 | demoSrc, // demo 源目录 23 | demoDist, // demo 目标目录 24 | 25 | wxss: { 26 | less: false, // 使用 less 来编写 wxss 27 | sourcemap: false, // 生成 less sourcemap 28 | }, 29 | 30 | js: { 31 | webpack: true, // 使用 webpack 来构建 js 32 | }, 33 | 34 | webpack: { 35 | mode: 'production', 36 | output: { 37 | filename: '[name].js', 38 | libraryTarget: 'commonjs2', 39 | }, 40 | target: 'node', 41 | externals: [nodeExternals()], // 忽略 node_modules 42 | module: { 43 | rules: [{ 44 | test: /\.js$/i, 45 | use: [ 46 | 'babel-loader', 47 | 'eslint-loader' 48 | ], 49 | exclude: /node_modules/ 50 | }], 51 | }, 52 | resolve: { 53 | modules: [src, 'node_modules'], 54 | extensions: ['.js', '.json'], 55 | }, 56 | plugins: [ 57 | new webpack.DefinePlugin({}), 58 | new webpack.optimize.LimitChunkCountPlugin({maxChunks: 1}), 59 | ], 60 | optimization: { 61 | minimize: false, 62 | }, 63 | // devtool: 'nosources-source-map', // 生成 js sourcemap 64 | performance: { 65 | hints: 'warning', 66 | assetFilter: assetFilename => assetFilename.endsWith('.js') 67 | } 68 | }, 69 | 70 | copy: ['./assets', './utils.js'], // 将会复制到目标目录 71 | } 72 | -------------------------------------------------------------------------------- /tools/demo/app.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | const WXAPI = require('./components/index') 3 | WXAPI.init('gooking') 4 | 5 | App({ 6 | onLaunch: function () { 7 | // 调用简单例子 8 | WXAPI.queryMobileLocation({ 9 | mobile: '13500000000' 10 | }).then(res => { 11 | console.log('queryMobileLocation:', res) 12 | }).catch(e => { 13 | console.error('接口调用异常:', e) 14 | }) 15 | // 读取 banner 16 | WXAPI.banners().then(res => { 17 | console.log('banners:', res) 18 | }) 19 | }, 20 | globalData: { 21 | 22 | } 23 | }) 24 | -------------------------------------------------------------------------------- /tools/demo/app.json: -------------------------------------------------------------------------------- 1 | { 2 | "pages":[ 3 | "pages/index/index" 4 | ], 5 | "window":{ 6 | "backgroundTextStyle":"light", 7 | "navigationBarBackgroundColor": "#fff", 8 | "navigationBarTitleText": "WeChat", 9 | "navigationBarTextStyle":"black" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /tools/demo/app.wxss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gooking/apifm-wxapi/3607a3c4cc6fdc4e95a9fe316668c5895b614722/tools/demo/app.wxss -------------------------------------------------------------------------------- /tools/demo/package.json: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /tools/demo/pages/index/index.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | const WXAPI = require('../../components/index') 3 | //WXAPI.init('gooking') 4 | 5 | Page({ 6 | data: {}, 7 | onLoad(){ 8 | WXAPI.banners().then(res => { 9 | console.log('banners-index:', res) 10 | }) 11 | } 12 | }) 13 | -------------------------------------------------------------------------------- /tools/demo/pages/index/index.json: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /tools/demo/pages/index/index.wxml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /tools/demo/pages/index/index.wxss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gooking/apifm-wxapi/3607a3c4cc6fdc4e95a9fe316668c5895b614722/tools/demo/pages/index/index.wxss -------------------------------------------------------------------------------- /tools/demo/project.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "description": "项目配置文件。", 3 | "packOptions": { 4 | "ignore": [] 5 | }, 6 | "setting": { 7 | "urlCheck": true, 8 | "es6": true, 9 | "postcss": true, 10 | "minified": true, 11 | "newFeature": true, 12 | "nodeModules": true 13 | }, 14 | "compileType": "miniprogram", 15 | "libVersion": "2.2.3", 16 | "appid": "", 17 | "projectname": "apifm-wxapi", 18 | "isGameTourist": false, 19 | "condition": { 20 | "search": { 21 | "current": -1, 22 | "list": [] 23 | }, 24 | "conversation": { 25 | "current": -1, 26 | "list": [] 27 | }, 28 | "game": { 29 | "currentL": -1, 30 | "list": [] 31 | }, 32 | "miniprogram": { 33 | "current": -1, 34 | "list": [] 35 | } 36 | } 37 | } -------------------------------------------------------------------------------- /tools/utils.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs') 2 | const path = require('path') 3 | 4 | // eslint-disable-next-line no-unused-vars 5 | const colors = require('colors') 6 | const through = require('through2') 7 | 8 | /** 9 | * 异步函数封装 10 | */ 11 | function wrap(func, scope) { 12 | return function (...args) { 13 | if (args.length) { 14 | const temp = args.pop() 15 | if (typeof temp !== 'function') { 16 | args.push(temp) 17 | } 18 | } 19 | 20 | return new Promise(function (resolve, reject) { 21 | args.push(function (err, data) { 22 | if (err) reject(err) 23 | else resolve(data) 24 | }) 25 | 26 | func.apply((scope || null), args) 27 | }) 28 | } 29 | } 30 | 31 | const accessSync = wrap(fs.access) 32 | const statSync = wrap(fs.stat) 33 | const renameSync = wrap(fs.rename) 34 | const mkdirSync = wrap(fs.mkdir) 35 | const readFileSync = wrap(fs.readFile) 36 | const writeFileSync = wrap(fs.writeFile) 37 | 38 | /** 39 | * 调整路径分隔符 40 | */ 41 | function transformPath(filePath, sep = '/') { 42 | return filePath.replace(/[\\/]/g, sep) 43 | } 44 | 45 | /** 46 | * 检查文件是否存在 47 | */ 48 | async function checkFileExists(filePath) { 49 | try { 50 | await accessSync(filePath) 51 | return true 52 | } catch (err) { 53 | return false 54 | } 55 | } 56 | 57 | /** 58 | * 递归创建目录 59 | */ 60 | async function recursiveMkdir(dirPath) { 61 | const prevDirPath = path.dirname(dirPath) 62 | try { 63 | await accessSync(prevDirPath) 64 | } catch (err) { 65 | // 上一级目录不存在 66 | await recursiveMkdir(prevDirPath) 67 | } 68 | 69 | try { 70 | await accessSync(dirPath) 71 | 72 | const stat = await statSync(dirPath) 73 | if (stat && !stat.isDirectory()) { 74 | // 目标路径存在,但不是目录 75 | await renameSync(dirPath, `${dirPath}.bak`) // 将此文件重命名为 .bak 后缀 76 | await mkdirSync(dirPath) 77 | } 78 | } catch (err) { 79 | // 目标路径不存在 80 | await mkdirSync(dirPath) 81 | } 82 | } 83 | 84 | /** 85 | * 读取 json 86 | */ 87 | function readJson(filePath) { 88 | try { 89 | // eslint-disable-next-line import/no-dynamic-require 90 | const content = require(filePath) 91 | delete require.cache[require.resolve(filePath)] 92 | return content 93 | } catch (err) { 94 | return null 95 | } 96 | } 97 | 98 | /** 99 | * 读取文件 100 | */ 101 | async function readFile(filePath) { 102 | try { 103 | return await readFileSync(filePath, 'utf8') 104 | } catch (err) { 105 | // eslint-disable-next-line no-console 106 | return console.error(err) 107 | } 108 | } 109 | 110 | /** 111 | * 写文件 112 | */ 113 | async function writeFile(filePath, data) { 114 | try { 115 | await recursiveMkdir(path.dirname(filePath)) 116 | return await writeFileSync(filePath, data, 'utf8') 117 | } catch (err) { 118 | // eslint-disable-next-line no-console 119 | return console.error(err) 120 | } 121 | } 122 | 123 | /** 124 | * 时间格式化 125 | */ 126 | function format(time, reg) { 127 | const date = typeof time === 'string' ? new Date(time) : time 128 | const map = {} 129 | map.yyyy = date.getFullYear() 130 | map.yy = ('' + map.yyyy).substr(2) 131 | map.M = date.getMonth() + 1 132 | map.MM = (map.M < 10 ? '0' : '') + map.M 133 | map.d = date.getDate() 134 | map.dd = (map.d < 10 ? '0' : '') + map.d 135 | map.H = date.getHours() 136 | map.HH = (map.H < 10 ? '0' : '') + map.H 137 | map.m = date.getMinutes() 138 | map.mm = (map.m < 10 ? '0' : '') + map.m 139 | map.s = date.getSeconds() 140 | map.ss = (map.s < 10 ? '0' : '') + map.s 141 | 142 | return reg.replace(/\byyyy|yy|MM|M|dd|d|HH|H|mm|m|ss|s\b/g, $1 => map[$1]) 143 | } 144 | 145 | /** 146 | * 日志插件 147 | */ 148 | function logger(action = 'copy') { 149 | return through.obj(function (file, enc, cb) { 150 | const type = path.extname(file.path).slice(1).toLowerCase() 151 | 152 | // eslint-disable-next-line no-console 153 | console.log(`[${format(new Date(), 'yyyy-MM-dd HH:mm:ss').grey}] [${action.green} ${type.green}] ${'=>'.cyan} ${file.path}`) 154 | 155 | this.push(file) 156 | cb() 157 | }) 158 | } 159 | 160 | /** 161 | * 比较数组是否相等 162 | */ 163 | function compareArray(arr1, arr2) { 164 | if (!Array.isArray(arr1) || !Array.isArray(arr2)) return false 165 | if (arr1.length !== arr2.length) return false 166 | 167 | for (let i = 0, len = arr1.length; i < len; i++) { 168 | if (arr1[i] !== arr2[i]) return false 169 | } 170 | 171 | return true 172 | } 173 | 174 | /** 175 | * 合并两个对象 176 | */ 177 | function merge(obj1, obj2) { 178 | Object.keys(obj2).forEach(key => { 179 | if (Array.isArray(obj1[key]) && Array.isArray(obj2[key])) { 180 | obj1[key] = obj1[key].concat(obj2[key]) 181 | } else if (typeof obj1[key] === 'object' && typeof obj2[key] === 'object') { 182 | obj1[key] = Object.assign(obj1[key], obj2[key]) 183 | } else { 184 | obj1[key] = obj2[key] 185 | } 186 | }) 187 | 188 | return obj1 189 | } 190 | 191 | /** 192 | * 获取 id 193 | */ 194 | let seed = +new Date() 195 | function getId() { 196 | return ++seed 197 | } 198 | 199 | module.exports = { 200 | wrap, 201 | transformPath, 202 | 203 | checkFileExists, 204 | readJson, 205 | readFile, 206 | writeFile, 207 | 208 | logger, 209 | format, 210 | compareArray, 211 | merge, 212 | getId, 213 | } 214 | --------------------------------------------------------------------------------