PHP HyperPay支付网关新增ApplePay选项 三元改if/else报500错误
错误原因
- 原有三元运算符本身存在语法错误:原代码连续写了两个
?符号,缺少对应分支的冒号分隔符,新增ApplePay后三元的分支逻辑完全混乱,哪怕不改写if/else也无法正确运行 - 封装的
paymentMethods函数存在多个语法/逻辑问题:- 函数内部无法直接访问外部的
$request变量,PHP会抛出未定义变量错误 - 每个分支中
env()调用后多余的.属于无效的字符串拼接符,没有后续拼接内容直接触发语法解析错误 - 所有分支都没有使用
return返回对应值,函数调用后不会返回任何entityId内容 - 没有兜底默认分支,如果
payment_option不属于三个预设值,会返回空值导致支付请求失败
- 函数内部无法直接访问外部的
- 如果不封装函数直接写if分支,PHP不允许在字符串拼接的表达式中直接插入if语句,也会触发语法错误
正确修改方案
方案1:if/else分支写法(可读性高,方便后续扩展)
先单独处理entityId的取值逻辑,再拼接请求参数:
// 先判断支付方式获取对应entityId if($request->payment_option == 'hyperpay_mada'){ $entityId = env('HYPERPAY_MADA_ENTITY'); } elseif($request->payment_option == 'hyperpay_visa'){ $entityId = env('HYPERPAY_VISA_ENTITY'); } elseif($request->payment_option == 'hyperpay_applepay'){ $entityId = env('HYPERPAY_APPLEPAY_ENTITY'); } else { // 兜底默认值,可根据业务需求调整 $entityId = env('HYPERPAY_VISA_ENTITY'); } $data = "entityId=" . $entityId . "&amount=" . str_replace(',','',number_format($order->grand_total,2)) . "¤cy=SAR" . "&billing.city=" .$order->city. "&billing.state=" .$order->city. "&billing.postcode=0000". "&billing.country=SA". "&customer.givenName=" .$order->name. "&paymentType=DB" . // "&testMode=EXTERNAL" . "&customer.email=" . (!empty(session('shipping_info')['email']) && session('shipping_info')['email'] != 'null' && session('shipping_info')['email'] != null ? session('shipping_info')['email'] :'shopcustomer'. rand(10000, 99999).'@parduswear.com') . "&merchantTransactionId=" . uniqid();
方案2:数组映射写法(更简洁,新增支付方式无需修改分支逻辑)
// 维护支付方式和entityId的映射关系 $paymentEntityMap = [ 'hyperpay_mada' => env('HYPERPAY_MADA_ENTITY'), 'hyperpay_visa' => env('HYPERPAY_VISA_ENTITY'), 'hyperpay_applepay' => env('HYPERPAY_APPLEPAY_ENTITY'), ]; // 取值,不存在的支付方式走默认值 $entityId = $paymentEntityMap[$request->payment_option] ?? env('HYPERPAY_VISA_ENTITY'); // 后续$data拼接逻辑和方案1完全一致,直接使用$entityId即可
内容的提问来源于stack exchange,提问作者Abdulrahman Mushref
相关产品推荐
相关产品推荐

