·微信公众号后端开发文档:
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842
·开始一些必须设置解读:
登陆公众号后台,进行开发者设置===》https://mp.weixin.qq.com/
具体设置
access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。
·后端接入指南原理:
开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上,GET请求携带参数如下表所示:
参数 | 描述 |
signature | 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。 |
timestamp | 时间戳 |
nonce | 随机数 |
echostr | 随机字符串 |
开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。加密/校验流程如下:
1)将token、timestamp、nonce三个参数进行字典序排序
2)将三个参数字符串拼接成一个字符串进行sha1加密
3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
意思是说:对微信服务器发过来消息忠token、timestamp、nonce三个参数进行加密处理,然后加密得到的字符串与signature微信加密签名相比较,如果相等则返回echostr随机字符串。
·下面是后端提供回调接口:
@Slf4j
@Api(tags = {"微信回调API"})
@Controller
@RequestMapping("/plutoadmin/wechat")
public class WechatController {
//公众号授权验签
@ApiOperation(value = "公众号授权验签", notes = "公众号授权验签")
@RequestMapping(value = "/getWechatPublicAuthorization", method = RequestMethod.GET)
@ResponseBody
public String getWechatPublicAuthorizationHttpServletRequest(String signature, String timestamp, String nonce, String echostr) {
if (WxPublicCheckSignature.checkSignature(signature, timestamp, nonce)) {
// 如果校验成功,将得到的随机字符串原路返回
log.info("验签字符串:{}", echostr);
return echostr;
}
return "验签错误";
}
}
验签工具类(网上很多此类代码):
/**
* @author hanyy
* @Description: 公众号后台验签
* @date 2019/8/21 18:18
*/
public class WxPublicCheckSignature {
public static final String tooken = "Alan"; //开发者自行定义Token
public static boolean checkSignature(String signature, String timestamp, String nonce) {
//1.定义数组存放tooken,timestamp,nonce
String[] arr = {tooken, timestamp, nonce};
//2.对数组进行排序
Arrays.sort(arr);
//3.生成字符串
StringBuffer sb = new StringBuffer();
for (String s : arr) {
sb.append(s);
}
//4.sha1加密,网上均有现成代码
String temp = getSha(sb.toString());
//5.将加密后的字符串,与微信传来的加密签名比较,返回结果
return temp.equals(signature);
}
public static String getSha(String str) {
if (str == null || 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) {
// TODO: handle exception
return null;
}
}
}
➡接口编写完成后,将验签接口填入url,注意token要填写后端验签工具类中定义的token,否则无法验签完成
➡点击提交,若正常提交,则回调验签成功,服务器配置成功~
➡常见错误:token验证失败 这就是微信回调验签失败,检查一下后端代码。
➡注意:点击右侧启用后会提示自定义菜单会失效,所以目前暂未启用。
根据业务需要去模板库搜索,消息模板格式无法自定义,只可以改模板内容
申请好模板,把模板id配置到后端配置文件里,防止模板变更,一个模板对应一个唯一模板id。