基于Authorize.net SDK的PHP简易结账实现:API选型困惑及AIM代码求助
我太懂这种被一堆API选项搞懵的感觉了!Authorize.net的文档确实有点繁杂,但你选的AIM API其实刚好适合做简易结账——它是服务器端直接调用的模式,不用跳转到第三方页面,集成起来很直接。我帮你把代码补全,再把关键要点理清楚:
完整的AIM API简易结账实现(PHP)
第一步:确保SDK正确引入
如果你用Composer安装的旧版Authorize.net SDK(对应authorizenet/authorizenet包),记得先加载自动加载器;如果是手动下载的SDK,直接引入核心文件:
// Composer方式 require 'vendor/autoload.php'; // 手动引入方式 // require_once '/path/to/AuthorizeNet.php';
第二步:初始化AIM对象并配置凭据
首先要把你的API登录ID和交易密钥填进去,测试环境记得开沙箱模式:
// 替换成你自己的API登录ID和交易密钥 $apiLoginId = "YOUR_API_LOGIN_ID"; $transactionKey = "YOUR_TRANSACTION_KEY"; // 初始化AIM交易对象 $sale = new AuthorizeNetAIM($apiLoginId, $transactionKey); // 测试环境开启沙箱,生产环境注释掉这行 $sale->setSandbox(true);
第三步:补全交易字段(完善你给出的代码片段)
注意字段格式必须严格符合要求,比如过期日期是MMYY格式,信用卡号不能有空格/连字符:
$sale->setFields( array( // 核心交易信息 'amount' => $total_price, // 要扣款的总金额(带小数,比如"99.99") 'card_num' => preg_replace('/\s|-/', '', $data['CreditCardNumber']), // 清洗掉卡号里的空格/连字符 'exp_date' => str_replace('/', '', $data['ExpirationDate']), // 转成MMYY格式,比如"12/28"变成"1228" 'card_code' => $data['CVV'], // 可选但推荐,提升交易安全性 'tax' => $tax, // 税费金额(可选) // 账单信息(部分字段必填,方便风控校验) 'first_name' => $data['BillingFirstName'], 'last_name' => $data['BillingLastName'], 'address' => $data['Address'], 'city' => $data['City'], 'state' => $data['State'], 'zip' => $data['Zip'], 'country' => $data['Country'], // 发货信息(如果和账单一致可以省略,否则必填) 'ship_to_first_name' => $data['ShippingFirstName'], 'ship_to_last_name' => $data['ShippingLastName'], 'ship_to_address' => $data['ShippingAddress'], 'ship_to_city' => $data['ShippingCity'], 'ship_to_state' => $data['ShippingState'], 'ship_to_zip' => $data['ShippingZip'], 'ship_to_country' => $data['ShippingCountry'], // 可选:订单号,便于后续对账 'invoice_num' => uniqid('ORDER-') ) );
第四步:执行交易并处理响应
发送请求后,根据响应状态做后续操作:
// 执行"授权+扣款"操作(如果只想先授权再扣款,用$sale->authorize()) $response = $sale->authorizeAndCapture(); // 处理响应结果 if ($response->approved) { // 交易成功!这里可以写生成订单、发送确认邮件等业务逻辑 echo "交易成功!交易ID:" . $response->transaction_id; // 还可以获取更多信息:授权码、实际扣款金额等 // echo "授权码:" . $response->authorization_code; } elseif ($response->declined) { // 交易被拒绝(比如余额不足、卡片过期) echo "交易被拒绝:" . $response->error_message; } else { // 系统错误(比如API凭据错误、网络问题) echo "交易出错:" . $response->error_message . ",错误码:" . $response->response_code; }
关键注意事项
- 测试环境用测试卡:Authorize.net提供测试信用卡号,比如
4111111111111111,过期日期选未来的MMYY,CVV随便填3位即可。 - 字段格式校验:前端要先做格式校验,比如卡号长度、过期日期格式,避免后端调用API时出错。
- 凭据区分环境:测试环境和生产环境的API登录ID、交易密钥是分开的,上线前一定要切换成生产凭据,同时关闭沙箱模式。
- 错误处理要全面:别只判断
approved,还要处理拒绝、系统错误等情况,给用户清晰的提示。
其实AIM API对于简易结账来说完全够用,不用纠结其他更复杂的API(比如CIM用于存储卡片、REST API用于更现代化的场景),先把基础流程跑通再说!
内容的提问来源于stack exchange,提问作者John Doe
相关产品推荐
相关产品推荐

