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 协议》,转载必须注明作者和本文链接
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。