2

我们有一个接受 Stripe 付款的网页,一旦付款完成,Stripe 可以调用我们服务器上的 webhook。

此时,我们可以将订单标记为完成并完成任何其他附加任务。

我们如何让订单网页更新/将用户移动到订单完成?

我们是否应该始终在 AJAX 中访问服务器以检查它现在是否已完成,或者是否有更好的方法来执行此操作。

4

3 回答 3

4

问:我们如何让订单网页更新/将用户移动到订单完成?

大多数支付引擎会将支付会话重定向到您选择的带有结果代码的 URL 或每个结果代码的不同 URL。这些通常可以在发出请求时进行配置,也可以在一般配置中针对整个站点进行配置。实际付款不应依赖这些结果,因为这是网络挂钩的工作。他们可以得到足够的信任,让您的网站显示一般的成功/失败错误消息,并让用户继续做任何事情。


Stripe 也允许这样做,您可以指定一个success_url(或successUrl在客户端集成)。

有关如何将此 URL 传递给请求的信息,请参阅在您的服务器上创建结帐会话。您还可以包含一个cancel_url. 请参阅下面代码示例中的最后 2 个参数:

curl https://api.stripe.com/v1/checkout/sessions \
  -u sk_test_4eC39HqLyjWDarjtT1zdp7dc: \
  -d payment_method_types[]=card \
  -d line_items[][name]=T-shirt \
  -d line_items[][description]="Comfortable cotton t-shirt" \
  -d line_items[][images][]="https://example.com/t-shirt.png" \
  -d line_items[][amount]=500 \
  -d line_items[][currency]=usd \
  -d line_items[][quantity]=1 \
  -d success_url="https://example.com/success" \
  -d cancel_url="https://example.com/cancel"

另请参阅结帐购买履行

当您的客户使用 Checkout 成功完成付款或启动订阅时,Stripe 会将他们重定向到您在 success_url 参数中指定的 URL(或客户端集成中的 successUrl)。通常,这是您网站上的一个页面,用于通知您的客户他们的付款已成功。

并且如上所述,如果付款成功,请不要将此作为实际指标。您应该为此使用网络挂钩。

不要依赖重定向到success_url单独来完成购买,因为:

  • 恶意用户无需付费即可直接访问success_url您的商品或服务。
  • success_url客户可能并不总是在成功付款后到达。他们可能会在重定向发生之前关闭浏览器选项卡。
于 2019-08-16T11:40:56.547 回答
0

好问题,您可以处理条带支付结果以在您的页面上产生新的效果

var cardholderName = document.getElementById('cardholder-name');
var cardButton = document.getElementById('card-button');
var clientSecret = cardButton.dataset.secret;

cardButton.addEventListener('click', function(ev) {
  stripe.handleCardPayment(
    clientSecret, cardElement, {
      payment_method_data: {
        billing_details: {name: cardholderName.value}
      }
    }
  ).then(function(result) {
    if (result.error) {
      // Display error.message in your UI.
    } else {
      // The payment has succeeded. update your front-end
    }
  });
});

我们是否应该始终在 AJAX 中访问服务器以检查它现在是否已完成,或者是否有更好的方法来执行此操作。

这里有一个 Ajax 示例,但更好的方法是 fetch api。你可以在这里找到所有细节

于 2019-08-21T07:01:08.120 回答
0

我们是否应该始终在 AJAX 中访问服务器以检查它现在是否已完成,或者是否有更好的方法来执行此操作。

不,你不应该,是的,有更好的方法。如果您没有处理事务的 asp.net 服务器,回调页面/webhook 将是有意义的,但在这里它们不是必需的。

我们如何让订单网页更新/将用户移动到订单完成?

条带支付过程只需几秒钟即可响应状态码。它与将用户定向到 Paypal 站点然后返回您的站点的 Paypal 不同。

该过程应该进行:

  1. 用户将他们的付款信息输入到您页面上的条带生成元素中。

  2. Stripe 为您的前端 javascript 提供了一个表示客户支付数据的令牌。

  3. 您使用 ajax 甚至是常规的老式表单请求将该信息发布到您的服务器。

  4. 处理调用的服务器端脚本使用asp.net 条带库来发送付款并获得如下所示的回复。
  5. 根据需要将事务结果保存到您的数据库中。

    一个。如果条带响应包括“状态”:“成功”,那么您可以为客户提供带有已付款收据的新页面。

    湾。如果由于某种原因失败,您可以重新加载支付页面并使用“failure_message”告诉客户为什么他们的卡不好。

让用户等到 stripe 回复有关付款成功或失败的消息并发送给他,因为它只需要一秒钟。

    /* SAMPLE RESPONSE FROM STRIPE
    {
    "id": "ch_1D658SDJ46dzUiasdfsdfaDq",
    "object": "charge",
    "amount": 2125,
    "amount_refunded": 0,
    "application": null,
    "application_fee": null,
    "balance_transaction": "txn_1D658SDJ46dzUilftNXRCz64",
    "captured": true,
    "created": 1565431460,
    "currency": "usd",
    "customer": null,
    "description": "856 addresses",
    "destination": null,
    "dispute": null,
    "failure_code": null,
    "failure_message": null,
    "fraud_details": {},
    "invoice": null,
    "livemode": false,
    "metadata": {},
    "on_behalf_of": null,
    "order": null,
    "outcome": {
      "network_status": "approved_by_network",
      "reason": null,
      "risk_level": "normal",
      "seller_message": "Payment complete.",
      "type": "authorized"
    },
    "paid": true,
    "receipt_email": null,
    "receipt_number": null,
    "refunded": false,
    "refunds": {
       "object": "list",
       "data": [],
       "has_more": false,
       "total_count": 0,
       "url": "/v1/charges/ch_1D658SDJ46dzUilfalFFraDq/refunds"
     },
     "review": null,
     "shipping": null,
     "source": {
       "id": "card_1D658RDJ46dzUilfbkLSOIwp",
       "object": "card",
       "address_city": "test",
       "address_country": "US",
       "address_line1": "123 test",
       "address_line1_check": "pass",
       "address_line2": "",
       "address_state": null,
       "address_zip": "32121",
       "address_zip_check": "pass",
       "brand": "Visa",
       "country": "US",
       "customer": null,
       "cvc_check": "pass",
       "dynamic_last4": null,
       "exp_month": 12,
       "exp_year": 2033,
       "fingerprint": "fNMgYIntTkOnLVzk",
       "funding": "credit",
       "last4": "4242",
       "metadata": {},
       "name": "Test",
       "tokenization_method": null
    },
    "source_transfer": null,
    "statement_descriptor": null,
    "status": "succeeded",
    "transfer_group": null
    }
于 2019-08-23T03:34:55.810 回答