微信企业号第三方应用开发[一]——创建套件

注:文中绿色部分为摘自微信官方文档

第三方应用提供给企业的是一个应用,但是应用必须在套件下创建,所以第一步是要创建套件。

注册成为应用提供商,必须输入以下信息:
信息项要求及说明
企业Logo 应用提供商的企业Logo,小于2M,640*640,背景为白色
企业简称 使用对外宣传的企业简称,能代表企业的名字,2-16个字
企业简介 描述企业所提供的服务,4-120个字
企业官网 应用服务商的企业官网
注册条件:a)拥有一个已经过认证的企业号 b)用系统管理员身份进行申请

摘自http://qydev.weixin.qq.com/wiki/index.php?title=%E5%BA%94%E7%94%A8%E6%8F%90%E4%BE%9B%E5%95%86%E6%B3%A8%E5%86%8C%E5%BA%94%E7%94%A8

符合以上条件后,登录微信第三方应用官网,选择“服务商登录”
1.png

登陆后界面如下,选择添加应用套件
2.png

创建应用套件

开发者完成注册之后,即可创建应用套件。应用套件是第三方应用授权的主体,接口的开发都与应用套件息息相关,请开发者仔细阅读下方内容。

基本信息:

信息项要求及说明
应用套件Logo 应用套件的Logo,小于2M,640*640,在授权页会被用于展示。
应用套件名称 应用套件的名称,2-16个字
介绍网站 介绍该应用套件网站或者页面
应用套件介绍 描述该应用套件所提供的服务,4-120个字
授权方式 使用方式目前有两种:线上自助注册授权使用和服务商辅助授权使用。
服务行业 该应用套件所服务的行业对象,一个套件只能属于一个服务行业。
套件标签 套件提供的服务类型,如OA办公、CRM、HR、ERP等。一个套件只能拥有一个标签。
注意:

1)你应谨慎选择所填写的行业和标签,行业是指可使用该套件企业所属的行业。当应用套件达到一定的活跃度后(授权企业数和日活跃用户数),会自动在企业号第三方官网进行推荐,套件所在的分类将基于所设置的行业和标签。

2)授权方式的作用在于区分应用套件是否可以直接从企业号第三方官网发起授权,线上自助注册授权使用是指该应用套件可以直接从企业号第三方官网发起授权,而不跳转服务商网站,该类型的应用套件还可以支持移动端发起应用套件授权;服务商辅助授权使用是指该应用套件必须跳转服务商网站,从服务商网站发起应用套件的授权,该类型的应用套件不支持移动端发起应用套件授权。

3)你可以创建或者选择其他开发者已创建的标签。你应该谨慎选择套件标签,用户往往会在企业号中通过标签查找相关联的套件。

开发信息:

套件参数内容说明
发起授权域名 在该域名下发起的授权请求才可被通过,企业点击授权链接时,企业号会检查该域名是否已登记。
授权完成回调域名 在第三方应用授权流程中,授权成功后会回调该域名,返回临时code。你需用此code换取永久授权码,请尽量将此域名与发起授权域名保持一致。
系统事件接收URL 系统将会把此套件的授权变更事件以及ticket参数推送给此URL,ticket说明详见API接口说明。(填写URL时需要正确响应微信验证URL的请求,具体说明请阅读“回调模式”)
Token 可任意填写,用于生成签名,校验回调请求的合法性。后续所有托管的企业产生的回调消息都使用该值来解密。
EncodingAESKey 回调消息加解密参数,是AES密钥的Base64编码,用于解密回调消息内容对应的密文。后续所有托管的企业产生的回调消息都使用该值来解密。
应用套件ID 应用套件的编号,相关的接口调用需要使用,由系统生成,不可更改。
应用套件secret 应用套件的密钥,相关的接口调用需要使用。
白名单IP列表 应用套件调用企业号第三方应用API时的合法IP列表,只有白名单内的IP才能正常调用企业号API,后续IP若有修改,需要及时进行列表更新。
创建完成之后,系统会告知开发者该应用套件的Suiteid和Suitesecret。(详见第三方应用接口说明)

摘自http://qydev.weixin.qq.com/wiki/index.php?title=%E5%BA%94%E7%94%A8%E6%8F%90%E4%BE%9B%E5%95%86%E6%B3%A8%E5%86%8C%E5%BA%94%E7%94%A8

进入创建套件页面,填写基本资料
3.png

点击下一步,填写开发资料
4.png

关于”系统事件接收URL”的填写
系统事件接收URL支持$CORPID$模板,调用时会将$CORPID$替换成企业号的corpid,所以”系统事件接收URL”可以写成
http://AAA.com/api/weixin/callback.do?corpid=$CORPID$

验证URL有效性

当你提交以上信息时,企业号将发送GET请求到填写的URL上,GET请求携带四个参数,企业在获取时需要做urldecode处理,否则会验证不成功。

参数描述是否必带
msg_signature 微信加密签名,msg_signature结合了企业填写的token、请求中的timestamp、nonce参数、加密的消息体
timestamp 时间戳
nonce 随机数
echostr 加密的随机字符串,以msg_encrypt格式提供。需要解密并返回echostr明文,解密后有random、msg_len、msg、$CorpID四个字段,其中msg即为echostr明文 首次校验时必带
其中msg即为echostr明文 首次校验时必带 企业通过参数msg_signature对请求进行校验,如果确认此次GET请求来自企业号,那么企业应该对echostr参数解密并原样返回echostr明文(不能加引号,不能带bom头,不能带换行符),则接入验证生效,回调模式才能开启。 摘自http://qydev.weixin.qq.com/wiki/index.php?title=%E5%9B%9E%E8%B0%83%E6%A8%A1%E5%BC%8F

“系统事件接收URL”响应的代码如下

WeiXinApi.java

/**
 * 微信回调响应
 *
 * @param req
 * @param res
 * @author:leap
 * @MethodName: callback
 * @Description:
 * @date:2016年8月25日
 */
@RequestMapping(value = "callback")
@ResponseBody
public void callback(HttpServletRequest req, ServletResponse res) {
    /** url中$CORPID$模板替换后的corpid **/
    String corpid = req.getParameter("corpid");
    /** url中的签名 **/
    String msgSignature = req.getParameter("msg_signature");
    /** url中的时间戳 **/
    String timestamp = req.getParameter("timestamp");
    /** url中的随机字符串 **/
    String nonce = req.getParameter("nonce");
    /** 创建套件时验证回调url有效性时传入**/
    String echostr = req.getParameter("echostr");

    WxAuthorizeLogic wxAuthorizeLogic = new WxAuthorizeLogic();
    String result = "";
    try {
        if (!Utils.isBlank(echostr)) {    
            /*
             * 验证回调url有效性
             * 响应需对echostr参数解密并原样返回echostr明文(不能加引号,不能带bom头,不能带换行符)
             */
            String verifyURLResult = wxAuthorizeLogic.verifyURL(msgSignature,
                    timestamp, nonce, echostr, corpid);
            res.getWriter().write(verifyURLResult);
        } else {
            //其他操作
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

WxAuthorizeLogic.java

/**
 * 微信授权逻辑
 *
 * @author:leap
 * @Description:
 * @date:2016年8月30日
 */
public class WxAuthorizeLogic {
    /**
     * 验证回调URL有效性
     *
     * @param msgSignature url中的签名
     * @param timestamp    url中的时间戳
     * @param nonce        url中的随机字符串
     * @param echostr      回显字符串
     * @param corpid       用于创建解密类
     * @return 返回解密后的明文字符串
     * @throws AesException
     * @author:leap
     * @MethodName: verifyURL
     * @Description:
     * @date:2016年8月30日
     */
    public String verifyURL(String msgSignature, String timestamp,
                        String nonce, String echostr, String corpid) throws AesException {
        //注意创建解密对象时使用的是CORP_ID而不是SUITE_ID
        WXBizMsgCrypt wxBizMsgCrypt = new WXBizMsgCrypt(WXBase.SUITE_TOKEN,
                WXBase.SUITE_ENCODING_AES_KEY, corpid);
        String result = wxBizMsgCrypt.VerifyURL(msgSignature, timestamp, nonce, echostr);
        logger.info("VerifyURLResult=" + result);
        return result;
    }
}

其中类WXBizMsgCrypt由官方提供

java库(2014年9月24日更新,点击下载)

注意事项:

1.com\qq\weixin\mp\aes目录下是用户需要用到的接入企业微信的接口,其中WXBizMsgCrypt.java文件提供的WXBizMsgCrypt类封装了用户接入企业微信的三个接口,其它的类文件用户用于实现加解密,用户无须关心。sample.java文件提供了接口的使用示例。

2.WXBizMsgCrypt封装了VerifyURL, DecryptMsg, EncryptMsg三个接口,分别用于开发者验证回调url、接收消息的解密以及开发者回复消息的加密过程。使用方法可以参考Sample.java文件。

3.请开发者使用jdk1.6或以上的版本。针对org.apache.commons.codec.binary.Base64,需要导入jar包commons-codec-1.9(或commons-codec-1.8等其他版本),我们有提供,官方下载地址:

http://commons.apache.org/proper/commons-codec/download_codec.cgi

4.异常java.security.InvalidKeyException:illegal Key Size的解决方案:

在官方网站下载JCE无限制权限策略文件(请到官网下载对应的版本, 例如JDK7的下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html ):

下载后解压,可以看到local_policy.jar和US_export_policy.jar以及readme.txt。如果安装了JRE,将两个jar文件放到%JRE_HOME% \lib\security目录下覆盖原来的文件,如果安装了JDK,将两个jar文件放到%JDK_HOME%\jre\lib\security目录下覆盖原来文件。

摘自http://qydev.weixin.qq.com/wiki/index.php?title=%E5%8A%A0%E8%A7%A3%E5%AF%86%E5%BA%93%E4%B8%8B%E8%BD%BD%E4%B8%8E%E8%BF%94%E5%9B%9E%E7%A0%81

* 红字部分是必要操作,不可忽略 *


[目录]
[上一篇] 微信企业号第三方应用开发[前言]
[下一篇] 微信企业号第三方应用开发[二]——创建应用



微信企业号第三方应用开发[前言]

关于微信

微信的口号是连接一切,其过程大概为

  • 人与人的连接(基础聊天、朋友圈)

  • 人与组织的连接(订阅号、公众号)

  • 人与企业的连接(企业号)

关于企业号第三方应用

微信推出了企业号第三方应用,它的作用其实是在人与企业连接中继续深化。企业号第三方应用与企业号并不相同,企业号第三方应用是在企业号的基础上扩展的产物。企业号的开发是基于每个企业的企业号进行,相当于为每个企业定制软件;而企业号第三方应用即是把软件做成SaaS,做成一套产品让多个企业直接使用,降低客户成本。企业号的这一发展方向与目前大众软件的发展路线是一致的,所以企业号第三方应用将会有非常强劲的生命力和广阔的市场空间。

关于本系列文章

有过微信开发经验的童鞋应该都体会过微信开发简直就是一步一个坑,其开发文档的不完善会导致很多细微的坑要占用大量的时间去解决,本系列文章旨在记录本人在企业号第三方应用开发的实践过程和遇到的各种问题,供大家参考。

企业号第三方应用开发的大致流程

111.png


[目录]
[下一篇] 微信企业号第三方应用开发[一]——创建套件



微信企业号第三方应用开发[目录]
itellij idea导入web项目并部署到tomcat

概述

主要分为项目配置和tomcat配置两大步骤。

一、项目配置

  • 打开idea,选择导入项目
    1.png

  • 选择将要打开的项目路径后,继续选择项目的原本类型(后续引导设置会根据原本的项目类型更新成idea的项目),此例中选择Eclipse,然后一直next到底即可。
    2.png

  • File->Project Structure打开项目配置窗口

  • 在Project项中配置JDK版本和编译等级
    3.png

  • 在Modules项的Sources标签页中配置项目结构(主要配置需编译的Java文件和配置文件)
    4.png

  • 在Modules项的Paths标签页中配置编译后文件输出路径
    5.png

  • 在Modules项的Dependencies标签页中配置依赖关系
    因为在导入项目的时候选择了导入的是eclipse项目,所以此处依赖关系已自动处理,若手动配置主要是要加上jdk和web-inf/lib的jar包。
    图片中标示的项目名称下有红色波浪线的错误提示,把依赖关系中所有红色的项删掉即可(图中红色的几个eclipse相关项是因为项目原来是在eclipse中打开,而在idea中这些项是不需要的)。
    6.png

  • 在Libraries项中配置需要的库。因为项目需要用到jsp和servlet,而项目的lib中没有相关jar包,所以在此引入tomcat_home/lib目录下的js-api.jar、servlet-api.jar。
    7.png

  • 在Facets项中对项目添加Web模块
    8.png

  • 点击图中标示位置对Web Resource进行修改。idea默认的目录是web,我们的项目是WebRoot,所以注意需要修改此处。
    9.png

  • 在Artifacts项中设置项目的部署配置
    添加WebApplication:Exploded
    10.png

  • 如有需要可以进一步配置,下图是添加后默认的配置没有再进行其他设置
    11.png

二、Tomcat配置

  • 在界面右上角点击图示出打开运行环境配置
    12.png

  • 添加tomcat运行环境
    13.png

  • 配置tomcat路径、端口
    14.png

  • 在Deployment标签页中添加要部署的项目,添加后可以看见部署操作增加“Build ‘epcsys:war exploded’ artifact”一项
    15.png

  • tomcat配置完成后点击运行tomcat即可
    16.png


linux成长路[一]——路迹

本文将持续更新,一直记录折腾linux过程中的各个节点


起步阶段

  • 希望翻墙,然后购买了付费的VPN
  • vpn速度不稳定,发现VPS的价格也是可以接受
  • 在linode上购买了一个国外的VPS,因为有首单优惠,所以第一个月只要几块钱
  • 网上大概了解首次使用VPS需要配置什么,照着教程敲着各个命令,慢慢熟悉linux(大学课程中有学过linux,所以并不太陌生,只是几乎所有知识点都忘记了)
  • 在VPS上搭建VPN
  • 隔了几天在同事推荐下发现BUDGETVM上的VPS价格只要linode的一半,于是在BUDGETVM上新购一个VPS,放弃linode
  • 再搭一次VPN
  • 大概持续了一个月,VPS基本只挂着一个VPN,处于极度闲置的状态
  • 感觉拥有自己域名的个人博客挺有趣的,于是开始关注如何搭建个人博客
  • 发现wordpress是比较热门的选择,于是搭建wordpress博客,环境包括apache、php、mysql
  • 因为工作中用nginx比较多,于是apache改用nginx
  • wordpress插件需要ftp,得再搭建ftp
  • 发现debian8.0按网上教程搭建ftp无论怎样都无法访问,无奈重装镜像换成了debian7.0,一切重来
  • 访问速度越来越慢,敲个命令都经常3、4秒延迟,一度怀疑是否自家网络问题,想着国外服务器估计大多都这样,于是忍受着这种延迟将近一个月
  • 延迟得无法接受,严重浪费时间,于是心一狠直接放弃这台服务器,换了个香港的VPS,延迟从190直接降到30,舒服!几乎是从换到香港VPS我才开始感受到linux的快感。
  • 怀疑是前一家服务商的debian8.0镜像有问题才导致我的ftp不能用,于是不死心还是选择了debian8.0
  • 系统启动后第一时间安装ftp,发现依然无法访问,最终挣扎无果还是重装到debian7.0
  • 再次搭建ftp、wordpress
  • 考虑到得处理备份的问题,于是查看备份方案。
  • 备份到百度云盘的方案感觉挺好的,结果最后发现百度云盘已停止对应接口
  • 感觉owncloud靠谱,于是着手搭建owncloud。
  • 配置nginx+owncloud过程中nginx版本过旧,鼓捣怎么安装新版nginx,结果作死删掉了系统级的文件,系统直接挂掉,再重装……
  • 再不死心,感觉debian8.0不可能不支持ftp,于是又装了debian8.0
  • 用之前debian7.0的ftp配置文件直接覆盖debian8.0的ftp配置文件,竟然成功了
  • 用之前手动备份的文件还原了wordpress、nginx等
  • 最终选择了dorpbox网盘作为备份方案,写了定时备份脚本,终于解决了备份问题
  • wordpress感觉太笨重,无意中看见typecho,于是又各种比较不同的博客,最终决定尝试使用typecho
  • 一番折腾、纠结、选择主题后,最后确定使用typecho作为我的博客

linux成长路[前言]

前言

  断断续续的花了好一段时间终于把服务器搭建好了,直到把服务器备份、博客搭建、博客风格确定等工作都做完了才算是结束这个初步阶段,写这篇文章的时间[2016-12-31 01:31]也正是刚刚完成这一阶段的时间。《linux成长路》这个系列的文章将会记录和分享我在linux上的摸爬滚打,也希望该系列文章能够帮助linux小白入门。当然,文章是以小白的视角进行记录,错漏之处务必指出,共同交流。


linux成长路[目录]