问题描述(应用场景):
实现通过代码控制公众号自定义菜单、主动回复消息、被动回复消息、发送模板消息、发送客服消息、获得微信事件推送等自定义功能与业务逻辑。
步骤:登录微信公众号平台--->开发---->基本配置(红色遮盖部分未服务器域名)
对应的服务端接口(get请求)
@Api(value = "微信管理",tags = "微信管理")
@RestController
@RequestMapping(value = "/wx")
public class WxManageController {
//开发者自定义token
private static String token = "zidingyidetoken";
@ApiOperation(value = "验签")
@GetMapping(value = "/wechat")
public String validate(WxSignParam wxSignParam){
String[] arr = new String[] { token, wxSignParam.getTimestamp(), wxSignParam.getNonce() };
// 将token、timestamp、nonce三个参数进行字典序排序
sort(arr);
StringBuilder content = new StringBuilder();
for (int i = 0; i < arr.length; i++) {
content.append(arr[i]);
}
// 进行sha1加密
String str = Sha1(content.ToString());
if(StringUtils.isEmpty(str)) return null;
//开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
return str.toLowerCase().equals(wxSignParam.getSignature())?wxSignParam.getEchostr() : null;
}
//按照字典排序
private static void sort(String a[]) {
for (int i = 0; i < a.length - 1; i++) {
for (int j = i + 1; j < a.length; j++) {
if (a[j].compareTo(a[i]) < 0) {
String temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
}
// 字符串进行sha1加密
public static string Sha1(string str)
{
var buffer = Encoding.UTF8.GetBytes(str);
var data = SHA1.Create().ComputeHash(buffer);
var sb = new StringBuilder();
foreach (var t in data)
{
sb.Append(t.ToString("X2"));
}
return sb.ToString();
}
}
// 接收的参数实体 WxSignParam
@Data
@ApiModel(value = "验签参数")
public class WxSignParam {
@ApiModelProperty(value = "微信传来的签名")
private String signature;
@ApiModelProperty(value = "时间戳")
private String timestamp;
@ApiModelProperty(value = "微信发来的随机数")
private String nonce;
@ApiModelProperty(value = "微信发来的验证字符串")
private String echostr;
}
// 备注:代码的实现就不分层了,直接在controller层实现了,有需要的根据具体情况自己分层