写博客向来是直接干货走起,废话不多说:
1.注册微信公众号就不多说了,
2.在进行配置公众号之前先成为开发者,成为开发者需要进行身份验证
3.进行微信公众号的配置
1.微信AppId和AppSecret直接可以在控制平台拿到
2.进行域名设置
JS接口安全域名: 此域名是进行调用微信js-sdk时需要验证的域名。所有js-sdk元素都有在这个域名下。不需要添加http开头。
网页授权域名:是进行关注公众号进行网页授权用的回调域名。请注意,这里填写的是域名(是一个字符串),而不是URL,因此请勿加 http:// 等协议头,但是必须指到项目上,可自行判断是否加项目名,一般线上环境不需要加项目名,本地花生壳测试环境会添加项目名;详情查看https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842
注:非测试号还需要添加*.txt文件到项目跟目录进行验证
3.进行服务器配置
URL必须为可直接访问路径,用于微信服务器进行确认服务器是通的。
Token为自定义的和微信服务器约定值,尽量用数字。
代码实例:
URL接口实现代码:
/**
* 微信请求 即url
* @return
*/
@RequestMapping(value="/wechatEvent")
public void wechatEvent(HttpServletRequest request, HttpServletResponse response){
try {
String signature = request.getParameter("signature");// 微信加密签名
String timestamp = request.getParameter("timestamp");// 时间戮
String nonce = request.getParameter("nonce"); // 随机数
String echostr = request.getParameter("echostr"); // 随机字符串
if(!StringUtils.isEmpty(echostr)){
//签名验证 此处就是处理服务器验证的,将随机串返回微信服务器
if(CheckSignature.checkSignature(signature, timestamp, nonce)==true) {
jsonOut(echostr);
}
}else{
ServletInputStream in=request.getInputStream();
response.setCharacterEncoding("utf-8");
//将微信消息转换为实体类
EventMessage message= XMLConverUtil.convertToObject(new EventMessage().getClass(), in);
//关注事件
if (message.getEvent().toLowerCase().equals(MessageType.SUBSCRIBE)) {
StringBuffer url = request.getRequestURL();
String tempContextUrl = url.delete(url.length() - request.getRequestURI().length(), url.length()).append(request.getContextPath()).toString();
message.setUrl(tempContextUrl);
logger.info(message.getFromUserName());
}
JsonUtil.toJSONString("接收到用户发来消息==="+message);
//处理微信消息
String xml= WechatServiceUtil.getWechatMessageAndSendMessageToWechat(message);
if (!StringUtils.isEmpty(xml)){
response.getWriter().write(xml);//回复消息
}
}
} catch (Exception e) {
e.printStackTrace();
logger.error("微信请求异常====》"+e);
}
}
校验方法checkSignature:
package com.chinatsp.wechat.util;
import com.chinatsp.wechat.bean.WechatBean;
import org.apache.log4j.Logger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
public class CheckSignature {
private Logger log = Logger.getLogger(getClass());
/**
* 加密/校验
* @param signature
* @param timestamp
* @param nonce
* @return
*/
public static boolean checkSignature(String signature, String timestamp, String nonce) {
//此处TOKEN为微信服务器后台自定义的 token值,这里只是进行了封装bean,可自行获取处理
String[] arr = new String[] { WechatBean.TOKEN, timestamp, nonce };
// 将token、timestamp、nonce三个参数进行字典序排序
Arrays.sort(arr);
StringBuilder content = new StringBuilder();
for (int i = 0; i < arr.length; i++) {
content.append(arr[i]);
}
// 将三个参数字符串拼接成一个字符串进行sha1加密
MessageDigest md = null;
String tmpStr = null;
try {
md = MessageDigest.getInstance("SHA-1");
byte[] digest = md.digest(content.toString().getBytes());
tmpStr = byteToStr(digest);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
content = null;
// 将sha1加密后的字符串可与signature对比,标识该请求来源于微信
return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false;
}
/**
*将byte数组转换成字体串
* @param byteArray
* @return
*/
private static String byteToStr(byte[] byteArray) {
String strDigest = "";
for (int i = 0; i < byteArray.length; i++) {
strDigest += byteToHexStr(byteArray[i]);
}
return strDigest;
}
/**
* 字节流转换为十六进制字符串
* @param mByte
* @return
*/
private static String byteToHexStr(byte mByte) {
char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
char[] tempArr = new char[2];
tempArr[0] = Digit[(mByte >>> 4) & 0X0F];
tempArr[1] = Digit[mByte & 0X0F];
String s = new String(tempArr);
return s;
}
public String getSignature(String jsapi_ticket,String noncestr,String timestamp,String url) {
log.info("jsapi_ticket"+jsapi_ticket);
String signature="";
String a="jsapi_ticket="+jsapi_ticket+"&noncestr="+noncestr+"×tamp="+timestamp+"&url="+url;
MessageDigest md = null;
try {
md = MessageDigest.getInstance("SHA-1");
// 将三个参数字符串拼接成一个字符串进行sha1加密
byte[] digest = md.digest(a.getBytes());
signature = byteToStr(digest);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return signature.toLowerCase();
}
}
启动项目,进行服务器配置成功保存,提示配置成功即代表通讯成功。
到此,基本上配置介绍了 。
附录:下图再配一张测试公众号的配置概览图以供参考
如果看完此文章还有不明白的地方,请戳此处https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421135319