easypay_sign_test.go 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. package provider
  2. import (
  3. "testing"
  4. )
  5. func TestEasyPaySignConsistentOutput(t *testing.T) {
  6. t.Parallel()
  7. params := map[string]string{
  8. "pid": "1001",
  9. "type": "alipay",
  10. "out_trade_no": "ORDER123",
  11. "name": "Test Product",
  12. "money": "10.00",
  13. }
  14. pkey := "test_secret_key"
  15. sign1 := easyPaySign(params, pkey)
  16. sign2 := easyPaySign(params, pkey)
  17. if sign1 != sign2 {
  18. t.Fatalf("easyPaySign should be deterministic: %q != %q", sign1, sign2)
  19. }
  20. if len(sign1) != 32 {
  21. t.Fatalf("MD5 hex should be 32 chars, got %d", len(sign1))
  22. }
  23. }
  24. func TestEasyPaySignExcludesSignAndSignType(t *testing.T) {
  25. t.Parallel()
  26. pkey := "my_key"
  27. base := map[string]string{
  28. "pid": "1001",
  29. "type": "alipay",
  30. }
  31. withSign := map[string]string{
  32. "pid": "1001",
  33. "type": "alipay",
  34. "sign": "should_be_ignored",
  35. "sign_type": "MD5",
  36. }
  37. signBase := easyPaySign(base, pkey)
  38. signWithExtra := easyPaySign(withSign, pkey)
  39. if signBase != signWithExtra {
  40. t.Fatalf("sign and sign_type should be excluded: base=%q, withExtra=%q", signBase, signWithExtra)
  41. }
  42. }
  43. func TestEasyPaySignExcludesEmptyValues(t *testing.T) {
  44. t.Parallel()
  45. pkey := "key123"
  46. base := map[string]string{
  47. "pid": "1001",
  48. "type": "alipay",
  49. }
  50. withEmpty := map[string]string{
  51. "pid": "1001",
  52. "type": "alipay",
  53. "device": "",
  54. "clientip": "",
  55. }
  56. signBase := easyPaySign(base, pkey)
  57. signWithEmpty := easyPaySign(withEmpty, pkey)
  58. if signBase != signWithEmpty {
  59. t.Fatalf("empty values should be excluded: base=%q, withEmpty=%q", signBase, signWithEmpty)
  60. }
  61. }
  62. func TestEasyPayVerifySignValid(t *testing.T) {
  63. t.Parallel()
  64. params := map[string]string{
  65. "pid": "1001",
  66. "type": "alipay",
  67. "out_trade_no": "ORDER456",
  68. "money": "25.00",
  69. }
  70. pkey := "secret"
  71. sign := easyPaySign(params, pkey)
  72. // Add sign to params (as would come in a real callback)
  73. params["sign"] = sign
  74. params["sign_type"] = "MD5"
  75. if !easyPayVerifySign(params, pkey, sign) {
  76. t.Fatal("easyPayVerifySign should return true for a valid signature")
  77. }
  78. }
  79. func TestEasyPayVerifySignTampered(t *testing.T) {
  80. t.Parallel()
  81. params := map[string]string{
  82. "pid": "1001",
  83. "type": "alipay",
  84. "out_trade_no": "ORDER789",
  85. "money": "50.00",
  86. }
  87. pkey := "secret"
  88. sign := easyPaySign(params, pkey)
  89. // Tamper with the amount
  90. params["money"] = "99.99"
  91. if easyPayVerifySign(params, pkey, sign) {
  92. t.Fatal("easyPayVerifySign should return false for tampered params")
  93. }
  94. }
  95. func TestEasyPayVerifySignWrongKey(t *testing.T) {
  96. t.Parallel()
  97. params := map[string]string{
  98. "pid": "1001",
  99. "type": "wxpay",
  100. }
  101. sign := easyPaySign(params, "correct_key")
  102. if easyPayVerifySign(params, "wrong_key", sign) {
  103. t.Fatal("easyPayVerifySign should return false with wrong key")
  104. }
  105. }
  106. func TestEasyPaySignEmptyParams(t *testing.T) {
  107. t.Parallel()
  108. sign := easyPaySign(map[string]string{}, "key123")
  109. if sign == "" {
  110. t.Fatal("easyPaySign with empty params should still produce a hash")
  111. }
  112. if len(sign) != 32 {
  113. t.Fatalf("MD5 hex should be 32 chars, got %d", len(sign))
  114. }
  115. }
  116. func TestEasyPaySignSortOrder(t *testing.T) {
  117. t.Parallel()
  118. pkey := "test_key"
  119. params1 := map[string]string{
  120. "a": "1",
  121. "b": "2",
  122. "c": "3",
  123. }
  124. params2 := map[string]string{
  125. "c": "3",
  126. "a": "1",
  127. "b": "2",
  128. }
  129. sign1 := easyPaySign(params1, pkey)
  130. sign2 := easyPaySign(params2, pkey)
  131. if sign1 != sign2 {
  132. t.Fatalf("easyPaySign should be order-independent: %q != %q", sign1, sign2)
  133. }
  134. }
  135. func TestEasyPayVerifySignWrongSignValue(t *testing.T) {
  136. t.Parallel()
  137. params := map[string]string{
  138. "pid": "1001",
  139. "type": "alipay",
  140. }
  141. pkey := "key"
  142. if easyPayVerifySign(params, pkey, "00000000000000000000000000000000") {
  143. t.Fatal("easyPayVerifySign should return false for an incorrect sign value")
  144. }
  145. }
  146. func TestEasyPayMerchantIdentityMetadata(t *testing.T) {
  147. t.Parallel()
  148. provider := &EasyPay{
  149. config: map[string]string{
  150. "pid": "1001",
  151. },
  152. }
  153. metadata := provider.MerchantIdentityMetadata()
  154. if metadata["pid"] != "1001" {
  155. t.Fatalf("pid = %q, want %q", metadata["pid"], "1001")
  156. }
  157. }