当前位置: 首页 > news >正文

php微信商家转账回调通知数据解密

<?php
namespace fast\wx;class AesUtil {/*** AES key(PEM格式)** @var string*/private $aesKey;const KEY_LENGTH_BYTE = 32;const AUTH_TAG_LENGTH_BYTE = 16;/*** 错误信息* @var string*/private $errorInfo = '';/*** Constructor* * @param string $aesKey 32字节的原始AES密钥(非PEM格式)* @throws Exception*/public function __construct($aesKey) {// 验证密钥是否为空if (empty($aesKey)) {throw new \Exception('AES密钥不能为空');}// 验证密钥长度$keyLength = strlen($aesKey);if ($keyLength != self::KEY_LENGTH_BYTE) {throw new \Exception('无效的ApiV3Key,长度应为' . self::KEY_LENGTH_BYTE . '个字节,实际为' . $keyLength . '个字节');}$this->aesKey = $aesKey;}/*** 获取最后发生的错误信息* * @return string*/public function getLastError() {return $this->errorInfo;}/*** 解密回调数据(修复密钥格式后)*/public function decryptToString($associatedData, $nonceStr, $ciphertext) {$this->errorInfo = '';// Base64解码密文$decodedCiphertext = base64_decode($ciphertext);if ($decodedCiphertext === false) {$this->errorInfo = '密文Base64解码失败';return false;}// 分离密文和认证标签$ctext   = substr($decodedCiphertext, 0, -self::AUTH_TAG_LENGTH_BYTE);$authTag = substr($decodedCiphertext, -self::AUTH_TAG_LENGTH_BYTE);// 使用PEM格式密钥解密$result = openssl_decrypt($ctext,'aes-256-gcm',$this->aesKey,OPENSSL_RAW_DATA,$nonceStr,$authTag,$associatedData);if ($result === false) {$errors = [];while ($error = openssl_error_string()) {$errors[] = $error;}$this->errorInfo = 'OpenSSL解密失败: ' . implode('; ', $errors);return false;}return $result;}}
?>

调用

public function batches_notify(){$encryptMsg = file_get_contents('php://input');// 记录原始数据file_put_contents(ROOT_PATH.'/runtime/batches_notify'.date('Ym').'.txt', '原始数据: '.$encryptMsg.PHP_EOL.'时间: '.date('Y-m-d H:i:s').PHP_EOL.PHP_EOL, FILE_APPEND);// $encryptMsg = '{"id":"a9102053-a245-5376-804e-2ae543187dbc","create_time":"2025-09-28T13:56:55+08:00","resource_type":"encrypt-resource","event_type":"MCHTRANSFER.BATCH.FINISHED","summary":"商家转账批次完成通知","resource":{"original_type":"mch_payment","algorithm":"AEAD_AES_256_GCM","ciphertext":"2obO8Q5Jl9yJZwEo+Cv5tvH65CST1pgrPSGKafizGWTKCwdK08BJLcAyrN9/coOeeb/YTbSUovoy6kpDBv0S/w3HZa3ASj/iUexKv26WMqk7uabUsWQVHxHcs/mm5jrCTnx+4V7CYfacinUx9iLieF5pczpJ38u6sQY3YQ6x7DA5kFSmtgtfwfHEGBXG84kZmlkmYwpt778kI9h85X497o48mbb/gkpife4l9A==","associated_data":"mch_payment","nonce":"lqe0lcxxxxxx"}}';$data = json_decode($encryptMsg, true);if (json_last_error() !== JSON_ERROR_NONE) {return json(['code'=>'FAIL','message'=>'JSON解析错误']);}// 验证数据格式if (!isset($data['resource']['ciphertext'])) {return json(['code'=>'FAIL','message'=>'回调数据格式不正确']);}$wxpay = Config::get('site.wxpay');$wxpayV3Key = $wxpay['wxpayV3Key'] ?? '';//APIv3密钥// 解密数据$aesUtil = new AesUtil($wxpayV3Key);$decryptedData = $aesUtil->decryptToString($data['resource']['associated_data'] ?? '',$data['resource']['nonce'] ?? '',$data['resource']['ciphertext']);if ($decryptedData === false) {return json(['code'=>'FAIL','message'=>'数据解密失败']);}// 解析业务数据$transferData = json_decode($decryptedData, true);if (json_last_error() !== JSON_ERROR_NONE) {return json(['code'=>'FAIL','message'=>'业务数据JSON解析错误']);}// 记录解密数据file_put_contents(ROOT_PATH.'/runtime/batches_notify_data'.date('Ym').'.txt', '解密数据: '.$decryptedData.PHP_EOL.'时间: '.date('Y-m-d H:i:s').PHP_EOL.PHP_EOL, FILE_APPEND);Db::startTrans();try {$order_id = $transferData['out_batch_no'] ?? '';$batch_id = $transferData['batch_id'] ?? '';$tixian = db('tixian')->where('order_id', $order_id)->find();// 逻辑处理} catch (\Exception $e) {Db::rollback();file_put_contents(ROOT_PATH.'/runtime/batches_notify_transfer_error'.date('Ym').'.txt', '错误: '.$e->getMessage().PHP_EOL.'时间: '.date('Y-m-d H:i:s').PHP_EOL.PHP_EOL, FILE_APPEND);return json(['code'=>'FAIL','message'=>'系统异常']);}}

http://www.dtcms.com/a/465761.html

相关文章:

  • 使用Linux的read和write系统函数操作文件
  • 基于 PLC 的仓储管理系统设计
  • 企业网站建设计划内部局域网怎么搭建
  • elasticsearch索引多长时间刷新一次(智能刷新索引根据数据条数去更新)
  • 脑电模型实战系列(二):PyTorch实现简单DNN模型
  • 脑电模型实战系列(二):为什么从简单DNN开始脑电情绪识别?
  • 哪个网站做h5比较好看金华手机建站模板
  • 制作网站源码电子商务网站建设课后习题答案
  • Google 智能体设计模式:模型上下文协议 (MCP)
  • 智能 DAG 编辑器:从基础功能到创新应用的全方位探索
  • 多语言建站系统深圳做网站比较好的公司有哪些
  • 基于OpenCV的智能疲劳检测系统:原理、实现与创新
  • Google 智能体设计模式:多智能体协作
  • 建设企业网站目的杭州网站建设q479185700惠
  • 自己建网站百度到吗网站建设与维护功能意义
  • Oracle 数据库多实例配置
  • 任天堂3DS模拟器最新版 Azahar Emulator 2123.3 开源游戏模拟器
  • 深圳福田网站建设公司共享ip网站 排名影响
  • 【AI安全】Anthropic推出AI安全工具Petri:通过自主Agent研究大模型行为
  • 云南做网站哪家便宜wordpress单页下载
  • 深度掌握 Git 分支体系:从基础操作到高级策略
  • CTF — ZIP 文件密码恢复
  • AI编程 | 基于即梦AI-Seedream 4.0模型,搭建人脸生成系统
  • 找设计案例的网站网站 设计
  • 医院项目:IBMS 集成系统 + 楼宇自控系统 + 智能照明系统协同解决方案
  • JavaEE初阶5.0
  • 一个企业做网站推广的优势手机网站怎么制作内容
  • 有代码怎么做网站做网站用源码
  • linux 环境下mysql 数据库自动备份和清库 通过crontab 创建定时任务实现mysql数据库备份
  • 每天一个设计模式——开闭原则