php函数 sha256算法,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);//处理中文乱码

来解决中文转码问题

官方文档如下可以参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值