
在处理支付交易时,有时需要查询已完成交易的详细信息,例如获取银行卡的末四位数字,以便进行客户服务、对账或内部记录。authorize.net提供了强大的api来检索这些信息。在laravel项目中,通常会通过其php sdk来与authorize.net进行交互。
1. API认证配置 与Authorize.net API交互的第一步是设置商家认证信息。这些信息通常存储在Laravel的.env文件中,以确保敏感数据的安全。
// app/Services/AuthorizeNetService.php (示例服务类)
use net\authorize\api\contract\v1 as AnetAPI;
use net\authorize\api\controller as AnetController;
class AuthorizeNetService
{
protected $merchantAuthentication;
public function __construct()
{
$this->merchantAuthentication = new AnetAPI\MerchantAuthenticationType();
$this->merchantAuthentication->setName(env('MERCHANT_LOGIN_ID'));
$this->merchantAuthentication->setTransactionKey(env('MERCHANT_TRANSACTION_KEY'));
}
// ... 其他方法
}在你的.env文件中,需要配置以下变量:
MERCHANT_LOGIN_ID=your_authorize_net_login_id MERCHANT_TRANSACTION_KEY=your_authorize_net_transaction_key
2. 构建GetTransactionDetailsRequest 要获取特定交易的详情,需要创建一个GetTransactionDetailsRequest对象,并传入交易ID。
public function getTransactionDetails(string $transactionId)
{
// 设置商家认证信息
$merchantAuthentication = new AnetAPI\MerchantAuthenticationType();
$merchantAuthentication->setName(env('MERCHANT_LOGIN_ID'));
$merchantAuthentication->setTransactionKey(env('MERCHANT_TRANSACTION_KEY'));
// 创建交易详情请求
$request = new AnetAPI\GetTransactionDetailsRequest();
$request->setMerchantAuthentication($merchantAuthentication);
$request->setTransId($transactionId); // 设置要查询的交易ID
// ...
}3. 执行请求并获取响应 构建好请求后,通过GetTransactionDetailsController执行请求,并指定API环境(沙盒或生产)。
public function getTransactionDetails(string $transactionId)
{
// ... (上述认证和请求构建代码)
// 创建并执行控制器
$controller = new AnetController\GetTransactionDetailsController($request);
$response = $controller->executeWithApiResponse(
\net\authorize\api\constants\ANetEnvironment::SANDBOX // 根据实际情况选择 SANDBOX 或 PRODUCTION
);
return $response;
}$response对象将包含API调用的结果,包括交易状态、支付信息等。
Authorize.net PHP SDK返回的响应对象是面向对象的,其内部属性通常是私有的,以实现数据封装。这意味着不能直接通过 $object->property 的方式访问私有属性。尝试这样做会导致 Cannot access private property 错误。
例如,当你得到一个net\authorize\api\contract\v1\GetTransactionDetailsResponse对象后,如果尝试直接访问$response->transaction,就会遇到上述错误。
正确访问TransactionDetailsType对象
为了获取交易详情,必须使用响应对象提供的公共getter方法。对于GetTransactionDetailsResponse对象,获取其内部的TransactionDetailsType对象应使用getTransaction()方法。
// 假设 $response 是从 Authorize.net API 返回的响应对象
$transactionDetails = $response->getTransaction();
if ($transactionDetails !== null) {
// 成功获取到交易详情对象
// 现在可以进一步处理 $transactionDetails
} else {
// 交易详情为空,可能需要检查API响应中的错误信息
// 例如:$response->getMessages()->getMessage()
}$transactionDetails现在是一个net\authorize\api\contract\v1\TransactionDetailsType类型的对象,它包含了所有关于这笔交易的详细信息。
一旦获取到TransactionDetailsType对象,就可以从中提取支付相关的信息,包括银行卡的末四位数字。银行卡信息通常嵌套在payment属性中,该属性是一个PaymentMaskedType对象。
if ($transactionDetails !== null) {
$payment = $transactionDetails->getPayment(); // 获取支付信息
if ($payment !== null) {
$creditCard = $payment->getCreditCard(); // 获取信用卡信息 (PaymentMaskedType内部的CreditCardMaskedType)
if ($creditCard !== null) {
$cardNumber = $creditCard->getCardNumber(); // 获取掩码后的卡号,例如 "XXXX1234"
// $expirationDate = $creditCard->getExpirationDate(); // 也可以获取过期日期
echo "银行卡末四位: " . substr($cardNumber, -4); // 进一步提取末四位
} else {
echo "未找到信用卡信息,可能支付方式不是信用卡。";
}
} else {
echo "未找到支付信息。";
}
} else {
echo "无法获取交易详情。";
}将上述步骤整合到一个Laravel控制器方法中,可以实现一个完整的交易详情查询功能。
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use net\authorize\api\contract\v1 as AnetAPI;
use net\authorize\api\controller as AnetController;
use Exception;
class AuthorizeNetController extends Controller
{
/**
* 获取指定交易的银行卡末四位数字。
*
* @param string $transactionId 交易ID
* @return \Illuminate\Http\JsonResponse
*/
public function getCardLastFourDigits(string $transactionId)
{
try {
// 1. 设置商家认证信息
$merchantAuthentication = new AnetAPI\MerchantAuthenticationType();
$merchantAuthentication->setName(env('MERCHANT_LOGIN_ID'));
$merchantAuthentication->setTransactionKey(env('MERCHANT_TRANSACTION_KEY'));
// 2. 创建交易详情请求
$request = new AnetAPI\GetTransactionDetailsRequest();
$request->setMerchantAuthentication($merchantAuthentication);
$request->setTransId($transactionId);
// 3. 创建并执行控制器
$controller = new AnetController\GetTransactionDetailsController($request);
$response = $controller->executeWithApiResponse(
\net\authorize\api\constants\ANetEnvironment::SANDBOX // 根据实际环境选择 SANDBOX 或 PRODUCTION
);
// 4. 处理API响应
if ($response !== null) {
if ($response->getMessages()->getResultCode() == "Ok") {
$transactionDetails = $response->getTransaction();
if ($transactionDetails !== null) {
$payment = $transactionDetails->getPayment();
if ($payment !== null && $payment->getCreditCard() !== null) {
$creditCard = $payment->getCreditCard();
$cardNumberMasked = $creditCard->getCardNumber(); // 例如 "XXXX1234"
$lastFourDigits = substr($cardNumberMasked, -4);
return response()->json([
'success' => true,
'transaction_id' => $transactionId,
'card_last_four_digits' => $lastFourDigits,
'card_type' => $creditCard->getCardType() // 也可以获取卡类型
]);
} else {
return response()->json([
'success' => false,
'message' => '未找到信用卡支付信息或支付方式不是信用卡。'
], 404);
}
} else {
return response()->json([
'success' => false,
'message' => '未能获取交易详情。'
], 404);
}
} else {
$messages = $response->getMessages()->getMessage();
$errorMessage = "Authorize.net API错误: " . $messages[0]->getCode() . " - " . $messages[0]->getText();
return response()->json([
'success' => false,
'message' => $errorMessage
], 500);
}
} else {
return response()->json([
'success' => false,
'message' => 'Authorize.net API响应为空。'
], 500);
}
} catch (Exception $e) {
return response()->json([
'success' => false,
'message' => '发生异常: ' . $e->getMessage()
], 500);
}
}
}通过遵循这些指南,你可以在Laravel应用中安全、有效地与Authorize.net API交互,并获取所需的交易详情,包括银行卡的末四位数字。
以上就是Laravel中从Authorize.net交易获取银行卡末四位数字的教程的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号