微信公众号开发(二)

咳咳,间隔了这么久,现在终于有时间继续了。废话不多说,接上篇微信公众号开发引言。

说明:博主使用的开发工具为IntelliJ IDEA,开发语言为JAVA。 环境搭建部分就不在这里多说什么了。使用IDEA创建一个SpringBoot项目,之后我们就进入开发阶段吧~

1.修改公众号的服务器配置

填写公众号服务器配置


URL处填写能从公网访问到你本机的一个地址,博主在这里选用的是花生壳内网穿透版,但是由于最近实名认证,博主还没有来得及认证[因为博主的花生壳是14年就购置的,好久不用了。在最近才知道要认证]。具体使用方式,博主过些日子认证一下在介绍吧。反正很容易的~

Token处填写的是自定义字符串,不过要注意!!!此处填写的Token一定要和程序中所设置的一样!此处博主写的是“DeveloperHome”。 然后不要点提交~因为此时提交是肯定会说Token验证失败的~~接下来请看:

2.验证消息来自微信服务器

首先,从官网的文档中可以看到,验证大约分为三个步骤。

将token,timestamp,nonce三个参数进行字典排序。

将三个参数字符串拼接成一个字符串进行SHA-1加密。

使用加密后提到的字符串与参数中的signature进行对比。

若能确认此GET请求来自微信服务器,则原样返回echor参数内容。

验证消息来自微信服务器


步骤知道了,现在就开始撸代码吧。

在项目中添加一个类ValidateWeChat

ValidateWeChat.java代码

package org.yyx.study.wechat.util; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import org.yyx.study.config.WeChatConfig; import javax.annotation.Resource; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Arrays; /** * 验证工具类 * Created by 叶云轩 on 2017/6/20-11:50 * Concat ycountjavaxuan@outlook.com */ @Component public class ValidateWeChat { private Logger logger = LoggerFactory.getLogger(ValidateWeChat.class); /** * 1)将token、timestamp、nonce三个参数进行字典序排序 * 2)将三个参数字符串拼接成一个字符串进行sha1加密 * 3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信 */ @Resource private WeChatConfig weChatConfig; /** * 对参数进行排序与加密 * * @param timestamp 时间戳 * @param nonce 随机字符串 */ private String sortParams(String timestamp, String nonce) { logger.info("排序...."); String[] array = new String[]{weChatConfig.getDeafultAccessToken(), timestamp, nonce}; StringBuffer sb = new StringBuffer(); // 字符串排序 Arrays.sort(array); for (int i = 0, length = array.length; i < length; i++) { sb.append(array[i]); } String sortString = sb.toString(); try { MessageDigest md = MessageDigest.getInstance("SHA-1"); md.update(sortString.getBytes()); byte[] digest = md.digest(); StringBuffer hexstr = new StringBuffer(); String shaHex; for (int i = 0; i < digest.length; i++) { shaHex = Integer.toHexString(digest[i] & 0xFF); if (shaHex.length() < 2) { hexstr.append(0); } hexstr.append(shaHex); } logger.info("排序完成..."); return hexstr.toString(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return null; } public boolean validate(String signature, String timestamp, String nonce) { String s = sortParams(timestamp, nonce); return signature.equals(s); } }

之后呢,在controller包中创建一个类,用于验证消息.
AccessEntrance.java代码

package org.yyx.study.wechat.controller; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.yyx.study.wechat.util.ValidateWeChat; import javax.annotation.Resource; /** * 接入微信服务器入口 * Created by 叶云轩 on 2017/6/20-10:59 * Concat ycountjavaxuan@outlook.com */ @RestController public class AccessEntrance { private Logger logger = LoggerFactory.getLogger(AccessEntrance.class); /** * 验证工具类 */ @Resource private ValidateWeChat validateWeChat; /** * 验证消息来自微信服务器方法 * * @param signature 微信加密签名 * @param timestamp 时间戳 * @param nonce 随机数 * @param echostr 随机字符串 * @return 验证结果 */ @GetMapping("http://www.likecs.com/") public String accessGet(@RequestParam String signature, @RequestParam String timestamp, @RequestParam String nonce, @RequestParam String echostr) { logger.info("method invoke..."); logger.info("参数[signature]={},[timestamp]={},[nonce]={},[echostr]={}", signature, timestamp, nonce, echostr); boolean validate = validateWeChat.validate(signature, timestamp, nonce); if (validate) { logger.info("验证成功..."); return echostr; } logger.info("验证失败..."); return "wrong"; } } 在AccessEntrance类中,有一个accessGet方法用于接收从微信服务器转发的GET请求,其中有四个必填参数,符合微信公众号开发文档的要求。现在启动我们的项目。 此时,我们回到微信公众号的服务器配置界面,点击提交按钮,则会在页面上方弹出提交成功的字样,如下图:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgypxj.html