PHP实现微信支付签名算法(MD5版本及HMAC-SHA256版本)
在开发微信支付的时候有时候会用到签名的同步是否和微信方一致,来验证有效性,微信目前签名方式大致有两种
在开发微信支付的时候有时候会用到签名的同步是否和微信方一致,来验证有效性,微信目前签名方式大致有两种,如下:
MD5版本实现思路
- 使用ksort()函数对参数数组按照数组键名进行升序排序
- 使用array_filter()函数过滤掉不符合签名条件的数组值
- 使用http_build_query()函数将数组键名与键值组合成URL字符串
- 对字符串进行MD5编码
- 最后使用strtoupper()函数将字符串转换为大写即可
/**
* Create the wechat pay sign with MD5
* @param $data
* @param $mach_key
* @return string
*/
private function createWechatPaySignWithMd5 ($data, $mach_key) {
ksort($data);
$data = array_filter($data, function ($v, $k) {
if ($k == "sign" && $v == '' && is_array($v)) {
return false;
}
return true;
}, ARRAY_FILTER_USE_BOTH);
$str = http_build_query($data)."&key=".$mach_key;
//$str = urldecode($str);//处理中文乱码
return strtoupper(md5($str));
}
HMAC-SHA256版本实现思路
使用HMAC-SHA256与MD5的主要差别就在于编码这一步,其它步骤基本一致:
- 使用ksort()函数对参数数组按照数组键名进行升序排序
- 使用array_filter()函数过滤掉不符合签名条件的数组值
- 使用http_build_query()函数将数组键名与键值组合成URL字符串
- 对字符串进行HMAC-SHA256编码
- 最后使用strtoupper()函数将字符串转换为大写即可
/**
* Create the wechat pay sign with hmac-sha256
* @param $data
* @param $mach_key
* @return string
*/
private function createWechatPaySignWithHash ($data, $mach_key) {
ksort($data);
$data = array_filter($data, function ($v, $k) {
if ($k == "sign" && $v == '' && is_array($v)) {
return false;
}
return true;
}, ARRAY_FILTER_USE_BOTH);
$str = http_build_query($data)."&key=".$mach_key;
//$str = urldecode($str);//处理中文乱码
return strtoupper(hash_hmac("sha256", $str, $mach_key));
}
坑一:如果$data 里有中文字样 http_build_query 会直接把中文转码,这样加密后的结果就会和不转码后的结果是不一样的,一定要注意
我们可以通过
$str = urldecode($str);//处理中文乱码
来解决中文转码问题
官方文档如下可以参考
原创文章,作者:ECHO陈文,如若转载,请注明出处:https://www.luweipai.cn/php/7398125/