微信退款通知,退款回调数据解密.SHA256签名AEAD_AES_256_GCM解密

$xmlResult = file_get_contents("php://input");//获取微信的数据
$result = $this->xmlToArray($xmlResult);//将xml转成数组
// 将加密的数据解密,方法在下面
$reqInfo = $this->refund_decrypt($result['req_info']);
 
/** 退款通知解密* @Author WangZhaoBo* @param $str 微信同步的加密串req_info* @param $key 商户key*/
public function refund_decrypt($str) {$key = md5($this->appSecret);$str = base64_decode($str);$str = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $str, MCRYPT_MODE_ECB);$block = mcrypt_get_block_size('rijndael_128', 'ecb');$pad = ord($str[($len = strlen($str)) - 1]);$len = strlen($str);$pad = ord($str[$len - 1]);return substr($str, 0, strlen($str) - $pad);
}

 //SHA256签名

/***     作用:生成256签名*/public function get256Sign($Obj,$key = null){foreach ($Obj as $k => $v){$Parameters[$k] = $v;}//签名步骤一:按字典序排序参数
        ksort($Parameters);$String = $this->formatBizQueryParaMap($Parameters, false);//echo '【string1refund_decrypt】'.$String.'</br>';//签名步骤二:在string后加入KEYif(is_null($key)){$key =  WxPayConf_pub::$KEY;$String = $String."&key=".WxPayConf_pub::$KEY;}else{$String = $String."&key=".$key;}echo $String;//签名步骤三:MD5加密//$String = md5($String);$String = hash_hmac("sha256", $str, $key);//echo "【string3】 ".$String."</br>";//签名步骤四:所有字符转为大写$result_ = strtoupper($String);//echo "【result】 ".$result_."</br>";return $result_;}

 AEAD_AES_256_GCM的解密php示例代码 (参考:https://pay.weixin.qq.com/wiki/doc/api/xiaowei.php?chapter=19_11和https://blog.csdn.net/u010324331/article/details/82153067和https://pay.weixin.qq.com/wiki/doc/api/download/wxpay_xiaowei_cert.pdf和)

//region 证书解密start public function decodePem(){$ciphertext = '加密后的证书内容';$nonce = '加密证书的随机串,加密证书的随机串';$associated_data = '加密证书的随机串,固定值: certificate';$key = '你的APIv3密钥';$check_sodium_mod = extension_loaded('sodium');if($check_sodium_mod === false){echo '没有安装sodium模块';die;}$check_aes256gcm = sodium_crypto_aead_aes256gcm_is_available();if($check_aes256gcm === false){echo '当前不支持aes256gcm';die;}$pem = sodium_crypto_aead_aes256gcm_decrypt(base64_decode($ciphertext),$associated_data,$nonce,$key);var_dump($pem); //这是解密出来的证书内容,复制出来保存就行了 
    }//endregion 证书解密end 

 使用sodium_crypto_aead_aes256gcm_decrypt函数需要安装sodium扩展,要求PHP版本必须大于7,小于7的也有这个扩展, 但是没有sodium_crypto_aead_aes256gcm_decrypt这个方法.

安装sodium扩展方法看这里https://blog.csdn.net/u010324331/article/details/82153067

如果不安装扩展,怎么办? 用paragonie/sodium_compat这个类库. 

Sodium Compat 是用于 Sodium 加密库(libsodium)的纯 PHP 填充,它是 PHP 7.2.0+ 的核心扩展,也可用于 PECL。
这个库 tentativeley 支持PHP 5.2.4 - 7.x(最新版),但官方只支持非 EOL 版本的 PHP。
如果安装了 PHP 扩展,Sodium Compat 将机会性地透明地使用 PHP 扩展而不是我们的实现。
github 地址: https://github.com/paragonie/sodium_compat

其中ParagonIE_Sodium_Compat类下面有一个crypto_aead_aes256gcm_decrypt方法.

调用方法

ParagonIE_Sodium_Compat::crypto_aead_aes256gcm_decrypt($ciphertext,$associated_data,$nonce,$key);

 

转载于:https://www.cnblogs.com/wangzhaobo/p/11040736.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/393176.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

BeanShell自动装箱拆箱

“装箱”和“拆箱”是用来描述自动包装一个原始类型到一个包装类以及在必要时解开包装回到原始类型的术语。装箱是 Java 的特性&#xff08;SDK 1.5&#xff09;之一&#xff0c;且 BeanShell 已支持多年。 BeanShell 支持原始类型的装箱和拆箱。比如&#xff1a; int i5; Inte…

leetcode816. 模糊坐标

我们有一些二维坐标&#xff0c;如 “(1, 3)” 或 “(2, 0.5)”&#xff0c;然后我们移除所有逗号&#xff0c;小数点和空格&#xff0c;得到一个字符串S。返回所有可能的原始字符串到一个列表中。 原始的坐标表示法不会存在多余的零&#xff0c;所以不会出现类似于"00&q…

IO流入门-第十二章-ObjectInputStream_ObjectOutputStream

DataInputStream和DataOutputStream基本用法和方法示例&#xff0c;序列化和反序列化 import java.io.Serializable; //该接口是一个“可序列化”的 &#xff0c;没有任何方法&#xff0c;是一个标识接口&#xff0c;还有Cloneable /*标识接口的作用&#xff1a;标识作用…

matlab pca重构,Matlab – PCA分析和重建多维数据

这是一个快速的演练.首先我们创建一个隐藏变量的矩阵.它有100个观察,有两个特点.>> Y randn(100,2);现在创建一个加载矩阵.这将把隐藏的变量映射到观察到的变量上.说你观察到的变量有四个特征.那么你的加载矩阵需要是24>> W [1 1; 1 -1; 2 1; 2 -1];这告诉你,观察…

文档对象模型dom_什么是文档对象模型,以及为什么应该知道如何使用它。

文档对象模型domby Leonardo Maldonado莱昂纳多马尔多纳多(Leonardo Maldonado) 什么是文档对象模型&#xff0c;以及为什么应该知道如何使用它。 (What’s the Document Object Model, and why you should know how to use it.) So, you’ve studied HTML, you’ve created y…

安装Docker step by step

1. 系统要求 centos7以上 使用cat /etc/redhat-release查看系统版本&#xff0c;我的Centos 7.6 centos-extra 仓库 enable&#xff0c;默认是打开的 2.安装docker docer安装分为联网安装和离线安装两种安装 方式&#xff0c; 第一种 在有外网环境下安装docker,一般使用yum安…

linux用户空间和内核exit的语义--linux没有线程

如果你在程序中调用了exit&#xff0c;那么很显然你的程序会退出&#xff0c;可是至于为何会退出那就是库的事情了&#xff0c;我为什么说只是库的事情而不关linux内核的事情呢&#xff1f;那是因为linux内核根本不管用户空间的行为策略。库的策略是什么&#xff1f;很简单的退…

leetcode1328. 破坏回文串

给你一个回文字符串 palindrome &#xff0c;请你将其中 一个 字符用任意小写英文字母替换&#xff0c;使得结果字符串的字典序最小&#xff0c;且 不是 回文串。 请你返回结果字符串。如果无法做到&#xff0c;则返回一个空串。 示例 1&#xff1a; 输入&#xff1a;palindro…

php补充 扩展,PHP安装扩展补充说明

上一篇文章中用到了&#xff0c;php的sodium扩展&#xff0c;那么如何安装PHP扩展呢&#xff1f;基于我之前踩过的一些坑&#xff0c;大致整理了几种安装php扩展的方法。已安装sodium为例1、先做点准备工作&#xff0c;安装sodium依赖rpm -ivh http://mirrors.whsir.com/centos…

Java调用存储过程出现Bug,sql语法错误

因为SQL Server运行没有正常,检查了传入参数的值,发现问题,然后传入默认参数,解决了问题.转载于:https://www.cnblogs.com/JimmySeraph/p/11043490.html

leetcode1438. 绝对差不超过限制的最长连续子数组

给你一个整数数组 nums &#xff0c;和一个表示限制的整数 limit&#xff0c;请你返回最长连续子数组的长度&#xff0c;该子数组中的任意两个元素之间的绝对差必须小于或者等于 limit 。 如果不存在满足条件的子数组&#xff0c;则返回 0 。 示例 1&#xff1a; 输入&#…

gitlab 2.7版本升级到2.8

第一步 关闭服务 /etc/init.d/gitlab stop第二部 更新代码cd /home/gitlab/gitlab# Get latest codesudo -u gitlab git pull origin stable# Install libssudo -u gitlab bundle install --without development test# update dbsudo -u gitlab bundle exec rake db:migrate RA…

arkit技术介绍_面向移动AR的触觉技术:如何以“触摸”感增强ARKit应用

arkit技术介绍by Neil Mathew通过尼尔马修(Neil Mathew) 面向移动AR的触觉技术&#xff1a;如何以“触摸”感增强ARKit应用 (Haptics for mobile AR: how to enhance ARKit apps with a sense of “touch”) I’m really excited about the future of haptics for AR and VR. …

Unity3D的坑系列:动态加载dll

Unity3D的坑系列&#xff1a;动态加载dll 我现在参与的项目是做MMO手游&#xff0c;目标平台是Android和iOS&#xff0c;iOS平台不能动态加载dll&#xff08;什么原因找乔布斯去&#xff09;&#xff0c;可以直接忽略&#xff0c;而在Android平台是可以动态加载dll的&#xff0…

微信小程序 php配置,微信小程序的配置

我们使用app.json文件来对微信小程序进行全局配置&#xff0c;决定页面文件的路径、窗口表现、设置网络超时时间、设置多 tab 等。以下是一个包含了所有配置选项的简单配置app.json{"pages": ["pages/index/index","pages/logs/index"],"wi…

leetcode332. 重新安排行程(dfs)

给定一个机票的字符串二维数组 [from, to]&#xff0c;子数组中的两个成员分别表示飞机出发和降落的机场地点&#xff0c;对该行程进行重新规划排序。所有这些机票都属于一个从 JFK&#xff08;肯尼迪国际机场&#xff09;出发的先生&#xff0c;所以该行程必须从 JFK 开始。 …

PWA - service worker - Workbox(未完)

Get Started&#xff08;开始&#xff09; 只有get请求才能cache缓存吗&#xff1f;Create and Register a Service Worker File&#xff08;创建和注册 Service Worker&#xff09; Before we can use Workbox, we need to create a service worker file and register it to o…

draft.js_如何使用快捷方式在Draft.js中创建有序列表和无序列表

draft.jsby Andrey Semin通过安德烈塞米(Andrey Semin) 如何使用快捷方式在Draft.js中创建有序列表和无序列表 (How to create ordered and unordered lists in Draft.js with a shortcut) We at Propeller have encountered many differences between Draft.js and popular t…

当javaScript从入门到提高前需要注意的细节:变量部分

到了HTML5的时代&#xff0c;对javaScript的要求不是降低了&#xff0c;而是更提高了。javaScript语言的入门非常简单&#xff0c;如果你有java、C#等C风格的结构化语言的基础&#xff0c;那javaScript你最多半天就可以写点什么了。但是javaScript是一种动态语言&#xff0c;这…

PAT乙级 1003. 我要通过!

题目&#xff1a; “答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于PAT的“答案正确”大派送 —— 只要读入的字符串满足下列条件&#xff0c;系统就输出“答案正确”&#xff0c;否则输出“答案错误”。 得到“答案正确”的条件是&#xff1a; 1. 字符串中必须仅有…