大家好,我是小悟
微信第三方开发的精妙就在于可以用一套代码,孵化出多个相同功能的小程序,减少开发成本,包括时间和金钱成本。而这最重要的一步就是将我们开发好的小程序上传到微信服务器,当做模板来使用,需要一套这样的小程序,就直接使用,而无需再做过多复杂的工作以及重新开发。那这样的模板小程序如何提交呢?
这最重要的一步,用开放平台的词来形容就是【模板库管理】。
说具体点,就是我们在开放平台上先添加一个开发小程序,这个需要单独注册一个小程序来操作。值得一提的是,有的同学会误以为这个列表是商家授权给平台的小程序列表,想在这里操作解除授权什么的。不是的,授权的小程序列表在开放平台上是不展示的,这里的小程序是代开发小程序。
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"));
}
}
这个说的是通过接口来操作,一说是接口,有的同学就不高兴了,那就得写代码来做,别慌,这个功能啊,虽然官方有提供接口,但也可以可视化操作。
那不少同学肯定就要问了,这么好的功能在哪里,就在开放平台上面,你瞧,草稿箱和模板列表都有了,你从开发工具上传后的代码会展示在草稿箱中,然后可以操作将草稿箱中的代码添加到模板列表中,再获取模板列表用来替所授权的小程序上传代码。
嗯,有一说一,开放平台这里还是不错的。比起全局的那么多接口,这可是直接提供可视化操作哦,对我们搞开发的同学来说,代码能少写一点是一点,毕竟,苍蝇再小也是肉对吧。
您的一键三连,是我更新的最大动力,谢谢
山水有相逢,来日皆可期,谢谢阅读,我们再会
我手中的金箍棒,上能通天,下能探海