PHP集成MasterCard支付时Checkout.configure()报INVALID_REQUEST错误
MasterCard支付集成问题:Checkout.configure()抛出INVALID_REQUEST错误导致支付页面空白
问题概述
使用MasterCard v59 REST API集成支付功能时,已成功获取SessionId,但跳转结账页面后返回空白。浏览器控制台显示Checkout.configure()抛出INVALID_REQUEST错误,导致Checkout.showPaymentPage()无法正常加载支付页面。
现有代码
后端PHP代码
$data = array( 'apiOperation' => 'CREATE_CHECKOUT_SESSION', 'interaction' => array( 'operation' => 'AUTHORIZE', 'merchant' => array( 'name' => $merchant ) ), 'order' => array( 'id' => $orderId, 'amount' => $amount, 'currency' => $currency ), ); $jsonPayload = json_encode($data); $headers = array( 'Content-Type: application/json', 'Authorization: Basic ' . base64_encode('merchant.MERCHANTID:mypassword') ); $options = array( CURLOPT_URL => $url, CURLOPT_POST => true, CURLOPT_POSTFIELDS => $jsonPayload, CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => $headers ); $curl = curl_init(); curl_setopt_array($curl, $options); $response = curl_exec($curl); if ($response === false) { echo 'cURL error: ' . curl_error($curl); } else { $responseData = json_decode($response, true); $sessionId = $responseData['session']['id']; } curl_close($curl); ?>
前端HTML/JS代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> </body> </html> <script> Checkout.configure({ merchant: '<?php echo $merchant; ?>', order: { amount: function(){ return <?php echo $amount ?>; }, currency: '<?php echo $currency; ?>', description: 'Order Goods', id: '<?php echo $orderId; ?>' }, interaction: { merchant: { name: "Milind Mhaskar", address: { line1: "Anna nagar", line2: "Jalgaon" } } }, session: { id: '<?php echo $sessionId; ?>' } }); Checkout.showPaymentPage(); </script>
排查与解决方案
以下是针对INVALID_REQUEST错误的核心排查点和修复方案:
缺少Checkout SDK引入:前端代码未加载MasterCard官方Checkout SDK脚本,这是导致
Checkout对象未定义或配置失败的关键原因。必须在<head>中添加对应版本的SDK:<script src="https://ap-gateway.mastercard.com/checkout/version/59/checkout.js"></script>订单信息不匹配:创建会话时的订单
id、amount、currency必须与前端配置完全一致。前端order.amount使用函数返回可能导致动态值与会话固定值不匹配,直接改为固定数值:order: { amount: <?php echo $amount; ?>, // 移除函数包装,直接传入固定值 currency: '<?php echo $currency; ?>', description: 'Order Goods', id: '<?php echo $orderId; ?>' }交互参数冲突:前端额外配置的
interaction.merchant.address在会话创建时未定义,可能引发参数不匹配。暂时简化interaction配置,只保留必要字段,甚至可以完全移除(会话创建时已配置核心交互参数)。会话ID有效性验证:在后端添加日志打印完整会话响应,确认
session.id正确生成且无格式问题:$responseData = json_decode($response, true); // 打印响应到日志,排查会话创建细节 error_log(print_r($responseData, true)); $sessionId = $responseData['session']['id'];商户ID一致性:确保前端
merchant参数与后端创建会话时使用的商户ID完全一致,检查$merchant变量是否正确传递。
修正后的前端代码示例
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>MasterCard支付</title> <!-- 引入MasterCard Checkout SDK v59 --> <script src="https://ap-gateway.mastercard.com/checkout/version/59/checkout.js"></script> </head> <body> <script> Checkout.configure({ merchant: '<?php echo $merchant; ?>', order: { amount: <?php echo $amount; ?>, currency: '<?php echo $currency; ?>', description: 'Order Goods', id: '<?php echo $orderId; ?>' }, session: { id: '<?php echo $sessionId; ?>' } }); Checkout.showPaymentPage(); </script> </body> </html>
内容的提问来源于stack exchange,提问作者Yogesh Mali
相关产品推荐
相关产品推荐

