再会,
我正在做一个涉及 laravel 收银员的项目。我想让用户能够更新他们的订阅数量并立即收费(我已经能够实现,使用下面的代码)
$user = Auth::user()
$user->subscription('main')->incrementAndInvoice(10000);
Run Code Online (Sandbox Code Playgroud)
与预期的一样,返回的发票不包含指示更改的描述,而是发票描述为空白。但是当我检查条纹上的事件数据时,有两个描述[见下图]
上图显示了当前订阅数量为 5000 件但增加到 15000 件的订阅计划的用户。有没有办法在生成的发票中包含这些描述。
在我检查了incrementAndInvoice()
方法之后,它只接受两个参数(1.count, 2.Plan),如下所示;
没有像我们对charge()
方法那样包含描述的选项。有什么解决方法吗?任何正确方向的想法或指示将不胜感激。
提前感谢您的帮助。
我已经通过Laravel的Cashier软件包订阅了用户订阅计划.我现在想要显示用户下次开帐单的日期,但是这似乎不是通过Billable特征可用的日期.
如何获得下一个结算日期?谢谢!
我想从条带上的应用程序创建一个计划.这种情况是,用户需要支付不同的价格作为定期付款.所以,这就是我想为每个用户创建计划的原因.
我正在使用laravel 5并使用"laravel/cashier": "~5.0"
我正在使用以下内容handleCustomerSubscriptionDeleted
通过将以下内容置于以下方法来覆盖默认方法app/Http/Controllers/WebHookController.php
:
<?php namespace App\Http\Controllers;
use Laravel\Cashier\WebhookController;
use Symfony\Component\HttpFoundation\Response;
class StripeWebhooks extends WebhookController {
/**
* Handle stripe subscription webhook
*
* @param array $payload
* @return Response
*/
public function handleCustomerSubscriptionDeleted($payload)
{
$billable = $this->getBillable($payload['data']['object']['customer']);
if ($billable && $billable->subscribed()) {
$billable->subscription()->cancel();
}
return new Response('Webhook Handled', 200);
}
}
Run Code Online (Sandbox Code Playgroud)
为了实际覆盖默认值,我应该更新到扩展控制器的路由,还是仍然引用默认值?我不认为将它保留为默认值甚至会让Laravel知道我的控制器存在,但也想确认一下.
当前:
Route::post('stripe/webhook', '\Laravel\Cashier\WebhookController@handleWebhook');
Run Code Online (Sandbox Code Playgroud)
另一部分是handleCustomerSubscriptionDeleted
我也希望能够抓住当前正在引用的用户并执行其他操作; 在这种情况下,自动将记录设置为未发布.检索用户的最佳方法是什么?它似乎$payload['data']['object']['customer']
可能保留并与stripe_id
users表中的列相关,但是想要确认.谢谢你的帮助!
我相信(基于文档),它应该更像这样:
<?php namespace App\Http\Controllers;
use App\Models\Dashboard\Listing;
use App\User;
use Symfony\Component\HttpFoundation\Response;
use Laravel\Cashier\WebhookController as BaseController; …
Run Code Online (Sandbox Code Playgroud) 我正在使用Laravel cashier 7.0,我想在订阅成功后解雇一些方法.我希望会有一些我可以听的事件,但情况似乎并非如此(除非我错过了它们).
Stripe是我正在使用的支付提供商,如果这有所不同.(stripe-php包.)
我错过了一些明显的东西吗
我知道有很多方法可以做到这一点,但我正在寻找一个优雅的解决方案.
我有点困惑。我在我的用户(实际上是“客户”)模型上有一个简单的方法来返回用户的订阅续订日期:
public function subscriptionRenewalDate() : string
{
$subscription = $this->subscriptions()->active()->first()->asStripeSubscription();
return Carbon::createFromTimeStamp($subscription->current_period_end)->format('F jS, Y');
}
Run Code Online (Sandbox Code Playgroud)
我从刀片模板 ( {{ auth()->user()->subscriptionRenewalDate() }}
)对经过身份验证的用户调用此方法,它在本地工作正常,但是一旦我将其上传到远程登台服务器,它就会失败并显示错误:
无法声明类 App\Models\Customer,因为该名称已被使用
它指向 Customer 模型中的这一行:
class Customer extends Authenticatable
{
Run Code Online (Sandbox Code Playgroud)
奇怪的是,它不仅仅是远程登台服务器,它也是 Travis CI 失败的地方(运行 PHPUnit 测试时——这些相同的测试在本地工作正常)。
显然,这似乎是某种缓存或配置问题,但我无法理解是什么导致了此错误。
它与数据库无关,因为测试使用RefreshDatabase
. 如果我删除 ENV 变量 ( CASHIER_MODEL: App\Models\Customer
),它会因预期的“找不到模型用户”错误而失败,因此它正确获取了 ENV 变量。我尝试清除我的 Laravel 缓存 ( php artisan optimize:clear
) 和composer dump-autoload
. 这很令人困惑。
我所知道的是该错误是由asStripeSubscription()
. 如果我从方法中删除它,刀片模板加载正常(一切正常)。
需要明确的是,我可以成功(这是本地、远程和 Travis CI):
我正在尝试创建订阅,但收到错误“资源 ID 不能为空或空格”。我安装并迁移了 stripe 和 cashier。
<?php
namespace App\Http\Controllers;
require_once('../vendor/autoload.php');
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Laravel\Cashier\Cashier;
use \Stripe\Stripe;
use Exception;
use Stripe_Error;
class SubscriptionController extends Controller {
public function __construct() {
$this->middleware('auth');
}
public function retrievePlans() {
$key = \config('services.stripe.secret');
$stripe = new \Stripe\StripeClient($key);
$plansraw = $stripe->plans->all();
$plans = $plansraw->data;
foreach($plans as $plan) {
$prod = $stripe->products->retrieve(
$plan->product,[]
);
$plan->product = $prod;
}
return $plans;
}
public function showSubscription() {
$plans = $this->retrievePlans();
$user = Auth::user();
return view('subscribe', …
Run Code Online (Sandbox Code Playgroud) 我是laravel的新手,并且一直在与收银员合作开发我正在开发的网络应用程序.在我的应用程序中,用户创建他们的帐户和公司,并允许他们使用该应用程序.因为公司可以有很多用户,所以我需要收银员检查公司是否有订阅.
在使用Stripe 的收银员文档中,我已将其设置在预先不需要信用卡的位置,他们可以使用该系统14天,直到被提示输入信用卡.
到目前为止,我已经在我的公司表上成功创建了收银台列,并根据文档添加了子列表.
add_cashier_table_fields.php迁移文件:
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class AddCashierTableFields extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
//
Schema::table('companies', function ($table) {
$table->string('stripe_id')->nullable();
$table->string('card_brand')->nullable();
$table->string('card_last_four')->nullable();
$table->timestamp('trial_ends_at')->nullable();
});
Schema::create('subscriptions', function ($table) {
$table->increments('id');
$table->integer('company_id');
$table->string('name');
$table->string('stripe_id');
$table->string('stripe_plan');
$table->integer('quantity');
$table->timestamp('trial_ends_at')->nullable();
$table->timestamp('ends_at')->nullable();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
//
}
}
Run Code Online (Sandbox Code Playgroud)
然后在我的公司模型中,我按照建议添加了Billable特征. Company.php - 模型
<?php …
Run Code Online (Sandbox Code Playgroud) 我目前正在将 Laravel Cashier(使用 Stripe)集成到一个小型应用程序中,该应用程序具有以下三层帐户;
\n\n当前的流程是,当用户在注册后确认其电子邮件地址时,他们就会以免费计划(无卡)注册 Stripe。然后他们可以随时选择升级到付费计划。
\n\n我的困惑在于管理用户订阅的更改,其代码如下所示:
\n\n// Check if the user has a subscription\n$activeSubscription = $user->subscriptions()->first();\n\nif ($activeSubscription instanceof Subscription) {\n return $activeSubscription->swap($targetPlan);\n}\n\n// No active plan (new registration) - create a new one\nreturn $user->newSubscription($targetPlan, $targetPlan)->create();\n
Run Code Online (Sandbox Code Playgroud)\n\n当使用该swap
方法将用户的套餐从免费更改为基本时stripe_id
,subscriptions
会更新以反映,这很好,因为用户实质上获得了更多功能。然而,如果用户决定从高级降级到基本,则该表中没有记录表明用户应保留高级功能直到该计费周期结束,因为它会再次更新上表中的单行。
这里应该发生什么过程?如何管理此层次结构并确保正确的计划在其计费周期结束之前一直处于“活动”状态?
\n\n编辑
\n\n经过思考,我认为使用swap
应该仅用于直接交换适用的情况(例如,从每月计划到同等年度计划)。那么执行上述操作的最佳方法是什么?我的猜测是取消现有目标并订阅新目标,但是如何将后者的开始延迟到第一个周期结束?
这是完整的subscribe
方法,以防有帮助;
public function subscribe(User $user, string $targetPlan, string $token = …
Run Code Online (Sandbox Code Playgroud) 我目前正在尝试使用Laravel Cashier在React应用程序中处理Billing。使用要求3D安全的测试卡(直接从Stripes文档中提取)(4000000000003220)时,我会IncompletePayment exception
抛出异常。
如文档中所述,这显然是正常的:https : //laravel.com/docs/6.x/billing#payments-requiring-additional-confirmation
try {
$subscription = $user->newSubscription('default', $planId)
->create($paymentMethod);
} catch (IncompletePayment $exception) {
return redirect()->route(
'cashier.payment',
[$exception->payment->id, 'redirect' => route('home')]
);
}
Run Code Online (Sandbox Code Playgroud)
现在,Laravel建议我在这种情况下转到他们的“确认”页面。但是,这就是我的困惑所在。首先,我已经通过我的React应用程序中的Stripe Elements向客户询问了他们的信用卡,因此转发到从Laravel生成的服务器端页面可能很难。我想在我的React Application中优雅地处理所有这些。
在将任何内容发送到服务器之前(通过Stripe Elements javascript已经为我处理过),我还已经通过上述弹出窗口确认了该卡对3D安全有效。因此文档说明:
在付款确认页上,将提示客户再次输入其信用卡信息,并执行Stripe要求的任何其他操作,例如“ 3D Secure”确认。
似乎无论如何这都是重复。有人可以指导我在这种情况下需要做什么吗?松散地在我的React App中,我做了以下工作:
生成服务器端的意图,然后将其触发以做出反应:在计费过程中:
stripe.confirmCardSetup(
billingStatus.paymentIntent.client_secret,
{
payment_method: {
card: card,
billing_details: {
name: 'Jenny Rosen'
}
}
}
)
.then((res)=>{
console.log(res);
processPayment( res );
});
Run Code Online (Sandbox Code Playgroud)
流程Payment方法命中服务器:
var data = new FormData();
data.append( "coreId", plan.id );
data.append( "productId", plan.product_id );
data.append( "planId", …
Run Code Online (Sandbox Code Playgroud) php laravel stripe-payments laravel-cashier react-stripe-elements
laravel-cashier ×10
laravel ×9
php ×7
laravel-5 ×3
controllers ×1
laravel-5.3 ×1
mysql ×1
webhooks ×1