对于刚使刚进行微信开发来说,确实很蒙,不知道如何下手为好,首先啊,就是需要进行微信申请与开通开发人员开发,然后新建一个工程,接口名字无所谓,但端口必须为443或80,项目必须放在外网,或用内网穿透,不强求一定使用域名。此篇主要讲的是微信的token验证。
在微信申请完后,在主页面->基本配置->服务器配置中会有服务器地址,令牌与消息加密秘钥。服务器地址就是你项目所在服务器的ip,加上http://,不需要加端口(此处尝试了好久才发现这个问题),例如:http://12.12.12.12/wx,消息加密秘钥可以先不用管。
在微信开发者文档中,token验证实例使用的是Python,确实有点让人头大,不过大致都是一样的,只需要将signature、timestamp、nonce与echostr各自放在@RequestParam中即可,@Api与@ApiOperation这个个注解不用管,这两个注解是swagger2注解,方便在页面调试代码使用的。接口定义代码块如下:
@RestController
@Api(tags = "微信接口")
@RequestMapping("/wx")
public class WXController {
@Autowired
WXService wxService;
@GetMapping("")
@ApiOperation("微信TOKEN验证接口")
public String check(@RequestParam("signature") String signature,
@RequestParam("timestamp") String timestamp,
@RequestParam("nonce") String nonce,
@RequestParam("echostr") String echostr){
return wxService.check(signature, timestamp, nonce, echostr);
}
}
微信token验证逻辑没有太多的复杂。1.先将TOKEN,timestamp,nonce进行排序,2.将将排列后的字符串数据拼接成一个字符串,在这里使用的是StringBuffer,3.对拼接后的字符串进行SHA1加密,此处使用的是DigestUtils工具包中自带的sha1加密方法,4.将加密后的数据与传过来的signature字段进行比较,如果相同则返回echostr字段,如果不相同,则返回null即可,代码块如下:
public interface WXService {
String check(String signature,String timestamp,String nonce,String echostr);
}
@Service
public class WXServiceImpl implements WXService {
private Logger logger = LoggerFactory.getLogger(WXServiceImpl.class);
private static final String TOKEN = "TEST_TOKEN";
/**
* 微信TOKEN验证
* @param signature
* @param timestamp
* @param nonce
* @param echostr
* @return
*/
@Override
public String check(String signature,String timestamp,String nonce,String echostr) {
//排序
String[] arr = new String[]{TOKEN,timestamp,nonce};
Arrays.sort(arr);
//生成字符串
StringBuffer content = new StringBuffer();
for(int i = 0; i < arr.length; i++){
content.append(arr[i]);
}
//sha1 加密 java实现消息摘要加密
String temp = DigestUtils.sha1Hex(content.toString());
//和微信传递过来的参数进行校验
if (temp.equals(signature)){
return echostr;
}
return null;
}
}
微信开发实际上没有太大的难度,主要看自己如何构建项目了,本人仍继续开发中,哈哈哈,继续努力