微信开放平台之第三方平台开发之提交模板小程序

时间:2023-01-06 01:08:04

大家好,我是小悟

微信第三方开发的精妙就在于可以用一套代码,孵化出多个相同功能的小程序,减少开发成本,包括时间和金钱成本。而这最重要的一步就是将我们开发好的小程序上传到微信服务器,当做模板来使用,需要一套这样的小程序,就直接使用,而无需再做过多复杂的工作以及重新开发。那这样的模板小程序如何提交呢?

这最重要的一步,用开放平台的词来形容就是【模板库管理】。

微信开放平台之第三方平台开发之提交模板小程序

说具体点,就是我们在开放平台上先添加一个开发小程序,这个需要单独注册一个小程序来操作。值得一提的是,有的同学会误以为这个列表是商家授权给平台的小程序列表,想在这里操作解除授权什么的。不是的,授权的小程序列表在开放平台上是不展示的,这里的小程序是代开发小程序。

微信开放平台之第三方平台开发之提交模板小程序

public AjaxResult commit(CommitModel model) {
  Merchant merchant = merchantService.selectMerchantById(model.getMerchantId());
  if (merchant == null) {
    logger.warn("上传代码---->失败,merchant为null");
    return AjaxResult.error("上传代码,merchant为null",null);
  }
  AuthorizationInfo info = AuthorizedUtils.getAuthorizationInfo(merchant.getAppid());
  if (info != null && StringUtils.isNotEmpty(info.getAuthorizer_access_token())) {
    CommitIn commitIn = new CommitIn();
    String value = model.getValue();
    String[] items = value.split("_");
    String version = items[2];
    commitIn.setTemplate_id(items[0])
      .setUser_desc(items[1])
      .setUser_version(version);
    //第三方自定义的配置
    JSONObject obj = new JSONObject();
    obj.put("extAppid", merchant.getAppid());
    Map<String, Object> map = new HashMap<>();
    map.put("appId", merchant.getAppid());
    map.put("merchantId", model.getMerchantId());
    map.put("userVersion", commitIn.getUser_version());
    map.put("contactUsQrcode", merchant.getContactUsQrcodeMpArticle());
    map.put("focusMpQrcode", merchant.getFocusMpQrcodeMpArticle());
    obj.put("ext", map);
    map = new HashMap<>();
    Map<String, Object> maps = new HashMap<>();
    maps.put("pages/home/home", map);
    obj.put("extPages", maps);
    commitIn.setExt_json(JSONObject.toJSONString(obj));
    //接受微信返回的数据
    obj = CodeUtils.commit(info, commitIn);
    Integer errCode = obj.getInteger(ResStatus.ERRCODE);
    String errMsg = obj.getString(ResStatus.ERRMSG);
    if (ResStatus.CODE.equals(errCode) && ResStatus.MSG.equalsIgnoreCase(errMsg)) {
      AppletsRelease ar = appletsReleaseService.getOne(new LambdaQueryWrapper<AppletsRelease>()
                                                       .eq(AppletsRelease::getMerchantId,merchant.getId()));
      if(ar == null){
        ar = new AppletsRelease();
        ar.setMerchantId(model.getMerchantId()).setHistoryversion(version);
      } else{
        ar.setHistoryversion(version);
      }
      appletsReleaseService.saveOrUpdate(ar);
      return AjaxResult.success();
    } else {
      return AjaxResult.error(errCode,errMsg);
    }
  } else {
    return AjaxResult.error("小程序未授权或已解绑授权",null);
  }
}

再说明白点,代开发小程序指的是服务商用于开发用途的小程序帐号,该帐号通常不会发布上线,仅仅用于登录微信开发者工具进行代码编写&提交。

微信开放平台之第三方平台开发之提交模板小程序

当前端同学使用这个小程序开发好了代码以后,提交代码和普通小程序一样,只不过这个时候所提交的代码会被提交到开放平台的草稿箱中,而不是该小程序的MP后台版本管理中。

微信开放平台之第三方平台开发之提交模板小程序

public AjaxResult submitAudit(SubmitAudit submit) {
  Merchant merchant = merchantService.getById(submit.getMerchantId());
  if (merchant == null) {
    logger.warn("提交审核---->失败,merchant为null");
    return AjaxResult.error("提交审核,merchant为null", null);
  }
  AppletsRelease ar = appletsReleaseService.getOne(new LambdaQueryWrapper<AppletsRelease>()
                                                   .eq(AppletsRelease::getMerchantId,merchant.getId()));
  if (ar == null) {
    return AjaxResult.error("请先上传代码");
  }
  AuthorizationInfo info = AuthorizedUtils.getAuthorizationInfo(merchant.getAppid());
  if (info != null && StringUtils.isNotEmpty(info.getAuthorizer_access_token())) {

    List<SubmitAudit> submits = new ArrayList<>();
    JSONObject sa = CodeUtils.submitAudit(info, submits);
    Integer errCode = sa.getInteger(ResStatus.ERRCODE);
    String errMsg = sa.getString(ResStatus.ERRMSG);
    if (ResStatus.CODE.equals(errCode) && ResStatus.MSG.equalsIgnoreCase(errMsg)) {
      JSONObject obj = CodeUtils.getAuditStatus(info, sa.getString("auditid"));
      Integer objErrCode = obj.getInteger(ResStatus.ERRCODE);
      String objErrMsg = obj.getString(ResStatus.ERRMSG);
      if (obj.getInteger(ResStatus.ERRCODE).equals(ResStatus.CODE) && ResStatus.MSG.equalsIgnoreCase(obj.getString(ResStatus.ERRMSG))) {
        ar.setMerchantId(submit.getMerchantId())
          .setAuditId(sa.getString("auditid"))
          .setStatus(obj.getString("status"));
        if (AppletsRelease.STATUS_0.equals(ar.getStatus())) {
          ar.setRemark(AppletsRelease.MSG_0);
        } else if (AppletsRelease.STATUS_1.equals(ar.getStatus())) {
          ar.setReason(obj.getString("reason"))
            .setScreenshot(obj.getString("screenshot"))
            .setRemark(AppletsRelease.MSG_1);
        } else if (AppletsRelease.STATUS_2.equals(ar.getStatus())) {
          ar.setRemark(AppletsRelease.MSG_2);
        } else if (AppletsRelease.STATUS_3.equals(ar.getStatus())) {
          ar.setRemark(AppletsRelease.MSG_3);
        } else if (AppletsRelease.STATUS_4.equals(ar.getStatus())) {
          ar.setRemark(AppletsRelease.MSG_4);
        }
        appletsReleaseService.updateById(ar);
        return AjaxResult.success();
      } else {
        return AjaxResult.error(objErrCode,objErrMsg);
      }
    } else {
      return AjaxResult.error(errCode,errMsg);
    }
  } else {
    return AjaxResult.error("小程序未授权或已解绑授权",null);
  }
}

当小程序代码到达了草稿箱后,这个时候可以做一个功能,使用开放平台提供的模板库管理接口来操作,先获取到草稿箱列表,再将草稿添加到模板库,然后再获取模板列表用来替所授权的小程序上传代码。

public AjaxResult templateList() {
  ComponentToken token = AuthorizedUtils.getComponentToken();
  JSONObject obj = TemplateUtils.getTemplateList(token);
  List<Template> templates = new ArrayList<>();
  if("0".equals(obj.getString("errcode")) && "ok".equalsIgnoreCase(obj.getString("errmsg"))){
    JSONArray array = obj.getJSONArray("template_list");
    if (array != null && array.size() > 0) {
      for(int i=0;i<array.size();i++){
        Template template = new Template();
        JSONObject json = array.getJSONObject(i);
        template.setTemplateId(json.getString("template_id"))
          .setUserVersion(json.getString("user_version"))
          .setUserDesc(json.getString("user_desc")).setCreateTime(json.getString("create_time"))
          .setLabel(template.getUserDesc()+"_"+template.getUserVersion())
          .setValue(template.getTemplateId()+"_"+template.getUserDesc()+"_"+template.getUserVersion());
        templates.add(template);
      }
    }
    return AjaxResult.success(templates);
  } else {
    return AjaxResult.error(obj.getInteger("errcode"),obj.getString("errmsg"));
  }
}

这个说的是通过接口来操作,一说是接口,有的同学就不高兴了,那就得写代码来做,别慌,这个功能啊,虽然官方有提供接口,但也可以可视化操作。

微信开放平台之第三方平台开发之提交模板小程序

那不少同学肯定就要问了,这么好的功能在哪里,就在开放平台上面,你瞧,草稿箱和模板列表都有了,你从开发工具上传后的代码会展示在草稿箱中,然后可以操作将草稿箱中的代码添加到模板列表中,再获取模板列表用来替所授权的小程序上传代码。

微信开放平台之第三方平台开发之提交模板小程序

嗯,有一说一,开放平台这里还是不错的。比起全局的那么多接口,这可是直接提供可视化操作哦,对我们搞开发的同学来说,代码能少写一点是一点,毕竟,苍蝇再小也是肉对吧。

微信开放平台之第三方平台开发之提交模板小程序


您的一键三连,是我更新的最大动力,谢谢

山水有相逢,来日皆可期,谢谢阅读,我们再会

我手中的金箍棒,上能通天,下能探海