问题描述
我工作的公司有一个旧的 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}