shankar-bavan /lara-anet-payment
一个用于授权.net的订阅原生命令服务的Laravel Cashier接口。
Requires
- php: ^7.2
- authorizenet/authorizenet: ^2.0
- dompdf/dompdf: ^0.8.2
README
简介
此包提供了一个兼容、表达性和流畅的接口,用于Authorize.net的原生命令订阅服务。它处理(主要是)所有您否则必须自己管理的订阅命令代码。除了基本的订阅管理外,此包还可以处理取消宽限期。
基本设置
请阅读以下内容以进行基本设置。
Composer设置
composer require https://github.com/shankar-bavan/lara-anet-payment
环境变量
ADN_ENV= ADN_LOG=authorize.log
ADN_API_LOGIN_ID= ADN_TRANSACTION_KEY= ADN_SECRET_KEY=Simon
ADN_ENV应该是以下之一:sandbox,production
迁移
您需要创建包含以下内容的迁移
Schema::table('users', function ($table) { $table->string('authorize_id')->nullable(); $table->string('authorize_payment_id')->nullable(); $table->string('card_brand')->nullable(); $table->string('card_last_four')->nullable(); });
Schema::create('subscriptions', function ($table) { $table->increments('id'); $table->integer('user_id'); $table->string('name'); $table->string('authorize_id'); $table->string('authorize_payment_id'); $table->text('metadata'); $table->string('authorize_plan'); $table->integer('quantity'); $table->timestamp('trial_ends_at')->nullable(); $table->timestamp('ends_at')->nullable(); $table->timestamps(); });
发布
您需要发布此包的资产。
php artisan vendor:publish --provider="Laravel\CashierAuthorizeNet\CashierServiceProvider"
配置
以下文件需要更新,如下所示。config/services.php
需要更新以匹配您的用户账户的类名。
config/cashier.php
'monthly-10-1' => [ 'name' => 'main', 'interval' => [ 'length' => 1, // number of instances for billing 'unit' => 'months' //months, days, years ], 'total_occurances' => 9999, // 9999 means without end date 'trial_occurances' => 0, 'amount' => 9.99, 'trial_amount' => 0, 'trial_days' => 0, 'trial_delay' => 0, // days you wish to delay the start of billing ]
config/services.php
'authorize' => [ 'model' => App\User::class, ],
您也可以使用以下.env
变量设置此值:ADN_MODEL
基本用法
与Authorize.net相比,与其他服务(例如Stripe)存在一些差异;首先,Authorize.net的速度略慢,并且是更受限制的订阅提供商。您必须首先取消并创建新的订阅才能执行某些操作(例如交换订阅、更改订阅数量)。
Laravel\CashierAuthorize\Billable
接口
interface Billable { /** * Charge a customer once. * * @param int $amount * @param array $options * @param string $transactionType * * @return Charge * @throws Error\Card */ public function charge(float $amount, array $options = [], string $transactionType = "authCaptureTransaction"); /** * Determines if the customer currently has a card on file. * * @return bool */ public function hasCardOnFile(); /** * Invoice the customer for the given amount. * * @param string $description * @param int $amount * @param array $options * @return bool * * @throws \Stripe\Error\Card */ public function invoiceFor($description, $amount, array $options = []); /** * Begin creating a new subscription. * * @param string $subscription * @param string $plan * @return \Laravel\CashierAuthorizeNet\SubscriptionBuilder */ public function newSubscription($subscription, $plan); /** * Determine if the user is on trial. * * @param string $subscription * @param string|null $plan * @return bool */ public function onTrial(string $subscription = 'default', $plan = null); /** * Determine if the user is on a "generic" trial at the user level. * * @return bool */ public function onGenericTrial(); /** * Determine if the user has a given subscription. * * @param string $subscription * @param string|null $plan * @return bool */ public function subscribed($subscription = 'default', $plan = null); /** * Get a subscription instance by name. * * @param string $subscription * @return \Laravel\Cashier\Subscription|null */ public function subscription($subscription = 'default'); /** * Get all of the subscriptions for the user. * * @return \Illuminate\Database\Eloquent\Collection */ public function subscriptions(); /** * Get the entity's upcoming invoice. * * @return \Laravel\Cashier\Invoice|null */ public function upcomingInvoice(); /** * Find an invoice by ID. * * @param string $id * @return \Laravel\Cashier\Invoice|null */ public function findInvoice($invoiceId); /** * Find an invoice or throw a 404 error. * * @param string $id * @return \Laravel\Cashier\Invoice */ public function findInvoiceOrFail($id); /** * Create an invoice download Response. * * @param string $id * @param array $data * @param string $storagePath * @return \Symfony\Component\HttpFoundation\Response */ public function downloadInvoice($id, array $data, $storagePath = null); /** * Get a subcription from Authorize * * @param string $subscriptionId * @return array */ public function getSubscriptionFromAuthorize($subscriptionId); /** * Get a collection of the entity's invoices. * * @param string $plan * @return \Illuminate\Support\Collection */ public function invoices($plan); /** * Update customer's credit card. * * @param string $token * @return void */ public function updateCard($card); /** * Determine if the user is actively subscribed to one of the given plans. * * @param array|string $plans * @param string $subscription * @return bool */ public function subscribedToPlan($plans, $subscription = 'default'); /** * Determine if the entity is on the given plan. * * @param string $plan * @return bool */ public function onPlan($plan); /** * Determine if the entity has a Stripe customer ID. * * @return bool */ public function hasAuthorizeId() { return !!$this->authorize_id; } /** * Create a Stripe customer for the given user. * * @param array $creditCardDetails * @return StripeCustomer */ public function createAsAuthorizeCustomer(Array $location, array $cardDetails); /** * Delete an Authorize.net Profile * * @return */ public function deleteAuthorizeProfile(); /** * Get the Stripe supported currency used by the entity. * * @return string */ public function preferredCurrency(); /** * Get the tax percentage to apply to the subscription. * * @return int */ public function taxPercentage(); /** * Detect the brand cause Authorize wont give that to us * * @param string $card Card number * @return string */ public function cardBrandDetector($card); }
交易详情
启用API以启用交易详情API
- 登录到https://account.authorize.net的商家界面。
- 在左侧主菜单中,选择“账户”下的“设置”。
- 在“安全设置”部分中单击“交易详情API”链接。打开交易详情API屏幕。
- 如果您尚未启用交易详情API,请输入您秘密问题的答案,然后单击“启用交易详情API”。
- 成功启用交易详情API后,设置页面将显示。
CRON作业
您需要启用以下CRON作业以检查用户订阅的状态。这可以运行得尽可能频繁,并将确认您的用户订阅是活动的。如果状态更改为已取消或已挂起,则系统将本地禁用其订阅。您的团队需要与Authorize.net解决付款问题,然后继续前进。
protected $commands = [ \Laravel\CashierAuthorizeNet\Console\SubscriptionUpdates::class, ];
$schedule->command('subscription:update')->hourly();
限制
另一个限制是与时间相关的。由于Authorize.net使用SOAP结构为其API,因此在将具有信用卡的客户添加到其系统以及添加订阅给该用户之间需要时间延迟。这可以通过让用户输入他们的信用卡信息,然后允许他们作为另一个操作确认他们希望购买的订阅来实现。此时间可能仅为几秒钟,但迄今为止所有立即添加订阅的测试都未能成功,因此请在设计应用程序时注意此限制。
许可
Laravel Cashier-Authorize 是一款开源软件,受 MIT 许可证 许可。