php - 条卡处理
问题描述
我希望这里有人可以关注我的流程,看看我做事是否正确,如果没有,建议我在哪里改进。
我的场景很简单:
第1步
- 客户使用电子邮件地址和密码登录,注意这可能是他们的第一次访问,也可能是回访
- 向客户展示产品列表,进行选择,单击按钮付款
- 根据 Stripe 指南并使用 Stripe.js,向客户提供一份抄送表格。
- 提交后,详细信息将发送到 Stripe,并收到我将其传递给我的 PHP 脚本的响应。
我相信此时我有一个响应 ID 和一个源对象,其中包含抽象的卡片详细信息以及卡片 ID。
第2步
我连接到 Stripe API:
Stripe::setApiKey($stripe_secret_key); // note this is a Connect account
Stripe::setApiVersion('2018-05-21');
我检查我是否已经为此电子邮件地址存储了 Stripe 客户 ID。如果是这样,我使用它。否则,我创建一个 Stripe 客户:
$customer = Stripe_Customer::create(
[
'description' => $u->user_email,
'email'=>$u->user_email
], $stripe_access_token
);
$customer_id = $customer->id;
然后我获取该客户的 Stripe 对象:
$customer = Stripe_Customer::retrieve($customer_id);
然后我使用响应 ID 获取源对象
$source = Stripe_Token::retrieve($form_response_id);
第 3 步
我想确保费用是从客户现在使用的卡中扣除的,无论他们之前是否访问过,或者之前是否使用过同一张卡。所以我将此来源保存给客户:
$customer->sources->create(['source' => $source->id]);
$customer->save();
...而且,虽然最新的来源应该是默认来源(即使用的那个),但我确保它:
$customer->default_source = $source->card->id;
$customer->save();
第4步
我做了一些本地工作来获取费用描述、计算申请费用等。我把它完全作为一个费用数组,使用我从 Stripe.js 收到的初始卡 ID 作为“源”参数
$charge = [
'customer' => $customer->id,
'source' => $transaction_card_id,
'amount' => $total_gross_received_cents,
'currency' => 'EUR',
'description' => $transaction_desc,
'application_fee' => $application_fee
];
$charge_obj = Stripe_Charge::create($charge, $stripe_access_token);
$charge_id = $charge_obj->id;
然后我将其保存$charge_id
在我的交易记录中。
问题
我最大的担忧围绕着第 3 步——确保接受和使用正确的卡。注意:
- 我不存储任何卡信息(我也不想),因此每笔交易都需要客户输入卡详细信息并由 Stripe.js 抽象。
- 我之前在更新卡时遇到过麻烦——即数量相同,但有效期不同。我想确保这不会发生。
我是否可以每次都将卡片保存为客户的新来源,即使它已经存在并已分配给他们?它似乎正在工作,并覆盖重复的源记录,但我想确定。
显然,我对推出一些我觉得我还没有完全理解的东西感到紧张,所以如果有人能给我一个大拇指或大拇指向下,我将非常感激。
解决方案
这是我的笔记:
卡信息需要安全地存储在受信任的支付网关(例如:Stripe、PayPal)的一侧。不存储敏感的信用卡信息是PCI 合规性要求之一。
就您而言,我认为您可以使用令牌。或者创建一个客户并保存您的客户 ID 以供以后使用。
https://stripe.com/docs/saving-cards
https://stripe.com/docs/recipes/updating-customer-cards
https://stackoverflow.com/a/18377973/5179786
推荐阅读
- c# - 日期格式的正则表达式
- python - 从 QTableView 单元格 DisplayRole 填充上下文菜单
- ios - Alamofire 根据输入更改多部分/表单数据编码
- javascript - AttributeError: 'list' 对象没有使用 Selenium 和 Python 的属性 'click'
- ios - 带有搜索栏动画故障的大标题
- c# - C# MVVM,等待一些事件触发并继续更新 UI
- javascript - JavaScript 中的 `async/await` 中的 `return timer` 和 `clearInterval(timer)` 有什么区别?
- java - 使用 testrail api 在 java 中创建测试运行
- opengl - OpenGL 的自定义混合方程(着色器)
- python - 我的python项目中的字符串浮动错误我很难过