1、注册微信公众号测试号
http://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/index
注意:
a、测试微信公众号的模版消息是可以手动编辑字段的,但是正式的微信公众号(已认证的服务号专有)只能从现有模版消息库中选择。
b、测试微信公众号的接口权限和正常的微信公众号是不完全相同的,请注意是否满足客户需求。
c、测试微信公众号不需要设置ip白名单即可获取token,正式的微信公众号需要设置ip白名单才可以获取微信的token,设置菜单为:设置与开发-安全中心-IP白名单
d、设置JS安全域名(测试公众号,需要有自己的服务器),正式微信公众号需要设置JS安全域名和网页安全域名(还需要按照微信的要求到服务器中对应的文件才可用) 将文件MP_verify_WAeKCUAHPRExbXad.txt(点击下载)上传至填写域名或路径指向的web服务器(或虚拟主机)的目录(若填写域名,将文件放置在域名根目录下,例如wx.qq.com/MP_verify_WAeKCUAHPRExbXad.txt;若填写路径,将文件放置在路径目录下,例如wx.qq.com/mp/MP_verify_WAeKCUAHPRExbXad.txt),并确保可以访问
附:获取token的地址 https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=?&secret=?
2、调用接口创建测试微信公众号菜单(正式的微信公众号不需要此操作,直接在 内容与互动-自定义菜单中设置即可)
自定义菜单 / 创建接口 (qq.com),根据文档设置即可
a、配置自定义跳转URL:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=?&redirect_uri=REDIRECT_URI&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect
其中STATE应替换为wxgzh_split_appID_split_appsecret这种格式的值,例如:
(wxgzh_split_wxa20e1232154586e4_split_89488d1231545165654f8b8c72fc0d)
REDIRECT_URI为把需要跳转的URL进行urlencode编码后的字符串,可以百度urlencode在线编码工具进行编码。
苍穹移动端的url格式大致为:http://访问域名/ierp/mobile.html?form=mobsp_apphomepage_new(注意这里微信规定不能用ip+端口的方式,注意这里不能用类似pc端首页的地址,不能在后面加#/dform?form=单据编码)
注意: 访问域名需要在JS安全域名和网页安全域名中设置,否则访问网络不通
3、苍穹mc中配置单点登录(免登)
a、进入mc中的环境公共配置项 :编码:authtication.apps 值kd.bos.login.thirdauth.app.tencent.WxgzhAuthtication
b、同步用户信息到苍穹(绑定关联关系,需要能访问外网否者获取不到微信的openID)
编码:login.after.handle.classes 值:kd.bos.login.thirdauth.app.tencent.WxgzhLoginAfter
这里可以使用企业微信同步用户,也可以直接在系统库中t_bas_immapping表插入数据,需要苍穹中用户的主键和微信中用户的openId,可以在苍穹的系统库使用sql:
insert into t_bas_immapping (fid, FIMTYPEID, FOPENID) value (主键, 类型(暂时随便给值也可以), '微信公众号用户的openId');
update t_bas_immapping SET FUSERID = (select fid from t_sec_user where fphone = '用户手机号') where fid = '用户手机号';
如果没有同步用户,即t_bas_immapping表中查不到数据,则会跳转到苍穹登陆界面;用户输入信息之后苍穹会自动在t_bas_immapping中获取openid并存储; ( 此逻辑在kd.bos.login.thirdauth.app.tencent.WxgzhLoginAfter中,目前标准代码存在bug,多系统对接对于同一个fuserid会替换openid,导致单点登录到别的系统失败,多系统对接需要修改总部标准代码或者联系总部出私包解决 )
4、注册消息渠道
5、重写渠道解析类,继承kd.bos.workflow.engine.msg.handler.AbstractMessageServiceHandler。
因为这边只需要实现发送消息,createtodo,dealtodo,deletetodo等方法可以不用重写,只需要重写sendMessage方法即可;如果是消息待办需要重写createtodo方法
{ = .(.); (, ) { } (, ) { } (, ) { } (, ) { .sendMessage(, ); { = .getTag(); = .getContent(); <> = .getUserIds(); = QFilter(, ., ); = .(, ,.toArray()); = .get().toString(); .info(+); = .get().toString(); .info(+); = .get().toString(); .info(+); = .get().toString(); .info(+); = ++++; .info(+); = .get().toString(); .info(+); = ; = .get().toString(); .info(+); = .get().toString(); .info(+); = .getLong(); .info(+); = .getString(); = .getString(); = .getString(); = .getString(); = .getString(); = .getString(); = SimpleDateFormat(); (!.() && !.()){ = .stringToDate(,); (.getDayDiff(Date(),)>){ = ; } } (.()){ = .(); .info(+); (!.()){ = .(); = .getString(); = .getIntValue(); (.()){ = .getString(); .error(+); KDBizException(); }{ = .(,); .set(,); .set(, .format(addMiniute(Date(),/)).toString()); .(DynamicObject[]{}); } }{ .error(); KDBizException(); } } (!.()){ = .get().toString(); .info(+); = + ; = JSONObject(); .put(,); <> = ArrayList<>(); (){ : = .(); = .getString(); = .getString(); = .getString(); = JSONObject(); = JSONObject(); = JSONObject(); = JSONObject(); = JSONObject(); .put(,); .put(,); .put(,); .put(,); .put(,); .put(,); .put(,); .put(,); = StringBuilder(); = ; (!.()){ .append(); .append(); .append(); .append(); .append(.()); .append(); .append(); .append(); .append(); .append(); } .put(,); .put(,); (:) { = getUserOpenId(); (!.()){ .put(,); .info(+.toJSONString()); = .(, , .toJSONString()); .info(+); (.()){ .add(); }{ = .(); = .getInteger(); (!=){ .add(); } } } } (.size()>){ .setUserIds(); KDBizException(); } ; }{ .error(); KDBizException(); } } () { .info(+ .getMessage()); WFMessageServiceException(, .(), Object[]{.getMessage()}); } } () { = ; = QFilter(, .,); = .and(QFilter(, .,)); = .(, , QFilter[]{}); (.size()>){ = .get().getString(); } ; } (, ) { = .(); .setTime(); .add(., ); .getTime(); } (, ) { = SimpleDateFormat(); = ; = ; { = .parse(.format()).getTime(); = .parse(.format()).getTime(); } () { .error(, ); } ()((- ) / );} (, ) { = SimpleDateFormat(); { = .parse(); ; } () { = StringBuilder(); .append(.(, , , Object[])).append().append(.(, , , Object[])).append(); RuntimeException(.toString(), ); } } }
推荐阅读