- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
背景:
我想做的是建立一个市场,客户可以在其中获得卖家的服务,确切地说,该项目是一个 MERN Stack Travel 应用程序。我希望客户在希望获得服务(例如酒店房间)时支付平台(与 Stripe 连接的网站)。客户在规定的时间内入住酒店,当他退房时,平台会保留部分客户金额作为申请费,并将其余部分转给服务提供商,在本例中为酒店。
当前努力:
我使用 STRIPE CONNECT
来实现所需的功能。
(注意
:你们不需要看到下面的所有代码,只要标题和描述就能让你们了解我做了什么以及我想问什么,但请务必阅读问题部分)
当卖家在我的网站上注册时,我为他创建了一个Connect account
创建连接帐户
const express = require("express");
const router = express.Router();
router.post("/createAccount", async (req, res) => {
const { name, email } = req.body; //Data Passed from the FrontEnd
stripe.accounts.create(
{
type: "custom",
country: "US",
email: email,
requested_capabilities: ["card_payments", "transfers"],
},
function (err, account) {
res.json({ account: account });
}
);
});
当卖家在登录卖家门户
后提供所需的其余详细信息(包括银行账户)时,我创建一个bank_account
,更新已创建的Connect Account
并将 bank_account
与 Connect Account
链接(希望这在某种程度上有意义)
创建银行账户
router.post("/createBankAccount", async (req, res) => {
const { account_holder_name, routing_number, account_number } = req.body;
stripe.tokens.create(
{
bank_account: {
country: "US",
currency: "USD",
account_holder_name,
account_holder_type: "individual",
routing_number,
account_number,
},
},
function (err, token) {
res.send(token);
}
);
});
更新帐户:
router.post("/updateAccount", async (req, res) => {
const {
AccountID,
Day,
Month,
Year,
first_name,
last_name,
email,
BankAccountID,
} = req.body;
const FrontFilePath = fs.readFileSync("PathToFileHere");
const FrontPhotoIDUpload = await stripe.files.create({
file: {
data: FrontFilePath,
name: "FrontPhotoID.jpg",
type: "application.octet-stream",
},
purpose: "identity_document",
});
const BackFilePath = fs.readFileSync("PathToFileHere");
const BackPhotoIDUpload = await stripe.files.create({
file: {
data: BackFilePath,
name: "BackPhotoID.jpg",
type: "application.octet-stream",
},
purpose: "identity_document",
});
stripe.accounts.update(
AccountID,
{
business_type: "individual",
individual: {
dob: { day: Day, month: Month, year: Year },
first_name: first_name,
last_name: last_name,
id_number: "006-20-8311",
phone: "605-628-6049",
address: {
city: "Half Way",
line1: "2467 Twin House Lane",
postal_code: "65663",
state: "MO",
},
email,
ssn_last_4: "8311",
verification: {
document: {
front: FrontPhotoIDUpload.id,
back: BackPhotoIDUpload.id,
},
},
},
business_profile: {
mcc: "4722",
url: "http://www.baoisne.com",
},
tos_acceptance: {
date: Math.floor(Date.now() / 1000),
ip: req.connection.remoteAddress,
},
},
function (err, account) {
console.log(err);
console.log(account);
}
);
//Connect External Account
stripe.accounts.createExternalAccount(
AccountID,
{
external_account: BankAccountID,
},
function (err, bankAccount) {
console.log(err);
res.send(bankAccount);
}
);
});
然后,当客户提供他的帐户详细信息时,我会向客户收费,保留一些钱作为申请费,并将其余部分转移到 Service Providers Connect 帐户。
向客户收费
router.post("/charge", async (req, res) => {
const { TokenID, CustomerID, Amount, AccountID } = req.body;
let PaymentAmount = Amount * 100;
let application_fee_amount = 400;
try {
const payment = await stripe.paymentIntents.create({
amount: PaymentAmount,
currency: "USD",
description: "We did it boss",
payment_method_data: {
type: "card",
card: {
token: TokenID,
},
},
receipt_email: "abdullahabid427@gmail.com",
customer: CustomerID,
application_fee_amount,
transfer_data: {
destination: AccountID,
},
confirm: true,
});
return res.status(200).json({
confirm: "Payment Succeeded",
});
} catch (error) {
console.log(error);
return res.status(400).json({
message: error.message,
});
}
});
通过执行上述程序,创建连接账户并将金额转入连接账户。
Issue
上述程序虽然工作正常,但它会在客户收费后直接将金额转移到连接的服务提供商帐户中,我希望客户向平台付款,在服务提供商提供服务后,平台支付给服务提供商,我考虑删除
application_fee_amount,
transfer_data: {
destination: AccountID,
}
Charge
或 Stripe.paymentIntents.create
端点中的上述参数,在服务提供商完成其服务后,我使用 Stripe Transfer API 转账金额
router.post("/transfer", async (req, res) => {
try {
console.log("TRANSFER=");
const { AccountID, amount } = req.body;
const transfer = await stripe.transfers.create({
amount,
currency: "USD",
destination: AccountID,
});
res.send(transfer);
} catch (error) {
res.send(error);
}
});
这里的问题是传输端点返回“您的目标帐户需要至少启用以下功能之一:传输、legacy_payments”,我已经在 Stripe 仪表板和功能部分 Card_Payment
和 Transfers
都设置为 Active,而且 Payments 和 Payouts 都已启用并且连接帐户的状态为“Complete”
因此,如果有人能指出正确的方向,我将不胜感激,干杯 :)
最佳答案
好的 - 我们同意 Stripe 按预期工作。您收到错误消息是因为您从付款意向创建函数中删除了目标账户 ID。这就是问题所在,在您的标题Charge Customer 下。
让我们看一下:(简化版)
const payment = await stripe.paymentIntents.create({
amount: PaymentAmount,
currency: "USD",
...
customer: CustomerID,
application_fee_amount,
transfer_data: {
destination: AccountID,
},
confirm: true,
});
最后一个属性confirm: true
相当于在同一个调用中创建和确认支付意图。默认值为 false
- 使用新创建的支付意向的状态将为 requires_confirmation
。准备就绪后,您可以按照以下方式确认付款意向:
const confirmedPayment = await stripe.paymentIntents.confirm(
'payment_intent_id',
{payment_method: 'card'},
function(err, paymentIntent) {
}
});
对出错的一些一般性评论
当付款人在线为某些商品付款时,应用程序开发人员有责任实现发送和接收金钱和商品的逻辑:可以是预付费、后付费或部分两者。没有逻辑是万无一失的。一般来说,如果我们担心客户利用我们的付款政策,我们可以要求所有付款方预付所有费用,并包括公平的退款政策。在这种情况下,Stripe 支持付款意向的退款,但更重要的是:它会跟踪付款状态。
当支付意向创建但未确认时,状态为requires_confirmation
。那里不会出错。但在付款意向得到确认后,状态将为processing
- 这可能需要几天时间。您可以随时决定取消付款。但如果一切顺利,状态将更改为 成功
,这意味着资金已到达目标帐户。但如果由于某种原因支付失败,状态将返回到requires_payment_method
。即使在这种情况下,也无需创建新的付款或转帐对象。您可以随时通过调用 stripe.retrievePaymentIntent(clientSecret)
检索支付意向并检查状态。但在我看来,使用配置为接收状态更改事件的 webhook 监视状态更改要容易得多。即使在状态更改时没有立即采取任何操作,我们也可以将状态存储在可用的数据库中。
根据经验,我发现付款失败是多么普遍。这并不意味着任何一方都在进行欺诈,但这确实意味着该应用程序应该准备好处理这两种情况。添加到 webhook 配置的事件是 payment_intent.succeeded
和 payment_intent.payment_failed
。这些事件的处理方式因每个应用程序而异。
关于node.js - 无法将金额转移到 Connect Stripe 帐户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62095187/
我正在尝试创建一个可以识别金额(美元)的正则表达式。问题是数据是在扫描的 PDF 文件上通过 OCR 生成的,因此数据不精确: $可以用S表示 .可以表示为, 1可以用l或I表示 5可以用S表示 例子
在写输入用到input的时候,经常出现以下几种情况: 只能输入某。栗子:只能输入数字,只能输入字母(大写,小写)只能输入某固定格式。栗子:只能输入金额,只能输入小数且最多保留2位不能输入某。栗子:
我们正在开发旅游网站,用于预订航类、酒店、汽车等。它是基于产品的软件。客户(购买我们软件的)将成为“主要代理机构”。他的总交易将以 INR(印度卢比货币)为单位。航类、酒店或汽车预订总额仅以“印度卢比
以下操作有什么区别吗? (将当前日期提前 160 天) Calendar c = Calendar.getInstance(); c.add(Calendar.DAY_OF_WEEK,
假设有 5 个桶 (1 - 5),并且为每个桶分配一个(整数)值。例如 > bucket = 1:5 > value = c(14, 12, 9, 20, 7) > data.frame(bucket
我正在尝试使用 MYSQL 查询对每月和每年以及该月的总收入进行分组,我尝试了多次,但似乎总是出错。 我当前的查询: Month Year
我正在创建一个 PHP 表单,其中包含客户的信息和他们想要花费的金额,当点击提交按钮时,详细信息将发送到我的电子邮件地址。 这就是我遇到的问题。然后我想向他们发送指向 PayPal 帐户的链接以完成购
我想获取总交易量超过50000的用户 SELECT sum(tractions.amount) as total , user_id FROM `tractions` where `total`
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
我有一段固定的文本,每次文本进入滚动的 div 时我都会尝试添加不同的类。我用起来没问题。但是如果我向固定文本添加偏移量,例如 top: 400px 我需要在 JS 中抵消这个偏移量。但我似乎无法弄清
我有下表 create table supplier_paid_details( id bigint(10) NOT NULL AUTO_INCREMENT, payment_mode
我正在练习 java 银行帐户中的一些简单任务,需要有关代码块的建议,如何编写?这是一个例子,如果用户输入字符串或一些字母而不是数字来打印“请输入数字”,如何输入 Else if block amou
我正在使用 angularJS 在 mvc-5 中创建一个基于 Web 的应用程序,我在表中得到了金额总和 Total: {{totalAmount}} 我像这样从 Controller 获取金额 $
我的数据就是这样返回的。我需要返回列表中的所有值,确保时间格式和票价金额按照我的解释进行纠正。我想删除票价中的逗号以及出发和到达中的 AM & PM。提前谢谢了。因为大约有 3 个航类代码,总共有 1
我想计算一下 数量 * 比率 = 金额 金额 - 折扣 + 税费 = 账单金额 账单金额+四舍五入= Netty 我知道这很容易完成,但问题是任何人都可以通过检查元素更改该值。为了阻止这种情况,我必须
基本上,我正在 LINQ 中寻找一种方法来选择列表中的第一个(比如说 3 个)分组对象。 例如,列表可能包含: {“AAA”、“AAA”、“AAA”、“AAA”、“BBB”、“BBB”、“CCC”、“
我正在尝试按类别对金额进行求和,但存在基于引用编号的重复金额,并且我只想为每个引用包含 1 个金额。大约有100K个不同的引用号,全线有4个差异量。 我正在分析的数据如下所示: reference |
我有一个表,每个 user_id 有很多行 我正在尝试按 user_id 对行进行分组并对它们的金额进行求和 这是表结构 Name Type Collation Attributes
如何查询实际金额 1.00 以内的金额列? 例如,如果 AmountPaid = 7.75,我想返回 Amount 在 6.75 - 8.75 之间的所有结果。 我知道我忽略了一些简单的事情,但到目前
我是 C# 的新手,正在为我尝试创建的程序而苦苦挣扎。我希望我能尽我所能提出这个问题。根据我的任务,我们将在 Visual Basic 中创建一个用于创建帐户的 Windows 窗体。出于我的问题的目
我是一名优秀的程序员,十分优秀!