主机参考:VPS测评参考推荐/专注分享VPS服务器优惠信息!若您是商家可以在本站进行投稿,查看详情!此外我们还提供软文收录、PayPal代付、广告赞助等服务,查看详情! |
我们发布的部分优惠活动文章可能存在时效性,购买时建议在本站搜索商家名称可查看相关文章充分了解该商家!若非中文页面可使用Edge浏览器同步翻译!PayPal代付/收录合作 |
如果有多个服务且功能模式相同的微信官方账号/小程序仅开发为小程序,是否需要复制多套代码,更改appid信息,并在微信微信官方账号后台配置域名服务器和密钥,并在每次更改后提交和发布一次,并重复上述步骤?随着需要维护的微信官方账号/小程序越来越多,需要投入的资源和成本也随之增加。
你有没有想过,我们只需要开发一套微信官方账号/小程序代码,用它做模板,然后设置一个后台管理系统,把微信官方账号后台做的那些事情全部搬到我们自己的系统里?推出相同业务的小程序,我们只需要管理员的授权,只需在我们的系统中点击几个按钮即可在线发布小程序,并一次性为N个微信官方账号开发,提供标准化的接口服务,以满足业务的基本需求。通过扫描二维码并授权给平台,超过N个微信官方账号代发即可实现业务,无需了解复杂的参数设置,也不向开发者提供密码,以确保安全,真正解放运营同学和开发者的双手,有更多时间谈女朋友。没错,微信第三方平台的开发就是帮助你节省更多泡妞时间的神器。
摘要
微信公众平台-第三方平台(以下简称第三方平台)面向所有通过开发者资格认证的开发者开放。第三方平台开发者在获得微信官方账号或小程序运营者(简称运营者)授权后,可通过调用微信开放平台的接口能力,为微信官方账号或小程序运营者提供账号申请、小程序创建、技术开发、行业解决方案、事件营销、插件能力等全方位服务。同一账号的运营者可以选择多家适合自己的第三方提供产品能力或委托运营。
从业务特征来看,第三方平台必须如图所示:
从具体业务场景来看,第三方平台包括以下场景:
提供行业解决方案,如电商行业解决方案或旅游行业解决方案;
行业:(横向)提供更专业的运营能力,精细化运营用户微信官方账号或小程序;
功能:(纵向)优化公共平台功能,例如优化图形消息的视觉样式和排版的工具,或定制的CRM用户管理功能,或强大的小程序插件。
接入第三方开发的前提是要有微信开放平台应用。请参考详细的创建步骤。
developers.weixin.qq.com/doc/oplatfo…
1.获取验证票据
验证票(component_verify_ticket),第三方平台创建通过后,微信服务器会每隔10分钟通过POST将component_verify_ticket推送至其“授权事件接收URL”。
收到POST请求后,直接返回字符串success即可。为了加强安全性,postdata中的xml将在服务申请时使用加解密密钥进行加密,并在收到推送后进行解密。
public void save ticket(http servlet request请求,HttpServletResponse响应)抛出io exception { String msg signature = request . getparameter(“msg _ signature“);//微信加密签名字符串timestamp = request . getparameter(“timestamp“);//timestamp string once = request . getparameter(“nonce“);//随机数缓冲读取器br =新的缓冲读取器(新的输入流读取器(request.getinputstream(),“UTF -8“));string buffer sb = new string buffer();String line = nullwhile((line = br . readline())= null){ sb = sb . append(line);} String post data = sb . tostring();请尝试{ authorized utils . savecomponentverifytick(msg signature,timeStamp,nonce,post data);} catch(exception e){ logger . error(“系统异常“,e);} finally {//响应消息printwriter out = response . getwriter();out.print(“成功”);}}复制代码2。拿到令牌。
令牌(component_access_token)是第三方平台接口的调用凭证。代币的获取是有限制的,每个代币的有效期为2小时。请自行管理令牌,当令牌即将到期时(例如1小时50分钟),请再次调用接口获取令牌。
public static component token getcomponent token(String ticket){ redis service redis service = redis service . load();component token component token = redis service . load(component token。COMPONENTTOKEN_ID,component token . class);if(component token = = null){ String encrypt appid = third plat。PLAT _ APPIDstring appId = endecryptutil . d3es decode(encrypt appId);String encryptSecret = ThirdPlat。PLAT _ SECRETstring secret = endecryptutil . d3es decode(encrypt secret);字符串requestUrl = AuthAccessUrl。组件_访问_ URLmap map = new HashMap();map . put(“component _ appId“,appId);//第三方平台appid map . put(“component _ app secret“,secret);//第三方平台appsecretmap . put(“component _ verify _ ticket“,ticket);string outputStr = JSON object . tojsonstring(map);Logger.warn(“请求数据“+输出str);JSON object JSON object = http request utils . http request(request URL,“POST“,outputStr);if (null!= JSON object){ long expires = system . current time millis()+7200;try { expires = system . current time millis()+JSON object . getint value(“expires _ in“);}catch(异常e){ } try { component token = new component token();component token . setcomponentaccestoken(JSON object . getstring(“component _ access _ token“);component token . setexpirish(expires);redis service . save(component token,component token . class);} catch(Exception e){ component token = null;Logger.error(“系统异常“,e);} } } else { long sysTime = system . current time millis();if(sysTime》= component token . getexpirish(){ redis service . delete(component token。COMPONENTTOKEN_ID,component token . class);component token = getcomponentoken(ticket);} else { } } return componentToken}复制代码3,快速创建小程序
小程序接口的快速创建优化了小程序注册和认证的流程,可以帮助第三方平台快速拓展线下商户,扩大商户的服务范围,抓住小程序线下的商业机会。用法人人脸识别代替小额支付等认证流程,大大降低了采集小程序主体和类别资质信息的人力成本。第三方平台只需采集法人姓名、法人微信、企业名称、企业代码信息四项信息,即可向企业法人发送模板消息采集法人人脸信息,完成全部注册认证流程。并且当法人收到成功创建的小程序的APPID时,它会同时向法人发送模板消息,提示法人设置邮箱和密码,以便后续法人可以登录小程序控制台进行管理。
默认情况下,通过该接口创建小程序会经过身份验证。为了降低接入小程序的成本门槛,通过该接口创建的小程序无需支付300元认证费。
public Ajax result fast register(String Merchant id){ Merchant Merchant = Merchant service . getbyid(Merchant id);if(merchant = = null){ logger . warn(“未能快速创建小程序----》,merchant为null“);Return AjaxResult.error(“快速创建小程序失败,商家为空”,null);} else { redis service redis service = redis service . load();componentverifytick componentverifytick = redis service . load(componentverifytick。COMPONENT_VERIFY_TICKET_ID,COMPONENT VERIFY TICKET . class);if(component verify ticket = = null){ logger . warn(“未能快速创建applet ---》,并且component_verify_ticket为null“);Return AjaxResult.error(“快速创建applet失败,component_verify_ticket为空”,null);} else { component token component token = authorized utils . get component token(component verify ticket . getcomponentvrify ticket());RegisterWeappOut = new RegisterWeappOut();out . setname(merchant . getname())。setCode(merchant . get code())。setCode _ type(merchant . getcodetype())。setLegal _ persona _ we chat(merchant . getlegalpersonawechat())。set legal _ persona _ name(merchant . getlegalpersonaname())。set component _ phone(merchant . getcomponentphone());JSON object obj = base utils . createregisterweapp(component token,out);if(obj . getinteger(“errcode“)= = 0 & &“ok“。equalsIgnoreCase(obj . getstring(“errmsg“)){ return Ajax result . success();} else { return Ajax result . error(obj . getinteger(“errcode“),obj . getstring(“errmsg“);}}}}复制代码4。获取预授权码。
预授权码(pre_auth_code)是第三方平台实现授权托管的必要信息,每个预授权码的有效期为10分钟。您需要在呼叫前获取令牌。
公共静态字符串getPreAuthCode(字符串ticket){ component token component token = getcomponent token(ticket);String encryptAppId = ThirdPlat。PLAT _ APPIDstring appId = endecryptutil . d3es decode(encrypt appId);字符串url = AuthAccessUrl。PRE _ AUTH _ CODE _ URL+component token . getcomponentaccesstoken();map map = new HashMap();map . put(“component _ appId“,appId);JSON object JSON object = http request utils . http request(URL,“POST“,JSON object . tojsonstring(map));返回JSON object . getstring(“pre _ auth _ code“);}复制代码5。引导商家授权并获取授权信息。
第三方服务提供商建立授权链接并放置自己的网站。用户点击后,会弹出授权页面。
10public Ajax result getMchWebAuthUrl(@ path variable(“id“)String id){ redis service redis service = redis service . load();componentverifytick componentverifytick = redis service . load(componentverifytick。COMPONENT_VERIFY_TICKET_ID,COMPONENT VERIFY TICKET . class);if(componentvrifytick = = null){ return Ajax result。错误(“未能将用户引入授权页面,component_verify_ticket为空”,空);} else { String preAuthCode = authorized utils . getpreauthcode(componentvrifytike . getcomponentvrifytike());String encryptAppId = ThirdPlat。PLAT _ APPIDstring appId = endecryptutil . d3es decode(encrypt appId);String auth_type = ThirdPlat。AUTH _ TYPE字符串requestUrl = AuthAccessUrl。WEB_AUTH_URL请尝试{ request URL = request URL . replace(“COMPONENT _ APPID“,APPID)。replace(“PRE _ AUTH _ CODE“,preAuthCode)。替换(“重定向_URI”,URL encoder . encode(third plat。REDIRECT _ uri . replace(“merchant ID“,id“,“UTF-8“))。replace(“验证类型”,验证类型);} catch(unsupportdencodingexception e){ e . printstacktrace();} logger.warn(“第二步:将用户导入授权页面----》成功,URL:“+request URL);返回AjaxResult.success(“操作成功”,request URL);}}复制代码6。设置小程序的基本信息。
设置小程序名称,如果名称没有命中关键字,则直接设置成功;当一个名字击中一个关键词时,就需要提交证明材料并进行审查。修改小程序的头像。修改功能介绍。修改小程序的隐私设置,即修改是否可以被搜索到。
1public Ajax result setBasicInfo(BasicInfo BasicInfo)抛出io exception { Merchant Merchant = Merchant service . get byid(BasicInfo . get Merchant id());if(merchant = = null){ logger . warn(“设置基本信息---》失败,merchant为null“);返回AjaxResult.error(“设置基本信息失败,商家为空”,null);} else { authorization info info = authorized utils . getauthorizationinfo(merchant . get appid());//修改头像if(String utils。不为空(basicinfo。get head image())){ upload in uli = new upload in();uli.setType(“图像”)。setUrlPath(basic info . get head image());JSON object upload JSON = base utils . upload(info,uli);string mediaId = upload JSON . getstring(“media _ id“);ModifyHeadImageIn MHI = new ModifyHeadImageIn();MHI。sethead _ img _ media _ id(mediaId)。setx 1(“0“)set y1(“0“)set x2(“1“)set y2(“1“);JSON object obj = base utils . modify head image(info,MHI);如果(!getinteger(RES status。错误代码)。等于(ResStatus。代码)||!雷斯塔图斯。msg . equalsignorecase(obj . getstring(RES status。ERRMSG)){ return Ajax result . error(obj . getinteger(RES status)。ERRCODE)、obj . getstring(RES status。ERRMSG);} else { merchant . setapplets head img(basic info . get head image());} }//修改名称if(String utils。不为空(basicinfo。get nickname())){ upload in uli = new upload in();uli.setType(“图像”)。setUrlPath(merchant . getbusiness license());JSON object upload JSON = base utils . upload(info,uli);string mediaId = upload JSON . getstring(“media _ id“);set nickname in sni = new set nickname in();sni . set nick _ name(basic info . get nickname());sni . set license(mediaId);JSON object obj = base utils . set nickname(info,sni);如果(!getinteger(RES status。错误代码)。等于(ResStatus。代码)||!雷斯塔图斯。msg . equalsignorecase(obj . getstring(RES status。ERRMSG)){ return Ajax result . error(obj . getinteger(RES status)。ERRCODE)、obj . getstring(RES status。ERRMSG);} else { merchant . setappletsname(basic info . get nickname());if(obj . contains key(“audit _ id“)& & string utils . isnotempty(obj . getstring(“audit _ id“)){ merchant . setauditid(obj . getstring(“audit _ id“));} } }//修改函数介绍if(string utils。不为空(basicinfo。get signature())){ modifysignaturein MSI = newmodifysignaturein();MSI . set signature(basic info . get signature());JSON object obj = base utils . modify signature(info,MSI);如果(!getinteger(RES status。错误代码)。等于(ResStatus。代码)||!雷斯塔图斯。msg . equalsignorecase(obj . getstring(RES status。ERRMSG)){ return Ajax result . error(obj . getinteger(RES status)。ERRCODE)、obj . getstring(RES status。ERRMSG);} else { merchant . setappletsignature(basic info . get signature());} }//修改隐私设置,即修改是否可以搜索if(string utils。不为空(basicinfo。getstatus())){ searchstatusinssi = new searchstatusin();SSI . set status(basic info . get status());JSON object obj = base utils . changewxasearchstatus(info,SSI);如果(!getinteger(RES status。错误代码)。等于(ResStatus。代码)||!雷斯塔图斯。msg . equalsignorecase(obj . getstring(RES status。ERRMSG)){ return Ajax result . error(obj . getinteger(RES status)。ERRCODE)、obj . getstring(RES status。ERRMSG);} else { merchant . setsearchstatus(basic info . get status());} } merchantservice . update byid(merchant);return Ajax result . success();}}复制代码7。支付授权
即填写商户编号和商户编号密钥,并上传p12证书。
8.设置服务器域名
授权给第三方的小程序的服务器域名只能是第三方平台的服务器。当通过第三方平台启动小程序时,小程序原本配置的服务器域名将被删除,仅保留第三方平台的域名。因此,第三方平台需要在发布代码而不是小程序之前调用接口为小程序添加第三方平台自己的域名。
注意:
您需要在第三方平台的小程序服务器域名中注册域名,然后才能调用该接口进行配置。
您最多可以添加1000个合法服务器域名;其中,请求域名、套接字域名、上传文件域名、下载域名和Udp域名的设置数量均支持多达200个。
你一个月可以提交50次修改申请。
1public Ajax result modify domain(modify domain modify domain){ Merchant Merchant = Merchant service . get byid(modify domain . get Merchant id());if(merchant = = null){ logger . warn(“未能设置服务器域名---》,merchant为null“);返回AjaxResult.error(“设置服务器域名失败,商家为空”,null);} else { authorization info info = authorized utils . getauthorizationinfo(merchant . get appid());modifydomain out = new modifydomain out();out . set action(modify domain . getaction());stringpublic Ajax result webview domain(webview domain webview domain){ Merchant Merchant = Merchant service . getbyid(webview domain . getmerchant id());if(merchant = = null){ logger . warn(“设置业务域名---》失败,merchant为null“);返回AjaxResult.error(“设置商家域名失败,商家为空”,null);} else { authorization info info = authorized utils . getauthorizationinfo(merchant . get appid());SetWebViewDomainOut out = new SetWebViewDomainOut();out . set action(webview domain . get action());string public Ajax result commit(commit model model){ Merchant Merchant = Merchant service . selectmerchantbyid(model . getmerchantid());if(merchant = = null){ logger . warn(“上传代码---》失败,merchant为null“);返回AjaxResult.error(“上传代码,商家为空”,null);} authorization info info = authorized utils . getauthorizationinfo(merchant . getappid());commit in commit in = new commit in();string value = model . getvalue();字符串11,成员管理
在第三方平台帮助其授权的小程序提交代码审查之前,可以让小程序运营者先行体验。体验前,需要将运营者的个人微信号添加到小程序的体验者列表中。
注意:如果运营者同时也是小程序的管理员,则无需绑定,管理员默认拥有体验权。
/* *绑定体验者* @ parambindtester * @ return */@覆盖公共Ajax结果绑定测试器(bindtester绑定测试器){ merchant merchant = merchant service。getbyid(绑定测试器。getmerchant());if(merchant = = null){ logger . warn(“binding experience ---》失败,merchant为null“);返回AjaxResult.error(“绑定体验者失败,商家为空”,null);} else { authorization info info = authorized utils . getauthorizationinfo(merchant . get appid());JSON object obj = member utils . bind tester(info,bind tester . getwe chatid());if(“0“。equals(obj . getstring(“errcode“))& &“ok“。equalsIgnoreCase(obj . getstring(“errmsg“)){ applets tester at = new applets tester();at . set merchant id(bind tester . get merchant id())。setwe chatid(bind tester . getwe chatid())。setUserStr(obj . getstring(“userstr“);appletsttesterservice . insertappletstester(at);return Ajax result . success();} else { return Ajax result . error(obj . getinteger(“errcode“),obj . getstring(“errmsg“);}}}/* *由* @ paramteditrids * @ return */@ override public Ajax result unbound tester发布(长公共Ajax result get二维码(字符串商家id){ merchant merchant =商家服务。getbyid(商家id);if(merchant = = null){ logger . warn(“未能获取体验二维码---》,商家为null“);返回AjaxResult.error(“获取体验二维码,商家为空”,null);} authorization info info = authorized utils . getauthorizationinfo(merchant . getappid());string QR codeurl = codeutils . get QR code(info,“pages/index/index“);返回AjaxResult.success(“操作成功”,QR codeurl);}复制代码13并提交审查。
public Ajax result submit audit(submit audit submit){ Merchant Merchant = Merchant service . get byid(submit . get Merchant id());if(merchant = = null){ logger . warn(“未能获取体验二维码---》,商家为null“);返回AjaxResult.error(“获取体验二维码,商家为空”,null);} authorization info info = authorized utils . getauthorizationinfo(merchant . getappid());list category s = submit . get category();submit . set first _ id(category s . get(0)。split(“-“)public Ajax result undocode audit(String public Ajax result release applets(String public Ajax result revertCodeRelease(String public Ajax result getminiqr code(@ path variable(“Merchant id“)String Merchant id){ Merchant Merchant = Merchant service . getbyid(Merchant id);if(merchant = = null){ logger . warn(“未能获取小程序代码---3》,merchant为null“);返回AjaxResult.error(“获取小程序代码,商家为空”,null);}字符串二维码;if(string utils . isnotempty(merchant . getappletimage()){ QR code = merchant . getappletimage();} else { authorization info info = authorized utils . getauthorizationinfo(merchant . get appid());QR code = wxutils . getMiniQrcode(merchant id,“pages/index/index“,“merchant“,“miniqr code“,info . getauthorizer _ access _ token());merchant.setAppletImage(二维码);merchantService.updateById(商家);} return AjaxResult.success(“操作成功”,二维码);}复制代码。以上是关于微信开放平台和第三方平台开发的细节。更多资讯请关注主机参考等相关文章!
这几篇文章你可能也喜欢:
- 从前端角度梳理微信支付的流程(微信支付流程开发)
- 详细解释mp、开放和付费平台之间的直接关系(mp平台是什么意思)
- 我最后整理了一下,和微信第三方平台授权了小程序业务(微信第三方授权)。
- 从前端角度梳理微信支付的流程(从前端角度微信支付有哪些流程)
- 最后整理了一下,小程序业务由微信第三方平台授权(微信小程序授权方式)。
本文由主机参考刊发,转载请注明:关于微信开放平台、第三方平台开发(微信开放平台功能) https://zhujicankao.com/99896.html
评论前必须登录!
注册