Проблема с кредитной картой для оплаты QuickBooks Online SDK

Я пытаюсь произвести оплату кредитной картой с помощью QuickBooks Online SDK, но когда я запускаю свой код, я получаю следующую ошибку:

Исходный номер кредитной карты не поддерживается. Требуется номер токенизированной кредитной карты

Вот что у меня есть. Может ли кто-нибудь объяснить, как я могу токенизировать номер карты с помощью sdk, прежде чем использовать его таким образом?

public Payment PaymentCreditCard(Order order, ServiceContext qboContextoAuth)
{
    Payment payment = new Payment();
    payment.TxnDate = Convert.ToDateTime(order.DateCreated);
    payment.TxnDateSpecified = true;
    Account depositAccount = Helper.FindOrAddAccount(qboContextoAuth, AccountTypeEnum.Bank, AccountClassificationEnum.Asset);
    payment.DepositToAccountRef = new ReferenceType()
    {
        name = depositAccount.Name,
        Value = depositAccount.Id
    };
    PaymentMethod paymentMethod = Helper.FindOrAdd<PaymentMethod>(qboContextoAuth, new PaymentMethod());
    payment.PaymentMethodRef = new ReferenceType()
    {
        name = paymentMethod.Name,
        Value = paymentMethod.Id
    };
    Customer customer = Helper.FindOrAdd<Customer>(qboContextoAuth, new Customer());
    payment.CustomerRef = new ReferenceType()
    {
        name = customer.DisplayName,
        Value = customer.Id
    };

    payment.PaymentType = PaymentTypeEnum.CreditCard;

    CreditCardPayment creditCardPayment = new CreditCardPayment();
    CreditChargeInfo creditChargeInfo = new CreditChargeInfo();
    creditChargeInfo.BillAddrStreet = order.BillingAddress;
    creditChargeInfo.CcExpiryMonth = Convert.ToInt32(order.CCExpMonth); 
    creditChargeInfo.CcExpiryMonthSpecified = true;
    creditChargeInfo.CcExpiryYear = Convert.ToInt32(order.CCExpYear);
    creditChargeInfo.CcExpiryYearSpecified = true;
    creditChargeInfo.CCTxnMode = CCTxnModeEnum.CardNotPresent;
    creditChargeInfo.CCTxnModeSpecified = true;
    creditChargeInfo.CCTxnType = CCTxnTypeEnum.Charge;
    creditChargeInfo.CCTxnTypeSpecified = true;
    //reditChargeInfo.CommercialCardCode = "Cardcode" + Helper.GetGuid().Substring(0, 5);
    creditChargeInfo.NameOnAcct = order.BillingName;
    creditChargeInfo.Number = order.CCNum;
    creditChargeInfo.PostalCode = order.BillingZip; 
    creditCardPayment.CreditChargeInfo = creditChargeInfo;

    payment.AnyIntuitObject = creditCardPayment;
    payment.TotalAmt = Convert.ToDecimal(order.TotalAmount);
    payment.TotalAmtSpecified = true;
    payment.UnappliedAmt = Convert.ToDecimal(order.TotalAmount);
    payment.UnappliedAmtSpecified = true;

    //Adding the Payment
    Payment added = Helper.Add<Payment>(qboContextoAuth, payment);

    return added;
}

Из того, что я собрал из необработанного API, мне нужно следующее:

https://developer.intuit.com/app/developer/qbpayments/docs/api/resources/all-entities/tokens

Но я, похоже, не могу найти такую ​​функциональность в SDK. У кого-нибудь есть опыт этого?


person Pedram Soheil    schedule 07.03.2019    source источник
comment
Поэтому, пройдя несколько раз с командой поддержки, они указали мне на базовый пример вызова REST в следующем репозитории GIT: github.com/IntuitDeveloper/SampleApp-Dotnet_Payments/blob/ Однако он НЕ использует SDK, поэтому теперь я Я пытаюсь узнать, поддерживает ли SDK эту функцию или нет.   -  person Pedram Soheil    schedule 09.03.2019
comment
Я только что получил подтверждение, что их SDK на сегодняшний день 14.03.19 НЕ имеет способа сгенерировать токен платежной карты.   -  person Pedram Soheil    schedule 14.03.2019


Ответы (1)


Вот решение этой проблемы на сегодня (14.03.19):

public string getCardToken()
{
    string cardToken="";
    JObject jsonDecodedResponse;
    string cardTokenJson = "";
    string cardTokenEndpoint = "quickbooks/v4/payments/tokens";
    string uri= paymentsBaseUrl + cardTokenEndpoint;

    string cardTokenRequestBody = "{\"card\":{\"expYear\":\"2020\",\"expMonth\":\"02\",\"address\":{\"region\":\"CA\",\"postalCode\":\"94086\",\"streetAddress\":\"1130 Kifer Rd\",\"country\":\"US\",\"city\":\"Sunnyvale\"},\"name\":\"emulate=0\",\"cvc\":\"123\",\"number\":\"4111111111111111\"}}";

    // send the request (token api call does not requires Authorization header, rest all payments call do)
    HttpWebRequest cardTokenRequest = (HttpWebRequest)WebRequest.Create(uri);
    cardTokenRequest.Method = "POST";           
    cardTokenRequest.ContentType = "application/json";
    cardTokenRequest.Headers.Add("Request-Id", Guid.NewGuid().ToString());//assign guid

    byte[] _byteVersion = Encoding.ASCII.GetBytes(cardTokenRequestBody);
    cardTokenRequest.ContentLength = _byteVersion.Length;
    Stream stream = cardTokenRequest.GetRequestStream();
    stream.Write(_byteVersion, 0, _byteVersion.Length);
    stream.Close();

    // get the response
    HttpWebResponse cardTokenResponse = (HttpWebResponse)cardTokenRequest.GetResponse();
    using (Stream data = cardTokenResponse.GetResponseStream())
    {
        cardTokenJson= new StreamReader(data).ReadToEnd();
        jsonDecodedResponse = JObject.Parse(cardTokenJson);
        if (!string.IsNullOrEmpty(jsonDecodedResponse.TryGetString("value")))
        {
            cardToken = jsonDecodedResponse["value"].ToString();
        }
    }
    return cardToken;
}

Они могут добавить опцию SDK, чтобы сделать то же самое когда-нибудь, но на сегодняшний день она недоступна!

person Pedram Soheil    schedule 14.03.2019