修正 PHP5 升级 PHP8 微信支付/支付宝 SDK支付问题
更换AlmaLinux服务器后,PHP从5.6升级到了8.0版本,发现 微信、支付宝的网站支付都不能使用。调试踩坑:
1、支付二维码不能显示
原因:phpqrcode/phpqrcode 依赖 gd 库
解决:安装 gd、php-gd
2、微信支付SDK异常
原因:PHP8 废弃了相关函数
解决:选用相应替代
- 文件:weipay_v3/lib/WxPay.Api.php
// 原代码
public static function notify($config, $callback, &$msg)
{
if (!isset($GLOBALS['HTTP_RAW_POST_DATA'])) {
# 如果没有数据,直接返回失败
return false;
}
//如果返回成功则验证签名
try {
//获取通知的数据
$xml = $GLOBALS['HTTP_RAW_POST_DATA'];
$result = WxPayNotifyResults::Init($config, $xml);
} catch (WxPayException $e){
$msg = $e->errorMessage();
......
// 替换后
public static function notify($config, $callback, &$msg)
{
$xml = file_get_contents("php://input");
if (empty($xml)) {
# 如果没有数据,直接返回失败
return false;
}
//如果返回成功则验证签名
try {
//获取通知的数据
$result = WxPayNotifyResults::Init($config, $xml);
} catch (WxPayException $e){
$msg = $e->errorMessage();
......
- 文件:weipay_v3/lib/WxPay.Data.php
// 原代码
libxml_disable_entity_loader(true);
// 替换后
libxml_set_external_entity_loader(function ($public, $system, $context) {
// 可以抛出异常、return 等操作
throw new WxPayException("异常:禁用外部实体加载!");
});
3、支付宝SDK异常
原因:PHP8 废弃了相关函数
解决:选用相应替代
- 文件:alipay_sdk/aop/AopClient.php
// 原代码
class AopClient {
protected function buildRequestForm($para_temp) {
$sHtml = "<form id='alipaysubmit' name='alipaysubmit' action='".$this->gatewayUrl."?charset=".trim($this->postCharset)."' method='POST'>";
while (list ($key, $val) = each ($para_temp)) {
if (false === $this->checkEmpty($val)) {
//$val = $this->characet($val, $this->postCharset);
$sHtml.= "<input type='hidden' name='".$key."' value='".$val."'/>";
}
}
// 替换后
class AopClient {
protected function buildRequestForm($para_temp) {
$sHtml = "<form id='alipaysubmit' name='alipaysubmit' action='".$this->gatewayUrl."?charset=".trim($this->postCharset)."' method='POST'>";
foreach ($para_temp as $key => $val) {
if (false === $this->checkEmpty($val)) {
//$val = $this->characet($val, $this->postCharset);
$val = str_replace("'","'",$val);
//$val = str_replace("\"",""",$val);
$sHtml.= "<input type='hidden' name='".$key."' value='".$val."'/>";
}
3、其他
- mcrypt 废弃,使用openssl、或 “phpseclib/phpseclib”。
- PHP8 内的 openssl 3 支持des-ecb,使用命令行显示是支持的。
- 不要轻易生级。
6207

被折叠的 条评论
为什么被折叠?



