主机参考:VPS测评参考推荐/专注分享VPS服务器优惠信息!若您是商家可以在本站进行投稿,查看详情!此外我们还提供软文收录、PayPal代付、广告赞助等服务,查看详情! |
我们发布的部分优惠活动文章可能存在时效性,购买时建议在本站搜索商家名称可查看相关文章充分了解该商家!若非中文页面可使用Edge浏览器同步翻译!PayPal代付/收录合作 |
这么说吧,微信官方账号/多种服务、功能模式相同的小程序只是小程序开发。是否需要复制多套代码,更改appid信息,在微信微信官方账号后台配置域名服务器和密钥,每次更改提交发布,重复步骤?随着要维护的微信官方账号/小程序数量逐渐增多,要投入的资源和成本也随之增加。
不曾想,我们只需要开发一套微信官方账号/小程序代码,用它做模板,然后一套后台管理系统,把微信微信官方账号后台做的事情全部搬到自己的系统里。同样业务的小程序,只需要管理员授权即可。在我们的系统中点击几个按钮,就可以在线发布小程序,一次性开发N个微信官方账号,提供标准化的接口服务,满足业务的基本需求。通过扫描二维码,授权给平台,帮助N代微信官方账号实现业务。不再需要了解复杂的参数设置,也不向开发者提供密码,保证安全。真的能把运营生和开发者的手解放出来,有更多的时间谈女朋友就好了。没错,微信的第三方平台开发就是帮你节省更多结婚时间的神器。
摘要
微信公众平台-第三方平台(简称第三方平台)面向所有通过开发者资格认证的开发者开放。第三方平台开发者在获得微信官方账号或小程序运营方(以下简称运营方)授权后,可以通过调用微信开放平台的接口能力,为微信官方账号或小程序运营方提供账号申请、小程序创作、技术开发、行业策划、活动营销、插件能力等全方位服务。同一账号的运营者可以选择几家合适的第三方为其提供产品能力或者委托其运营。
从业务特点来看,第三方平台必须如图所示:
从具体的业务场景来看,第三方平台包括以下场景:
提供行业解决方案,如电商行业解决方案或旅游行业解决方案;
行业:(横向)提供更专业的运营能力,细化用户微信官方账号或小程序的运营;
功能:(垂直)优化公众平台功能,比如专门优化图文消息视觉风格和布局的工具,或者定制的CRM用户管理功能,或者强大的小程序插件等。
接入第三方开发的前提是要有微信开放平台应用。请参考详细的创建步骤。
developers.weixin.qq.com/doc/oplatfo…
1.拿到验证单。
验证票证(component_verify_ticket)。第三方平台审核通过后,微信服务器会每隔10分钟向其授权的事件接收URL发布component_verify_ticket。
收到POST请求后,只需直接返回字符串success即可。为了加强安全性,postdata中的xml会在服务申请时用加解密密钥加密,收到push后解密。
public void save ticket(http servlet request请求,HttpServletResponse响应)抛出io exception { String msg signature = request . getparameter( ;消息_签名 );//微信加密签名字符串timest = request . getparameter(" timest ;);//timest string nonce = request . getparameter(" nonce ;);//随机数buffered reader br = newbuffered reader(newinputstreamreader(request . getinputstream())," ut F-8 ;));string buffer sb = new string buffer();String line = nullwhile ((line = br.readLine())!= null) { sb = sb.append(行);} String post data = sb . tostring();try { authorized utils . savecomponentverifytick(msg signature,timeSt,nonce,post data);} catch(异常e){ logger . error( ;例外制度”,e);} finally {//响应消息printwriter out = response . getwriter();out . print( ;成功 gt;);}}复制代码2。获取令牌
Token (component_access_token)是第三方平台接口的调用凭证。代币的获取是有限制的,每个代币的有效期是2个小时。请自行管理令牌,并在令牌即将过期时(例如1小时50分钟)再次调用接口进行获取。
public static component token getcomponent token(String ticket){ redis service lt;ComponentToken gtredis 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。组件_访问_ URL地图 ltString,String gtmap = new HashMap lt gt();map . put( ;component_appid,appId);//第三方平台appid map . put( ;component _ appsecret ,秘密);//第三方平台app secret map . put( ;组件_验证_票证 ,票);string output str = JSON object . tojsonstring(map);logger . warn( ;请求数据"+outputStr);JSON object JSON object = http request utils . http request(request URL, 帖子 ,output str);if (null!= JSON object){ long expires = system . current time millis()+7200;请尝试{ expires = system . current time millis()+JSON object . getint value( ;过期时间为 );}catch(异常e){ } try { component token = new component token();component token . setcomponentaccesstoken(JSON object . getstring( ;组件访问令牌 ));component token . setexpire树脂(过期);redis service . save(component token,component token . class);} catch(异常e){ component token = null;logger.error(例外制度”,e);} } } else { long sysTime = system . current time millis();if(系统时间 gt= component token . getexpiresin()){ redis service . delete(component token。COMPONENTTOKEN_ID,component token . class);component token = getcomponentoken(ticket);} else { } }返回componentToken}复制代码3,快速创建小程序
小程序接口的快速创建,优化了小程序注册和认证的流程,可以帮助第三方平台快速拓展线下商户,扩大商户的服务范围,占领小程序线下业务的先机。用法人人脸识别方式代替小额钱等认证过程,大大降低了采集小程序主体和类别资质信息的人力成本。第三方平台只需采集法人名称、法人微信、企业名称、企业代码信息这四项信息,就可以向企业法人发送模板消息采集法人的人脸信息,完成所有的注册认证流程。并且当法人收到创建成功的小程序APPID时,同时向法人发送模板消息,提示法人设置邮箱和密码,方便后续法人登录小程序控制台进行管理。
默认情况下,通过该接口创建的小程序是“经过验证的”。为了降低接入小程序的成本门槛,通过该接口创建的小程序不需要缴纳300元认证费。
public Ajax result fast register(String Merchant id){ Merchant Merchant = Merchant service . get byid(Merchant id);if(merchant = = null){ logger . warn( ;快速创建小程序---->:失败,商家为空 );返回AjaxResult.error快速创建子视图失败,商家为空 ,null);} else { RedisService ltComponentVerifyTicket gtredis service = redis service . load();component verify ticket component verify ticket = redis service . load(component verify ticket。COMPONENT_VERIFY_TICKET_ID,COMPONENT VERIFY TICKET . class);if(component verify ticket = = null){ logger . warn( ;快速创建小程序---->:失败,component_verify_ticket为空 );返回AjaxResult.error快速创建子视图失败,component_verify_ticket为空,null);} else { component token component token = authorized utils . getcomponent token(componentverifytick . getcomponentverifytick());RegisterWeappOut = new RegisterWeappOut();out.setName(merchant.getName())。setCode(merchant.getCode())。set code _ type(merchant . getcodetype())。set legal _ 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( ;错误代码 )= = 0 "好的 。equalsIgnoreCase(obj . getstring( ;errmsg ))){ return Ajax result . success();} else { return Ajax result . error(obj . getinteger( ;错误代码 ),obj . getstring( ;errmsg ));}}}}复制代码4。获取预授权码。
预授权码(pre_auth_code)是第三方平台实现授权托管的必要信息。每个预授权码的有效期为10分钟。您需要在调用之前获取一个令牌。
公共静态字符串getPreAuthCode(String 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();地图 ltString,String gtmap = new HashMap ltString,String gt();map . put( ;component_appid,appId);JSON object JSON object = http request utils . http request(URL, 帖子 ,JSON object . tojsonstring(map));返回JSON object . getstring( ;预认证代码 );}复制代码5。引导商家授权,获取授权信息。
第三方服务提供商建立授权链接来放置他们自己的网站。用户点击后,弹出授权页面。
10public Ajax result getMchWebAuthUrl(@ path variable( ;id )字符串id){ redis service lt;ComponentVerifyTicket gtredis service = redis service . load();component verify ticket component verify ticket = redis service . load(component verify ticket。COMPONENT_VERIFY_TICKET_ID,COMPONENT VERIFY TICKET . class);if(component verify ticket = = null){ return Ajax result . error( ;用户进入授权页面失败,component_verify_ticket为空 ,null);} else { String preAuthCode = authorized utils . getpreauthcode(componentverifytool . getcomponentverifytool());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)。替换(预认证代码 预授权码)。替换(重定向_ URI ;,URLEncoder.encode(ThirdPlat。REDIRECT _ uri . replace( ;MERCHANTID ,id), ut F-8 ;)).替换(AUTH_TYPE,auth _ type);} catch(UnsupportedEncodingException e){ e . printstacktrace();} logger . warn( ;第二步:向用户介绍授权页面---->;成功,URL:“+request URL);返回Ajax result . 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( ;设置基本信息---->:失败,商户为空 );返回AjaxResult.error设置基本信息失败,商户为空 ,null);} else { authorization info info = authorized utils . getauthorizationinfo(merchant . get appid());//修改头像if(string utils . not empty(basic info . getheadimage()){ 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( ;媒体标识 );modify head imagein MHI = new modify head imagein();MHI . sethead _ img _ media _ id(mediaId). setx 1( ;0 gt;). sety 1( ;0 gt;). set x2( ;1 ). sety 2( ;1 );JSON object obj = base utils . modify head image(info,MHI);如果(!getinteger(RESS status。错误代码)。等于(ResStatus。码)||!雷斯塔特斯。msg . equalsignorecase(obj . getstring(RES status。ERRMSG)){ return Ajax result . error(obj . getinteger(RES status。ERRCODE)、obj.getString(ResStatus。ERRMSG));} else { merchant . setappletsheadimg(basic info . get head image());} }//修改名称if (stringitils .不为空(basic info . get nickname()){ uploadinuli = new uploadin();uli . settype( ;图像 ).seturl path(merchant . getbusinesslicense());JSON object upload JSON = base utils . upload(info,uli);string mediaId = upload JSON . getstring( ;媒体标识 );set昵称sni = new昵称in();sni . set nick _ name(basic info . get nickname());sni . set license(mediaId);JSON object obj = base utils . set nickname(info,sni);如果(!getinteger(RESS status。错误代码)。等于(ResStatus。码)||!雷斯塔特斯。msg . equalsignorecase(obj . getstring(RES status。ERRMSG)){ return Ajax result . error(obj . getinteger(RES status。ERRCODE)、obj.getString(ResStatus。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(stringitils . is not empty(basic info . get signature()){ modifysignaturein MSI = newmodifysignaturein();MSI . set signature(basic info . get signature());JSON object obj = base utils . modify signature(info,MSI);如果(!getinteger(RESS status。错误代码)。等于(ResStatus。码)||!雷斯塔特斯。msg . equalsignorecase(obj . getstring(RES status。ERRMSG)){ return Ajax result . error(obj . getinteger(RES status。ERRCODE)、obj.getString(ResStatus。ERRMSG));} else { merchant . setappletsignature(basic info . get signature());} }//修改隐私设置,即如果(stringitils .不为空(basic info . get status()){ searchstatusssi = newsearchstatusin())是否可以搜索;SSI . set status(basic info . get status());JSON object obj = base utils . changewxasearchstatus(info,SSI);如果(!getinteger(RESS status。错误代码)。等于(ResStatus。码)||!雷斯塔特斯。msg . equalsignorecase(obj . getstring(RES status。ERRMSG)){ return Ajax result . error(obj . getinteger(RES status。ERRCODE)、obj.getString(ResStatus。ERRMSG));} else { merchant . setsearchstatus(basic info . get status());} } merchantService.updateById(商家);返回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( ;设置服务器域名---->:失败,商户为空 );返回AjaxResult.error设置服务器域名失败,商家为空 ,null);} else { authorization info info = authorized utils . getauthorizationinfo(merchant . get appid());ModifyDomainOut out = new ModifyDomainOut();out . set action(modify domain . getaction());stringpublic Ajax result webview domain(webview domain webview domain){ Merchant Merchant = Merchant service . get byid(webview domain . getmerchant id());if(merchant = = null){ logger . warn( ;设置商家域名---->:失败,商家为空 );返回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( ;上传代码---->:失败,商户为空 );返回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 */@ override public Ajax result bind tester(bind tester bind tester){ merchant merchant = merchant service . get byid(bind tester . get merchant tid());if(merchant = = null){ logger . warn( ;体验者---->:失败,商家为空 );返回AjaxResult.error体验者失败,商家为空 ,null);} else { authorization info info = authorized utils . getauthorizationinfo(merchant . get appid());JSON object obj = member utils . bind tester(info,bind tester . getwechatid());如果( 0 gt;。equals(obj . getstring( ;错误代码 )) "好的 。equalsIgnoreCase(obj . getstring( ;errmsg ))){ applets tester at = new applets tester();at . setmerchantid(bind tester . getmerchantid())。setWechatId(bind tester . getwechatid())。setUserStr(obj . getstring( ;userstr ));applets tester service . insertapplets tester(at);返回Ajax result . success();} else { return Ajax result . error(obj . getinteger( ;错误代码 ),obj . getstring( ;errmsg ));}}}/* * *缓解体验者* @ paramesterids * @ return */@ override public Ajax result unbind tester(long public Ajax result get QR code(string merchant id){ merchant merchant = merchant service . get byid(merchant id);if(merchant = = null){ logger . warn( ;获取二维码---->:失败,商家为空 );返回AjaxResult.error获取体验二维码,商家为空 ,null);} authorization info info = authorized utils . getauthorizationinfo(merchant . getappid());string QR codeurl = code utils . get QR code(info, 页数/索引/索引 );返回Ajax result . success( ;操作成功”,QR codeurl);}复制代码13。提交以供审查
public Ajax result submit audit(submit audit submit){ Merchant Merchant = Merchant service . get byid(submit . getmerchantid());if(merchant = = null){ logger . warn( ;获取二维码---->:失败,商家为空 );返回AjaxResult.error获取体验二维码,商家为空 ,null);} authorization info info = authorized utils . getauthorizationinfo(merchant . getappid());列表 lt字符串 gtcategory ys = submit . get category();submit . set first _ id(category ys . get(0))。拆分( - ;)public Ajax result undocode audit(string public Ajax result release applets(string public Ajax result revertCodeRelease(string public Ajax result getminiqr code(@ path variable( ;merchantId )String Merchant id){ Merchant Merchant = Merchant service . get byid(Merchant id);if(merchant = = null){ logger . warn( ;获取小程序代码---->:失败,商户为空 );返回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 . getminiqr code(merchant id, 页数/索引/索引 , 商人 , miniQrcode ,info . getauthorizer _ access _ token());merchant.setAppletImage(二维码);merchantService.updateById(商家);} return Ajax result . success( ;操作成功”,二维码);}复制代码以上是关于微信开放平台,第三方平台开发的细节,请多关注主机参考其他相关文章!
这几篇文章你可能也喜欢:
本文由主机参考刊发,转载请注明:微信开放平台呢,第三方平台开发(什么是微信开放平台) https://zhujicankao.com/75527.html
评论前必须登录!
注册