php微信企业付款到银行卡获取RSA加密公钥

2023-11-02

微信企业付款到银行卡需要对收款方银行卡号、收款方用户名进行加密,这个过程需要获取到加密公钥

对于一些第一次接刚触到的小伙伴来说,可能比较陌生,在此记录一下自己生成 RSA公钥的过程。

1、调用官方提供的接口,接口默认输出PKCS#1格式的公钥

获取RSA公钥API获取RSA公钥
public function createRsaKey() {
    $data = [
        'mch_id' => '写自己的商户ID', // 商户ID
        'nonce_str' => md5(time()),
        'sign_type' => 'MD5',
    ];
    $pay_api_key = '写自己的密钥'; // 密钥
    //签名
    $data["sign"] = $this->appgetSign($data, $pay_api_key);
    $url = 'https://fraud.mch.weixin.qq.com/risk/getpublickey';
    $data = $this->arrayToXml($data, true);
    $postResult = $this->postCurl($url, $data);
    $postResult = simplexml_load_string($postResult, 'SimpleXMLElement', LIBXML_NOCDATA);
    // 保存成PEM文件,
    file_put_contents('/自己的路径/名称.pem', $postResult->pub_key);
}

2、格式化参数格式化成url参数 生成签名sign

//格式化参数格式化成url参数  生成签名sign
public function appgetSign($Obj, $appwxpay_key, $bool = true) {
    foreach ($Obj as $k => $v) {
        $Parameters[$k] = $v;
    }
    //签名步骤一:按字典序排序参数
    ksort($Parameters); // ksort — 对数组按照键名排序
    $String = $this->formatBizQueryParaMap($Parameters, false);

    //签名步骤二:在string后加入KEY
    if ($appwxpay_key) {
        $String = $String . "&key=" . $appwxpay_key;
    }

    if ($bool) {
        //签名步骤三:MD5加密
        $String = md5($String);
    } else {
        //HMAC-SHA256签名方式
        $String = hash_hmac("sha256", $String, $appwxpay_key);
    }

    //签名步骤四:所有字符转为大写
    $result_ = strtoupper($String);
    return $result_;
}

3、按字典序排序参数

//按字典序排序参数
public function formatBizQueryParaMap($paraMap, $urlencode) {
    $buff = "";
    ksort($paraMap);
    foreach ($paraMap as $k => $v) {
        if ($urlencode) {
            $v = urlencode($v); //urlencode — 编码 URL 字符串
        }
        //$buff .= strtolower($k) . "=" . $v . "&";
        $buff .= $k . "=" . $v . "&";
    }
    $reqPar = '';
    if (strlen($buff) > 0) {
        $reqPar = substr($buff, 0, strlen($buff) - 1);
    }
    return $reqPar;
}

4、将数组转换为xml格式

//将数组转换为xml格式
public function arrayToXml($arr, $bool) {
    $xml = "<xml>";
    foreach ($arr as $key => $val) {
        if ($bool) {
            $xml .= "<" . $key . ">" . $val . "</" . $key . ">";
        } else {
            $xml .= "<" . $key . "><![CDATA[" . $val . "]]></" . $key . ">";
        }
    }
    $xml .= "</xml>";
    return $xml;
}

5、发送到微信post方法

function postCurl($url, $postData, $second = 30, $aHeader = array()) {
    // $cert、$key为自己的证书路径
    // 注意:要用绝对路径、要用绝对路径、要用绝对路径
    $cert = 'C:/certs/apiclient_cert.pem';
    $key = 'C:/certs/apiclient_key.pem';

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_TIMEOUT, $second);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($ch, CURLOPT_SSLCERTTYPE, 'PEM');
    curl_setopt($ch, CURLOPT_SSLCERT, $cert);
    curl_setopt($ch, CURLOPT_SSLKEYTYPE, 'PEM');
    curl_setopt($ch, CURLOPT_SSLKEY, $key);
    if (count($aHeader) >= 1) {
        curl_setopt($ch, CURLOPT_HTTPHEADER, $aHeader);
    }
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
    $data = curl_exec($ch);
    if ($data) {
        curl_close($ch);
        return $data;
    } else {
        $error = curl_errno($ch);
        curl_close($ch);
        return false;
    }
}

注意:证书验证失败和curl返回错误码58,问题原因:是微信支付的证书的路径必须是绝对路径

成功返回的数据如下

 返回的PKCS#1格式的公钥 文件如下

 6、PKCS#1 转 PKCS#8

命令:openssl rsa -RSAPublicKey_in -in 调用微信接口生成的文件名.pem -pubout > 自己命名一个公钥名称.pem

如:openssl rsa -RSAPublicKey_in -in pubkey.pem -pubout > public.pem

我是 鼠标右键 Git Bash Here

生成的PKCS#8公钥格式

【微信支付】付款开发者文档

在线RSA PKCS#1、PKCS#8公钥格式转换工具-ME2在线工具

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

php微信企业付款到银行卡获取RSA加密公钥 的相关文章

  • 在多维数组 PHP 的所有键中搜索

    我想在多维数组中的所有键中搜索特定字符串 我只需要弄清楚它是否存在 仅此而已 我想知道访问者的 IP 是否存在于任何数组中 有没有我可以用来执行此操作的 php 函数或方法 我尝试过的每个函数或方法总是返回 false 数组中 数组搜索 数
  • AWS S3从本地主机批量上传php错误

    我在尝试着批次 散装从本地主机 xampp 上传到我的S3 bucket 它似乎适用于大约 6 个项目 然后我收到一条错误消息 cURL 错误说Failed sending network data from http curl haxx
  • PHP 异常处理与 C#

    这是一个非常基本的问题 我希望如此 我所做的大部分异常处理都是使用 C 进行的 在 C 中 任何在 try catch 块中出错的代码都会由 catch 代码处理 例如 try int divByZero 45 0 catch Except
  • 用 PHP 截断文件末尾

    我有一个日志文件 我想在 PHP 读取该文件后将其截断 我的代码目前如下所示 fp fopen file r ftruncate fp 125000 fclose fp 但是 这会通过保留first1MB 不过 我想保留last1Mb 的文
  • PHP 删除字符最后一个实例之前的所有内容

    有没有办法删除某个字符之前的所有内容 包括最后一个实例 我有多个字符串 其中包含 gt e g the gt cat gt sat gt on gt the gt mat welcome gt home 我需要对字符串进行格式化 以便它们变
  • 禁用外部点击时关闭模式

    我正在制作一些使用模式的博客物质化 但我的模态 onclick 外部和错误数据有问题 这是我的代码 main js function changepassword var user userlog val var content conte
  • zend 表单验证

    我想知道 Zend Form 如何验证输入 我的意思是它如何知道要验证哪些输入字段 我查看了 php 全局变量 POST GET 但没有看到任何设置为标识符 例如 的内容 以便了解如何验证 有人能给我推荐一些关于这些东西的指南吗 好吧 找出
  • use 语句顺序会影响 PHP 中的功能吗?

    我使用 PHP 的命名空间已经有一段时间了 我认为它对我的编程来说是一个很好的补充 今天早上我想知道一些关于use陈述 我想知道顺序是否use影响我的 PHP 代码的功能 根据 PHP net 使用别名引用外部完全限定名称或导入的能力是命名
  • 随机错误 symfony:ContextErrorException: 警告: simplexml_load_file(): I/O 警告: 无法加载外部实体

    在我的 Symfony 项目中 当我进入应用程序中的随机页面时 会出现以下随机错误 ContextErrorException Warning simplexml load file I O warning failed to load e
  • 查明具有特定 ID 的会话是否已过期

    我正在创建一个上传功能 将用户上传的文件存储在服务器上 并以用户的会话 ID 作为名称 现在 我只想将此文件保留在服务器上 直到该会话处于活动状态 所以 我的问题是 如何根据会话 ID 确定会话是活动的还是过期的 以便在后一种情况下我可以安
  • Memcache 不会刷新或清除内存

    我一直在尝试清除我的内存缓存 因为我注意到使用时存储占用了近 30 的服务器内存ps aux 所以我运行了以下 php 代码 memcache new Memcache memcache gt connect localhost 11211
  • CryptoJS 使用密码加密 AES,但 PHP 解密需要密钥

    我在用CryptoJS https code google com p crypto js AES加密字符串 function doHash msg msg String msg var passphrase aggourakia var
  • Zend RegEx Validator 的自定义有意义的错误消息

    我正在验证表单中的文本字段 如下所示 name new Zend Form Element Text name name gt setLabel First Name gt setRequired true gt addFilter new
  • 如何从另一个数组值中过滤数组值并返回新数组? [复制]

    这个问题在这里已经有答案了 我有两个数组 all languages and taken languages 第一个包含所有语言 例如 200 种或其他语言 第二个包含之前选择的语言 从 0 到 200 种 我需要删除所有已采用的语言 ta
  • 自定义 WordPress 画廊 html 布局

    当使用默认媒体上传器在 WordPress 中创建图像库时 WordPress 将图像包装在一堆 HTML 标记中 如何在生成之前覆盖它 以便我可以输出所需的标记并更改创建图库布局的方式 目前 WordPress 生成的代码如下 div d
  • 使用 Xpath 进行部分匹配

    我正在尝试创建一个搜索功能 允许使用 Xpath 按歌曲标题或流派进行部分匹配 这是我的 XML 文件
  • WordPress - 类别和子类别的嵌套列表

    我正在尝试显示带有嵌套子类别的 WordPress 类别列表 到目前为止 我只能获取父类别列表或不包括父类别的子类别列表 但我无法将两者连接在一起 这是我想要创建的结果 Parent Category 子类别 子类别 Parent Cate
  • sqlite3和pdo_sqlite有什么区别

    我正在将我的 Web 应用程序从 MySQL 迁移到 SQLite 数据库 我发现有两个 PHP 扩展用于与 sqlite 通信 php sqlite3 dll and php pdo sqlite dll 什么扩展比较好 或者另一个问题
  • PHP 中根据相似值对数组进行分组

    我有一个具有以下结构的数组
  • Google Drive 服务帐户上传的位置

    我正在尝试使用服务帐户将文件上传到我的 Google 云端硬盘 当我部署此代码时 我不希望用户给予授权 我希望他们上传到我的帐户 我通过 PHP 使用它 下面是我到目前为止的情况 这段代码是基于官方文档给出的例子 当我运行 php 脚本时

随机推荐

  • Dart基础语法1

    Dart基础 学习一门新的语言 我们可以以自己现有的熟悉的语言来类比 比如我们非常熟悉Java 那么剩下的就是需要掌握与Java不同的Dart语法 剩下的就需要靠自己多写多看来慢慢熟悉 国际惯例 使用Dart完成一个 Hello World
  • web前端面试之基础面试题(一)(含答案)

    前端面试题 一 今天我们整理一下前端面试题 15个 此面试题答案自己书写总结 有问题或疑问请指出问题 谢谢 1 HTML中行内元素与块元素的区别 并举例 行内元素怎么转化为块级元素 块级元素 block element 在浏览器中占据整行
  • 一文看懂yolov7;yolov7详解

    免责声明 1 此方法仅提供参考 2 搬了其他博主的操作方法 以贴上路径 3 场景一 yolo v7 场景二 yolo系列未完待续 Yolo系列强推 gt Yolo v1 v5 Yolox 场景一 yolo v7 强推先看 gt yolov7
  • 7-52 两个有序链表序列的交集

    include
  • 用遗传算法进行特征选择

    文章目录 一 问题举例 二 算法描述 1 基于类内类间距离的可分性判据 2 遗传算法 Genetic Algorithm 1 初始化种群 2 计算当前种群 M t 中每条染色体的适应度值 f m 3 基于适应度值的选择 4 交叉 5 变异
  • STM32直流电机测速

    任务要求 以STM32单片机 DSPTMS320F28335芯片或ARM系列芯片为核心 测量电机旋转速度 并利用开发板实现如下功能 在LCD屏幕上显示捕捉的电机转速 转速高于阈值报警 LED闪烁指示处于工作状态 扩展功能 0 96寸OLED
  • ent orm笔记1---快速尝鲜

    前几天看到消息Facebook孵化的ORM ent转为正式项目 出去好奇 简单体验了一下 使用上自己感觉比GORM好用 于是打算把官方的文档进行整理 也算是学习一下如何使用 安装 ent orm 需要使用entc命令进行自动代码生成 所以需
  • ChatGPT+小红书爆文,牛!

    随着AI技术的不断发展 它已经逐渐渗透到了我们的生活之中 包括内容营销领域 我们通过AI算法生成文本 优化搜索引擎排名 提高用户体验等 现在AI已逐渐在改变时代的进步 AI也将成为下一个十年的一个变革 我们每个创业者 内容创作者以及普通人都
  • Visual Studio 卸载 Visual Assist番茄助手

    在VS的Visual Studio 2010 Extension Manager 中可卸载 详细可参考文章 https blog csdn net fangxinggood article details 6052950
  • Selenium常用操作之单选复选框、下拉列表、键盘、截屏、断言、(显式隐式)等待

    目录 1 窗口最大化 2 单选框操作 3 复选框操作 4 下拉列表 5 selenium 三种等待 6 键盘操作 7 截屏 8 断言 9 Selenium操作JS弹窗控件 10 鼠标悬停与释放 1 窗口最大化 driver maximize
  • 算法03-任务混部

    公司创新实验室正在研究如何最小化资源成本 最大化资源利用率 请你设计算法帮他们 解决一个任务混部问题 有 taskNum 项任务 每个任务有开始时间 startTime 结束时间 endTime 并行度 parallelism 三个属性 并
  • 福建中烟RFID托盘运输环节的出入库管理

    1 项目设计 在木托盘上加一张带有RFID芯片的纸滑托盘 利用专用推拉器RFID智能叉车将纸滑托盘连同放在其上面的整托盘卷烟叉起 经过出库扫描仪扫描芯片信息后装车 便完成了基于RFID托盘运输环节的出入库作业 基于工业的RFID托盘运输管理
  • C/C++编程:名称

    两个概念 如果一个名称使用域解析符 或者成员访问运算符 gt 来显式表明它所属的作用域 我们就称该名称为受限名称 this gt count是受限名称 count不是 即使count实际上引用的也是一个类名称 如果一个名称 以某种方式 依赖
  • 如何基于 Kubernetes 实现优质开发者平台体验?

    内部开发者平台 或 IDP 是使开发团队能够更快 更轻松 更一致地交付应用程序的基础设施 Kubernetes 本身是一个功能强大的平台 但它引入了太多复杂性和功能 因此不能简单地将其作为 IDP 交给开发团队 若要期望他们能取得成功 非常
  • QString 乱谈(3)-Qt5与中文

    两个月前 简单写过QTextCodec中的setCodecForTr等终于消失了 Qt5 在Qt论坛上 不少用户都对去掉这两个函数表示特别的不了解 为什么会这样 我想多少能说明不少用户对C 中源码字符集和执行字符集的不太了解 从而造成对这种
  • SQL查询~ 存在一个表而不在另一个表中的数据

    A B两表 找出ID字段中 存在A表 但是不存在B表的数据 A表总共13w数据 去重后大约3W条数据 B表有2W条数据 且B表的ID字段有索引 方法一 使用 not in 容易理解 效率低 执行时间为 1 395秒 1 select dis
  • 微信小程序中调用手机拨号功能

    在微信小程序中 如何实现点击电话按钮后跳转至手机的拨号界面 并且传入指定的号码 要实现在微信小程序中点击电话按钮后跳转至手机的拨号界面 并传入指定的号码 你可以使用 wx makePhoneCall 方法 微信小程序中调用手机拨号功能 首先
  • Netty编程面试题

    1 Netty 是什么 Netty是 一个异步事件驱动的网络应用程序框架 用于快速开发可维护的高性能协议服务器和客户端 Netty是基于nio的 它封装了jdk的nio 让我们使用起来更加方法灵活 2 Netty 的特点是什么 高并发 Ne
  • java数组定义错误_JAVA定义数组 int a[]=new int[100000] 错误

    我用JAVA定义了一个1W的数组可以使用 但是定义一个10W的数组提示Exceptioninthread main java lang ArrayIndexOutOfBoundsException 2147479015atJavaappli
  • php微信企业付款到银行卡获取RSA加密公钥

    微信企业付款到银行卡需要对收款方银行卡号 收款方用户名进行加密 这个过程需要获取到加密公钥 对于一些第一次接刚触到的小伙伴来说 可能比较陌生 在此记录一下自己生成 RSA公钥的过程 1 调用官方提供的接口 接口默认输出PKCS 1格式的公钥