payment.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. package gofakeit
  2. import "strconv"
  3. import "time"
  4. var currentYear = time.Now().Year() - 2000
  5. // CreditCardInfo is a struct containing credit variables
  6. type CreditCardInfo struct {
  7. Type string
  8. Number int
  9. Exp string
  10. Cvv string
  11. }
  12. // CreditCard will generate a struct full of credit card information
  13. func CreditCard() *CreditCardInfo {
  14. return &CreditCardInfo{
  15. Type: CreditCardType(),
  16. Number: CreditCardNumber(),
  17. Exp: CreditCardExp(),
  18. Cvv: CreditCardCvv(),
  19. }
  20. }
  21. // CreditCardType will generate a random credit card type string
  22. func CreditCardType() string {
  23. return getRandValue([]string{"payment", "card_type"})
  24. }
  25. // CreditCardNumber will generate a random credit card number int
  26. func CreditCardNumber() int {
  27. integer, _ := strconv.Atoi(replaceWithNumbers(getRandValue([]string{"payment", "number"})))
  28. return integer
  29. }
  30. // CreditCardNumberLuhn will generate a random credit card number int that passes luhn test
  31. func CreditCardNumberLuhn() int {
  32. cc := ""
  33. for i := 0; i < 100000; i++ {
  34. cc = replaceWithNumbers(getRandValue([]string{"payment", "number"}))
  35. if luhn(cc) {
  36. break
  37. }
  38. }
  39. integer, _ := strconv.Atoi(cc)
  40. return integer
  41. }
  42. // CreditCardExp will generate a random credit card expiration date string
  43. // Exp date will always be a future date
  44. func CreditCardExp() string {
  45. month := strconv.Itoa(randIntRange(1, 12))
  46. if len(month) == 1 {
  47. month = "0" + month
  48. }
  49. return month + "/" + strconv.Itoa(randIntRange(currentYear+1, currentYear+10))
  50. }
  51. // CreditCardCvv will generate a random CVV number - Its a string because you could have 017 as an exp date
  52. func CreditCardCvv() string {
  53. return Numerify("###")
  54. }
  55. // luhn check is used for checking if credit card is valid
  56. func luhn(s string) bool {
  57. var t = [...]int{0, 2, 4, 6, 8, 1, 3, 5, 7, 9}
  58. odd := len(s) & 1
  59. var sum int
  60. for i, c := range s {
  61. if c < '0' || c > '9' {
  62. return false
  63. }
  64. if i&1 == odd {
  65. sum += t[c-'0']
  66. } else {
  67. sum += int(c - '0')
  68. }
  69. }
  70. return sum%10 == 0
  71. }