评论

整理一些使用wechatpay-php过程中,异常问题问答知识,希望对你对接有所帮助

wechatpay-php 使用过程中的问答知识整理

#10 php7.2.1无法使用?

使用的是7.2.1的版本,composer报错如下:
Your requirements could not be resolved to an installable set of packages.
Problem 1

  • wechatpay/wechatpay 1.0.2 requires guzzlehttp/guzzle ^7.0 -> satisfiable by guzzlehttp/guzzle[7.0.0, 7.0.1, 7.1.0, 7.1.1, 7.2.0, 7.3.0].
  • wechatpay/wechatpay 1.0.3 requires guzzlehttp/guzzle ^7.0 -> satisfiable by guzzlehttp/guzzle[7.0.0, 7.0.1, 7.1.0, 7.1.1, 7.2.0, 7.3.0].
  • wechatpay/wechatpay 1.0.1 requires php ^7.2.5 || ^8.0 -> your PHP version (7.2.1) does not satisfy that requirement.
  • wechatpay/wechatpay 1.0.0 requires php ^7.2.5 || ^8.0 -> your PHP version (7.2.1) does not satisfy that requirement.
  • guzzlehttp/guzzle 7.3.0 requires php ^7.2.5 || ^8.0 -> your PHP version (7.2.1) does not satisfy that requirement.
  • guzzlehttp/guzzle 7.2.0 requires php ^7.2.5 || ^8.0 -> your PHP version (7.2.1) does not satisfy that requirement.
  • guzzlehttp/guzzle 7.1.1 requires php ^7.2.5 -> your PHP version (7.2.1) does not satisfy that requirement.
  • guzzlehttp/guzzle 7.1.0 requires php ^7.2.5 -> your PHP version (7.2.1) does not satisfy that requirement.
  • guzzlehttp/guzzle 7.0.1 requires php ^7.2.5 -> your PHP version (7.2.1) does not satisfy that requirement.
  • guzzlehttp/guzzle 7.0.0 requires php ^7.2.5 -> your PHP version (7.2.1) does not satisfy that requirement.
  • Installation request for wechatpay/wechatpay ^1.0 -> satisfiable by wechatpay/wechatpay[1.0.0, 1.0.1, 1.0.2, 1.0.3].

是的,php7.2.1无法使用wechatpay-php开发包。因为:guzzle7 最低支持的PHP版本是 7.2.5,另PHP官方已于30 Nov 2020停止了维护PHP7.2,建议开发者升级至PHP7.4版本。

另外,可以查看packagist statisticsPHP的版本分布情况,从2021年5月至8月,7.2从11.1%降到9.4%;8.0从15.0%升至20.0%;建议有条件的开发者/商户选用PHP8来对接微信支付。

#15 Builder::factory 参数和支付类型问题

‘certs’ => [ // 可由内置的平台证书下载器 ./bin/CertificateDownloader.php 生成 ‘YYYYYYYYYY’ => PemUtil::loadCertificate(’/path/to/wechatpay/cert.pem’) ],

这里的Y是个什么?我填入序列号报错,不填没错。
还有个问题
支付只有native类型?

初始化字典说明如下:

  • mchid 为你的商户号,一般是10字节纯数字
  • serial 为你的商户证书序列号,一般是40字节字符串
  • privateKey 为你的商户API私钥,一般是通过官方证书生成工具生成的文件名是apiclient_key.pem文件,支持纯字符串或者文件resource格式
  • certs[$serial_number => #resource] 为通过下载工具下载的平台证书key/value键值对,键为平台证书序列号,值为平台证书pem格式的纯字符串或者文件resource格式

Y 值已在v1.0.7版本重新做了说明,代码逻辑如下:

<?php
// 商户号,假定为`1000100`
$merchantId = '1000100';
// 商户私钥,文件路径假定为 `/path/to/merchant/apiclient_key.pem`
$merchantPrivateKeyFilePath = '/path/to/merchant/apiclient_key.pem';
// 加载商户私钥
$merchantPrivateKeyInstance = PemUtil::loadPrivateKey($merchantPrivateKeyFilePath);
$merchantCertificateSerial = '可以从商户平台直接获取到';// API证书不重置,商户证书序列号就是个常量
// // 或者从以下代码也可以直接加载
// // 商户证书,文件路径假定为 `/path/to/merchant/apiclient_cert.pem`
// $merchantCertificateFilePath = '/path/to/merchant/apiclient_cert.pem';
// // 加载商户证书
// $merchantCertificateInstance = PemUtil::loadCertificate($merchantCertificateFilePath);
// // 解析商户证书序列号
// $merchantCertificateSerial = PemUtil::parseCertificateSerialNo($merchantCertificateInstance);
// 平台证书,可由下载器 `./bin/CertificateDownloader.php` 生成并假定保存为 `/path/to/wechatpay/cert.pem`
$platformCertificateFilePath = '/path/to/wechatpay/cert.pem';
// 加载平台证书
$platformCertificateInstance = PemUtil::loadCertificate($platformCertificateFilePath);
// 解析平台证书序列号
$platformCertificateSerial = PemUtil::parseCertificateSerialNo($platformCertificateInstance);
$instance = Builder::factory([
    'mchid'      => $merchantId,
    'serial'     => $merchantCertificateSerial,
    'privateKey' => $merchantPrivateKeyInstance,
    'certs'      => [
        $platformCertificateSerial => $platformCertificateInstance,
    ],
]);

这些非代码逻辑相关的备注信息,以注释形式放在README上,一定要看

wechatpay-php是通用型开发包,README上仅示例了Native付,其他接口照猫画虎按照官方文档中心即可自行完成。

#21 创建支付分订单API 报错,乱码

Client error: POST https://api.mch.weixin.qq.com/v3/payscore/serviceorder resulted in a 400 Bad Request response:
{“code”:“PARAM_ERROR”,“message”:"µ£ìÕèíÕ╝ÇÕºïµùÂÚù┤õ©ìÞ⢵ù®õ║ÄÞ░âþö¿µÄÑÕÅúµùÂÚù┤´╝îµêûõ╝áÕàÑÕø║Õ«ÜÕÇ╝OnAcceptÞí¿þñ║þö¿µ (truncated…)

请问这个是什么原因

建议阅读 PHP字符编码的要求,PHP的特性之一就是,所执行的PHP文件如果是GBK/CP936/ISO-8859-1等编码,那参数就自动继承此编码;而微信支付接口,是仅支持UTF-8编码,建议你调整下PHP文件编码为utf-8格式再试试。

#26 $config[‘serial’]与$config[‘certs’]的逻辑关系

ClientJsonTrait.php line 195
array_key_exists($config[‘serial’], $config[‘certs’]) , 这里是应该取非吗

不是取非,是你不恰当地把商户证书序列号,填在了平台证书序列号位置,SDK替你做了判断,你这种配置方法错了。

举个例子,都是钥匙,你家的钥匙和我家的钥匙,都是钥匙,但是你不能拿你家的来开我家的门,这就是非对称加解密技术的概要。

// 平台证书,可由下载器 `./bin/CertificateDownloader.php` 生成并假定保存为 `/path/to/wechatpay/cert.pem`
$platformCertificateFilePath = '/path/to/wechatpay/cert.pem';
// 加载平台证书
$platformCertificateInstance = PemUtil::loadCertificate($platformCertificateFilePath);
// 解析平台证书序列号
$platformCertificateSerial = PemUtil::parseCertificateSerialNo($platformCertificateInstance);
  • certs[$serial_number => #resource] 为通过下载工具下载的平台证书key/value键值对,键为平台证书序列号,值为平台证书pem格式的纯字符串或者文件resource格式

另:你检查逻辑唯独缺了README注释说明,README要耐心读一下。

与【腾讯云SDK 3.0】共享时,安装wechatpay/wechatpay失败问题反馈

我的环境已经存在 Guzzle7.0 版本【是安装腾讯云SDK 3.0 就安装了的】
执行 :composer require wechatpay/wechatpay
报: Your requirements could not be resolved to an installable set of packages.
Problem 1

  • Installation request for wechatpay/wechatpay ^1.1.1 -> satisfiable by wechatpay/wechatpay[1.1.1].
  • wechatpay/wechatpay 1.1.1 requires ext-curl * -> the requested PHP extension curl is missing from your system.
    我的环境是有 curl 的,
    版本是: curl 7.68.0 (x86_64-pc-linux-gnu) libcurl/7.68.0 OpenSSL/1.1.1f zlib/1.2.11 brotli/1.0.7 libidn2/2.2.0 libpsl/0.21.0 (+libidn2/2.2.0) libssh/0.9.3/openssl/zlib nghttp2/1.40.0 librtmp/2.3 Release-Date: 2020-01-08 Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtmp rtsp scp sftp smb smbs smtp smtps telnet tftp Features: AsynchDNS brotli GSS-API HTTP2 HTTPS-proxy IDN IPv6 Kerberos Largefile libz NTLM NTLM_WB PSL SPNEGO SSL TLS-SRP UnixSockets

------另外的方法: “require”: { “wechatpay/wechatpay”: “^1.1.1” }

一样的错误,我就搞不懂,我的问题在哪里。

这是个基础问题,PHP运行模式有常量PHP_SAPI以及php_sapi_name方法释义,常见的运行模式有cli cgi srv cli-server fpm-fcgi cgi-fcgi 等,composer运行安装包时是在cli模式下;上述错误提示反馈是说,依赖的ext-curl扩展缺失;

Terminal终端上,运行 php --ri curl 来查看当前cli模式下,curl扩展信息;这个和 curl -V输出是不一样的;解决方案是:

php -i|grep 'ini' 找到cli模式下的ini配置文件,然后调整 ;extension=curlextension=curl,或者在user_ini.filename的值上,自行添加 extension=curl

调整后,再执行composer require wechatpay/wechatpay 即可。

最后一次编辑于  2021-09-06  
点赞 3
收藏
评论

3 个评论

  • mima
    mima
    2021-08-18

    顶起来

    2021-08-18
    赞同 2
    回复
  • 蹦擦蹦擦蹦擦擦
    蹦擦蹦擦蹦擦擦
    2021-09-13

    请问下mchid 可以在哪里查看,这边在商户号上找了很久都没找到查看的地方

    2021-09-13
    赞同
    回复 1
    • 北望沣渭
      北望沣渭
      2021-09-13
      mchid就是商户号,可以登录商户平台查询。。。
      2021-09-13
      回复
  • 三叔
    三叔
    2021-08-18

    火钳刘明

    2021-08-18
    赞同
    回复
登录 后发表内容