@PostMapping("creatApp")
@ApiImplicitParam(name = "companyVO", dataType = "CompanyVO")
@ApiOperation("创建小程序")
public ApiResponse creatApp(@RequestBody CompanyVO companyVO) {
String componentAccessToken = getComponentAccessToken();
StringBuffer stf = new StringBuffer("https://api.weixin.qq.com/cgi-bin/component/fastregisterweapp?action=create&component_access_token=");
stf.append(componentAccessToken);
Map<String, Object> map = new HashMap();
map.put("name", companyVO.getCompanyName());
map.put("code", companyVO.getCompanyCode());
map.put("code_type", companyVO.getCompanyCodeType());
map.put("legal_persona_wechat", companyVO.getWeChatAccount());
map.put("legal_persona_name", companyVO.getMerchantName());
map.put("component_phone", companyVO.getMerchantPhone());
ResponseEntity<String> entity = restTemplate.postForEntity(stf.toString(), map, String.class);
//状态码,0成功,其他失败
if (entity.getStatusCode().equals(HttpStatus.OK) && JSONObject.parseObject(entity.getBody()).getInteger("errcode") == 0) {
log.info("创建小程序=========》【{}】", entity.getBody());
} else {
log.error("创建小程序=========》失败!");
}
return ResponseUtil.success(entity.getBody());
}
CompanyVO:如下
{
"name": "tencent", // 企业名
"code": "123", // 企业代码
"code_type": 1, // 企业代码类型(1:统一社会信用代码, 2:组织机构代码,3:营业执照注册号)
"legal_persona_wechat": "123", // 法人微信
"legal_persona_name":"pony" , // 法人姓名
"component_phone":"1234567" //第三方联系电话
}
返回结果:
{
"errcode":0, // 状态码,0成功,其他失败
"errmsg":"OK" // 错误信息
}
失败
-1 非法action参数 invalid action
89249 该主体已有任务执行中,距上次任务24h后再试 task running
89247 内部错误 inner error
86004 无效微信号 invalid wechat
61070 法人姓名与微信号不一致 name, wechat name not in accordance
89248 企业代码类型无效,请选择正确类型填写 invalid code type
89250 未找到该任务 task not found
89251 待法人人脸核身校验 legal person checking
89252 法人&企业信息一致性校验中 front checking
89253 缺少参数 lack of some params
89254 第三方权限集不全,补全权限集全网发布后生效 lack of some component rights
/**
* 消息与事件接收URL
*/
@PostMapping("receiveComponentVerifyTicket/{APPID}")
public String receiveComponentVerifyTicket(HttpServletRequest request) {
log.info("消息与事件接收URL=========》开始【{}】", JSON.toJSONString(request.getParameterMap()));
/*log.info("消息与事件接收URL=====================》【{}】", request.getParameterMap().get("AppId"));
String[] AppId = request.getParameterMap().get("AppId");
redisUtil.set("APP_ID", StringUtils.join(AppId), 7200);*/
return "success";
}
当然熟悉的话,直接让授权方给你发小程序的APPID也可以,创建成功后,授权方会受到微信的通知,可以看的到自己的小程序APPID,但是没办法登录,因为是通过第三方平台接口创建的。
@GetMapping("commitCode")
@ResponseBody
@ApiImplicitParams({
@ApiImplicitParam(name = "desc", value = "备注", required = true, dataType = "string"),
@ApiImplicitParam(name = "templateId", value = "模板ID", required = true, dataType = "int"),
@ApiImplicitParam(name = "version", value = "版本号", required = true, dataType = "string")
})
@ApiOperation("为已经授权的小程序部署代码")
public ApiResponse commitCode(String desc, Integer templateId, String version) {
String authorizerAccesstoken = String.valueOf(redisUtil.get("authorizer_access_token"));
String appId = String.valueOf(redisUtil.get("authorizer_appid"));
log.error("为已经授权的小程序部署代码=========》开始!");
StringBuffer stf = new StringBuffer("https://api.weixin.qq.com/wxa/commit?access_token=");
stf.append(authorizerAccesstoken);
Map<String, Object> map = new HashMap();
map.put("template_id", templateId);
map.put("user_version", version);
//第三方自定义的配置
Map extMap = new HashMap();
//授权第三方的APPID
extMap.put("extAppid", appId);
map.put("ext_json", JSON.toJSONString(extMap));
map.put("user_desc", desc);
ResponseEntity<String> entity = restTemplate.postForEntity(stf.toString(), map, String.class);
if (entity.getStatusCode().equals(HttpStatus.OK)) {
log.info("为已经授权的小程序部署代码=========》【{}】", entity.getBody());
} else {
log.error("为已经授权的小程序部署代码=========》失败!");
}
return ResponseUtil.success(entity.getBody());
}
成功返回:
{
"errcode":0,
"errmsg":"ok",
}
上述接口的模板ID,版本号,备注,在第三方平台小程序模版库可以看的到,通过微信开发者工具去上传代码,去生成模板库。具体参数太多不一一描述,都在微信第三方平台代小程序实现业务的 代码管理模块里去找这个接口描述
@GetMapping("qrCode")
@ApiOperation("预览小程序")
public ApiResponse qrCode() {
String authorizerAccesstoken = redisUtil.get("authorizer_access_token").toString();
log.error("预览小程序=========》开始!");
StringBuffer stf = new StringBuffer("https://api.weixin.qq.com/wxa/get_qrcode?access_token=");
stf.append(authorizerAccesstoken);
log.info("预览小程序=========》【{}】", stf.toString());
return ResponseUtil.success(stf.toString());
}
authorizer_access_token 怎么获取,在上一篇文章中写到过,点此链接查看
这个接口没写,我是用postman测试的
https://api.weixin.qq.com/cgi-bin/wxopen/addcategory?access_token=
该接口文档上也有
@GetMapping("/getCategory")
@ApiOperation("获取授权小程序帐号已设置的类目")
public ApiResponse getCategory() {
StringBuffer stf = new StringBuffer("https://api.weixin.qq.com/wxa/get_category?access_token=");
String authorizerAccessToken = String.valueOf(redisUtil.get("authorizer_access_token"));
stf.append(authorizerAccessToken);
ResponseEntity<String> entity = restTemplate.getForEntity(stf.toString(), String.class);
if (entity.getStatusCode().equals(HttpStatus.OK)) {
log.info("获取授权小程序帐号已设置的类目=========》【{}】", entity.getBody());
} else {
log.error("获取授权小程序帐号已设置的类目=========》失败!");
}
return ResponseUtil.success(entity.getBody());
}
@GetMapping("getPage")
@ApiOperation("获取小程序的第三方提交代码的页面配置")
public ApiResponse getPage() {
StringBuffer stf = new StringBuffer("https://api.weixin.qq.com/wxa/get_page?access_token=");
String authorizerAccessToken = String.valueOf(redisUtil.get("authorizer_access_token"));
stf.append(authorizerAccessToken);
ResponseEntity<String> entity = restTemplate.getForEntity(stf.toString(), String.class);
if (entity.getStatusCode().equals(HttpStatus.OK)) {
log.info("获取小程序的第三方提交代码的页面配置=========》【{}】", entity.getBody());
} else {
log.error("获取小程序的第三方提交代码的页面配置=========》失败!");
}
return ResponseUtil.success(entity.getBody());
}
public class SubmitAuditVO {
@ApiModelProperty("提交审核项的一个列表")
private List<SubmitAuditAddressVO> itemList;
@ApiModelProperty("反馈内容,不超过200字")
private String feedbackInfo;
@ApiModelProperty("图片media_id列表,中间用“丨”分割,xx丨yy丨zz,不超过5张图片")
private String feedbackStuff;
}
public class SubmitAuditAddressVO {
@ApiModelProperty("小程序的页面")
private String address;
@ApiModelProperty("小程序的标签,多个标签用空格分隔,标签不能多于10个,标签长度不超过20")
private String tag;
@ApiModelProperty("一级类目")
private String firstClass;
@ApiModelProperty("二级类目")
private String secondClass;
@ApiModelProperty("三级类目")
private String thirdClass;
@ApiModelProperty("一级类目的ID")
private String firstId;
@ApiModelProperty("二级类目的ID")
private String secondId;
@ApiModelProperty("三级类目的ID")
private String thirdId;
@ApiModelProperty("小程序页面的标题,标题长度不超过32")
private String title;
}
@PostMapping("submitAudit")
@ApiOperation("将第三方提交的代码包提交审核")
@ApiImplicitParam(name = "submitAuditVO", dataType = "SubmitAuditVO")
public ApiResponse submitAudit(@RequestBody SubmitAuditVO submitAuditVO) {
StringBuffer stf = new StringBuffer("https://api.weixin.qq.com/wxa/submit_audit?access_token=");
String authorizerAccessToken = String.valueOf(redisUtil.get("authorizer_access_token"));
stf.append(authorizerAccessToken);
Map<String, Object> parmMap = new HashMap(3);
List<SubmitAuditAddressVO> list = submitAuditVO.getItemList();
List<Map<String, String>> mapList = new ArrayList();
list.forEach(submitAuditAddressVO -> {
Map<String, String> map = new HashMap();
map.put("address", submitAuditAddressVO.getAddress());
map.put("tag", submitAuditAddressVO.getTag());
if (!StringUtils.isEmpty(submitAuditAddressVO.getFirstClass())) {
map.put("first_class", submitAuditAddressVO.getFirstClass());
}
if (!StringUtils.isEmpty(submitAuditAddressVO.getSecondClass())) {
map.put("second_class", submitAuditAddressVO.getSecondClass());
}
if (!StringUtils.isEmpty(submitAuditAddressVO.getThirdClass())) {
map.put("third_class", submitAuditAddressVO.getThirdClass());
}
if (!StringUtils.isEmpty(submitAuditAddressVO.getFirstId())) {
map.put("first_id", submitAuditAddressVO.getFirstId());
}
if (!StringUtils.isEmpty(submitAuditAddressVO.getSecondId())) {
map.put("second_id", submitAuditAddressVO.getSecondId());
}
if (!StringUtils.isEmpty(submitAuditAddressVO.getThirdId())) {
map.put("third_id", submitAuditAddressVO.getThirdId());
}
map.put("title", submitAuditAddressVO.getTitle());
mapList.add(map);
});
if (!StringUtils.isEmpty(submitAuditVO.getFeedbackInfo())) {
parmMap.put("feedback_info", submitAuditVO.getFeedbackInfo());
}
if (!StringUtils.isEmpty(submitAuditVO.getFeedbackStuff())) {
parmMap.put("feedback_stuff", submitAuditVO.getFeedbackStuff());
}
parmMap.put("item_list", mapList);
log.info("请求参数【{}】=============================》", parmMap);
ResponseEntity<String> entity = restTemplate.postForEntity(stf.toString(), parmMap, String.class);
if (entity.getStatusCode().equals(HttpStatus.OK)) {
log.info("将第三方提交的代码包提交审核=========》【{}】", entity.getBody());
} else {
log.error("将第三方提交的代码包提交审核=========》失败!");
}
return ResponseUtil.success(entity.getBody());
}
正确返回:
{
"errcode":0,
"errmsg":"ok",
"auditid":1234567
}
可通过 auditid 去查询审核状态
@GetMapping("setNickName")
@ApiOperation("修改小程序名字")
public ApiResponse setNickName(String nickName) {
StringBuffer stf = new StringBuffer("https://api.weixin.qq.com/wxa/setnickname?access_token=");
String authorizerAccessToken = String.valueOf(redisUtil.get("authorizer_access_token"));
stf.append(authorizerAccessToken);
Map<String, String> parmMap = new HashMap();
parmMap.put("nick_name", nickName);
ResponseEntity<String> entity = restTemplate.postForEntity(stf.toString(), parmMap, String.class);
if (entity.getStatusCode().equals(HttpStatus.OK)) {
log.info("修改小程序名字=========》【{}】", entity.getBody());
} else {
log.error("修改小程序名字=========》失败!");
}
return ResponseUtil.success(entity.getBody());
}
正确返回:
{
"errcode": 0,
"errmsg": "ok",
"wording": "",
"audit_id": 12345
}
可通过audit_id 去查询审核状态,具体参考第三方平台代小程序实现业务小程序基本信息设置里的接口
@ApiOperation("修改功能介绍")
@GetMapping("modifySignature")
//signature 功能介绍(简介)
public ApiResponse modifySignature(String signature) {
StringBuffer stf = new StringBuffer("https://api.weixin.qq.com/cgi-bin/account/modifysignature?access_token=");
String authorizerAccessToken = String.valueOf(redisUtil.get("authorizer_access_token"));
stf.append(authorizerAccessToken);
Map<String, String> parmMap = new HashMap();
parmMap.put("signature", signature);
ResponseEntity<String> entity = restTemplate.postForEntity(stf.toString(), parmMap, String.class);
if (entity.getStatusCode().equals(HttpStatus.OK)) {
log.info("修改功能介绍=========》【{}】", entity.getBody());
} else {
log.error("修改功能介绍=========》失败!");
}
return ResponseUtil.success(entity.getBody());
}
正确返回:
{
"errcode": 0,
"errmsg": "ok",
}
@ApiOperation("修改头像")
@PostMapping("modifyHeadImage")
public ApiResponse modifyHeadImage(@RequestBody ModifyHeadImageVO modifyHeadImageVO) {
StringBuffer stf = new StringBuffer("https://api.weixin.qq.com/cgi-bin/account/modifyheadimage?access_token=");
String authorizerAccessToken = String.valueOf(redisUtil.get("authorizer_access_token"));
stf.append(authorizerAccessToken);
Map<String, Object> parmMap = new HashMap();
parmMap.put("head_img_media_id", modifyHeadImageVO.getHeadImgMediaId());
parmMap.put("x1", Float.valueOf(modifyHeadImageVO.getX1()));
parmMap.put("y1", Float.valueOf(modifyHeadImageVO.getY1()));
parmMap.put("x2", Float.valueOf(modifyHeadImageVO.getX2()));
parmMap.put("y2", Float.valueOf(modifyHeadImageVO.getY2()));
log.info("修改头像请求参数==============================》【{}】", parmMap);
ResponseEntity<String> entity = restTemplate.postForEntity(stf.toString(), parmMap, String.class);
if (entity.getStatusCode().equals(HttpStatus.OK)) {
log.info("修改头像=========》【{}】", entity.getBody());
} else {
log.error("修改头像=========》失败!");
}
return ResponseUtil.success(entity.getBody());
}
modifyHeadImageVO:参数如下
{
"head_img_media_id": "mI-4E_sFh_2X3g-qmTIWD83RT78ytI1_6VfgFp_A3-Y2U5T_nLl3nm1xYTafFJ8p",
"x1": 0,
"y1": 0,
"x2": 0.7596899224806202,
"y2": 0.49,
}
注:head_img_media_id 参考微信素材管理文档,可以用临时生成。
比如直接用curl
curl -F media=@D:\background_img\timg.jpg "https://api.weixin.qq.com/cgi-bin/media/upload?access_token=你的access_token&type=TYPE"
会返回给你一个id:如:rXXH2BHtQz8HiK7FDuG3HgzPhK-_VEIgfa5wWAt_5vDbJd31fHoPTu4oN6Esa_6R
参考第三方平台代小程序实现业务的服务器域名设置,我这个也是 postman 去操作的,注意添加域名要和你在第三方平台填写的资料上的域名一样,不然错误代码 85017。比如:www.baidu.com 和 baidu.com 也是有去别的,本人就是因为这个www 的问题 报了好久的错,可能是域名解析的问题吧,不太清楚
public class WxCodeConstants {
private static final Map<String, String> codeMap;
public static String getCodeMessage(String codeNum) {
return codeMap.get(codeNum);
}
static {
codeMap = new HashMap<>();
codeMap.put("-1", "非法 action 参数");
codeMap.put("40007", "非法的 media_id");
codeMap.put("40009", "图片尺寸太大");
codeMap.put("41006", "media_id 不能为空");
codeMap.put("40097", "参数错误");
codeMap.put("42001", "token 失效");
codeMap.put("46001", "media_id 不存在");
codeMap.put("53200", "本月功能介绍修改次数已用完");
codeMap.put("53201", "功能介绍内容命中黑名单关键字");
codeMap.put("53202", "本月头像修改次数已用完");
codeMap.put("53303", "参数提交错误");
codeMap.put("53300", "超出每月次数限制");
codeMap.put("53301", "超出可配置类目总数限制");
codeMap.put("53302", "当前账号主体类型不允许设置此种类目");
codeMap.put("53304", "与已有类目重复");
codeMap.put("53305", "包含未通过 ICP 校验的类目");
codeMap.put("53306", "修改类目只允许修改类目资质,不允许修改类目 ID");
codeMap.put("53307", "只有审核失败的类目允许修改");
codeMap.put("53308", "审核中的类目不允许删除");
codeMap.put("53010", "名称格式不合法");
codeMap.put("53011", "名称检测命中频率限制");
codeMap.put("53012", "禁止使用该名称");
codeMap.put("53013", "公众号:名称与已有公众号名称重复;小程序:该名称与已有小程序名称重复");
codeMap.put("53014", "公众号:公众号已有{名称 A+}时,需与该帐号相同主体才可申请{名称 A};小程序:小程序已有{名称 A+}时,需与该帐号相同主体才可申请{名称 A}");
codeMap.put("53015", "公众号:该名称与已有小程序名称重复,需与该小程序帐号相同主体才可申请;小程序:该名称与已有公众号名称重复,需与该公众号帐号相同主体才可申请");
codeMap.put("53016", "公众号:该名称与已有多个小程序名称重复,暂不支持申请;小程序:该名称与已有多个公众号名称重复,暂不支持申请");
codeMap.put("53017", "公众号:小程序已有{名称 A+}时,需与该帐号相同主体才可申请{名称 A};小程序:公众号已有{名称 A+}时,需与该帐号相同主体才可申请{名称 A}");
codeMap.put("53018", "名称命中微信号");
codeMap.put("53019", "名称在保护期内");
codeMap.put("61003", "component is not authorized by this account hin");
codeMap.put("61070", "法人姓名与微信号不一致");
codeMap.put("61004", "当前客户端ip未在开放平台白名单");
codeMap.put("61007", "当前公众号或者小程序已在公众平台解绑");
codeMap.put("61023", "授权已过期,请重新授权");
codeMap.put("85001", "微信号不存在或微信号设置为不可搜索");
codeMap.put("85002", "小程序绑定的体验者数量达到上限");
codeMap.put("85003", "微信号绑定的小程序体验者达到上限");
codeMap.put("85004", "微信号已经绑定");
codeMap.put("85006", "标签格式错误");
codeMap.put("85007", "页面路径错误");
codeMap.put("85008", "类目填写错误");
codeMap.put("85009", "已经有正在审核的版本");
codeMap.put("85010", "item_list有项目为空");
codeMap.put("85011", "标题填写错误");
codeMap.put("85012", "无效的审核id");
codeMap.put("85013", "无效的自定义配置");
codeMap.put("85014", "无效的模版编号");
codeMap.put("85019", "没有审核版本");
codeMap.put("85020", "审核状态未满足发布");
codeMap.put("85021", "状态不可变-5以内");
codeMap.put("85022", "action非法");
codeMap.put("85023", "审核列表填写的项目数不在1-5以内");
codeMap.put("85043", "模版错误");
codeMap.put("85044", "代码包超过大小限制");
codeMap.put("85045", "导航设置错误,请重置导航再试,编号85045',//'ext_json有不存在的路径");
codeMap.put("85046", "tabBar中缺少path");
codeMap.put("85047", "pages字段为空");
codeMap.put("85048", "导航设置错误,请重置导航再试,编号85048',//'ext_json解析失败");
codeMap.put("85052", "小程序已发布");
codeMap.put("85066", "链接错误");
codeMap.put("85068", "测试链接不是子链接");
codeMap.put("85069", "校验文件失败");
codeMap.put("85070", "链接为黑名单");
codeMap.put("85071", "已添加该链接,请勿重复添加");
codeMap.put("85072", "该链接已被占用");
codeMap.put("85073", "二维码规则已满");
codeMap.put("85074", "小程序未发布, 小程序必须先发布代码才可以发布二维码跳转规则");
codeMap.put("85075", "个人类型小程序无法设置二维码规则");
codeMap.put("85076", "链接没有ICP备案");
codeMap.put("85077", "小程序类目信息失效(类目中含有官方下架的类目,请重新选择类目)");
codeMap.put("85079", "'小程序没有线上版本,不能进行灰度");
codeMap.put("85080", "小程序提交的审核未审核通过");
codeMap.put("85081", "无效的发布比例");
codeMap.put("85082", "当前的发布比例需要比之前设置的高");
codeMap.put("85085", "当前平台近7天提交审核的小程序数量过多,请耐心等待审核完毕后再次提交");
codeMap.put("85060", "无效的 taskid");
codeMap.put("85027", "身份证绑定管理员名额达到上限");
codeMap.put("85061", "手机号绑定管理员名额达到上限");
codeMap.put("85026", "微信号绑定管理员名额达到上限");
codeMap.put("85063", "身份证黑名单");
codeMap.put("85062", "手机号黑名单");
codeMap.put("85083", "搜索标记位被封禁,无法修改");
codeMap.put("85084", "非法的 status 值,只能填 0 或者 1");
codeMap.put("85015", "该账号不是小程序账号");
codeMap.put("85016", "域名数量超过限制");
codeMap.put("85017", "没有新增域名,请确认小程序已经添加了域名或该域名是否没有在第三方平台添加");
codeMap.put("85018", "域名没有在第三方平台设置");
codeMap.put("86000", "不是由第三方代小程序进行调用");
codeMap.put("86001", "不存在第三方的已经提交的代码");
codeMap.put("86002", "小程序还未设置昵称、头像、简介。请先设置完后再重新提交");
codeMap.put("87011", "现网已经在灰度发布,不能进行版本回退");
codeMap.put("87012", "该版本不能回退,可能的原因:1:无上一个线上版用于回退 2:此版本为已回退版本,不能回退 3:此版本为回退功能上线之前的版本,不能回退");
codeMap.put("87013", "撤回次数达到上限(每天一次,每个月10次)");
codeMap.put("89019", "业务域名无更改,无需重复设置");
codeMap.put("89020", "尚未设置小程序业务域名,请先在第三方平台中设置小程序业务域名后在调用本接口");
codeMap.put("89021", "请求保存的域名不是第三方平台中已设置的小程序业务域名或子域名");
codeMap.put("89029", "业务域名数量超过限制");
codeMap.put("89031", "小程序绑定的体验者数量达到上限");
codeMap.put("89231", "个人小程序不支持调用 setwebviewdomain 接口");
codeMap.put("89248", "企业代码类型无效,请选择正确类型填写");
codeMap.put("89250", "未找到该任务");
codeMap.put("89251", "待法人人脸核身校验");
codeMap.put("89252", "法人&企业信息一致性校验中");
codeMap.put("89253", "缺少参数");
codeMap.put("89249", "该主体已有任务执行中,距上次任务 24h 后再试");
codeMap.put("89247", "内部错误");
codeMap.put("86004", "无效微信号");
codeMap.put("89254", "第三方权限集不全,补全权限集全网发布后生效");
codeMap.put("91001", "不是公众号快速创建的小程序");
codeMap.put("91002", "小程序发布后不可改名");
codeMap.put("91003", "改名状态不合法");
codeMap.put("91004", "昵称不合法");
codeMap.put("91005", "昵称 15 天主体保护");
codeMap.put("91006", "昵称命中微信号");
codeMap.put("91007", "昵称已被占用");
codeMap.put("91008", "昵称命中 7 天侵权保护期");
codeMap.put("91009", "需要提交材料");
codeMap.put("91010", "其他错误");
codeMap.put("91013", "占用名字过多");
codeMap.put("91014", "+号规则 同一类型关联名主体不一致");
codeMap.put("91015", "原始名不同类型主体不一致");
codeMap.put("91016", "名称占用者 ≥2");
codeMap.put("91017", "+号规则 不同类型关联名主体不一致");
codeMap.put("91011", "查不到昵称修改审核单信息");
codeMap.put("91012", "其它错误");
}
}