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

简介: 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
     * 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的主要差别就在于编码这一步,其它步骤一致:

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

参考链接:

目录
相关文章
ly~
|
2月前
|
存储 供应链 小程序
除了微信小程序,PHP 还可以用于开发哪些类型的小程序?
除了微信小程序,PHP 还可用于开发多种类型的小程序,包括支付宝小程序、百度智能小程序、抖音小程序、企业内部小程序及行业特定小程序。在电商、生活服务、资讯、工具、娱乐、营销等领域,PHP 能有效管理商品信息、订单处理、支付接口、内容抓取、复杂计算、游戏数据、活动规则等多种业务。同时,在企业内部,PHP 可提升工作效率,实现审批流程、文件共享、生产计划等功能;在医疗和教育等行业,PHP 能管理患者信息、在线问诊、课程资源、成绩查询等重要数据。
ly~
74 6
|
2月前
|
IDE 安全 网络安全
Xdebug 在不同版本的 PHP 中配置方法有什么不同?
Xdebug 在不同版本的 PHP 中配置方法有什么不同?
135 4
|
27天前
|
云安全 存储 小程序
PHP微信小程序解决方案PhpMall
PHP微信小程序解决方案PhpMall
34 0
|
2月前
|
算法 计算机视觉
Mat未初始化引起拼接算法结果,release版本和debug版本不一致
在OpenCV中由于Mat对象未初始化导致的拼接算法在release版本和debug版本中结果不一致的问题,并提供了通过显式初始化Mat对象为零来解决这一问题的修改方法。
|
3月前
|
Linux PHP
Linux CentOS 宝塔 Suhosin禁用php5.6版本eval函数详细图文教程
【8月更文挑战第27天】本文介绍两种禁用PHP执行的方法:使用`PHP_diseval_extension`禁用和通过`suhosin`禁用。由于`suhosin`不支持PHP8,仅适用于PHP7及以下版本,若服务器安装了PHP5.6,则需对应安装`suhosin-0.9.38`版本。文章提供了详细的安装步骤,并强调了宝塔环境下与普通环境下的PHP路径差异。安装完成后,在`php.ini`中添加`suhosin.so`扩展并设置`executor.disable_eval = on`以禁用执行功能。最后通过测试代码验证是否成功禁用,并重启`php-fpm`服务生效。
36 2
|
3月前
|
算法 关系型数据库 MySQL
揭秘MySQL中的版本号排序:这个超级算法将颠覆你的排序世界!
【8月更文挑战第8天】在软件开发与数据管理中,正确排序版本号对软件更新及数据分析至关重要。因MySQL默认按字符串排序版本号,可能出现'1.20.0'在'1.10.0'之前的不合理情况。解决办法是将版本号各部分转换为整数后排序。例如,使用`SUBSTRING_INDEX`和`CAST`函数从`software`表的`version`字段提取并转换版本号,再按这些整数排序。这种方法可确保版本号按逻辑正确排序,适用于'major.minor.patch'格式的版本号。对于更复杂格式,需调整处理逻辑。掌握此技巧可有效应对版本号排序需求。
165 3
|
3月前
|
Web App开发 关系型数据库 PHP
使用 Docker 快速搭建多版本 PHP 开发环境
使用 Docker 快速搭建多版本 PHP 开发环境
71 2
|
3月前
|
算法 安全 测试技术
Go - 常用签名算法的基准测试
Go - 常用签名算法的基准测试
29 2
|
4月前
|
Java API PHP
【亲测有效,官方提供】php版本企查查api接口请求示例代码,php请求企查查api接口,thinkphp请求企查查api接口
【亲测有效,官方提供】php版本企查查api接口请求示例代码,php请求企查查api接口,thinkphp请求企查查api接口
131 1
|
4月前
|
算法 PHP
【php经典算法】冒泡排序,冒泡排序原理,冒泡排序执行逻辑,执行过程,执行结果 代码
【php经典算法】冒泡排序,冒泡排序原理,冒泡排序执行逻辑,执行过程,执行结果 代码
30 1