ECHO陈文
关注互联网技术开发与维护运营

PHP实现微信支付签名算法(MD5版本及HMAC-SHA256版本)

在开发微信支付的时候有时候会用到签名的同步是否和微信方一致,来验证有效性,微信目前签名方式大致有两种,如下:

MD5版本实现思路

  1. 使用ksort()函数对参数数组按照数组键名进行升序排序
  2. 使用array_filter()函数过滤掉不符合签名条件的数组值
  3. 使用http_build_query()函数将数组键名与键值组合成URL字符串
  4. 对字符串进行MD5编码
  5. 最后使用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的主要差别就在于编码这一步,其它步骤基本一致:

  1. 使用ksort()函数对参数数组按照数组键名进行升序排序
  2. 使用array_filter()函数过滤掉不符合签名条件的数组值
  3. 使用http_build_query()函数将数组键名与键值组合成URL字符串
  4. 对字符串进行HMAC-SHA256编码
  5. 最后使用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);//处理中文乱码

来解决中文转码问题

官方文档如下可以参考

微信支付算法文档

微信支付接口签名校验工具

赞(1) 打赏
未经允许不得转载:芦苇派 » PHP实现微信支付签名算法(MD5版本及HMAC-SHA256版本)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏