条纹结帐 - 删除或使电子邮件字段只读
Posted
技术标签:
【中文标题】条纹结帐 - 删除或使电子邮件字段只读【英文标题】:Stripe checkout - Remove or make email field read only 【发布时间】:2020-08-26 19:11:08 【问题描述】:我正在使用https://stripe.com/docs/payments/checkout中所述的条带结帐
在服务器端,我创建了一个新的条带客户(如果还没有的话),并使用该客户 ID 创建一个结帐会话。然后使用 stripe api 重定向到结帐
stripe.redirectToCheckout(
// Make the id field from the Checkout Session creation API response
// available to this file, so you can provide it as parameter here
// instead of the CHECKOUT_SESSION_ID placeholder.
sessionId: 'CHECKOUT_SESSION_ID'
).then(function (result)
// If `redirectToCheckout` fails due to a browser or network
// error, display the localized error message to your customer
// using `result.error.message`.
);
在结帐页面(由条带托管)中,有一个预先填充但可编辑的电子邮件字段。我让客户更改了该电子邮件地址。有没有办法让我在条带结帐字段中设置电子邮件地址为只读字段?
【问题讨论】:
不幸的是,这目前是不可能的。提供客户 ID 允许 Stripe 使客户和 PaymentMethods 尽可能保持最新。这包括允许客户更改他们的电子邮件地址。虽然不完美,但您可以使用 webhook 检测代码中的这些更改,并让用户协调或验证客户对象上应该包含的内容。 stripe.com/docs/api/customers/update#update_customer-email @v3nkman 您知道 Stripe 是否在允许付款之前验证新电子邮件?在将电子邮件传递给 Stripe 结帐表单之前,我经历了自己验证的麻烦,如果 Stripe 允许他们在未经验证的情况下更改电子邮件,这将破坏所有工作。同时,我不想按照 MatiasG 的解决方案传递customer_email
,因为这会产生重复的客户。我正在尝试遵循最佳实践,这几乎就像 Stripe 的 API 不允许我这样做。
@cazort 现在可以通过条带解决。请参阅下面的答案
【参考方案1】:
一种可能的解决方法:
您可以在创建会话时使用 customer_email 代替 customer 参数。 在这种情况下,用户无法更改电子邮件字段的值。
然后,如果您需要使用 API 添加一些数据,您可以获取创建的客户并更新它:https://stripe.com/docs/api/customers/update
但是,问题是 Stripe 会在每次结账时创建一个新客户。
【讨论】:
是的,创建重复客户是我想避免的问题。我对 Stripe 感到沮丧,因为最佳做法是在 接受付款之前验证电子邮件;如果您不这样做,则可能会通过付款但没有为客户存档的任何有效电子邮件,因此您最终可能无法联系客户,这可能会产生各种问题.因此,在将其发送到结帐之前,我会先进行此验证。就像 Stripe 的设计方式让我无法遵循最佳实践。 考虑到无法使用 Stripe API 合并重复客户,这种“解决方法”尤其令人沮丧。所以我永远被杂乱的重复信息所困扰,这使得客户管理变得困难。运行 Stripe 的人几乎不知道如何实际运行数据库并生成功能性 API。这是一款已经存在多年并经历过广泛修改的产品。这些严重的缺陷和限制尚未得到解决,这一事实令人难以置信。最悲伤的部分是什么?它不像任何竞争对手做得更好。【参考方案2】:我今天收到了来自 Stripe 的电子邮件
We are disabling customers’ ability to overwrite their email address
Starting October 26, customers can no longer edit their email address after you pass it into a Checkout Session. We’ve made this change to prevent duplicative subscriptions from being created by accident for existing customers and prevent unexpected updates to the Customer object during Checkout.
这里是它的全部荣耀
【讨论】:
【参考方案3】:现在,根据Docs:
如果客户在结帐页面更改了他们的电子邮件,客户对象将更新为新的电子邮件。
【讨论】:
我无法在他们的文档中找到答案的一个问题是当客户更改电子邮件时会发生什么。 Stripe 是否会发送验证电子邮件?它是否允许在验证电子邮件之前完成付款?我在这里要避免的是付款通过但输入的电子邮件无效的情况。在我的测试中,如果我将该字段留空并让客户在结帐表单上指定它,Stripe 允许这种情况发生。这是不可接受的,所以我自己验证了电子邮件。但是现在他们允许再次更改?真是令人沮丧。 我收到了 Stripe 支持的回复,他们一字不差地说:“很抱歉,Stripe Checkout 没有预先检查电子邮件有效性的功能。在这种情况下,由于 Checkout 不支持此功能,我们无法为您提供相应的支持。”他们唯一的建议是放弃结帐页面并使用 Stripe Elements 来获得更多的手动控制。我对他们的问题是,如果允许这样的场景,他们为什么还要提供结帐表格?我认为预先构建的表单是为了让编码人员有更少的空间来搞砸,而不是阻止最佳实践。【参考方案4】:鉴于 Stripe 允许“客户”更改电子邮件 ID。我们传递给结帐表单,一个可能对您有用的想法是将您的“内部”标识符(无论是电子邮件还是其他内部用户 ID)作为元数据添加到您创建的客户,就像这样(下面的代码在 c# 中,但你明白了):
Dictionary<string, string> customerMetaData = new Dictionary<string, string>();
customerMetaData.Add("myappuserid", "useyourinternalidhere");
var customer = await cs.CreateAsync(new CustomerCreateOptions Email = "emailthat youwanttouseforcustomer", Metadata = customerMetaData );
//Now you can pass this customer when you create the session for checkout
重点是用户最终使用的任何电子邮件,您始终可以从客户对象的元数据中获取相应的内部用户 ID。
在“成功”回调中,您可以检索客户数据,然后保存返回的客户详细信息 - 包括最终用户在结帐表单中使用的条带客户 ID/电子邮件/您现在可以使用的您自己的内部 ID从客户元数据中检索——这样您就可以维护条带详细信息到您自己的内部客户详细信息的映射。
//This code is on the "success" call back (when the session id. is passed)
var sessionService = new SessionService();
var session = await sessionService.GetAsync(session_id, new SessionGetOptions Expand = new List<string> "customer" , "line_items", "subscription" );
var sessionCustomer = session.Customer;
//This sessionCustomer now has the metadata that you passed while creating the customer
//Save the Stripe ids / email id along with data retrieved from the Metadata;
//Now you have all the info you required..
当然,这个回复是延迟的 - 希望它可以帮助其他人......
【讨论】:
以上是关于条纹结帐 - 删除或使电子邮件字段只读的主要内容,如果未能解决你的问题,请参考以下文章
php [使用操作和过滤器自定义结帐字段]向电子邮件添加自定义WooCommerce结帐字段
自定义 WooCommerce 日期选择器结帐字段已保存并显示在订单和电子邮件中
使 Woocommerce (3.8.0) 管理员电子邮件包含结帐页面中的自定义字段数据