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

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

案例:企业付款到银行卡

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

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

详解一:签名(sign)

375686c967075267fc470f30a44fd867.png

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

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

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

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

ed4f9baeac28f1eb8b5a1968bbcfc068.png

我们发现,在调用接口时需要传入“采用标准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()对明文进行加密时提示如下错误:

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

*@param$pubRSAPath 加密公钥路径

*@returnstring密文(base64)

*@throws\Exception

*/

publicfunctionRSAEncryptByPub($plainText,$pubRSAPath){

try{

//读取公钥内容

$pub_key =openssl_pkey_get_public(file_get_contents($pubRSAPath));

//转换为openssl格式密钥

if(!openssl_public_encrypt($plainText,$cipherText,$pub_key,OPENSSL_PKCS1_OAEP_PADDING)){

thrownew\Exception('加密错误,请重试!');

}

returnbase64_encode($cipherText);

}catch(\Exception $e){

throw$e;

}

解决方案如下:

步骤一、找到生成的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 -pubout

PKCS#8 转 PKCS#1:

openssl rsa -pubin -in -RSAPublicKey_out

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值