easywechat 对接企业打款到银行卡密钥参数不是有效的公钥

easywechat对接企业打款到银行卡

使用easyWeChat命令:

./vendor/bin/easywechat payment:rsa_public_key \
  >  --mch_id=1********8 \
  >  --api_key=YT********************Yy \
  >  --cert_path=/Users/overtrue/www/demo/apiclient_cert.pem \
  >  --key_path=/Users/overtrue/www/demo/apiclient_key.pem

在当前目录生成一个 ./ public-1****8.pem 文件,如果直接使用该公钥,将报openssl_public_encrypt(): key parameter is not a valid public key【密钥参数不是有效的公钥】,在easywechat有这样一段源码:

function rsa_public_encrypt($content, $publicKey)
{
    $encrypted = '';
    openssl_public_encrypt($content, $encrypted, openssl_pkey_get_public($publicKey), OPENSSL_PKCS1_OAEP_PADDING);

    return base64_encode($encrypted);
}

报非法key是因为 openssl_pkey_get_public($publicKey) 返回的是false

解决步骤

1、 公共密钥的开头需要加上”—–BEGIN RSA PUBLIC KEY—–\n”,结尾需要加上”\n—–BEGIN RSA PUBLIC KEY—–\n”
2、 公钥字符串每隔64隔字符需要加一个换行
3、 以上2步应该可以满足有些语言的需求,但php不行,还需要讲以上PKCS#1 格式密钥转换成PKCS#8 格式密钥。

  • 这是因为easywechat直接生成的 public-1****8.pem 文件中,key的格式是这样的。
    —–BEGIN RSA PUBLIC KEY—–MIIBCgKCAQEAuVvw3DeWx4wdDl2/I0aAMma2bH3hhU89rqMhJWvQ41uRbatxZxMZ13iEMXg8UfTBR+UGl+NCzpkkTjjcVm/2TcIdWgZCLr3Rzo4XD5hRLs8ExI+uzKnmar……CmtgTKWkqkhCnLwr7bRRzBUi3po7UDLWPePrH1ICd83/wIDAQAB—–END RSA PUBLIC KEY—–
    这种格式是错误的,无法直接放到函数 openssl_pkey_get_public 中使用。需要对他进行格式化成如下形式。
    —–BEGIN RSA PUBLIC KEY—– MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuVvw3DeWx4wdDl2/I0aA
    Mma2bH3hhU89rqMhJWvQ41uRbatxZxMZ13iEMXg8UfTBR+UGl+NCzpkkTjjcVm/2
    ……
    …… EXFyDtEykuiMuhn3A7WWNkc3voHML9C4kDWdJrX3wjQrwZbW3p3F1O/9pGHLNzn9
    p3la2C9/Ve3jLdG8lEzvkCmtgTKWkqkhCnLwr7bRRzBUi3po7UDLWPePrH1ICd83 /wIDAQAB —–END RSA PUBLIC KEY—–
    第一行是 —–BEGIN RSA PUBLIC KEY—– ,最后一行是 —–END RSA PUBLIC KEY—– ,然后中间的key每64个字符一行,可以用php的wordwrap($key, 64, "\n", true)函数处理。
    但这种是PKCS#1 格式密钥。php是函数 openssl_pkey_get_public 也无法使用。需要将其转换成PKCS#8 格式密钥。可以用如下命令
    openssl rsa -RSAPublicKey_in -in  public-1********8.pem -out public.pem
    这种就是在当前目录得到一个 public.pem 文件。里面存放的是PKCS#8 格式密钥。这种密钥格式是php可以使用的。密钥如下:
    —–BEGIN PUBLIC KEY—– MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuVvw3DeWx4wdDl2/I0aA
    Mma2bH3hhU89rqMhJWvQ41uRbatxZxMZ13iEMXg8UfTBR+UGl+NCzpkkTjjcVm/2
    ……
    …… EXFyDtEykuiMuhn3A7WWNkc3voHML9C4kDWdJrX3wjQrwZbW3p3F1O/9pGHLNzn9
    p3la2C9/Ve3jLdG8lEzvkCmtgTKWkqkhCnLwr7bRRzBUi3po7UDLWPePrH1ICd83 /wIDAQAB —–END PUBLIC KEY—–

文章参考:www.west.cn/info/html/wangluobianc...

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!