stripe_card.cpp 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. /*
  2. This file is part of Telegram Desktop,
  3. the official desktop application for the Telegram messaging service.
  4. For license and copyright information please follow this link:
  5. https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
  6. */
  7. #include "stripe/stripe_card.h"
  8. #include "stripe/stripe_decode.h"
  9. namespace Stripe {
  10. namespace {
  11. CardBrand BrandFromString(const QString &brand) {
  12. if (brand == "visa") {
  13. return CardBrand::Visa;
  14. } else if (brand == "american express") {
  15. return CardBrand::Amex;
  16. } else if (brand == "mastercard") {
  17. return CardBrand::MasterCard;
  18. } else if (brand == "discover") {
  19. return CardBrand::Discover;
  20. } else if (brand == "jcb") {
  21. return CardBrand::JCB;
  22. } else if (brand == "diners club") {
  23. return CardBrand::DinersClub;
  24. } else {
  25. return CardBrand::Unknown;
  26. }
  27. }
  28. CardFundingType FundingFromString(const QString &funding) {
  29. if (funding == "credit") {
  30. return CardFundingType::Credit;
  31. } else if (funding == "debit") {
  32. return CardFundingType::Debit;
  33. } else if (funding == "prepaid") {
  34. return CardFundingType::Prepaid;
  35. } else {
  36. return CardFundingType::Other;
  37. }
  38. }
  39. } // namespace
  40. Card::Card(
  41. QString id,
  42. QString last4,
  43. CardBrand brand,
  44. quint32 expMonth,
  45. quint32 expYear)
  46. : _cardId(id)
  47. , _last4(last4)
  48. , _brand(brand)
  49. , _expMonth(expMonth)
  50. , _expYear(expYear) {
  51. }
  52. Card Card::Empty() {
  53. return Card(QString(), QString(), CardBrand::Unknown, 0, 0);
  54. }
  55. Card Card::DecodedObjectFromAPIResponse(QJsonObject object) {
  56. if (!ContainsFields(object, {
  57. u"id",
  58. u"last4",
  59. u"brand",
  60. u"exp_month",
  61. u"exp_year"
  62. })) {
  63. return Card::Empty();
  64. }
  65. const auto string = [&](QStringView key) {
  66. return object.value(key).toString();
  67. };
  68. const auto cardId = string(u"id");
  69. const auto last4 = string(u"last4");
  70. const auto brand = BrandFromString(string(u"brand").toLower());
  71. const auto expMonth = object.value("exp_month").toInt();
  72. const auto expYear = object.value("exp_year").toInt();
  73. auto result = Card(cardId, last4, brand, expMonth, expYear);
  74. result._name = string(u"name");
  75. result._dynamicLast4 = string(u"dynamic_last4");
  76. result._funding = FundingFromString(string(u"funding").toLower());
  77. result._fingerprint = string(u"fingerprint");
  78. result._country = string(u"country");
  79. result._currency = string(u"currency");
  80. result._addressLine1 = string(u"address_line1");
  81. result._addressLine2 = string(u"address_line2");
  82. result._addressCity = string(u"address_city");
  83. result._addressState = string(u"address_state");
  84. result._addressZip = string(u"address_zip");
  85. result._addressCountry = string(u"address_country");
  86. // TODO incomplete, not used.
  87. //result._allResponseFields = object;
  88. return result;
  89. }
  90. QString Card::cardId() const {
  91. return _cardId;
  92. }
  93. QString Card::name() const {
  94. return _name;
  95. }
  96. QString Card::last4() const {
  97. return _last4;
  98. }
  99. QString Card::dynamicLast4() const {
  100. return _dynamicLast4;
  101. }
  102. CardBrand Card::brand() const {
  103. return _brand;
  104. }
  105. CardFundingType Card::funding() const {
  106. return _funding;
  107. }
  108. QString Card::fingerprint() const {
  109. return _fingerprint;
  110. }
  111. QString Card::country() const {
  112. return _country;
  113. }
  114. QString Card::currency() const {
  115. return _currency;
  116. }
  117. quint32 Card::expMonth() const {
  118. return _expMonth;
  119. }
  120. quint32 Card::expYear() const {
  121. return _expYear;
  122. }
  123. QString Card::addressLine1() const {
  124. return _addressLine1;
  125. }
  126. QString Card::addressLine2() const {
  127. return _addressLine2;
  128. }
  129. QString Card::addressCity() const {
  130. return _addressCity;
  131. }
  132. QString Card::addressState() const {
  133. return _addressState;
  134. }
  135. QString Card::addressZip() const {
  136. return _addressZip;
  137. }
  138. QString Card::addressCountry() const {
  139. return _addressCountry;
  140. }
  141. bool Card::empty() const {
  142. return _cardId.isEmpty();
  143. }
  144. QString CardBrandToString(CardBrand brand) {
  145. switch (brand) {
  146. case CardBrand::Amex: return "American Express";
  147. case CardBrand::DinersClub: return "Diners Club";
  148. case CardBrand::Discover: return "Discover";
  149. case CardBrand::JCB: return "JCB";
  150. case CardBrand::MasterCard: return "MasterCard";
  151. case CardBrand::Unknown: return "Unknown";
  152. case CardBrand::Visa: return "Visa";
  153. }
  154. std::abort();
  155. }
  156. } // namespace Stripe