在 Braintree Net 如何生成 PaymentNonce

问题描述

我工作的公司有一个旧的 WinForms 应用程序,销售和客户服务部使用它来帮助客户创建订单,而不是客户在网站上创建订单。我们想将我们的 CC 支付网关转换为 Braintree,但我无法弄清楚如何创建一个支付 Nonce,以便我可以使用 CC 信息创建一个支付方式。有人成功将 Braintree SDK 集成到 WinForms 项目中吗?

我尝试创建交易请求,但没有 PaymentNonce。我只使用了客户 ID,该 ID 使用了该客户的认付款方式。如果

  • 有一位客户
  • 一个认的付款方式

但是,如果我想为不存在的客户创建交易,或者客户没有用户提供的信用卡的付款方式,那么我很难过。我不知道如何提供 CC 信息以及在哪个对象中传递卡数据(编号、到期日期、CVV),由于其保护级别,Braintree.CreditCard 对象无法访问,因此这不是如何传递它. ?‍♂️

以下是我尝试传递信用卡信息的交易:

  transaction = new TransactionRequest()
            {
                Amount = paymentData.Amount,CustomerId = customerId,discountAmount = paymentData.Coupondiscount + paymentData.discAmount,ShippingAmount = paymentData.ShipCharge,LineItems = lineItems.ToArray(),TaxAmount = paymentData.Taxes,TaxExempt = paymentData.Taxes == 0 ? true : false,BillingAddress = new AddressRequest()
                {
                    Company = address.Company,FirstName = paymentData.FirstName,LastName = paymentData.LastName,Locality = address.City,Region = address.State,PostalCode = address.Zip,StreetAddress = address.Address1,ExtendedAddress = address.Address2,CountryCodeAlpha2 = address.CountryCode
                },Options = new TransactionoptionsRequest()
                {
                    SubmitForSettlement = paymentData.TransType == "A" ? false : true
                },Braintree.CreditCard = new Braintree.CreditCard()
                {
                    CardholderName = paymentData.AccountName,Cvv = paymentData.CVV,ExpirationMonth = paymentData.ExpMonth,ExpirationYear = paymentData.ExpYear,UniqueNumberIdentifier = paymentData.AccountNumber
                },};

            var customFields = new Dictionary<string,string>();
            customFields.Add("cartid",paymentData.IsCart ? paymentData.Id.ToString() : "0");
            customFields.Add("orderid",paymentData.IsCart ? "0" : paymentData.Id.ToString());
            customFields.Add("userid",paymentData.CustId);
            transaction.CustomFields = customFields;
  

            Result<Braintree.Transaction> result = GetGateway().Transaction.Sale(transaction);

解决方法

要使用 Braintree SDK 创建信用卡交易而不使用 DropIn 或托管字段,您需要先创建信用卡对象,然后再创建交易。

//create the credit card
                var creditCardRequest = new CreditCardRequest
                {
                    CustomerId = customerId,Number = paymentData.AccountNumber,CardholderName = paymentData.AccountName,ExpirationMonth = paymentData.ExpMonth.ToString("d2"),ExpirationYear = paymentData.ExpYear.ToString(),CVV = paymentData.CVV,Options = new CreditCardOptionsRequest()
                    {
                        FailOnDuplicatePaymentMethod = false,VerifyCard = true
                    },};
                Result<Braintree.CreditCard> result = GetGateway().CreditCard.Create(creditCardRequest);
                if (result.IsSuccess())
                    creditCard = result.Target;




 transaction = new TransactionRequest()
                {
                    Amount = paymentData.Amount,CustomerId = customerId,PaymentMethodToken = creditCard.Token,DiscountAmount = paymentData.CouponDiscount + paymentData.DiscAmount,ShippingAmount = paymentData.ShipCharge,LineItems = lineItems.ToArray(),TaxAmount = paymentData.Taxes,TaxExempt = paymentData.Taxes == 0 ? true : false,BillingAddress = new AddressRequest()
                    {
                        Company = address.Company,FirstName = paymentData.FirstName,LastName = paymentData.LastName,Locality = address.City,Region = address.State,PostalCode = address.Zip,StreetAddress = address.Address1,ExtendedAddress = address.Address2,CountryCodeAlpha2 = address.CountryCode
                    },Options = new TransactionOptionsRequest()
                    {
                        SubmitForSettlement = paymentData.TransType == "A" ? false : true
                    },TransactionSource = "moto"
                };

                var customFields = new Dictionary<string,string>();
                customFields.Add("cartid",paymentData.IsCart ? paymentData.Id.ToString() : "0");
                customFields.Add("orderid",paymentData.IsCart ? "0" : paymentData.Id.ToString());
                customFields.Add("userid",paymentData.CustId);
                transaction.CustomFields = customFields;
      

                Result<Braintree.Transaction> result = GetGateway().Transaction.Sale(transaction);
                if (result.IsSuccess())
                { //do something here}