微信小程序批量提交后台审核

在常规开发小程序的时候一般通过小程序官方编辑器来进行提交到后台审核,如果一个小程序适用于多个组织/角色的情况下,只是某些组织code不同其他代码一致,这时候如果需要开发提交审核,那就是一个比较头疼的问题了。如果你有10个code变量,那就要在开发完成后提交后台审核上线这一步上就得花费一个小时或者更多的时间。

微信给开发者提供了三种提交审核的方式:

1、通过开发者编辑器提交

2、注册为微信服务商来统一管理提交

3、通过miniprogram-ci来进行提交。

如果选择第二种方法,那就需要注册为微信服务商。同时也需要开发相对应的版本后台管理系统,结合目前的实际情况还是选择了第三种方案。优先解决批量小程序提交审核的问题。

实现步骤

首先去小程序的后台获取小程序的appId以及在开发管理中-开发设置-小程序代码上传 获取该小程序的代码上传密钥以及关闭IP白名单

准备工作

首先新建文件夹用来存放小程序的key如下图:

以appid为文件名内容为key,同时新建version.json文件用来对当前小程序版本号进行管理

代码

安装相关依赖

import inquirer from 'inquirer'
import shell from 'shelljs'
import fs from 'fs'
import ci from 'miniprogram-ci'
import path from 'path'
const username = '小程序提交名称'
const __dirname = ''
const config = [{
    appid: "appid", // appid
    env: "prod", // 发布环境
    name: "小程序名字", // 小程序名字
  }];

版本号自增算法

// 版本自加算法
function autoVersionAdd(version, index) {
  if (!version) return new Error("版本号不存在");
  let arr = version.split(".");
  index === undefined && (index = arr.length - 1);
  let newVal = parseInt(arr[index] '' "0") + 1;
  if (newVal > 20 && index !== 0) {
    arr.splice(index, 1, 0);
    if (index < 0) return arr.join(".");
    return versionAutoAdd(arr.join("."), index - 1);
  } else {
    arr.splice(index, 1, newVal);
    return arr.join(".");
  }
}

上传小程序代码

// 上传小程序
const uploadMiniCode = (options) => {
  return new Promise(async (resovle) => {
    let {
      appid,
      remark,
      name
    } = options;
    // 获取版本号
    const versions = await getVersions();
    // 获取自增后的版本号
    const version = autoVersionAdd(versions[appid]);
    const project = new ci.Project({
      appid: appid, 
      type: "miniProgram", // 类型-小程序
      projectPath: path.join(__dirname, "dist/dev/mp-weixin"), // 项目路径
      privateKeyPath: process.cwd() + <code>/keys/${appid}.key`, // 密钥路径
      ignores: ["node_modules/**/*"], // 忽略的文件
    });
    // 调用上传方法
    ci.upload({
        project,
        version: version '' "1.0.0",
        desc: username + ":" + remark, // 上传用户信息
        setting: {
          es6: true, // 是否 "es6 转 es5"
          es7: true, // 是否 "es7 转 es5"
          minify: true, // 是否压缩代码
        },
      })
      .then(async (res) => {
        console.log("----------代码上传成功-------------");
        await setVersion(appid, versions, version);
        resovle({
          isSuccess: true,
        });
      })
      .catch((error) => {
        console.log("上传失败");
        resovle({
          isSuccess: false,
        });
        process.exit(-1);
      });
  });
};</code></pre>

#### 调用上传逻辑

<pre>`inquirer
  .prompt([{
      type: "input", // 类型
      name: "remark", // 字段名称,在then里可以打印出来
      message: "备注:", // 提示信息
    },
    {
      type: "checkbox",
      message: "请选择你要发布的环境?",
      name: "type",
      choices: config.map((item) => {
        return {
          name: item.name,
          value: item.appid,
        };
      }),
    },
  ])
  .then(async (answers) => {
    console.log(answers, '------------开始选择----------------');
    // 队列式上传
    for (let appid of answers.type) {
      switch (appid) {
        case "wx6182acwewe8557e17":
          console.log("正在发布xxxx,请稍等...");
          break;
        default:
          break;
      }
      // 修改打包文件的appid为当前appid
      await writeJson(appid);
      // 上传小程序
      await uploadMini({
        appid: appid,
        remark: answers.remark,
      });
    }
  });

发布流程

每次发布前将代码拷贝到发布程序的dist路径下,然后在根目录执行node deploy.js即可。

后续

执行完成之后还需要登录各个小程序的后台进行人工提交审核,没办法,如果想全部自动化只能走微信服务商那一套流程,等到后期业务规模变大可以在考虑这种实现方式。前期先解决一键提交审核,后期在解决自动化问题