关于微信公众平台订阅号、服务号、企业号的申请,不在本系列文章关注的内容,通过微信公众平台,根据官网指导很容易完成。
本系列文章主要通过 Java 实现微信公众平台的相关功能,微信公众平台wiki 相关的实例都是以 python 实现。
文章实例都基于 SpringBoot 框架,如果对 SpringBoot 框架不了解自个网上学习了解一下,这是一个很优秀的值得学习的框架,可为你省去很大的工程搭建时间,似乎天生就是用于微服务和 docker 部署。
一、阿里云申请
阿里云 ECS 服务器的申请,这里不详述。
但一定要开通外网带宽,在勾选开通的端口时,务必把80和443端口勾选上。
二、 ECS 服务器Java 安装
三、微信公众平台服务器配置
登录微信公众平台,点击左栏的 开发设置-->服务器配置-->修改配置。
本步骤需要在五、发布 Java 微服务至 ECS 服务器成功后,才能提交成功。
四、服务接入校验 java 代码
@RestController
public class WXAccessCheckController {
@Value("${knowbetter.weixin.dev.token}")
private String wxDevToken;
@GetMapping("/wx/access/check")
public String accessCheck(String signature, String timestamp,String nonce,String echostr) throws Exception {
System.out.println(System.currentTimeMillis());
if(false==checkSignature(signature, timestamp,nonce,echostr)){
return "fail";
}
return echostr;
}
private boolean checkSignature(String signature, String timestamp, String nonce, String echostr) throws NoSuchAlgorithmException, UnsupportedEncodingException {
//定义数组
String[] array={wxDevToken,timestamp,nonce};
//对数组排序
Arrays.sort(array);
//生成字符串
StringBuffer sb=new StringBuffer();
for(String item:array){
sb.append(item);
}
//进行sha1加密
String sha1Result=getSha1(sb.toString());
return sha1Result.equals(signature);
}
private String getSha1(String string) throws NoSuchAlgorithmException, UnsupportedEncodingException {
return CryptoUtils.getSha1(string);
}
}
CryptoUtils.getSha1(string)方法实现如下:(本代码摘录于网上)
public static String getSha1(String str) throws NoSuchAlgorithmException, UnsupportedEncodingException {
if (null == str || str.length() == 0){
return null;
}
char[] hexDigits = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'a', 'b', 'c', 'd', 'e', 'f'};
try {
MessageDigest mdTemp = MessageDigest.getInstance("SHA1");
mdTemp.update(str.getBytes("UTF-8"));
byte[] md = mdTemp.digest();
int j = md.length;
char[] buf = new char[j * 2];
int k = 0;
for (int i = 0; i < j; i++) {
byte byte0 = md[i];
buf[k++] = hexDigits[byte0 >>> 4 & 0xf];
buf[k++] = hexDigits[byte0 & 0xf];
}
return new String(buf);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
五、发布 Java 微服务至 ECS 服务器
本人实例的工程名称为:knowbetter-weixin-service,生成的工程包为:knowbetter-service-0.0.1-SNAPSHOT.jar
把工程包knowbetter-service-0.0.1-SNAPSHOT.jar上传至 ECS服务器的/tmp 下(由于是实例才放在/tmp 下,实际的项目发布应对发布的目录制定一个规则)
本文实例未启动 https,没有配置 nginx,直接通过微信平台访问阿里云的服务器
远程登录 ecs 服务器,进入/tmp 目录执行服务启动命令,启动端口为80:
nohup java -Xms128m -Xmx128 -Xmx512m -jar /tmp/knowbetter-service-0.0.1-SNAPSHOT.jar --server.port=80 --knowbetter.weixin.dev.token=QAZXSWEDColmjuUJYHGSDLO 2>&1 >/tmp/knowbetter.log &
tail -n 200 -f /tmp/knowbetter.log
参数--knowbetter.weixin.dev.token的值为微信公众平台设置的 token,可通过点击左栏的开发-->开发设置 查看或设置
参考: