微信企业向用户银行卡付款API开发详解(PHP)

时间:2023-01-14 12:08:36

最近在实现微信企业向用户银行卡付款时遇到了一些问题,发现官方文档说的太笼统,走了不少弯路,想要在此记录,希望可以帮到大家。

案例:企业付款到银行卡

     微信接口链接:https://api.mch.weixin.qq.com/mmpaysptrans/pay_bank

在传参时发现需要一些特殊参数,正文开始。

详解一:签名(sign)

微信企业向用户银行卡付款API开发详解(PHP)

注意:此处的签名必须是接口请求字段参与的签名,通俗的来讲就是要调用某个接口,需要传入签名字段(sign)时,此签名字段的值必须由其他请求字段按官方文档“MD5签名生成算法”生成,若在签名过程中遗漏某个请求字段(不参与签名),则在接口调用时会报签名错误异常(SIGNERROR)。

例如:假设请求需要商户号、APPID及签名(sign),则需要商户号和APPID参与签名生成签名(sign),然后一起作为请求参数调用接口API,此时的请求参数个数为3;

   若请求只需要商户号及签名(sign),只需要商户号参与签名生成签名(sign),然后再一起作为请求参数调用接口API,此时请求参数个数为2。

详解二:特殊请求参数(保密参数)

微信企业向用户银行卡付款API开发详解(PHP)

我们发现,在调用接口时需要传入“采用标准RSA算法”加密的字段,在根据官方“获取RSA加密公钥API”时发现其将RSA算法使用分为五步:

1、 调用获取RSA公钥API获取RSA公钥,落地成本地文件,假设为public.pem
2、
确定public.pem文件的存放路径,同时修改代码中文件的输入路径,加载RSA公钥
3、
用标准的RSA加密库对敏感信息进行加密,选择RSA_PKCS1_OAEP_PADDING填充模式(eg:Java的填充方式要选 "
RSA/ECB/OAEPWITHSHA-1ANDMGF1PADDING")
4、 得到进行rsa加密并转base64之后的密文
5、
将密文传给微信侧相应字段,如付款接口(enc_bank_no/enc_true_name)

接口默认输出PKCS#1格式的公钥,商户需根据自己开发的语言选择公钥格式

在开发过程中,使用PHP内置函数openssl_public_encrypt()对明文进行加密时提示如下错误:

[2] ErrorException in Paybank.php line 170

openssl_public_encrypt(): key parameter is not a valid public key

  1. * @param $pubRSAPath 加密公钥路径
  2. * @return string 密文(base64)
  3. * @throws \Exception
  4. */
  5. public function RSAEncryptByPub($plainText, $pubRSAPath) {
  6. try {
  7. //读取公钥内容
  8. $pub_key = openssl_pkey_get_public(file_get_contents($pubRSAPath));
  9. //转换为openssl格式密钥
  10. if (!openssl_public_encrypt($plainText, $cipherText, $pub_key, OPENSSL_PKCS1_OAEP_PADDING)) {
  11. throw new \Exception('加密错误,请重试!');
  12. }
  13. return base64_encode($cipherText);
  14. } catch (\Exception $e) {
  15. throw $e;
  16. }

解决方案如下:

步骤一、找到生成的RSA公钥文件,查看内容,发现其为PKCS#1格式,效果如下:

-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEArT82k67xybiJS9AD8nNAeuDYdrtCRaxkS6cgs8L9h83eqlDTlrdw
zBVSv5V4imTq/URbXn4K0V/KJ1TwDrqOI8hamGB0fvU13WW1NcJuv41RnJVua0QA
lS3tS1JzOZpMS9BEGeFvyFF/epbi/m9+2kUWG94FccArNnBtBqqvFncXgQsm98JB
3a62NbS1ePP/hMI7Kkz+JNMyYsWkrOUFDCXAbSZkWBJekY4nGZtK1erqGRve8Jbx
TWirAm/s08rUrjOuZFA21/EI2nea3DidJMTVnXVPY2qcAjF+595shwUKyTjKB8v1
REPB3hPF1Z75O6LwuLfyPiCrCTmVoyfqjwIDAQAB
-----END
RSA PUBLIC KEY-----

步骤二、安装OpenSSL工具,将其手动转为PKCS#8格式,效果如下:

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArT82k67xybiJS9AD8nNA
euDYdrtCRaxkS6cgs8L9h83eqlDTlrdwzBVSv5V4imTq/URbXn4K0V/KJ1TwDrqO
I8hamGB0fvU13WW1NcJuv41RnJVua0QAlS3tS1JzOZpMS9BEGeFvyFF/epbi/m9+
lkUWG94FccArNnBtBqqvFncXgQsm98JB3a42NbS1ePP/hMI7Kkz+JNMyYsWkrOUF
DCXAbSZkWBJekY4nGZtK1erqGRve8JbxTWirAm/s08rUrjOuZFA21/EI2nea3Did
JMTVnXVPY2qcAjF+595shwUKyTjKB8v1REPB3hPF1Z75O6LwuLfyPiCrCTmVoyfq
jwIDAQAB
-----END
PUBLIC KEY-----

RSA公钥格式PKCS#1,PKCS#8互转说明

PKCS#1 转 PKCS#8:

openssl rsa -RSAPublicKey_in -in <filename> -pubout

PKCS#8 转 PKCS#1:

openssl rsa -pubin -in <filename> -RSAPublicKey_out

步骤三、替换RSA公钥文件内容并保存,异常消失,问题解决。

问题原因:公钥格式错误导致加密失败。

微信企业向用户银行卡付款API开发详解(PHP)的更多相关文章

  1. 基于H5的微信支付开发详解

    这次总结一下用户在微信内打开网页时,可以调用微信支付完成下单功能的模块开发,也就是在微信内的H5页面通过jsApi接口实现支付功能.当然了,微信官网上的微信支付开发文档也讲解的很详细,并且有实现代码可 ...

  2. &ast;&ast;&ast;&ast;基于H5的微信支付开发详解&lbrack;转&rsqb;

    这次总结一下用户在微信内打开网页时,可以调用微信支付完成下单功能的模块开发,也就是在微信内的H5页面通过jsApi接口实现支付功能.当然了,微信官网上的微信支付开发文档也讲解的很详细,并且有实现代码可 ...

  3. &ast;&ast;&ast;PHP基于H5的微信支付开发详解(CI框架)

    这次总结一下用户在微信内打开网页时,可以调用微信支付完成下单功能的模块开发,也就是在微信内的H5页面通过jsApi接口实现支付功能.当然了,微信官网上的微信支付开发文档也讲解的很详细,并且有实现代码可 ...

  4. PayPal 开发详解(七):运行REST API SAMPLE

    1.编译成功,修改配置文件 sdk_config.properties ,使用我们申请的测试帐号执行收款测试,clientId 和 clientSecret 参见 PayPal 开发详解(五) 2.将 ...

  5. 产品经理-需求分析-用户故事-敏捷开发 详解 一张图帮你了解Scrum敏捷流程

    产品经理-需求分析-用户故事-敏捷开发 详解 用户故事是从用户的角度来描述用户渴望得到的功能.一个好的用户故事包括三个要素:1. 角色:谁要使用这个功能.2. 活动:需要完成什么样的功能.3. 商业价 ...

  6. iOS原生地图开发详解

    在上一篇博客中:http://my.oschina.net/u/2340880/blog/414760.对iOS中的定位服务进行了详细的介绍与参数说明,在开发中,地位服务往往与地图框架结合使用,这篇博 ...

  7. t持久化与集群部署开发详解

    Quartz.net持久化与集群部署开发详解 序言 我前边有几篇文章有介绍过quartz的基本使用语法与类库.但是他的执行计划都是被写在本地的xml文件中.无法做集群部署,我让它看起来脆弱不堪,那是我 ...

  8. 【转】MySQL用户管理及SQL语句详解

    [转]MySQL用户管理及SQL语句详解 1.1 MySQL用户管理 1.1.1 用户的定义 用户名+主机域 mysql> select user,host,password from mysq ...

  9. JMessage Android 端开发详解

    目前越来越多的应用会需要集成即时通讯功能,这里就为大家详细讲一下如何通过集成 JMessage 来为你的 App 增加即时通讯功能. 首先,一个最基础的 IM 应用会需要有哪些功能? 用户注册 / 登 ...

随机推荐

  1. 【STL】帮你复习STL泛型算法 一

    STL泛型算法 #include <iostream> #include <vector> #include <algorithm> #include <it ...

  2. OpenERP里面继承的用法

    最近开发遇到了这样的问题:需要往HR模块里面添加一些查询条件,这些查询条件是HR模型里已经写好的,直接修改HR肯定可以实现,但是HR模块一旦修改就会导致一系列的错误,OE开发中的一项基本原则就是不可修 ...

  3. linux telnet服务安装与配置

    关闭防火墙:service iptabls stop            chkconfig iptabls off 1.安装telnet服务 [root@rheltest1 ~]# rpm -qa ...

  4. IE6&bsol; IE7、IE8&bsol;9&bsol;10和Firefox的hack方式

    #test{color:red;color:red !important;/ Firefox.IE7支持 */_color:red; / IE6支持 */*color:red; / IE6.IE7支持 ...

  5. JVM菜鸟进阶高手之路四

    转载请注明原创出处,谢谢! 由于很多的jvm分析最好是基于gc日志的,所以添加参数如下即可: -verbose:gc -XX:+HeapDumpOnOutOfMemoryError -XX:+Prin ...

  6. 28&period;Django cookie

    概述 1.获取cookie request.COOKIES['key'] request.COOKIES.get('key') request.get_signed_cookie(key, defau ...

  7. &lbrack;Swift&rsqb;LeetCode963&period; 最小面积矩形 II &vert; Minimum Area Rectangle II

    Given a set of points in the xy-plane, determine the minimum area of any rectangle formed from these ...

  8. Git合并一次commit到指定分支

    1 在当前分支,查看要合并的分支版本号 git log 需要合并的commit版本号 16b7df3aa1e64e00554a8a3c871e59db8cd87b16 2 切换到 指定分支 git c ...

  9. openresty的安装和使用

    1,简介 OpenResty(又称:ngx_openresty) 是一个基于 NGINX 的可伸缩的 Web 平台,是一个强大的 Web 应用服务器,在性能方面,OpenResty可以 快速构造出足以 ...

  10. Python在mysql中进行操作是十分容易和简洁的

    首先声明一下,我用的是Windows系统! 1.在Python中对mysql数据库进行操作首先要导入pymysql模块,默认情况下,Python中是没有安装这个模块的, 可以在Windows的命令行中 ...