当前位置: 首页 > 知识库问答 >
问题:

通过带条支付意向自定义支付流传递额外的客户详细信息

伍心水
2023-03-14

我正在尝试按照本教程集成Stripe的自定义支付流:https://stripe.com/docs/payments/integration-builder

// A reference to Stripe.js initialized with your real test publishable API key.
var stripe = Stripe("pk_test..");



 var formData = {
            'email': document.getElementById("email").value,
            'cardholder-name': document.getElementById("cardholder-name").value,
            'user_id': document.getElementById("user_id").value
        };

// Disable the button until we have Stripe set up on the page
document.querySelector("button").disabled = true;
fetch("create.php", {
  method: "POST",
  headers: {
    "Content-Type": "application/json"
  },
  body: JSON.stringify(formData),

})
  .then(function(result) {
    return result.json();
  })
  .then(function(data) {
    var elements = stripe.elements();

    var style = {
      base: {
        color: "#32325d",
        fontFamily: 'Arial, sans-serif',
        fontSmoothing: "antialiased",
        fontSize: "16px",
        "::placeholder": {
          color: "#32325d"
        }
      },
      invalid: {
        fontFamily: 'Arial, sans-serif',
        color: "#fa755a",
        iconColor: "#fa755a"
      }
    };

    var card = elements.create("card", { style: style });
    // Stripe injects an iframe into the DOM
    card.mount("#card-element");

    card.on("change", function (event) {
      // Disable the Pay button if there are no card details in the Element
      document.querySelector("button").disabled = event.empty;
      document.querySelector("#card-error").textContent = event.error ? event.error.message : "";
    });

    var form = document.getElementById("payment-form");
    form.addEventListener("submit", function(event) {
      event.preventDefault();
      // Complete payment when the submit button is clicked
      payWithCard(stripe, card, data.clientSecret);
    });
  });

// Calls stripe.confirmCardPayment
// If the card requires authentication Stripe shows a pop-up modal to
// prompt the user to enter authentication details without leaving your page.
var payWithCard = function(stripe, card, clientSecret) {
  loading(true);
  stripe
    .confirmCardPayment(clientSecret, {
      payment_method: {
        card: card
      }
    })
    .then(function(result) {
      if (result.error) {
        // Show error to your customer
        showError(result.error.message);
      } else {
        // The payment succeeded!
        orderComplete(result.paymentIntent.id);
      }
    });
};

/* ------- UI helpers ------- */

// Shows a success message when the payment is complete
var orderComplete = function(paymentIntentId) {
  loading(false);
  document
    .querySelector(".result-message a")
    .setAttribute(
      "href",
      "https://dashboard.stripe.com/test/payments/" + paymentIntentId
    );
  document.querySelector(".result-message").classList.remove("hidden");
  document.querySelector("button").disabled = true;
};

// Show the customer the error from Stripe if their card fails to charge
var showError = function(errorMsgText) {
  loading(false);
  var errorMsg = document.querySelector("#card-error");
  errorMsg.textContent = errorMsgText;
  setTimeout(function() {
    errorMsg.textContent = "";
  }, 4000);
};

// Show a spinner on payment submission
var loading = function(isLoading) {
  if (isLoading) {
    // Disable the button and show a spinner
    document.querySelector("button").disabled = true;
    document.querySelector("#spinner").classList.remove("hidden");
    document.querySelector("#button-text").classList.add("hidden");
  } else {
    document.querySelector("button").disabled = false;
    document.querySelector("#spinner").classList.add("hidden");
    document.querySelector("#button-text").classList.remove("hidden");
  }
};
<form id="payment-form">
           
    <input type="hidden" id="user_id"  value="<? echo $user_id; ?>">
  <div class="form-group">
                       
                      </div>
  <label>
      
    <input id="cardholder-name" class="field is-empty" placeholder="Cardholder Name" style="height: 50px;" />
  </label>
  <label>
    <input class="field is-empty" type="email" name="email" id="email" placeholder="Your Email" style="height: 50px;" />
    
  </label>
    <label>
      <div id="card-element" class="field form-control"><!--Stripe.js injects the Card Element--></div><br><br>
      </label>
      <button id="submit">
        <div class="spinner hidden" id="spinner"></div>
        <span id="button-text">Submit Payment</span>
      </button>
      <p id="card-error" role="alert"></p>
      <p class="result-message hidden">
        Payment succeeded, see the result in your
        <a href="" target="_blank">Stripe dashboard.</a> Refresh the page to pay again.
      </p>
    </form>
require 'vendor/autoload.php';
\Stripe\Stripe::setApiKey('sk_test_...');  
header('Content-Type: application/json');

try {
  // retrieve JSON from POST body
  $json_str = file_get_contents('php://input');
  $json_obj = json_decode($json_str);

  $email = $json_obj['email'];
  
$paymentIntent = \Stripe\PaymentIntent::create([
    'amount' => 1000,
    'currency' => 'gbp',
    'description' => $user_id,
    "receipt_email" => $email,
   "payment_method_options" => [
    "card" =>   [  "installments"  => null,
                "network" => null,
                 "request_three_d_secure" => "automatic" ]
  ],
  "payment_method_types" => ["card"] ]);

  $output = [
    'clientSecret' => $paymentIntent->client_secret,
  ];
            
  echo json_encode($output);
} catch (Error $e) {
  http_response_code(500);
  echo json_encode(['error' => $e->getMessage()]);
}

电子邮件和user_id仍然没有被传递,并且在Stripe Dashboard上返回为空。但是,正如我所说的,付款是成功的。但是,我需要将它链接到一个user_id,电子邮件。来使用它。请帮帮忙。提前道谢。

共有1个答案

平俊茂
2023-03-14

在您共享的片段中,$user_id$email没有在任何地方定义,只在参数中提供。

假设您已经确认有效负载按照预期从客户端到达服务器,您是否打算设置以下内容:

$user_id = $json['user_id'];
$email = $json['email'];
 类似资料:
  • 我正在尝试使用PaymentIntent执行带区支付。我在stripe网站上读到了以下内容(链接) 在服务器上使用金额和货币创建PaymentIntent。始终要决定在服务器端(一个受信任的环境)而不是客户端收取多少费用。这就防止了恶意客户能够自行选择价格。 我不明白如何决定在服务器端收取多少费用。我的应用程序有一系列的项目要买,每一个项目都有价格应用程序是一个市场和价格清单在客户端,所以我决定多

  • 我不清楚什么时候建立秩序,以下是我想到的两种方法: 第一种方法 用户输入订单详细信息并单击“下单”。 在数据库中创建带有布尔标志is_active的Order,并将orderId发送到UI。 用户将被重定向到带区支付页面。 用户输入卡的详细信息,我们将获得计费卡的条带令牌 将orderId发送到后端的令牌。 后端使用令牌向带区计费用户发送请求,如果计费成功,则将订单标记为活动,否则向用户报告失败。

  • wx.BaaS.pay(OBJECT) OBJECT 参数说明 参数 类型 必填 参数描述 totalCost Number Y 支付总额 merchandiseDescription String Y 微信支付凭证-商品详情的内容 merchandiseSchemaID Integer N 商品表 ID,可用于定位用户购买的物品 merchandiseRecordID String N 商品记录

  • 下面的代码在javascript工作,它返回的响应的付款方式,例如'PM_1HZDPTHMQMK5H2YU0KAI****',我用这个付款方式收取付款,下面是条带的响应。 “提供的PaymentMethod以前与没有客户附件的PaymentIntent一起使用,与没有客户附件的连接帐户共享,或者与客户分离。它不能再次使用。若要多次使用PaymentMethod,必须先将其附加到客户”。 问题是,我

  • 我正在使用条纹支付。我想把资金转给其他Stripe用户。我的帐户不在美国。 有没有办法,我可以代其他用户向我的客户收费?我必须在每一笔交易上传递应用程序API密钥,所有的付款都到应用程序帐户,但我想转移一个金额给用户,并扣除一些金额:即应用程序费用到我的应用程序帐户。

  • 首先使用stripe验证信用卡,然后生成令牌并创建客户。我们将把代币而不是信用卡信息保存在数据库中,以后我们将根据代币或客户而不是信用卡信息向客户付款。 在javscript文件中,我们如何处理和? 因为我们已经使用 1-通过验证信用卡信息保存令牌,在这种情况下不涉及支付。金额/价格将为零(0)。 2-将此内标识保存在数据库中,但此内标识只使用一次,使用次数不多。如果以后再使用此内标识,将不起作用