服务示例
1. 计算签名(SHA1)
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang3.StringUtils;
import java.util.Arrays;
public static String gen(String... arr) {
if (StringUtils.isAnyEmpty(arr)) {
throw new IllegalArgumentException("非法请求参数,有部分参数为空 : " + Arrays.toString(arr));
}
Arrays.sort(arr);
StringBuilder sb = new StringBuilder();
for (String a : arr) {
sb.append(a);
}
return DigestUtils.sha1Hex(sb.toString());
}
2. 接入回调事件请求示例
@Slf4j
@RestController
@RequestMapping("/event")
public class WillingEventController {
private final static String TOKEN = "TOKEN";
private final static String ENCODING_AES_KEY = "ENCODING_AES_KEY";
/**
* 回调服务 测试请求地址的合法性
*
* @param msgSignature 消息签名,msg_signature计算结合了企业填写的token、
* 请求中的timestamp、nonce、echostr
* @param timeStamp 时间戳
* @param nonce 随机数
* @param echoStr 加密字符串
* @return
*/
@GetMapping(value = "/test")
public String test(@RequestParam("msg_signature") String msgSignature,
@RequestParam("timestamp") String timeStamp,
@RequestParam("nonce") String nonce,
@RequestParam("echostr") String echoStr) {
//通过token, timestamp. nonce, echostr四个参数生成签名
String signature = SHA1.gen(TOKEN, timeStamp, nonce, echoStr);
//如果签名相同,则解密echostr并返回
if (signature.equals(msgSignature)){
CryptUtil util = new CryptUtil(ENCODING_AES_KEY);
return util.decrypt(echoStr);
}
return null;
}
/**
* 回调服务示例 解密后包含回调信息
*
* @param msgSignature 消息签名,msg_signature计算结合了企业填写的token、
* 请求中的timestamp、nonce、请求体中的encrypt_msg
* @param timeStamp 时间戳
* @param nonce 随机数
* @param body 请求体(回调应用的appid、 加密信息encrypt_msg)
* @return
*/
@PostMapping(value = "/test")
public String test(@RequestParam("msg_signature") String msgSignature,
@RequestParam("timestamp") String timeStamp,
@RequestParam("nonce") String nonce,
@RequestBody CallbackBody body){
String encrypted = body.getEncrypt_msg();
String signature = SHA1.gen(TOKEN, timeStamp, nonce, encrypted);
if (signature.equals(msgSignature)){
CryptUtil util = new CryptUtil(ENCODING_AES_KEY);
// msg中包含回调信息
String msg = util.decrypt(encrypted);
// do something
}
return "success";
}
@Data
public class CallbackBody implements Serializable {
private String to_app;
private String encrypt_msg;
}
}
最后修改时间: 5 个月前