如何在Laravel中通过Omnipay集成NMI支付网关?
在Laravel中集成Omnipay-NMI支付网关
Omnipay是一套提供统一支付API的工具库,能快速对接各类支付网关。下面是在Laravel中集成NMI支付网关的具体步骤:
1. 安装依赖包
通过Composer安装Omnipay核心库、NMI驱动以及Laravel集成包:
composer require league/omnipay omnipay/nmi laravel/omnipay
2. 配置Laravel项目
- 发布Omnipay配置文件:
php artisan vendor:publish --provider="Omnipay\Laravel\OmnipayServiceProvider" - 在
config/omnipay.php中添加NMI网关配置:'gateways' => [ 'nmi' => [ 'driver' => 'NMI', 'api_key' => env('NMI_API_KEY'), 'testMode' => env('APP_DEBUG', false), ], ], - 在
.env文件中填入NMI提供的API密钥:NMI_API_KEY=你的NMI_API_KEY
3. 编写支付业务逻辑
创建一个支付服务类封装NMI的支付操作(示例):
<?php namespace App\Services; use Omnipay\Omnipay; class PaymentService { protected $gateway; public function __construct() { $this->gateway = Omnipay::create('NMI'); $this->gateway->setApiKey(config('omnipay.gateways.nmi.api_key')); $this->gateway->setTestMode(config('omnipay.gateways.nmi.testMode')); } // 处理信用卡支付 public function processCreditCardPayment(array $params) { try { $response = $this->gateway->purchase([ 'amount' => $params['amount'], 'currency' => 'USD', 'card' => [ 'number' => $params['card_number'], 'expiryMonth' => $params['expiry_month'], 'expiryYear' => $params['expiry_year'], 'cvv' => $params['cvv'], 'firstName' => $params['first_name'], 'lastName' => $params['last_name'], ], ])->send(); if ($response->isSuccessful()) { return [ 'success' => true, 'transaction_id' => $response->getTransactionReference(), 'message' => '支付成功' ]; } return [ 'success' => false, 'message' => $response->getMessage() ]; } catch (\Exception $e) { return [ 'success' => false, 'message' => $e->getMessage() ]; } } // 处理退款 public function processRefund(array $params) { try { $response = $this->gateway->refund([ 'transactionReference' => $params['transaction_id'], 'amount' => $params['amount'], ])->send(); if ($response->isSuccessful()) { return [ 'success' => true, 'message' => '退款成功' ]; } return [ 'success' => false, 'message' => $response->getMessage() ]; } catch (\Exception $e) { return [ 'success' => false, 'message' => $e->getMessage() ]; } } }
4. 在控制器中调用服务
示例控制器代码,处理前端支付请求:
<?php namespace App\Http\Controllers; use App\Services\PaymentService; use Illuminate\Http\Request; class PaymentController extends Controller { protected $paymentService; public function __construct(PaymentService $paymentService) { $this->paymentService = $paymentService; } public function pay(Request $request) { $validated = $request->validate([ 'amount' => 'required|numeric|min:0.01', 'card_number' => 'required|digits:16', 'expiry_month' => 'required|digits_between:1,2|min:1|max:12', 'expiry_year' => 'required|digits:4|min:' . date('Y'), 'cvv' => 'required|digits_between:3,4', 'first_name' => 'required|string', 'last_name' => 'required|string', ]); $result = $this->paymentService->processCreditCardPayment($validated); return response()->json($result); } }
5. 测试注意事项
- NMI测试环境可使用测试卡号
4111111111111111,过期日期设为未来年月,CVV填123。 - 测试时确保
testMode配置为true,生产环境切换为false。
内容的提问来源于stack exchange,提问作者Lingaraju DP
相关产品推荐
相关产品推荐

