【问题标题】:Blazer Server: Setup Braintree Payment Javascript and .NET SDK and APIBlazer 服务器:设置 Braintree Payment Javascript 和 .NET SDK 和 API
【发布时间】:2021-05-24 09:52:43
【问题描述】:

我找不到任何使用 Blazer Server 应用程序设置 Braintree Javascript.NET SDK 的示例。

Brainstree 工作流程是在客户端收集用户信用卡数据,然后返回一个令牌,Braintree 将其称为 Nonce。这样,用户的信用卡数据就不会通过或存储在您的应用程序中。您将 nonce 传递给服务器,然后由服务器处理付款。

我不确定如何使 javascript 与 Blazer 服务器一起工作,然后在服务器端需要做什么。

【问题讨论】:

    标签: blazor blazor-server-side braintree


    【解决方案1】:

    我能够使用 Braintree 沙盒进行支付流程。

    示例位于:https://github.com/MSIH/Blazor-Braintree-Example/

    1. 将 Braintree javascript 库添加到 _Host.cshtml 文件中
    <!-- braintree-->
    <script type="text/javascript" src="https://js.braintreegateway.com/web/dropin/1.29.0/js/dropin.js">
    </script>
    
    </head>
    
    1. 将 Braintree 函数添加到 _Host.cshtml 文件中(这应该放在单独的 js 文件中)
    <script>
    window.brainstreePayment = (clientToken, dotNetObject) => {
        //alert(clientToken);
        var button = document.querySelector('#submit-button');
        braintree.dropin.create({
            authorization: clientToken,
            selector: '#dropin-container'
        }, function (err, instance) {
            button.addEventListener('click', function () {
                instance.requestPaymentMethod(function (requestPaymentMethodErr, payload) {
                    if (requestPaymentMethodErr) {
                        // No payment method is available.
                        // An appropriate error will be shown in the UI.
                        console.error(requestPaymentMethodErr);
                        return;
                    }      
                    dotNetObject.invokeMethodAsync('MakePayment', payload.nonce);
                });
            })
        });
    }
    </script>
    </body>
    
    1. 创建 Payment.razor 文件
    @page "/PaymentSubmit/"
    
    @using Braintree;
    @using Microsoft.Extensions.Logging;
    @inject IJSRuntime JSRuntime;
    @inject ILogger<Counter> logger;
    
    
    <label for="Amount">In the Amount:</label>
    <input id="Amount" name="Amount" type="tel" min="1" @bind="@Amount" />
    <br>
    <br>
    
    <div id="dropin-container"></div>
    
    <div id="dropin-wrapper">
        <div id="checkout-message"></div>
        <div id="dropin-container"></div>
        <button id="submit-button">Pay</button>
    </div>
    <br>
    PaymentTransactionId: @PaymentTransactionId
    <br>
    
    @code {
    
       
        public string ClientToken { get; set; }   
        public string Nonce { get; set; }   
        public string Amount { get; set; }    
        public string PaymentTransactionId { get; set; }    
    
        public BraintreeGateway gateway = new BraintreeGateway
        {
            Environment = Braintree.Environment.SANDBOX,
            MerchantId = "GetFromBraintree",
            PublicKey = "GetFromBraintree",
            PrivateKey = "GetFromBraintree"
        };
    
    
        protected override async Task OnAfterRenderAsync(bool firstRender)
        {
            if (firstRender)
            {
                ClientToken = gateway.ClientToken.Generate();
                var dotNetReference = DotNetObjectReference.Create(this);        
                await JSRuntime.InvokeVoidAsync("brainstreePayment", ClientToken, dotNetReference);
            }
        }
    
        [JSInvokable("MakePayment")]
        public void MakePayment(string Nonce)
        {
    
            logger.LogWarning(Nonce);
            logger.LogWarning(Amount);
            decimal newAmount = Convert.ToDecimal(Amount);
            var request = new TransactionRequest
            {
                Amount = newAmount,
                PaymentMethodNonce = Nonce,
                Options = new TransactionOptionsRequest
                {
                    SubmitForSettlement = true
                }
            };
    
            Result<Transaction> result = gateway.Transaction.Sale(request);
            if (result.IsSuccess())
            {
                Transaction transaction = result.Target;
                logger.LogWarning("transaction success");
                PaymentTransactionId = transaction.Id;
                StateHasChanged();
    
                @*redirect*@
            }
            else if (result.Transaction != null)
            {
                @*redirect*@
                logger.LogWarning("transaction null");
            }
            else
            {
                string errorMessages = "";
                foreach (ValidationError error in result.Errors.DeepAll())
                {
                    errorMessages += "Error: " + (int)error.Code + " - " + error.Message + "\n";
                }
                logger.LogWarning("transaction error");
                logger.LogWarning(errorMessages);
            }
        }
    }
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-18
      • 2023-02-19
      • 2017-03-31
      • 2019-03-31
      • 1970-01-01
      • 1970-01-01
      • 2018-01-04
      • 1970-01-01
      相关资源
      最近更新 更多