#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 statistics的PHP的版本分布
情况,从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=curl
为 extension=curl
,或者在user_ini.filename
的值上,自行添加 extension=curl
调整后,再执行composer require wechatpay/wechatpay
即可。
顶起来
请问下mchid 可以在哪里查看,这边在商户号上找了很久都没找到查看的地方
火钳刘明