SpringBoot之微信公众号开发流程
说明:
2)获取AccessToken;
3)自定义菜单;
5)页面跳转控制;
6)接收事件推送
1、填写服务器配置
解释:
1)服务器地址(URL):域名指向的IP端口必须是80端口和443端口
2)令牌(Token):须与后台配置的一致
3)消息加解密密钥(EncodingAESKey):随机生成即可
4)消息加解密方式:我选择的是明文模式,选加密模式也可以,看项目的私密性而定
5)最重要的一点:配服务器信息之后,需要添加白名单(域名指向的IP)
2、验证服务器地址的有效性
点击上图的提交,验证服务器地址等相关信息的有效性
注意:
1) 排序:将token、timestamp、nonce三个参数进行字典序排序
解释:
代码中涉及到的排序,加密的代码示例如下: // 排序方法 public String sort(String token, String timestamp, String nonce) { String[] strArray = { token, timestamp, nonce }; Arrays.sort(strArray); StringBuilder sb = new StringBuilder(); for (String str : strArray) { sb.append(str); } return sb.toString(); }
/** * 将字符串进行sha1加密 * @param str 需要加密的字符串 * @return 加密后的内容 */ public String sha1(String str) { try { MessageDigest digest = MessageDigest.getInstance("SHA-1"); digest.update(str.getBytes()); byte messageDigest[] = digest.digest(); // Create Hex String StringBuffer hexString = new StringBuffer(); // 字节数组转换为 十六进制 数 for (int i = 0; i < messageDigest.length; i++) { String shaHex = Integer.toHexString(messageDigest[i] & 0xFF); if (shaHex.length() < 2) { hexString.append(0); } hexString.append(shaHex); } return hexString.toString(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return null; }
二、获取AccessToken
3、接口请求方式:GET
4、接口:
5、接口详情:
三、自定义菜单
注意:
1)自定义菜单最多包含3个一级菜单,每个菜单最多包含5个二级菜单
2)一级菜单最多四个汉字,二级菜单最多七个汉字,多出来的部分将会以”…”代替
2、接口请求方式:POST
4、菜单示例:
private static Logger logger = LoggerFactory.getLogger(WebchatMenuUtil.class);
// 默认自定义菜单初始化 public static Menu initMenu(String backUrl, String appId) throws UnsupportedEncodingException { Menu menu = new Menu(); ViewButton button11 = new ViewButton(); button11.setName("车辆列表"); button11.setType("view"); button11.setUrl(backUrl + "/freeter-api/wechatredirect/auth?state=carListPage");
ViewButton button12 = new ViewButton(); button12.setName("报警列表"); button12.setType("view"); button12.setUrl(backUrl + "/freeter-api/wechatredirect/auth?state=stockListPage");
Button button1 = new Button(); button1.setName("数据列表"); // 将button11/button12两个button作为二级菜单封装第一个一级菜单 button1.setSub_button(new Button[] { button11, button12 });
ViewButton button3 = new ViewButton(); button3.setName("个人中心"); button3.setType("view"); button3.setUrl(backUrl + "/freeter-api/wechatredirect/auth?state=userInfoPage");
menu.setButton(new Button[] { button1, miniprogramButton, button3 });// 将31Button直接作为一级菜单 return menu; }
四、获取用户openid
1、作用:
1)配置回调域名
注意:须将文件放在项目的根目录下
2)构造请求url如下:
注意:1)redirect_uri表示回调地址
2)snsapi_userinfo表示应用授权作用域为请求用户信息,scope=snsapi_base表示不需要用户授权
3)state表示我们在后面需要的参数
通过接口调用,返回详情如下:
此时就获取到用户的openId了
五、页面跳转控制
1、流程说明:
在项目中,页面跳转控制是在获取到用户openid之后,根据openid判断用户是否绑定到项目,如果没有,则页面统一跳转到用户绑定页;如果已经绑定,再根据获取code时,传的state参数值,判断当前用户点击的菜单是去哪个页面,再通过重定向的方式,携带必要的参数重定向到指定的页面。
2、示例:
@Value("${wechat.frontUrl}") private String frontUrl; @Value("${wechat.backUrl}") private String backUrl; @Value("${wechat.appId}") private String appId; @Value("${wechat.appSecret}") private String appSecret;
六、接收事件推送
1、官方解读
2)扫描带参数二维码事件
3)上报地理位置事件
4)自定义菜单事件
5)点击菜单拉取消息时的事件推送
6)点击菜单跳转链接时的事件推送
2、在我的项目中,目前涉及到的事件包括:
接收普通消息:统一回复文本消息
1)文本消息
2)图片消息
3)语音消息
4)视频消息
5)地理位置消息
6)链接消息