1、获取验证票据
验证票据(component_verify_ticket),在第三方平台创建审核通过后,微信服务器会向其 ”授权事件接收URL” 每隔 10 分钟以 POST 的方式推送 component_verify_ticket
接收 POST 请求后,只需直接返回字符串 success。为了加强安全性,postdata 中的 xml 将使用服务申请时的加解密 key 来进行加密,在收到推送后需进行解密。
public void saveTicket(HttpServletRequest request, HttpServletResponse response) throws IOException { String msgSignature = request.getParameter("msg_signature");// 微信加密签名 String timeStamp = request.getParameter("timestamp");// 时间戳 String nonce = request.getParameter("nonce"); // 随机数 BufferedReader br = new BufferedReader(new InputStreamReader(request.getInputStream(),"UTF-8")); StringBuffer sb = new StringBuffer(); String line = null; while ((line = br.readLine()) != null) { sb = sb.append(line); } String postData = sb.toString(); try { AuthorizedUtils.saveComponentVerifyTicket(msgSignature, timeStamp, nonce, postData); } catch (Exception e) { logger.error("系统异常", e); } finally { // 响应消息 PrintWriter out = response.getWriter(); out.print("success"); } }复制代码
2、获取令牌
令牌(component_access_token)是第三方平台接口的调用凭据。令牌的获取是有限制的,每个令牌的有效期为 2 小时,请自行做好令牌的管理,在令牌快过期时(比如1小时50分),重新调用接口获取。
public static ComponentToken getComponentToken(String ticket) { RedisServiceredisService = RedisService.load(); ComponentToken componentToken = redisService.load(ComponentToken.COMPONENTTOKEN_ID, ComponentToken.class); if (componentToken == null) { String encryptAppId = ThirdPlat.PLAT_APPID; String appId = EnDecryptUtil.d3esDecode(encryptAppId); String encryptSecret = ThirdPlat.PLAT_SECRET; String secret = EnDecryptUtil.d3esDecode(encryptSecret); String requestUrl = AuthAccessUrl.COMPONENT_ACCESS_URL; Map map = new HashMap<>(); map.put("component_appid", appId); //第三方平台appid map.put("component_appsecret", secret); //第三方平台appsecret map.put("component_verify_ticket", ticket); String outputStr = JSONObject.toJSONString(map); logger.warn("请求数据"+outputStr); JSONObject jsonObject = HttpRequestUtils.httpRequest(requestUrl, "POST", outputStr); if (null != jsonObject) { long expires = System.currentTimeMillis() + 7200; try{ expires = System.currentTimeMillis() + jsonObject.getIntValue("expires_in"); }catch (Exception e) { } try { componentToken = new ComponentToken(); componentToken.setComponentAccessToken(jsonObject.getString("component_access_token")); componentToken.setExpiresIn(expires); redisService.save(componentToken, ComponentToken.class); } catch (Exception e) { componentToken = null; logger.error("系统异常", e); } } } else { long sysTime = System.currentTimeMillis(); if (sysTime >= componentToken.getExpiresIn()) { redisService.delete(ComponentToken.COMPONENTTOKEN_ID, ComponentToken.class); componentToken = getComponentToken(ticket); }else{ } } return componentToken; }复制代码
public AjaxResult fastRegister(String merchantId) { Merchant merchant = merchantService.getById(merchantId); if (merchant == null) { logger.warn("快速创建小程序---->失败,merchant为null"); return AjaxResult.error("快速创建小程序失败,merchant为null",null); } else { RedisServiceredisService = RedisService.load(); ComponentVerifyTicket componentVerifyTicket = redisService.load(ComponentVerifyTicket.COMPONENT_VERIFY_TICKET_ID, ComponentVerifyTicket.class); if (componentVerifyTicket == null) { logger.warn("快速创建小程序---->失败,component_verify_ticket为null"); return AjaxResult.error("快速创建小程序失败,component_verify_ticket为null",null); } else { ComponentToken componentToken = AuthorizedUtils.getComponentToken(componentVerifyTicket.getComponentVerifyTicket()); RegisterWeappOut out = new RegisterWeappOut(); out.setName(merchant.getName()) .setCode(merchant.getCode()) .setCode_type(merchant.getCodeType()) .setLegal_persona_wechat(merchant.getLegalPersonaWechat()) .setLegal_persona_name(merchant.getLegalPersonaName()) .setComponent_phone(merchant.getComponentPhone()); JSONObject obj = BaseUtils.createRegisterWeapp(componentToken,out); if (obj.getInteger("errcode") == 0 && "ok".equalsIgnoreCase(obj.getString("errmsg"))) { return AjaxResult.success(); } else { return AjaxResult.error(obj.getInteger("errcode"),obj.getString("errmsg")); } } } } 复制代码
4、获取预授权码
预授权码(pre_auth_code)是第三方平台方实现授权托管的必备信息,每个预授权码有效期为 10 分钟。需要先获取令牌才能调用。
public static String getPreAuthCode(String ticket) { ComponentToken componentToken = getComponentToken(ticket); String encryptAppId = ThirdPlat.PLAT_APPID; String appId = EnDecryptUtil.d3esDecode(encryptAppId); String url = AuthAccessUrl.PRE_AUTH_CODE_URL + componentToken.getComponentAccessToken(); Mapmap = new HashMap (); map.put("component_appid", appId); JSONObject jsonObject = HttpRequestUtils.httpRequest(url, "POST", JSONObject.toJSONString(map)); return jsonObject.getString("pre_auth_code"); }复制代码
5、引导商户授权获取授权信息
第三方服务商构建授权链接放置自己的网站,用户点击后,弹出授权页面。
public AjaxResult getMchWebAuthUrl(@PathVariable("id") String id) { RedisServiceredisService = RedisService.load(); ComponentVerifyTicket componentVerifyTicket = redisService.load(ComponentVerifyTicket.COMPONENT_VERIFY_TICKET_ID, ComponentVerifyTicket.class); if(componentVerifyTicket == null){ return AjaxResult.error("引入用户进入授权页失败,component_verify_ticket为null",null); }else{ String preAuthCode = AuthorizedUtils.getPreAuthCode(componentVerifyTicket.getComponentVerifyTicket()); String encryptAppId = ThirdPlat.PLAT_APPID; String appId = EnDecryptUtil.d3esDecode(encryptAppId); String auth_type = ThirdPlat.AUTH_TYPE; String requestUrl = AuthAccessUrl.WEB_AUTH_URL; try { requestUrl = requestUrl.replace("COMPONENT_APPID", appId).replace("PRE_AUTH_CODE", preAuthCode) .replace("REDIRECT_URI", URLEncoder.encode(ThirdPlat.REDIRECT_URI.replace("MERCHANTID", id),"UTF-8")).replace("AUTH_TYPE", auth_type); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } logger.warn("步骤2:引入用户进入授权页---->成功,url为:" + requestUrl); return AjaxResult.success("操作成功",requestUrl); } }复制代码
6、设置小程序基本信息
设置小程序名称,当名称没有命中关键词,则直接设置成功;当名称命中关键词,需提交证明材料,并需要审核。修改小程序的头像。修改功能介绍。修改小程序隐私设置,即修改是否可被搜索。
public AjaxResult setBasicInfo(BasicInfo basicInfo) throws IOException { Merchant merchant = merchantService.getById(basicInfo.getMerchantId()); if (merchant == null) { logger.warn("设置基本信息---->失败,merchant为null"); return AjaxResult.error("设置基本信息失败,merchant为null",null); } else { AuthorizationInfo info = AuthorizedUtils.getAuthorizationInfo(merchant.getAppid()); //修改头像 if (StringUtils.isNotEmpty(basicInfo.getHeadImage())) { UploadIn uli = new UploadIn(); uli.setType("image").setUrlPath(basicInfo.getHeadImage()); JSONObject uploadJson = BaseUtils.upload(info,uli); String mediaId = uploadJson.getString("media_id"); ModifyHeadImageIn mhi = new ModifyHeadImageIn(); mhi.setHead_img_media_id(mediaId).setX1("0").setY1("0").setX2("1").setY2("1"); JSONObject obj = BaseUtils.modifyHeadImage(info,mhi); if (!obj.getInteger(ResStatus.ERRCODE).equals(ResStatus.CODE) || !ResStatus.MSG.equalsIgnoreCase(obj.getString(ResStatus.ERRMSG))) { return AjaxResult.error(obj.getInteger(ResStatus.ERRCODE),obj.getString(ResStatus.ERRMSG)); } else { merchant.setAppletsHeadImg(basicInfo.getHeadImage()); } } //修改名称 if (StringUtils.isNotEmpty(basicInfo.getNickname())) { UploadIn uli = new UploadIn(); uli.setType("image").setUrlPath(merchant.getBusinessLicense()); JSONObject uploadJson = BaseUtils.upload(info,uli); String mediaId = uploadJson.getString("media_id"); SetNicknameIn sni = new SetNicknameIn(); sni.setNick_name(basicInfo.getNickname()); sni.setLicense(mediaId); JSONObject obj = BaseUtils.setNickname(info,sni); if (!obj.getInteger(ResStatus.ERRCODE).equals(ResStatus.CODE) || !ResStatus.MSG.equalsIgnoreCase(obj.getString(ResStatus.ERRMSG))) { return AjaxResult.error(obj.getInteger(ResStatus.ERRCODE),obj.getString(ResStatus.ERRMSG)); } else { merchant.setAppletsName(basicInfo.getNickname()); if (obj.containsKey("audit_id") && StringUtils.isNotEmpty(obj.getString("audit_id"))) { merchant.setAuditId(obj.getString("audit_id")); } } } //修改功能介绍 if (StringUtils.isNotEmpty(basicInfo.getSignature())) { ModifySignatureIn msi = new ModifySignatureIn(); msi.setSignature(basicInfo.getSignature()); JSONObject obj = BaseUtils.modifySignature(info, msi); if (!obj.getInteger(ResStatus.ERRCODE).equals(ResStatus.CODE) || !ResStatus.MSG.equalsIgnoreCase(obj.getString(ResStatus.ERRMSG))) { return AjaxResult.error(obj.getInteger(ResStatus.ERRCODE),obj.getString(ResStatus.ERRMSG)); } else { merchant.setAppletsSignature(basicInfo.getSignature()); } } //修改隐私设置,即修改是否可被搜索 if (StringUtils.isNotEmpty(basicInfo.getStatus())) { SearchStatusIn ssi = new SearchStatusIn(); ssi.setStatus(basicInfo.getStatus()); JSONObject obj = BaseUtils.changeWxaSearchStatus(info, ssi); if (!obj.getInteger(ResStatus.ERRCODE).equals(ResStatus.CODE) || !ResStatus.MSG.equalsIgnoreCase(obj.getString(ResStatus.ERRMSG))) { return AjaxResult.error(obj.getInteger(ResStatus.ERRCODE),obj.getString(ResStatus.ERRMSG)); } else { merchant.setSearchStatus(basicInfo.getStatus()); } } merchantService.updateById(merchant); return AjaxResult.success(); } }复制代码
7、支付授权
即填写商户号和商户号密钥,以及上传p12证书
public AjaxResult modifyDomain(ModifyDomain modifyDomain) { Merchant merchant = merchantService.getById(modifyDomain.getMerchantId()); if (merchant == null) { logger.warn("设置服务器域名---->失败,merchant为null"); return AjaxResult.error("设置服务器域名失败,merchant为null",null); } else { AuthorizationInfo info = AuthorizedUtils.getAuthorizationInfo(merchant.getAppid()); ModifyDomainOut out = new ModifyDomainOut(); out.setAction(modifyDomain.getAction()); String[] requests = modifyDomain.getRequestdomain().split(","); ListrequestList = Arrays.asList(requests); out.setRequestdomain(requestList); String[] wsrequests = modifyDomain.getWsrequestdomain().split(","); List wsrequestList = Arrays.asList(wsrequests); out.setWsrequestdomain(wsrequestList); String[] uploads = modifyDomain.getUploaddomain().split(","); List uploadList = Arrays.asList(uploads); out.setUploaddomain(uploadList); String[] downloads = modifyDomain.getDownloaddomain().split(","); List downloadsList = Arrays.asList(downloads); out.setDownloaddomain(downloadsList); JSONObject obj = BaseUtils.modifyDomain(info, out); if("0".equals(obj.getString("errcode")) && "ok".equalsIgnoreCase(obj.getString("errmsg"))){ return AjaxResult.success(); } else { return AjaxResult.error(obj.getInteger("errcode"),obj.getString("errmsg")); } } }复制代码
9、设置业务域名
授权给第三方的小程序,其业务域名只可以为第三方平台的服务器,当小程序通过第三方发布代码上线后,小程序原先自己配置的业务域名将被删除,只保留第三方平台的域名,所以第三方平台在代替小程序发布代码之前,需要调用接口为小程序添加业务域名。
注意:
需要先将业务域名登记到第三方平台的小程序业务域名中,才可以调用接口进行配置。
为授权的小程序配置域名时支持配置子域名,例如第三方登记的业务域名如为 qq.com,则可以直接将 qq.com 及其子域名(如 xxx.qq.com)也配置到授权的小程序中。
最多可以添加100个业
public AjaxResult webviewDomain(WebviewDomain webviewDomain) { Merchant merchant = merchantService.getById(webviewDomain.getMerchantId()); if (merchant == null) { logger.warn("设置业务域名---->失败,merchant为null"); return AjaxResult.error("设置业务域名失败,merchant为null",null); } else { AuthorizationInfo info = AuthorizedUtils.getAuthorizationInfo(merchant.getAppid()); SetWebViewDomainOut out = new SetWebViewDomainOut(); out.setAction(webviewDomain.getAction()); String[] webviews = webviewDomain.getWebviewdomain().split(","); ListwebviewList = Arrays.asList(webviews); out.setWebviewdomain(webviewList); JSONObject obj = BaseUtils.setWebViewDomain(info, out); if("0".equals(obj.getString("errcode")) && "ok".equalsIgnoreCase(obj.getString("errmsg"))){ return AjaxResult.success(); } else { return AjaxResult.error(obj.getInteger("errcode"),obj.getString("errmsg")); } } }复制代码
10、上传小程序代码
第三方平台需要先将草稿添加到代码模板库,或者从代码模板库中选取某个代码模板,得到对应的模板 id(template_id);然后调用本接口可以为已授权的小程序上传代码。
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()); 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()); Mapmap = new HashMap<>(); map.put("merchantId", model.getMerchantId()); map.put("userVersion", commitIn.getUser_version()); obj.put("ext", map); map = new HashMap<>(); Map maps = new HashMap<>(); maps.put("pages/index/index", map); obj.put("extPages", maps); commitIn.setExt_json(JSONObject.toJSONString(obj)); //接受微信返回的数据 obj = CodeUtils.commit(info, commitIn); if("0".equals(obj.getString("errcode")) && "ok".equalsIgnoreCase(obj.getString("errmsg"))){ AppletsRelease ar = appletsReleaseService.getOne(new LambdaQueryWrapper () .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(obj.getInteger("errcode"),obj.getString("errmsg")); } }复制代码
/** * 绑定体验者 * @parambindTester * @return */ @Override public AjaxResult bindTester(BindTester bindTester) { Merchant merchant = merchantService.getById(bindTester.getMerchantId()); if (merchant == null) { logger.warn("绑定体验者---->失败,merchant为null"); return AjaxResult.error("绑定体验者失败,merchant为null",null); } else { AuthorizationInfo info = AuthorizedUtils.getAuthorizationInfo(merchant.getAppid()); JSONObject obj = MemberUtils.bindTester(info, bindTester.getWechatId()); if("0".equals(obj.getString("errcode")) && "ok".equalsIgnoreCase(obj.getString("errmsg"))){ AppletsTester at = new AppletsTester(); at.setMerchantId(bindTester.getMerchantId()).setWechatId(bindTester.getWechatId()).setUserStr(obj.getString("userstr")); appletsTesterService.insertAppletsTester(at); return AjaxResult.success(); } else { return AjaxResult.error(obj.getInteger("errcode"),obj.getString("errmsg")); } } } /** * 解除体验者 * @paramtesterIds * @return */ @Override public AjaxResult unbindTester(Long[] testerIds) { for (Long id : testerIds) { AppletsTester tester = appletsTesterService.getById(id); if (tester == null) { logger.warn("解除体验者---->失败,tester为null"); return AjaxResult.error("解除体验者,tester为null",null); } Merchant merchant = merchantService.getById(tester.getMerchantId()); if (merchant == null) { logger.warn("解除体验者---->失败,merchant为null"); return AjaxResult.error("解除体验者,merchant为null",null); } AuthorizationInfo info = AuthorizedUtils.getAuthorizationInfo(merchant.getAppid()); JSONObject obj = MemberUtils.unbindTester(info, tester.getWechatId()); if("0".equals(obj.getString("errcode")) && "ok".equalsIgnoreCase(obj.getString("errmsg"))){ appletsTesterService.removeById(id); } else { return AjaxResult.error(obj.getInteger("errcode"),obj.getString("errmsg")); } } return AjaxResult.success(); }复制代码
12、获取体验版二维码
public AjaxResult getQrcode(String merchantId) { Merchant merchant = merchantService.getById(merchantId); if (merchant == null) { logger.warn("获取体验二维码---->失败,merchant为null"); return AjaxResult.error("获取体验二维码,merchant为null",null); } AuthorizationInfo info = AuthorizedUtils.getAuthorizationInfo(merchant.getAppid()); String qrcodeUrl = CodeUtils.getQrcode(info, "pages/index/index"); return AjaxResult.success("操作成功",qrcodeUrl); }复制代码
13、提交审核
public AjaxResult submitAudit(SubmitAudit submit) { Merchant merchant = merchantService.getById(submit.getMerchantId()); if (merchant == null) { logger.warn("获取体验二维码---->失败,merchant为null"); return AjaxResult.error("获取体验二维码,merchant为null", null); } AuthorizationInfo info = AuthorizedUtils.getAuthorizationInfo(merchant.getAppid()); Listcategorys = submit.getCategory(); submit.setFirst_id(categorys.get(0).split("-")[0]) .setFirst_class(categorys.get(0).split("-")[1]) .setSecond_id(categorys.get(1).split("-")[0]) .setSecond_class(categorys.get(1).split("-")[1]) .setTag(submit.getTag().replace(",", " ")); List submits = new ArrayList<>(); submits.add(submit); JSONObject sa = CodeUtils.submitAudit(info, submits); if (sa.getInteger(ResStatus.ERRCODE).equals(ResStatus.CODE) && ResStatus.MSG.equalsIgnoreCase(sa.getString(ResStatus.ERRMSG))) { JSONObject obj = CodeUtils.getAuditStatus(info, sa.getString("auditid")); if (obj.getInteger(ResStatus.ERRCODE).equals(ResStatus.CODE) && ResStatus.MSG.equalsIgnoreCase(obj.getString(ResStatus.ERRMSG))) { AppletsRelease ar = appletsReleaseService.getOne(new LambdaQueryWrapper () .eq(AppletsRelease::getMerchantId,merchant.getId())); if (ar == null) { return AjaxResult.error("请先上传代码"); } ar.setMerchantId(submit.getMerchantId()) .setAuditId(sa.getString("auditid")) .setStatus(obj.getString("status")) .setRemark(obj.getString("screenshot")); 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(obj.getInteger(ResStatus.ERRCODE), obj.getString(ResStatus.ERRMSG)); } } else { return AjaxResult.error(sa.getInteger(ResStatus.ERRCODE), sa.getString(ResStatus.ERRMSG)); } }复制代码
14、审核撤回
注意: 单个帐号每天审核撤回次数最多不超过 1 次,一个月不超过 10 次。
public AjaxResult undoCodeAudit(String[] ids) { StringBuilder sb = new StringBuilder(); for (String id : ids) { Merchant merchant = merchantService.getById(id); AuthorizationInfo info = AuthorizedUtils.getAuthorizationInfo(merchant.getAppid()); JSONObject obj = CodeUtils.undoCodeAudit(info); if (obj.getInteger(ResStatus.ERRCODE).equals(ResStatus.CODE) && ResStatus.MSG.equalsIgnoreCase(obj.getString(ResStatus.ERRMSG))) { AppletsRelease ar = appletsReleaseService.getOne(new LambdaQueryWrapper() .eq(AppletsRelease::getMerchantId,merchant.getId())); ar.setStatus(AppletsRelease.MSG_3); appletsReleaseService.updateById(ar); } else{ sb.append(merchant.getName()+","); } } if (sb.length() == 0) { return AjaxResult.success(); } else { String name = sb.substring(0, sb.length()-1); return AjaxResult.error(name+"审核撤回失败"); } }复制代码
15、发布已通过审核的小程序
public AjaxResult releaseApplets(String[] ids) { StringBuilder sb = new StringBuilder(); for (String id : ids) { Merchant merchant = merchantService.getById(id); AuthorizationInfo info = AuthorizedUtils.getAuthorizationInfo(merchant.getAppid()); JSONObject obj = CodeUtils.release(info); if (obj.getInteger(ResStatus.ERRCODE).equals(ResStatus.CODE) && ResStatus.MSG.equalsIgnoreCase(obj.getString(ResStatus.ERRMSG))) { AppletsRelease ar = appletsReleaseService.getOne(new LambdaQueryWrapper() .eq(AppletsRelease::getMerchantId,merchant.getId())); ar.setStatus(AppletsRelease.STATUS_5); appletsReleaseService.updateById(ar); } else{ sb.append(merchant.getName()+","); } } if (sb.length() == 0) { return AjaxResult.success(); } else { String name = sb.substring(0, sb.length()-1); return AjaxResult.error(name+"发布失败"); } }复制代码
16、小程序版本回退
如果没有上一个线上版本,将无法回退
只能向上回退一个版本,即当前版本回退后,不能再调用版本回退接口。
public AjaxResult revertCodeRelease(String[] ids) { StringBuilder sb = new StringBuilder(); for (String id : ids) { Merchant merchant = merchantService.getById(id); AuthorizationInfo info = AuthorizedUtils.getAuthorizationInfo(merchant.getAppid()); JSONObject obj = CodeUtils.revertCodeRelease(info); if (!(obj.getInteger(ResStatus.ERRCODE).equals(ResStatus.CODE) && ResStatus.MSG.equalsIgnoreCase(obj.getString(ResStatus.ERRMSG)))) { sb.append(merchant.getName()+","); } } if (sb.length() == 0) { return AjaxResult.success(); } else { String name = sb.substring(0, sb.length()-1); return AjaxResult.error(null,name+"审核撤回失败"); } }复制代码
17、获取小程序码
public AjaxResult getMiniQrcode(@PathVariable("merchantId") String merchantId) { Merchant merchant = merchantService.getById(merchantId); if (merchant == null) { logger.warn("获取小程序码---->失败,merchant为null"); return AjaxResult.error("获取小程序码,merchant为null",null); } String qrcode; if (StringUtils.isNotEmpty(merchant.getAppletImage())) { qrcode = merchant.getAppletImage(); } else { AuthorizationInfo info = AuthorizedUtils.getAuthorizationInfo(merchant.getAppid()); qrcode = WxUtils.getMiniQrcode(merchantId, "pages/index/index", "merchant", "miniQrcode", info.getAuthorizer_access_token()); merchant.setAppletImage(qrcode); merchantService.updateById(merchant); } return AjaxResult.success("操作成功",qrcode); }复制代码
相关学习推荐:微信小程序教程
以上就是关于微信开放平台那些事,第三方平台开发的详细内容,更多请关注其它相关文章!