刚做完微信公众号项目,分享一下代码,经验!初写博客,格式写得不好,还请见谅。有不懂的可以留言或加qq 505281494交流下。
一.
第一步进行服务器接口配置,提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上,开发者通过检验signature对请求进行校验。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。加密/校验流程如下:
1)将token、timestamp、nonce三个参数进行字典序排序
2)将三个参数字符串拼接成一个字符串进行sha1加密
3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
(对应github源码中的WXCommon.Validate方法,token需在此方法中配置 与填写一致)
本地调试就需要做端口映射到外网,推荐ngrok,需指定80端口
(微信公众平台会通过80端口访问本机)
如果启用安全模式 可能遇到的问题:
消息的加解密接口JCE无限制权限策略
java.security.InvalidKeyException:illegalKey Size
异常java.security.InvalidKeyException:illegalKey Size的解决方案:
在官方网站下载JCE无限制权限策略文件,下载对应的jdk版本后解压,可以看到local_policy.jar和US_export_policy.jar以及readme.txt。如果安装了JRE,将两个jar文件放到%JRE_HOME% \lib\security目录下覆盖原来的文件,如果安装了JDK,将两个jar文件放到%JDK_HOME%\jre\lib\security目录下覆盖原来文件。
二:接口配置成功后,微信公众号接收到的消息和事件推送都会以Xml数据包通过POST请求发送到此接口。如:
详情见微信开发者文档。
github中源码中的工具包(MessageUtil)
parseXMLCrypt方法:安全模式下解析XML消息,然后封装到一个map中。
ParseXML方法:明文模式下解析XML消息
getTextXmlMessage,getVoiceXmlMessage等方法:获取文本,声音回复的XML格式消息。(回复消息时需交换接收时XML的ToUserName和FromUserName)。
可根据消息,事件的XML标签内容不同判断用户的操作,然后回复相应的消息。尽量先回复消息,再处理之后的业务。因为:
三:接口调用
WXCommonUtil. Getaccess_token:
首先获得接口调用凭证。有效期:2小时。 存进redis中,设置过期时间。(需要appid和appsecret)
HttpRequestUtil.httpsRequest方法:
/**
* 发送https请求
*
*@param requestUrl 请求地址
*@param requestMethod 请求方式(GET、POST)
*@param postStr 提交的数据
*@return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值)
*/
MyX509TrustManager类:
发送Https请求时的证书信任管理器类,实现了接口X509TrustManager的类。 接口X509TrustManager有下述三个公有的方法需要我们实现:
⑴ oid checkClientTrusted(X509Certificate[]chain, String authType)
throws CertificateException
该方法检查客户端的证书,若不信任该证书则抛出异常。由于我们不需要对客户端进行认证,因此我们只需要执行默认的信任管理器的这个方法。JSSE中,默认的信任管理器类为TrustManager。
⑵ oid checkServerTrusted(X509Certificate[]chain, String authType)
throwsCertificateException
该方法检查服务器的证书,若不信任该证书同样抛出异常。通过自己实现该方法,可以使之信任我们指定的任何证书。在实现该方法时,也可以简单的不做任何处理,即一个空的函数体,由于不会抛出异常,它就会信任任何证书。
⑶ X509Certificate[] getAcceptedIssuers()
返回受信任的X509证书数组。
一些常用的接口:(需用到access_token)
1. 根据openid获取用户消息
2. 发送模板消息
3. 自定义菜单
4. 获取用户列表
四.微信网页授权登录和带参数的二维码:
1.授权登录跳转网址:
获取code后请求以下链接
可得到:
带参数的二维码:
然后会得到
url则为二维码的链接地址。