整理了自己在开发微信支付相关接口时,根据官方文档实现的签名算法供大家参考,欢迎提出改进优化建议!
MD5版本基本步骤及实现
- 使用ksort()函数对参数数组按照数组键名进行升序排序
- 使用array_filter()函数过滤掉不符合签名条件的数组值
- 使用http_build_query()函数将数组键名与键值组合成URL字符串
- 对字符串进行MD5编码
- 最后使用strtoupper()函数将字符串转换为大写即可
/** * Create the wechat pay sign with MD5 * Document https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=4_3 * @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; 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 * Document https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=4_3 * @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; return strtoupper(hash_hmac("sha256", $str, $mach_key)); }
参考链接: