微信相关-微信小程序支付后,微信回调我们接口的签名验证
目录
1.微信小程序的支付流程
点击这里移步去观看我的上一篇文章:微信相关-微信小程序支付的实现(详细的一批版)
2.为什么对微信回调我们的接口进行签名验证
因为微信的支付的回调接口是涉及到金钱的,非常重要的一个对外接口,这就导致这个接口很容易被人攻击,我们就需要对是谁在调用接口进行验证,确保百分百是微信在调用我们的接口。
3.讲思路
先不上代码,因为每个人写的代码都不相同,直接看代码可能会出现各种问题
(1).第一步,在回调接口里面,把微信返回的数据全部的解析出来,存放在一个map集合里。
(2).第二步,把微信返给我们的 sign 里的值取出来,这个就是微信那边生成的一个签名,具体的生成规则就自己去看微信的文档了。
(3).第三步,把 sign 从map里面去除掉,因为我们本地解密时所用到的参数是微信返回给我们的全部参数,但是不包括 sign。
(4).第四步,将mao集合所有内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA(这是非常官方的说法)
(5).第五步,在stringA最后拼接上key得到stringSignTemp字符串,key是当前小程序的商户秘钥,注意:是商户秘钥,而不是小程序秘钥,拼接的格式是字符串stringA+“&key=商户秘钥”
(6).第六步,将拼接好的字符串,进行md5运算(这里运算的格式默认是md5,但是还有HMAC-SHA256格式)
(7).第七部,把最后我们运算出来的签名跟微信返回给我们的签名对比,如果相同,就证明是微信在调用我们的接口,就可以继续下列的任务
4.重要点的代码
代码里面使用到的工具类,看我的上一篇文章,里面的
WXPayUtil 和 WxPayApi
这2个工具类,由于代码太长了,就不在重复的贴在这个帖子里面了
//准备一个map集合
Map<String, String> stringStringMap = null;
try {
//使用工具类,把微信返给我们的数据用key,value的格式放入到map集合里面
stringStringMap = wxPayApi.payCallBack(request);
} catch (Exception e) {
e.printStackTrace();
}
SysUser user = null;
//判断是不是支付成功,因为很多参数是支付成功才会返回的
if(stringStringMap.get("return_code").equals("SUCCESS")){
//回调返回的加密签名 保存下来 下面会进行对比
String wxSign = stringStringMap.get("sign");
String mySign="";
//去掉sign和利用微信回调回来的信息重新加密,这一步非常的主要
stringStringMap.remove("sign");
try {
//重新加密 获取加密的签名,StaticValue.MERCHANT_SECRET是你的商户秘钥
mySign=WXPayUtil.generateSignature(stringStringMap, StaticValue.MERCHANT_SECRET); //签名
}catch (Exception e){
}
}
代码很少,因为大部分代码其实都是应用到的我写的支付相关的那个帖子里面的工具类。
但是主要不是看代码,而是分享思路。