Compare commits
1885 Commits
Author | SHA1 | Date | |
---|---|---|---|
b4c3fef78c | |||
019379f729 | |||
1a52833467 | |||
77bea77f4e | |||
4f5f90298d | |||
003cdd18f4 | |||
f863a25498 | |||
66ccf11560 | |||
5603ae28db | |||
d0dd1b82d7 | |||
9446b1a636 | |||
e92e97ca11 | |||
bce4e5a324 | |||
03c5092164 | |||
9124457533 | |||
d217b67cf6 | |||
3e617b3a4c | |||
bb3b148de4 | |||
927361987f | |||
68bc4e84b4 | |||
44208b4fab | |||
57079fecfd | |||
f16561c82a | |||
fba63df660 | |||
5c1aef79c8 | |||
aa235ae02f | |||
53bed19f45 | |||
75003069f9 | |||
670766282a | |||
706a42f7b2 | |||
3bdd0a99fa | |||
34d1d5db58 | |||
c881e857ae | |||
f676c1239d | |||
4fa242751e | |||
45010d1575 | |||
21a71adba8 | |||
1822d39c12 | |||
e69e7edd02 | |||
faeb62abd8 | |||
84acfa03f7 | |||
5dd10f3adc | |||
51185a972c | |||
9ba61c9f9b | |||
29cccd94b2 | |||
b8d15f0124 | |||
d629d61250 | |||
704a41b1e2 | |||
0a21e62667 | |||
e4f18688e1 | |||
fd98fad567 | |||
6a20373254 | |||
c6a20f1a72 | |||
3655e95a67 | |||
09684077ea | |||
843193024c | |||
5d906b1fba | |||
2081e708a8 | |||
6a8bde04be | |||
c59e8740d6 | |||
2836428f68 | |||
54d4e054e6 | |||
b5c654d3fc | |||
ddf6d80599 | |||
5c23311d69 | |||
f0c1ea178b | |||
89cf809f5f | |||
7e20e4a59a | |||
081e0b7e6e | |||
e1cf8088be | |||
73c2a89f70 | |||
79b5a11a9e | |||
ad67ed3441 | |||
6ba6e1829f | |||
677e796990 | |||
05b85efc0f | |||
c8cc611085 | |||
8edbe341ed | |||
4812dc26dc | |||
38faf619a9 | |||
a8fe23030f | |||
|
112f7c100e | ||
|
abae2cfce9 | ||
|
6ccbf900db | ||
|
64e29af498 | ||
|
521ea08ba9 | ||
|
1557894954 | ||
|
e425817e69 | ||
|
0d1320a48f | ||
|
87c33ac776 | ||
|
90556820ba | ||
|
b7ceeed557 | ||
|
baa8a6da37 | ||
|
901fceba27 | ||
|
e0a39c8d68 | ||
|
749f326f94 | ||
|
90d8098d93 | ||
|
b35645ee67 | ||
|
a3a8295262 | ||
|
8088c4ada8 | ||
|
c443dc1fd1 | ||
|
c0a7376e22 | ||
|
5776914faa | ||
|
d2571d094b | ||
|
d3552245a5 | ||
|
57859d8d80 | ||
|
6205568948 | ||
|
327e6ffa05 | ||
|
d68956df72 | ||
|
c7ade5b2d5 | ||
|
07c4615d7e | ||
|
99a55e6bc9 | ||
|
3ced24eb9e | ||
|
431e83bf4f | ||
|
3f6e5d8d51 | ||
|
c702f787f7 | ||
|
0721b01cdb | ||
|
e636362585 | ||
|
ace4f9a278 | ||
|
60fdf91ce7 | ||
|
d94b42b6ee | ||
|
1e13645f72 | ||
|
43a460a28b | ||
|
c109e81842 | ||
|
c26b055ccf | ||
|
4888d1576b | ||
|
48a86940e2 | ||
|
199c109a3d | ||
|
9522585074 | ||
|
ae08833323 | ||
|
bf9c0571f8 | ||
|
30264bfaae | ||
|
edb098500d | ||
|
46921e0e55 | ||
|
df759717cd | ||
|
31d446a6bd | ||
|
48a22a0e60 | ||
|
512975fb86 | ||
|
62490c77b6 | ||
|
2eb6180567 | ||
|
4118e8bba6 | ||
|
10414d9971 | ||
|
c1e7d095ed | ||
|
6b21f1a234 | ||
|
69cf2bcb90 | ||
|
a8a5359c9f | ||
|
9b78acd0e5 | ||
|
b08530917c | ||
|
791ec8d2db | ||
|
b6ad48dff7 | ||
|
809ff15709 | ||
|
bb65189fb8 | ||
|
8a161cfa2c | ||
|
4ca4dec37e | ||
|
d759317396 | ||
|
3bd517a007 | ||
|
7219c2dbd0 | ||
|
26e2cbcb60 | ||
|
320bbfe7be | ||
|
65134bd1ca | ||
|
81cb16bf9f | ||
|
aa19a2874d | ||
|
3477e41ad2 | ||
|
7f7c0a3765 | ||
|
b8d0baae5b | ||
|
286596f8a2 | ||
|
310e1d91be | ||
|
3918005b1f | ||
|
a435ee5a01 | ||
|
7a200c0574 | ||
|
80cc0e4939 | ||
|
81bb1f3563 | ||
|
57ff6a80ec | ||
|
d19fec73d4 | ||
|
db5826cfcf | ||
|
dc8b5454e2 | ||
|
30a0eb8e98 | ||
|
6e5800181b | ||
|
4d526dbd7a | ||
|
152e6a01fa | ||
|
d39062353c | ||
|
8c461bbaf2 | ||
|
3e09168019 | ||
|
3abaa2c1d1 | ||
|
1dfde62772 | ||
|
36602d58a5 | ||
|
f94e67056d | ||
|
066c77c752 | ||
|
c3f4943acd | ||
|
e9c351a083 | ||
|
bf68104ee0 | ||
|
9a32876bf3 | ||
|
0f9e75acb2 | ||
|
c78a1f5132 | ||
|
452dd58af9 | ||
|
a126c8e6d3 | ||
|
94ff00bc4b | ||
|
6472484b32 | ||
|
c84b46a55b | ||
|
fe49e5af11 | ||
|
53d332190c | ||
|
cc8901598d | ||
|
cfa92390f2 | ||
|
ab26565377 | ||
|
52471fce89 | ||
|
05f0fa2ac3 | ||
|
2058580866 | ||
|
3f57b346e0 | ||
|
4e06dd6039 | ||
|
873a0218e7 | ||
|
44ce1e9fbc | ||
|
18a79b5b6c | ||
|
d056cc8abe | ||
|
1747190674 | ||
|
b550806956 | ||
|
5a2607787f | ||
|
0cfcc8d4a0 | ||
|
7cd213da65 | ||
|
cfa842fa44 | ||
|
b6130d938a | ||
|
c9803879f5 | ||
|
6cbfe0a3a3 | ||
|
8b7225325d | ||
|
8f301500ef | ||
|
bac18534dc | ||
|
e0f3c76cea | ||
|
d166c27fad | ||
|
c68f2d2f36 | ||
|
27bccb3a7e | ||
|
188d1e186b | ||
|
f30ac6be6c | ||
|
918daa2a55 | ||
|
2b93f91af6 | ||
|
31a18b28a4 | ||
|
f19ef3b097 | ||
|
a17d8ae5a2 | ||
|
ba13eef750 | ||
|
9f69e69090 | ||
|
1b6275afb3 | ||
|
5f34a8811e | ||
|
4b3d59645e | ||
|
a12fa55601 | ||
|
4fd6693c56 | ||
|
a807063f4c | ||
|
1fbd22efac | ||
|
f00d21d188 | ||
|
3ee7d0d391 | ||
|
1ccb94fd4e | ||
|
541589be59 | ||
|
867f8e454d | ||
|
2ed1a5f03a | ||
|
4590c9c333 | ||
|
d5c6803260 | ||
|
5ac2e690c0 | ||
|
a21a622936 | ||
|
1f3f133772 | ||
|
a9fe0b29d4 | ||
|
d390c5d9fe | ||
|
bb8c82d25c | ||
|
508d053ed3 | ||
|
f81d5b74d5 | ||
|
c39cd8b85e | ||
|
a6caeaf5cf | ||
|
29c92a0b92 | ||
|
c8e3d7ad26 | ||
|
0dfd7a091c | ||
|
6ce418a719 | ||
|
3952fcdd33 | ||
|
42122ce548 | ||
|
4e6e692d4d | ||
|
96e0067cb9 | ||
|
172d31fd2e | ||
|
e7054aab0e | ||
|
95be03bf1c | ||
|
41bb3b9901 | ||
|
cd034c4a6a | ||
|
403d9c58ea | ||
|
f83c55c010 | ||
|
dbf9622395 | ||
|
1fdfd5c5a2 | ||
|
9517292a0e | ||
|
529f786814 | ||
|
4de09fa565 | ||
|
a6d4b6e6ab | ||
|
5da9fb30aa | ||
|
19c311391e | ||
|
b353067ee1 | ||
|
46a01bdd33 | ||
|
28e8277410 | ||
|
dfec57f200 | ||
|
cfb532722a | ||
|
66383836b8 | ||
|
458e7c3d24 | ||
|
6177ca05b8 | ||
|
858a3b9c82 | ||
|
7e96d6ab0f | ||
|
d6301d3c2e | ||
|
fcb0bc8c35 | ||
|
946f693bd0 | ||
|
303a0ea155 | ||
|
6390dea046 | ||
|
3e49868388 | ||
|
42c57b6de9 | ||
|
40f10de24b | ||
|
f1977f53fd | ||
|
5227c45653 | ||
|
e9e7afd69e | ||
|
7d22221380 | ||
|
e7f589e1d3 | ||
|
a685e8f3fa | ||
|
010c184caa | ||
|
f9cf8ca1de | ||
|
1fc0da066b | ||
|
220e38d6c4 | ||
|
6b93962208 | ||
|
9e0a5bcc78 | ||
|
343fa115ae | ||
|
8831056a5f | ||
|
1030115751 | ||
|
5d0364f6d2 | ||
|
bd821c80c1 | ||
|
df45a4a25d | ||
|
aea370503e | ||
|
fa5cac5e5b | ||
|
6074c846fc | ||
|
7265b3bec2 | ||
|
751820621d | ||
|
050dafbd42 | ||
|
062eb6c3b4 | ||
|
0256461044 | ||
|
ccd452c2a5 | ||
|
4985a21f24 | ||
|
a0dcda4ac1 | ||
|
b6ee83d119 | ||
|
4d01470821 | ||
|
7229bb4e40 | ||
|
6f776bdda0 | ||
|
f3921c7332 | ||
|
a88619a7dc | ||
|
568a989576 | ||
|
63c0eb107e | ||
|
b00e938ef7 | ||
|
8bcafdc6b2 | ||
|
83adb23f8f | ||
|
db8c26b74a | ||
|
76f6826461 | ||
|
1d817903ba | ||
|
7992ee0d3d | ||
|
07c3545105 | ||
|
56e5d6ff77 | ||
|
4f2360c9b2 | ||
|
2f2d51b53d | ||
|
100fd1f856 | ||
|
829df8804b | ||
|
a6b0b9c191 | ||
|
e2c24124e1 | ||
|
2cb8331030 | ||
|
1df2dda136 | ||
|
2a169bacad | ||
|
94bd262694 | ||
|
be49b10547 | ||
|
62645a4311 | ||
|
1893790aae | ||
|
6ce3772c86 | ||
|
a4dd111def | ||
|
94e6d6518b | ||
|
4036921f21 | ||
|
13c80294a2 | ||
|
eb8942c871 | ||
|
0919205931 | ||
|
bbb5269bc2 | ||
|
61f1179bdb | ||
|
2c27f8bc5a | ||
|
08ea0bd9df | ||
|
e8596bceff | ||
|
400fbc926a | ||
|
abaec2faf9 | ||
|
533ea253d6 | ||
|
4339c4dc57 | ||
|
8430122655 | ||
|
cba7603ee2 | ||
|
d615f8af59 | ||
|
aae9bebff1 | ||
|
fcfee0a068 | ||
|
a25c48e3d6 | ||
|
6c466f00b3 | ||
|
c90e4b9810 | ||
|
1ebe3aa3c5 | ||
|
90b42bd2bb | ||
|
bae7886fe7 | ||
|
0c00e15c8f | ||
|
1bbadc37cb | ||
|
935749e580 | ||
|
2914943cad | ||
|
a2ed0713e2 | ||
|
438d5833f9 | ||
|
37fe7d21ef | ||
|
6f23c5e289 | ||
|
1af394cdd9 | ||
|
a79b05cd45 | ||
|
93616adf3a | ||
|
65d8059221 | ||
|
c0535f87fb | ||
|
b8dd04b89f | ||
|
bd670742e7 | ||
|
74b5f806d0 | ||
|
189ee0925e | ||
|
f3b2e93a08 | ||
|
04914f5b01 | ||
|
487cc7f689 | ||
|
649af3e4bd | ||
|
31efa1ad66 | ||
|
6bccbf5fc3 | ||
|
2c48303f8d | ||
|
a6f55b3ef1 | ||
|
1dc58f0021 | ||
|
0601e8fb17 | ||
|
ee17a5ee6f | ||
|
4c781ee7ee | ||
|
be40eb7c14 | ||
|
6fb083aeea | ||
|
bb9a1857c8 | ||
|
76ea7fe2a8 | ||
|
4b92f94a41 | ||
|
0c35f778db | ||
|
fd8e02a81a | ||
|
a647fe8c5b | ||
|
1309e9e2dc | ||
|
1474e727b2 | ||
|
94ad8169fa | ||
|
7101c22899 | ||
|
739c222586 | ||
|
1bda3eee15 | ||
|
7116fe5ae2 | ||
|
c66ecbfd4d | ||
|
31984c130f | ||
|
bcd5806cdc | ||
|
2175e94158 | ||
|
2e4d73e8b7 | ||
|
43594d71b1 | ||
|
d6d0e35984 | ||
|
8449f2f942 | ||
|
228c71c42a | ||
|
ef293d284e | ||
|
51b3dc0efb | ||
|
d70b907407 | ||
|
c1d0b68d32 | ||
|
6f35b985b1 | ||
|
23bc3bc763 | ||
|
fc856b66bb | ||
|
7bf9373b55 | ||
|
fa2c990ab2 | ||
|
b8f328b90b | ||
|
f351ecf2a1 | ||
|
3f8b6e1c7a | ||
|
05fd45b853 | ||
|
f2ac81ef5e | ||
|
fcb599b76e | ||
|
1c6b7fc07c | ||
|
ce8bf302fa | ||
|
e2f370eedc | ||
|
7f11938799 | ||
|
e3fc624052 | ||
|
05ea881fac | ||
|
a254d1ce34 | ||
|
40ba792acc | ||
|
5ac4e00133 | ||
|
c22fc05193 | ||
|
f4bf76c490 | ||
|
20011f8b7e | ||
|
cc6bc22c1d | ||
|
daae431ef0 | ||
|
2e0b20021b | ||
|
ddf207e15b | ||
|
95d130d927 | ||
|
1984b28ce3 | ||
|
669b4ea7c2 | ||
|
cffd17399b | ||
|
6cc0b2db22 | ||
|
1f830ecacf | ||
|
8b4c105029 | ||
|
a5cd1a6cd5 | ||
|
421fbd4993 | ||
|
f7ab9f8f29 | ||
|
93779d227a | ||
|
ef99e3d24f | ||
|
23a115fdee | ||
|
def6856b02 | ||
|
bb6bec04b1 | ||
|
88301a6192 | ||
|
dd83e1655a | ||
|
d5d61a4e1a | ||
|
5f1aa6fc97 | ||
|
e343159e3a | ||
|
7b4ba553ac | ||
|
6f57d4a522 | ||
|
537a9332c0 | ||
|
dde445150a | ||
|
7164e26195 | ||
|
3039dd018e | ||
|
44e4ee4416 | ||
|
a2042dd7c2 | ||
|
5755c293df | ||
|
8c787d1638 | ||
|
f4c18d7eb8 | ||
|
0c1258594e | ||
|
e68477c26c | ||
|
0bcba32ea4 | ||
|
fddb2f7a18 | ||
|
a5c141f7be | ||
|
3c4e749ea9 | ||
|
56d2b5f57a | ||
|
cecdace1c5 | ||
|
b45c626e82 | ||
|
abbfc85e24 | ||
|
2019efffa3 | ||
|
cabee0f70c | ||
|
18b49daf2b | ||
|
8faef7c8e2 | ||
|
941c47a193 | ||
|
6bba793f4f | ||
|
123bef0ea9 | ||
|
ba23afd49f | ||
|
ea31b7bfbe | ||
|
3c267bbe61 | ||
|
f7f2121fca | ||
|
8f4993971d | ||
|
5f35ab27fb | ||
|
ba99224d13 | ||
|
b06cc90f94 | ||
|
59a1456799 | ||
|
2a36ebf45f | ||
|
159471c9cb | ||
|
af212bd68f | ||
|
28156fcb3a | ||
|
b65783bd72 | ||
|
226c2af5a1 | ||
|
373aa777c7 | ||
|
9531df8067 | ||
|
28b2ca93fb | ||
|
614a1c923e | ||
|
6cfe90b31e | ||
|
dfeb2f944f | ||
|
d4a1a98ba1 | ||
|
e785b1f9a7 | ||
|
3f42a162c2 | ||
|
ed6bd016f5 | ||
|
426ad57aa5 | ||
|
b3eadb4ffa | ||
|
5326c5b155 | ||
|
60c9df46f5 | ||
|
2b92b6fdc2 | ||
|
e9c1cda356 | ||
|
24bde9298c | ||
|
72f3005ac6 | ||
|
16d98a6142 | ||
|
5c71b2a29f | ||
|
60663f2f7a | ||
|
2d36b4d6d2 | ||
|
091d74b6ee | ||
|
622b838005 | ||
|
1652ae2f79 | ||
|
87c1952eef | ||
|
8c76e60675 | ||
|
2a8854656e | ||
|
06c407a6f0 | ||
|
eecd3f87d7 | ||
|
443fa220e2 | ||
|
4a009fe9f2 | ||
|
140fb022a1 | ||
|
10fd006f32 | ||
|
6d2c0a3709 | ||
|
00347dc50c | ||
|
8511f8f826 | ||
|
5f23a6f101 | ||
|
426bcddd47 | ||
|
e15181867f | ||
|
b307c5aa85 | ||
|
29498a9b3e | ||
|
596ada05f1 | ||
|
59f871a3a1 | ||
|
0eb474d319 | ||
|
7db5207fee | ||
|
3a444d0fba | ||
|
497a0b7017 | ||
|
e53733b842 | ||
|
1b48399501 | ||
|
7bd9ef4dfd | ||
|
9e3f256032 | ||
|
d3730b361d | ||
|
72205bbf16 | ||
|
737d75964b | ||
|
2d2cf39f1c | ||
|
69b9ec0068 | ||
|
44e8f229ee | ||
|
b8e2d58505 | ||
|
b4abd5143d | ||
|
982ad86bab | ||
|
d29d18028a | ||
|
3d6185914f | ||
|
eaa517359a | ||
|
fb0460e1a1 | ||
|
dc7bcc01e2 | ||
|
b2eaa59cb3 | ||
|
65921f572f | ||
|
568d02c25e | ||
|
fedab8f28a | ||
|
577b756912 | ||
|
e3f785f006 | ||
|
b6d4b5e902 | ||
|
591b2d83c6 | ||
|
71289e4dea | ||
|
1e64a7f7b3 | ||
|
3963c6d471 | ||
|
566e5f31c7 | ||
|
8e0a6a3d40 | ||
|
61303c2226 | ||
|
4ef9b5d91e | ||
|
3ab66e3447 | ||
|
183bdb2cbe | ||
|
c7c834b450 | ||
|
4d94e17b96 | ||
|
54222bd346 | ||
|
96395c895f | ||
|
0c4fb44a79 | ||
|
0e9e06a964 | ||
|
fdd3a94131 | ||
|
c9fad3121c | ||
|
8f73c409d6 | ||
|
2c108c4628 | ||
|
317c98b6da | ||
|
a2e82448b8 | ||
|
01ab45bc0c | ||
|
efb2c52011 | ||
|
fa5d892176 | ||
|
3d1c1ba475 | ||
|
3609edb4fb | ||
|
62a3931aee | ||
|
dfb02eac38 | ||
|
f64addb0cb | ||
|
f0e8b23514 | ||
|
6159d4266c | ||
|
5667784c0f | ||
|
2c11ca5383 | ||
|
7359abf7c5 | ||
|
a596228a8d | ||
|
dae6b15fa4 | ||
|
65c1cdc07c | ||
|
15bd95c3cb | ||
|
51dc66194d | ||
|
63fdc318d1 | ||
|
942cb07f41 | ||
|
3eabfedd9c | ||
|
0a75b0e902 | ||
|
7f4b576fd6 | ||
|
28df6d426a | ||
|
49983cf618 | ||
|
e41478d9fd | ||
|
b650dae665 | ||
|
fcc34c3913 | ||
|
6f24f7b92e | ||
|
d818d576d9 | ||
|
4d0ff8fbd7 | ||
|
2b89a1dd64 | ||
|
2f9d843d79 | ||
|
91b651d6a7 | ||
|
12652bddb2 | ||
|
2ac03917f7 | ||
|
63edc076b9 | ||
|
d16ea7d4de | ||
|
59d8cc6d57 | ||
|
4730b334b6 | ||
|
d9de6f1169 | ||
|
850c95a042 | ||
|
5155c8c4b1 | ||
|
86233064b5 | ||
|
20c40ad826 | ||
|
8470122858 | ||
|
0203950f4e | ||
|
fefe039e95 | ||
|
7470834896 | ||
|
488706b2df | ||
|
eb46a10fd9 | ||
|
2736ea4edf | ||
|
30155b316b | ||
|
e46c6c1995 | ||
|
da512ff53d | ||
|
bac1b679b4 | ||
|
52c33e207c | ||
|
f002311b69 | ||
|
3f9bba4c63 | ||
|
2869a086c0 | ||
|
367bf4ee9f | ||
|
b2998b2ce4 | ||
|
13356d1cd5 | ||
|
45a422f0f7 | ||
|
9d3c11f552 | ||
|
3bb918d125 | ||
|
1001158231 | ||
|
f40547a459 | ||
|
7e68b576cc | ||
|
06a1726665 | ||
|
fa179f6cba | ||
|
73c135fb10 | ||
|
566d58e899 | ||
|
8cc9a8abe5 | ||
|
87431f3ffe | ||
|
584c7ac354 | ||
|
6811bffa18 | ||
|
c4a87961af | ||
|
596aafcfb4 | ||
|
2c810298f4 | ||
|
37ae6807e6 | ||
|
13b484a071 | ||
|
ce62d1c01b | ||
|
bb5aadf6be | ||
|
43771f6048 | ||
|
ecbefea5e5 | ||
|
fee15ff8d2 | ||
|
fb7ecd4715 | ||
|
04fadf6f71 | ||
|
fd58b3f212 | ||
|
1eec0f4bfa | ||
|
20c0a028c8 | ||
|
f0eb219eb8 | ||
|
e7f2bd62f8 | ||
|
a8232f6c91 | ||
|
0af608f119 | ||
|
e946ce0642 | ||
|
b235a779f3 | ||
|
58e9411b45 | ||
|
2e18fec385 | ||
|
45e212818f | ||
|
604098b047 | ||
|
02d3c160b2 | ||
|
55e1399fe8 | ||
|
cbcba481b0 | ||
|
384fab5cf2 | ||
|
573bd4507f | ||
|
8bea393977 | ||
|
59c6ce0aba | ||
|
871876a524 | ||
|
a2448d5179 | ||
|
155501152a | ||
|
06d45dc5fe | ||
|
0306103d28 | ||
|
34495cb655 | ||
|
2a45fe4ade | ||
|
8f3fa1dd7c | ||
|
45297e7f4d | ||
|
350d2b2bda | ||
|
ae4f30eed9 | ||
|
d2f5adcb40 | ||
|
bf92d03529 | ||
|
b0440e0faa | ||
|
0e2186632a | ||
|
c0af379370 | ||
|
ff064c8663 | ||
|
e6a3e6efcc | ||
|
b4da5c9fe4 | ||
|
57ab245093 | ||
|
1bac8f9774 | ||
|
b351ef761c | ||
|
c80e77c047 | ||
|
64d67bb42f | ||
|
940f69a763 | ||
|
384dd35b9a | ||
|
5986698d42 | ||
|
6d556f8b1d | ||
|
30aca49ab9 | ||
|
c605330661 | ||
|
a2074a4d39 | ||
|
edc04cb0ae | ||
|
f301912154 | ||
|
4af70b2c7c | ||
|
e9125872d1 | ||
|
bf4c8c2064 | ||
|
6037002c27 | ||
|
3b439113ac | ||
|
9850151dfa | ||
|
b693c5fb4e | ||
|
a2de4ac26c | ||
|
c235018374 | ||
|
a3250c9865 | ||
|
474ce2aa7a | ||
|
f2b423bcd7 | ||
|
7bca440f93 | ||
|
e6a550dc70 | ||
|
aa26d6b2e4 | ||
|
c584cd07d2 | ||
|
7fdfe2ce7e | ||
|
73f30b1a82 | ||
|
7eb11c8799 | ||
|
8bd95bcc22 | ||
|
4654f42656 | ||
|
3c7d470210 | ||
|
c9d8509a11 | ||
|
fc6428c457 | ||
|
15e02d725c | ||
|
449bda4009 | ||
|
0bb343dfda | ||
|
1849890b82 | ||
|
08bb3991a3 | ||
|
151004110f | ||
|
07bc5a5eac | ||
|
77e3c8e3e8 | ||
|
7c9e2e4a12 | ||
|
5599c0d833 | ||
|
c7b1abc796 | ||
|
6cc5ebdcce | ||
|
9c91aeba6e | ||
|
6948044ab9 | ||
|
64402ab1de | ||
|
18f3f4001c | ||
|
8929fc41ab | ||
|
8428270e67 | ||
|
cd0c63fde6 | ||
|
429f1706a4 | ||
|
9603199597 | ||
|
d248c0e868 | ||
|
b797152199 | ||
|
7e3e16da10 | ||
|
a28a17a76b | ||
|
1d7344309a | ||
|
5ecfaf7cd0 | ||
|
f212f02ee0 | ||
|
f0f21e1432 | ||
|
17583a49a0 | ||
|
32f72774fe | ||
|
697a6809d5 | ||
|
e0c995e1f8 | ||
|
07edd5bc41 | ||
|
807ed7d0b5 | ||
|
7df0e7508d | ||
|
58ac339beb | ||
|
3b4bb74ce7 | ||
|
5f0d1b320a | ||
|
203790064d | ||
|
00bc9656b6 | ||
|
9b20c749ce | ||
|
aa2fe98895 | ||
|
020cd0aed4 | ||
|
1598c61e56 | ||
|
6713787bb9 | ||
|
489942a99b | ||
|
cdda57d4e1 | ||
|
e00320dd1c | ||
|
7261f23689 | ||
|
115f910e3c | ||
|
5b606fddf4 | ||
|
60c63a51f1 | ||
|
b660bfd4a0 | ||
|
e56289f4c8 | ||
|
7c10cdd078 | ||
|
3fbeec4018 | ||
|
cc83bcb415 | ||
|
37a009c790 | ||
|
91d484f730 | ||
|
6c31059020 | ||
|
b15142a06c | ||
|
ef0b34bb92 | ||
|
19b033c41f | ||
|
c2552def43 | ||
|
efdf64eb6b | ||
|
34f0d99df1 | ||
|
4f157b08ea | ||
|
7bf811aa57 | ||
|
060576148b | ||
|
6927eaa139 | ||
|
c8fc670f52 | ||
|
b8d9a157f3 | ||
|
f18c62b152 | ||
|
935988530d | ||
|
97409a7fbc | ||
|
9f6051634a | ||
|
35d7c3eee0 | ||
|
dfec2e3aef | ||
|
391fa2b831 | ||
|
e4661117ce | ||
|
e04eaf4389 | ||
|
010b43194f | ||
|
07352d183c | ||
|
31ecd4d83d | ||
|
541899a5af | ||
|
53ad42e6ac | ||
|
c01347cac6 | ||
|
7cfabab628 | ||
|
64f7adcc29 | ||
|
84b9b992b1 | ||
|
6c490e3295 | ||
|
e0d87ebe49 | ||
|
5db9706ba0 | ||
|
10e0ca568e | ||
|
cee37531c7 | ||
|
a8901aa1f1 | ||
|
425b08245a | ||
|
33701efaf3 | ||
|
0fcd371f71 | ||
|
ec7ab21c4e | ||
|
daf0b23328 | ||
|
33b13b1bcd | ||
|
2797bd657a | ||
|
b5956fb298 | ||
|
6d996f20b9 | ||
|
817b474dd0 | ||
|
aca8dbabbc | ||
|
bd100bf846 | ||
|
c1c66e940e | ||
|
6f953862df | ||
|
17c20422e2 | ||
|
a3ec26138c | ||
|
2b27ee9c9f | ||
|
a2783832d4 | ||
|
1812b233bb | ||
|
43633aacc2 | ||
|
89011dbdb5 | ||
|
79f00925a7 | ||
|
9145628c7a | ||
|
8b7ca9b7b4 | ||
|
928ba178a3 | ||
|
a7ea5f5bf3 | ||
|
ce8f4f8cab | ||
|
4d3346d0c1 | ||
|
9346c170ca | ||
|
4bd5b3cf56 | ||
|
14dfe30bf6 | ||
|
542b633c70 | ||
|
c588303d8a | ||
|
edf8e18c5b | ||
|
e7f2378f49 | ||
|
a9f9e30089 | ||
|
306e9dc8cb | ||
|
7dda2ad3a7 | ||
|
a776e9cf11 | ||
|
2755bc9d50 | ||
|
7ef9e9153d | ||
|
fa24f789ed | ||
|
6a27b838b6 | ||
|
fbe2dd9268 | ||
|
8b1f15fd02 | ||
|
694f2c2b96 | ||
|
0758049ea9 | ||
|
04fb35d1ba | ||
|
4d1440912d | ||
|
11974f00da | ||
|
f6f4b89fc0 | ||
|
3b8c66a7e1 | ||
|
56a271c11c | ||
|
7c0a38e1a0 | ||
|
03c143b09a | ||
|
4ab50809d8 | ||
|
df80ea6c8b | ||
|
b93169e78c | ||
|
1650ee2e20 | ||
|
10c4d45f91 | ||
|
0adca9650d | ||
|
8121a521d3 | ||
|
978ada7373 | ||
|
b75569498c | ||
|
60f5127e63 | ||
|
7d20aa1743 | ||
|
a00d67a58a | ||
|
c60fda48d2 | ||
|
eec3f78ec6 | ||
|
4d44398d7a | ||
|
49ffba1b09 | ||
|
86f3c42cfc | ||
|
ba33c9a728 | ||
|
a0c370ba66 | ||
|
c2034cb655 | ||
|
320f3676a8 | ||
|
1ae00b67df | ||
|
2769f506c6 | ||
|
da6f6d1bbe | ||
|
8256c46db2 | ||
|
3b37f52235 | ||
|
29b4dbd601 | ||
|
a81550f79f | ||
|
03d9f2d19e | ||
|
0f8361e558 | ||
|
8467852c17 | ||
|
92c0fd698b | ||
|
58b261753d | ||
|
a2f5452b4a | ||
|
ddbeda4584 | ||
|
93414199d6 | ||
|
1d7602be50 | ||
|
f14b33a642 | ||
|
b52e676040 | ||
|
1c60839890 | ||
|
6c3d090ebd | ||
|
2446fa626b | ||
|
0a2e4d8aea | ||
|
17aaba2496 | ||
|
6e2babd46b | ||
|
1720e5137f | ||
|
eb6a578e1e | ||
|
b95045b3a7 | ||
|
da0ce15da6 | ||
|
edf1401dbe | ||
|
7b641e7b5b | ||
|
8bb6b02cba | ||
|
d650bb64e6 | ||
|
fe73fba9cb | ||
|
26795ee056 | ||
|
9628d3d698 | ||
|
a6468847ff | ||
|
9ab2cfb2a8 | ||
|
d8a1fce913 | ||
|
3b46faeb89 | ||
|
9d2f90ec4f | ||
|
ebc8f0e346 | ||
|
06c8ae81d2 | ||
|
4eb1d1d71a | ||
|
bcefec0f4b | ||
|
ae1b14f37e | ||
|
69ac4ec4a7 | ||
|
11e81d8318 | ||
|
5c7b6d2af4 | ||
|
50e50c13c4 | ||
|
4929e4e03e | ||
|
40ab5dd402 | ||
|
39cea92171 | ||
|
8709a9c5a7 | ||
|
0bc2cf9ade | ||
|
cb3f105121 | ||
|
6186d25697 | ||
|
b87ec9a574 | ||
|
a219035bfa | ||
|
7ee277219e | ||
|
189669c20c | ||
|
058ce62a2b | ||
|
609b38a9db | ||
|
92ea01e371 | ||
|
95b02d2b95 | ||
|
ef7516c191 | ||
|
8f5a9e0d76 | ||
|
eb38e86a78 | ||
|
98aef34fdb | ||
|
424a835c45 | ||
|
42d92c0291 | ||
|
09100e6766 | ||
|
561da62060 | ||
|
a90793885a | ||
|
8805e97e62 | ||
|
172638bd3f | ||
|
9472dd3d4f | ||
|
1ccce79b6b | ||
|
ebe46822ef | ||
|
6da4b4fca1 | ||
|
619b377326 | ||
|
585bd94b8a | ||
|
7ace417364 | ||
|
d60106c9c3 | ||
|
7feca8d962 | ||
|
340f341947 | ||
|
d938182141 | ||
|
ea444f2263 | ||
|
dc01e0b1ed | ||
|
2112db791d | ||
|
f101374a6e | ||
|
2e75e465c7 | ||
|
6f57472a02 | ||
|
74d8891301 | ||
|
3af0a2beba | ||
|
1487ce3e29 | ||
|
4a88064aba | ||
|
6633ea3ca7 | ||
|
a9766960c3 | ||
|
458c645fa4 | ||
|
c175a31c45 | ||
|
d752c48dc8 | ||
|
04f7d76057 | ||
|
d703f2d35c | ||
|
a05b2ce366 | ||
|
1a8ec43d26 | ||
|
2cd362dc40 | ||
|
7f6780a4e3 | ||
|
61e6221bd7 | ||
|
fb3ed0b642 | ||
|
23c1b0b0df | ||
|
96b370ea01 | ||
|
8f2c641813 | ||
|
3048767a43 | ||
|
84748b3968 | ||
|
a9cd7d2c2f | ||
|
1f49ac0781 | ||
|
73ecaabdb4 | ||
|
a45a98234d | ||
|
ef6e2dd6c0 | ||
|
8c15b3b4b5 | ||
|
7a1863b6a1 | ||
|
9bad0ff280 | ||
|
faf07b3d27 | ||
|
f65833f699 | ||
|
60c37d83da | ||
|
0397e44002 | ||
|
bb12cce0b8 | ||
|
c15384ff8d | ||
|
2cda0e45e1 | ||
|
71d6d7fdaa | ||
|
ffb25e9555 | ||
|
b9f60cd7c0 | ||
|
38959f821a | ||
|
8d6978d757 | ||
|
83d1b933e6 | ||
|
5b934c0e0d | ||
|
d3b58e3174 | ||
|
6f7bc7c02c | ||
|
868545cfc3 | ||
|
b84674f908 | ||
|
8ba4dec701 | ||
|
7ea3828bb3 | ||
|
f3c013f481 | ||
|
15592b02ec | ||
|
ea01e55cce | ||
|
80bf27a21a | ||
|
9ea6f3b97a | ||
|
ec8cc3ba99 | ||
|
44280382ce | ||
|
61d9fe4163 | ||
|
07a1d26622 | ||
|
c184ae1e4c | ||
|
2406dc63ac | ||
|
704a389ddb | ||
|
e761174270 | ||
|
341f176dfa | ||
|
9b322713c1 | ||
|
c8a23b848f | ||
|
8aa4758e01 | ||
|
fb4705281a | ||
|
f58ba62acc | ||
|
06aaacce65 | ||
|
1b193e3070 | ||
|
0a99706b74 | ||
|
7ff934a51d | ||
|
80669d4c4d | ||
|
d9ea16fdc0 | ||
|
e3c6aff3cb | ||
|
0a8db2933e | ||
|
68fa49cfc8 | ||
|
7bd4726e9c | ||
|
1b66e77d71 | ||
|
4b13a04014 | ||
|
1dba5dba36 | ||
|
9355b50cd5 | ||
|
99d450f3cf | ||
|
bb0771736f | ||
|
6aa8559970 | ||
|
70640f4d00 | ||
|
8efed3ebc4 | ||
|
8012154ec9 | ||
|
3ccc2786c5 | ||
|
8b280f4eb1 | ||
|
2e2d5ffb56 | ||
|
27d88a752e | ||
|
f90f4540d7 | ||
|
94064752ab | ||
|
47061bde2b | ||
|
438f8e5fb0 | ||
|
e9efa900a9 | ||
|
ccb25345ff | ||
|
15f7de33f9 | ||
|
b2ea2fe52a | ||
|
1a136a2403 | ||
|
6b3a09a925 | ||
|
ac935c5c66 | ||
|
75421148e2 | ||
|
9f33b34740 | ||
|
26ddf1d3c6 | ||
|
ea06197107 | ||
|
c1b87971fa | ||
|
7a2d870b7a | ||
|
e176fc0d22 | ||
|
13a3f58d1c | ||
|
abccf4ab2c | ||
|
7643ef24bf | ||
|
4378228012 | ||
|
7a7a920a8a | ||
|
7d4dfadae9 | ||
|
db8f7e6a06 | ||
|
aad2e5be45 | ||
|
662fd1e73e | ||
|
db1f10b6fa | ||
|
4b0fbcb15d | ||
|
79f85176cb | ||
|
fa1f085e1d | ||
|
3e3d4e8345 | ||
|
1d50acace7 | ||
|
45f3e54526 | ||
|
7627c8d666 | ||
|
34ae0c5643 | ||
|
491134b4ac | ||
|
f60a7d911b | ||
|
5761226887 | ||
|
8c514a7850 | ||
|
9c58930719 | ||
|
5f9c813b4e | ||
|
71ba078768 | ||
|
7c3e7853c9 | ||
|
07cd47938f | ||
|
d266aaaea5 | ||
|
e1ca4e02b7 | ||
|
dd6a1c0529 | ||
|
c70706c9aa | ||
|
0ab307c34b | ||
|
2369aa7cb3 | ||
|
232ea7e3c7 | ||
|
d4d830fe3a | ||
|
c1c801c420 | ||
|
f02ed97c33 | ||
|
9317366def | ||
|
70f42e21cc | ||
|
e8a9d00a36 | ||
|
46e9a39c2f | ||
|
80f885fbfb | ||
|
010464e399 | ||
|
d43876a6a4 | ||
|
6fd1e8b312 | ||
|
88e66226a2 | ||
|
dc7a9bb217 | ||
|
4759606f37 | ||
|
f00f5e60d5 | ||
|
dc89396ead | ||
|
2faac86310 | ||
|
4f280bb939 | ||
|
0c18330deb | ||
|
b92c421802 | ||
|
92c5d62af4 | ||
|
a687654faf | ||
|
a04c890a85 | ||
|
5cf6c1916a | ||
|
76ed7f6e97 | ||
|
ac67482a95 | ||
|
2e14b5479e | ||
|
e7a0d6a597 | ||
|
d9da800af1 | ||
|
acc0833622 | ||
|
913aec6e93 | ||
|
bd1cf2d8c3 | ||
|
4ff65a0ccb | ||
|
7e079f7709 | ||
|
70e6016d4a | ||
|
f394a62fad | ||
|
8dffbd4fdb | ||
|
d184ff8303 | ||
|
81df397536 | ||
|
70ce3a2ff9 | ||
|
159347eb9b | ||
|
48586de7d9 | ||
|
67128b02db | ||
|
8fb05730a2 | ||
|
829ca6f9e2 | ||
|
902ba61e73 | ||
|
e33601ce78 | ||
|
2899978dfa | ||
|
faaf7fe5c4 | ||
|
73286d40f6 | ||
|
8e97b778f3 | ||
|
779f1d08a9 | ||
|
df1aa5c9dc | ||
|
ff62dc5af1 | ||
|
5ead473356 | ||
|
3512930237 | ||
|
2d0cb1a2a2 | ||
|
f86957fae7 | ||
|
39779cb073 | ||
|
6958142c47 | ||
|
b15bb2de6c | ||
|
fdaefcb9ea | ||
|
34aea1916d | ||
|
de191a9c2f | ||
|
c2107faf57 | ||
|
00a54a1119 | ||
|
ac5532c142 | ||
|
d638b20bf5 | ||
|
8ab4af031a | ||
|
32e78b22ea | ||
|
eecd4bec76 | ||
|
4c88e8616a | ||
|
a72cdde584 | ||
|
a19236b120 | ||
|
4a113c473d | ||
|
86fe8209c7 | ||
|
ccbbf8c01a | ||
|
50cfb1f16d | ||
|
e463c78437 | ||
|
b0ff3f0e93 | ||
|
2eb0aa574c | ||
|
b45f20a856 | ||
|
58244ee9ec | ||
|
6a78b0bc99 | ||
|
145fdd06bf | ||
|
102df15fe4 | ||
|
704ad1d052 | ||
|
3a4f5f94e1 | ||
|
8f1c7420a5 | ||
|
3e948ec01b | ||
|
0eed5e6b59 | ||
|
0754c7a01c | ||
|
33929ce197 | ||
|
3f23e5bec9 | ||
|
f2d6d5c68c | ||
|
db638dd8b1 | ||
|
f24495b729 | ||
|
e109037249 | ||
|
358850ad6f | ||
|
6a7367ec0b | ||
|
4eb86b05a6 | ||
|
4a58e2736e | ||
|
fa79568a47 | ||
|
5e8d4a2ec6 | ||
|
ecc407a6e9 | ||
|
d1586aec25 | ||
|
6e1d7fcef0 | ||
|
c6a4f4548f | ||
|
564f6c0993 | ||
|
21b2793fef | ||
|
8b2dc293ea | ||
|
4de2e8c82a | ||
|
49af881f66 | ||
|
88f7080554 | ||
|
560cab1778 | ||
|
73ea041061 | ||
|
74c5e5f3e7 | ||
|
cfda3eaec8 | ||
|
0fc8cb025e | ||
|
b06bc156b6 | ||
|
476b067392 | ||
|
3bf1bb928e | ||
|
62b9d84675 | ||
|
64d4bc58b3 | ||
|
3c099f8d8d | ||
|
23ab472293 | ||
|
6c77a87833 | ||
|
7033b1d5d6 | ||
|
3a1fae639a | ||
|
44b3680a3f | ||
|
2ccb60fe62 | ||
|
2f372b4a39 | ||
|
9de72c7623 | ||
|
ae4a0211cd | ||
|
5570cbabf9 | ||
|
d9b7217009 | ||
|
d0d83a7b81 | ||
|
a5ccd0adcb | ||
|
7a389ad851 | ||
|
05411dac62 | ||
|
488357176c | ||
|
4223abfae6 | ||
|
c680a75c9f | ||
|
1793c2576a | ||
|
0196764079 | ||
|
364aa0594f | ||
|
ca780d71c0 | ||
|
7c6ebe66ae | ||
|
d09d2950fa | ||
|
e980b52ef2 | ||
|
e5338c5b9b | ||
|
eb6b09c2f6 | ||
|
55ce13865a | ||
|
48742dddcc | ||
|
c805444154 | ||
|
d451d3b779 | ||
|
113407a213 | ||
|
4ae6c435f5 | ||
|
9149cd441a | ||
|
b3462243e5 | ||
|
09b726fd0b | ||
|
663c45c77e | ||
|
16bb8f122a | ||
|
37f5e59fbd | ||
|
7ac670b287 | ||
|
158171c5d1 | ||
|
0eb3a642c4 | ||
|
59030a46a9 | ||
|
7de959f8e5 | ||
|
54c8ae5452 | ||
|
a63321f712 | ||
|
18e3f75028 | ||
|
90b5ca56c2 | ||
|
b2cf45297d | ||
|
26eec2c52a | ||
|
46f5916faa | ||
|
fdf14977ba | ||
|
be78d8c125 | ||
|
9c149bb1e2 | ||
|
a4f5aa341b | ||
|
06085f0a1a | ||
|
f6380d4e93 | ||
|
caed0fe510 | ||
|
cb4e3f3eb0 | ||
|
af9b3a4529 | ||
|
084ffcf8bb | ||
|
2422a28f9a | ||
|
6dc9d378c5 | ||
|
1ac042695d | ||
|
e937d3f5f5 | ||
|
4507ae4559 | ||
|
3d50561bc0 | ||
|
14bc77c753 | ||
|
614165d66a | ||
|
d2304b63a9 | ||
|
14bc2f5dc7 | ||
|
07d0656dec | ||
|
97e88bd99d | ||
|
6b08dc881e | ||
|
b4125bc384 | ||
|
60ebb54958 | ||
|
f71fed4c6a | ||
|
f67333a06a | ||
|
3465d53880 | ||
|
1273a8aef0 | ||
|
40fd10b801 | ||
|
94096bdec9 | ||
|
e1b623906b | ||
|
1923047292 | ||
|
d47313bff2 | ||
|
f956d9640a | ||
|
90790ffe71 | ||
|
001a2742c6 | ||
|
d748bd0dcf | ||
|
bdb11ffc38 | ||
|
2fd0ae6d28 | ||
|
61f3914c34 | ||
|
32f88b7cd4 | ||
|
a503171a5b | ||
|
78a930a8d4 | ||
|
d8e3d457c1 | ||
|
a48b5ab266 | ||
|
0ce60efad5 | ||
|
39806a9ab6 | ||
|
e3c0cada2e | ||
|
fcc01030d2 | ||
|
3410692f2d | ||
|
ca346abad6 | ||
|
e9e7f6e46b | ||
|
a592df5ecb | ||
|
70a7781ed3 | ||
|
b842cf538c | ||
|
4247eb41cb | ||
|
3f386d0a56 | ||
|
0345d62d0a | ||
|
03a88aab8e | ||
|
0287fb565b | ||
|
cf78cd52d2 | ||
|
2dfcd6acaa | ||
|
467e33dc71 | ||
|
49454655c6 | ||
|
5dde475785 | ||
|
48e10f3469 | ||
|
2f6ae138c1 | ||
|
ce86aaa0a0 | ||
|
c779de022a | ||
|
fa6668d976 | ||
|
0f2855b9e6 | ||
|
00df74359b | ||
|
77e1b93a8e | ||
|
118076abda | ||
|
3c95fde544 | ||
|
10da566d05 | ||
|
7fabf2f043 | ||
|
ee99368466 | ||
|
28456f2f03 | ||
|
a16e0f4c88 | ||
|
0a51875d83 | ||
|
59d936d866 | ||
|
265ddae149 | ||
|
f5660b197f | ||
|
d6b2e8263d | ||
|
d1a6cb0b0c | ||
|
e5e76bd382 | ||
|
f233d81a26 | ||
|
62b776b8e6 | ||
|
c74bc7811e | ||
|
fd910a4ef1 | ||
|
01de13ac6e | ||
|
64000d2235 | ||
|
ea97e8b24e | ||
|
60a6bad7a2 | ||
|
2703a0ec40 | ||
|
5f111b0302 | ||
|
5166bd15fa | ||
|
6903f8bda3 | ||
|
5fc4142885 | ||
|
e5b6324be8 | ||
|
f46187aed0 | ||
|
2cea017363 | ||
|
a26bf7a30c | ||
|
8350040eaf | ||
|
3c5a4bb160 | ||
|
2896905630 | ||
|
a9966532b4 | ||
|
69c9ad04ff | ||
|
8c0745278d | ||
|
ec59321bac | ||
|
0133cd0106 | ||
|
52e2c34d02 | ||
|
f0fb027a28 | ||
|
2c742c6ecb | ||
|
806547857e | ||
|
fe84839937 | ||
|
c501aada8d | ||
|
ef3c7aaf3f | ||
|
7fbb4697df | ||
|
0d816ef22e | ||
|
98c22dd6dc | ||
|
00a8a020a3 | ||
|
5e0960e30e | ||
|
f1bac2a60b | ||
|
80c6f7f471 | ||
|
f0f47c87cd | ||
|
cab663629a | ||
|
e92e417a14 | ||
|
c2bff929ef | ||
|
9d4847df21 | ||
|
9fd7f7d8dc | ||
|
b8ef2ec143 | ||
|
cea482a762 | ||
|
3b941cde16 | ||
|
fbfab81a6f | ||
|
c46d9505aa | ||
|
fb92b3bda0 | ||
|
a0584e142d | ||
|
0d74a4b05f | ||
|
970ee5136c | ||
|
fe6b548130 | ||
|
c6c1bc0485 | ||
|
a8933c5123 | ||
|
7538b8ec72 | ||
|
9804074ce7 | ||
|
98839aaf85 | ||
|
c40c6c5797 | ||
|
1549ef36d0 | ||
|
bfe89b9ddd | ||
|
fb6efe9e0b | ||
|
d17bb257f0 | ||
|
0937ac85b1 | ||
|
b98e6fdb1e | ||
|
28c03d71db | ||
|
d0de3f864d | ||
|
7b6f3bbdc2 | ||
|
7eeceef2c1 | ||
|
4beeca2762 | ||
|
53a4da00cd | ||
|
cd95053aec | ||
|
f115d27045 | ||
|
e4f739fc0c | ||
|
f6285f049e | ||
|
89521cdb1e | ||
|
be33986ecd | ||
|
9133071ab1 | ||
|
eb141f6567 | ||
|
b33e1708c0 | ||
|
61f2e13236 | ||
|
6a0196aa01 | ||
|
ad4618fcc4 | ||
|
3c6af19af1 | ||
|
32162b2485 | ||
|
507921be65 | ||
|
8ef459c964 | ||
|
3bf866e7ff | ||
|
b1a355218a | ||
|
2887c1e47e | ||
|
044f8c92af | ||
|
5d7f69a984 | ||
|
28affd2d11 | ||
|
1e23b3b743 | ||
|
df3c761c34 | ||
|
b5230ae982 | ||
|
7b1e411214 | ||
|
343ed7a708 | ||
|
014fb28354 | ||
|
cf549eaed3 | ||
|
a47d91fc24 | ||
|
761e88201c | ||
|
bdd72995a5 | ||
|
58faf5a891 | ||
|
24619d666f | ||
|
6fccfb3600 | ||
|
8fa9ee4dc6 | ||
|
cf11fa3826 | ||
|
f45c8103e9 | ||
|
568706f155 | ||
|
8d6a5270d8 | ||
|
3225311b09 | ||
|
0eccfb6a82 | ||
|
f7f7f9dd3c | ||
|
333a840d00 | ||
|
ec1bdb163e | ||
|
2d424040af | ||
|
8ec61d1328 | ||
|
d6923f2537 | ||
|
8311262037 | ||
|
8c45021d32 | ||
|
6a2ff801f0 | ||
|
47b3891b49 | ||
|
556085997d | ||
|
24fbf2adad | ||
|
5af4059970 | ||
|
3b75a1502c | ||
|
e7dd742923 | ||
|
dd3466fc09 | ||
|
baa5681058 | ||
|
77459fd56c | ||
|
2c2e7e9b49 | ||
|
d46a1b4a5c | ||
|
7d23b65a3d | ||
|
76320dd655 | ||
|
cc8359b22c | ||
|
765b5d1a41 | ||
|
35ff50edcc | ||
|
c517ad6b1f | ||
|
d696537988 | ||
|
71001db73c | ||
|
afc0bb471f | ||
|
ac944d46ed | ||
|
a4a34fcb2e | ||
|
b17d06cc12 | ||
|
3969124ae5 | ||
|
6272639f02 | ||
|
9b6893161a | ||
|
b7d3f839f7 | ||
|
5eb5cffb6a | ||
|
af68dd4522 | ||
|
4fdfd8de85 | ||
|
c69b4aadb2 | ||
|
c229a35af1 | ||
|
9694abfc2e | ||
|
150e6c2749 | ||
|
5db8229a8f | ||
|
ac405b0bc2 | ||
|
dde25ec9c3 | ||
|
ab2d516000 | ||
|
3537381d89 | ||
|
29c6a0000b | ||
|
3c391c5778 | ||
|
d59dff2f73 | ||
|
812de026a6 | ||
|
ee4380f4b2 | ||
|
6f6d0ea0cd | ||
|
9824420aa4 | ||
|
896a4affdd | ||
|
9b5a9eb821 | ||
|
140345902d | ||
|
1eef762c92 | ||
|
483886ff36 | ||
|
c590e54c07 | ||
|
73945bfb1a | ||
|
856b021d2c | ||
|
9ed9c2a58c | ||
|
7cb92a85f6 | ||
|
a73d6e69aa | ||
|
e951cf6756 | ||
|
c841ad73ec | ||
|
b58d2405e1 | ||
|
dfd9d5ef69 | ||
|
49633cd123 | ||
|
1cd06082aa | ||
|
3dd70569e6 | ||
|
1d35399a7c | ||
|
0a09e960da | ||
|
0d7ea29652 | ||
|
1160209ec2 | ||
|
e1a233c07b | ||
|
6720960d54 | ||
|
e83070fc5c | ||
|
a5c8f13fff | ||
|
556b07378e | ||
|
84aa3cf1c0 | ||
|
4a62a3f70e | ||
|
e204b0e2e4 | ||
|
4b7cce8706 | ||
|
c5de67ae91 | ||
|
eab7dd398a | ||
|
cd28a5b487 | ||
|
897394e05e | ||
|
74dafd2901 | ||
|
ef2d5f30fd | ||
|
9236f04d68 | ||
|
b4833d1019 | ||
|
f379769c1e | ||
|
64446f35e4 | ||
|
66055b4a00 | ||
|
23cb2104ad | ||
|
b053ee666a | ||
|
1810884787 | ||
|
732a38bf46 | ||
|
3b6b34db6b | ||
|
c6b23d29b5 | ||
|
6c4dba8254 | ||
|
56c00022cd | ||
|
6b34e9dacd | ||
|
5df79928a3 | ||
|
3c84ceeff8 | ||
|
bb9768a517 | ||
|
44597ce202 | ||
|
aa106de6ce | ||
|
34cea664ba | ||
|
f07d575513 | ||
|
ec5cc69abb | ||
|
34eb2f6aac | ||
|
ca13def670 | ||
|
9fcb4331c2 | ||
|
990dcd4328 | ||
|
83b8f6200e | ||
|
d854ad8811 | ||
|
3874ee7c2e | ||
|
cdf8db87ca | ||
|
07e25bad7c | ||
|
fbca4cdc59 | ||
|
a41ebdc1aa | ||
|
cd72fbfaf6 | ||
|
e237f0be68 | ||
|
9a80d8ddd2 | ||
|
b8e9d9d2c4 | ||
|
6c8369b883 | ||
|
905e9a5715 | ||
|
505cdafe98 | ||
|
d5d106f426 | ||
|
4990c622a3 | ||
|
314871cea6 | ||
|
61a3356469 | ||
|
941833ea1a | ||
|
50fb00e68a | ||
|
13bee05edc | ||
|
f7c524f0f3 | ||
|
df8dcb003c | ||
|
1149654555 | ||
|
0cecf5df76 | ||
|
247d4d9209 | ||
|
cc6dd65671 | ||
|
95e398de7e | ||
|
9a15bc1b4c | ||
|
fca9024424 | ||
|
71c729cb84 | ||
|
bc9d684cfa | ||
|
fe33878487 | ||
|
e1ef1449ef | ||
|
a2e5dd83b0 | ||
|
72738b6619 | ||
|
e4cfb843a2 | ||
|
a343e220b0 | ||
|
25dc6d55fc | ||
|
6c41d6f34e | ||
|
73029a3024 | ||
|
699d5546b0 | ||
|
a8bac131fa | ||
|
4dd67f46b8 | ||
|
c41903e9c5 | ||
|
b1c094127b | ||
|
28b09f7ed6 | ||
|
f90f72fc9c | ||
|
fedec3ca82 | ||
|
b327724433 | ||
|
6f9371dfb7 | ||
|
1caf4bd6b5 | ||
|
fbcb5558be | ||
|
87c6c4c4b9 | ||
|
5380271eb4 | ||
|
5f1290720e | ||
|
d5d1ef919b | ||
|
93fc7b9d56 | ||
|
494d98ad6b | ||
|
94ed923333 | ||
|
3bc2bbc208 | ||
|
587c68a969 | ||
|
6e75ca258b | ||
|
3dec968fc3 | ||
|
d9d67b182b | ||
|
36a5cc979d | ||
|
373ab8fe81 | ||
|
3f94ec379d | ||
|
a81a8b2b69 | ||
|
9cdff1d010 | ||
|
93b27351a0 | ||
|
dee34bd97c | ||
|
b342a2f487 | ||
|
a9654cc0ae | ||
|
2f361aca48 | ||
|
ebf9baac27 | ||
|
a24b74603f | ||
|
8c63f13387 | ||
|
c7734a8d9f | ||
|
214e7e58fa | ||
|
93db3237a6 | ||
|
266aca2734 | ||
|
ad8de25f7f | ||
|
c29a3e5f01 | ||
|
013835fc31 | ||
|
c237bb81dd | ||
|
2c3af860aa | ||
|
f03e80694c | ||
|
99d601138f | ||
|
d1838000cf | ||
|
f909041319 | ||
|
d618261a99 | ||
|
158dccc64d | ||
|
bd941025b6 | ||
|
4289bd5350 | ||
|
0678e22e4e | ||
|
40a6c2caa9 | ||
|
9e9e773dc3 | ||
|
4710354d96 | ||
|
82e2371847 | ||
|
1781d4edd2 | ||
|
9d66d582db | ||
|
0cbd35452f | ||
|
edb15cc117 | ||
|
a10007a68e | ||
|
ba7905a205 | ||
|
fa6fe78f8b | ||
|
5b5dada0fe | ||
|
0daaa011ef | ||
|
b901f73107 | ||
|
499d12e0d3 | ||
|
1b759ea93b | ||
|
c0938ffedb | ||
|
7852a580ae | ||
|
030ab99674 | ||
|
96e7310143 | ||
|
f704b1a538 | ||
|
535dd55fe2 | ||
|
4d863eef7b | ||
|
5b0022bb87 | ||
|
f574403445 | ||
|
ad2a5d3dd6 | ||
|
f796bfdafe | ||
|
ef97a308f3 | ||
|
a9d552729c | ||
|
13222283c6 | ||
|
0e812063d8 | ||
|
7435f2dbd5 | ||
|
bdbd92b7f9 | ||
|
01b1be350b | ||
|
08250aa8ef | ||
|
936b40cd88 | ||
|
b698806a07 | ||
|
06c356bdcc | ||
|
71f97c063f | ||
|
adf3685e88 | ||
|
d4cf2205e5 | ||
|
26eba6a8e5 | ||
|
75069baad4 | ||
|
329847eb90 | ||
|
95583789b5 | ||
|
499750b3df | ||
|
a21fdf2c78 | ||
|
1cea48b447 | ||
|
9ff53a59f9 | ||
|
04ec788d07 | ||
|
3c2249eae8 | ||
|
ba93544473 | ||
|
0247486b13 | ||
|
75c038d464 | ||
|
3481cca8ec | ||
|
445b47b618 | ||
|
80cf6325b0 | ||
|
06e3a9c725 | ||
|
5b69d91e65 | ||
|
61e3163f48 | ||
|
8b30615cd7 | ||
|
2063dcfd4c | ||
|
b5c3b5e59a | ||
|
94b2803842 | ||
|
66b02d0536 | ||
|
138610781b | ||
|
728c79534d | ||
|
7d688a3db0 | ||
|
74faa2a03e | ||
|
558f4e7880 | ||
|
a0240e7847 | ||
|
617f861af5 | ||
|
a6ee082798 | ||
|
dce4f6fb06 | ||
|
e1d274811c | ||
|
ae5267dcdf | ||
|
5295b26aaf | ||
|
b69a0b96f5 | ||
|
608b59ec07 | ||
|
45cc5cc9c5 | ||
|
d619848211 | ||
|
996c8061a2 | ||
|
2d84939be0 | ||
|
e6cf8d5a45 |
@ -1,7 +0,0 @@
|
||||
engines:
|
||||
fixme:
|
||||
enabled: true
|
||||
ratings:
|
||||
paths: []
|
||||
exclude_paths:
|
||||
- "readme.md"
|
@ -1,14 +0,0 @@
|
||||
# EditorConfig: http://editorconfig.org/
|
||||
|
||||
root = true
|
||||
|
||||
[*]
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
end_of_line = lf
|
||||
charset = utf-8
|
||||
trim_trailing_whitespace = true
|
||||
insert_final_newline = true
|
||||
|
||||
[*.md]
|
||||
trim_trailing_whitespace = false
|
270
.gitignore
vendored
270
.gitignore
vendored
@ -1,55 +1,235 @@
|
||||
*.class
|
||||
test-output
|
||||
### Gradle ###
|
||||
.gradle
|
||||
build/
|
||||
|
||||
# Mobile Tools for Java (J2ME)
|
||||
.mtj.tmp/
|
||||
# Ignore Gradle GUI config
|
||||
gradle-app.setting
|
||||
|
||||
# Package Files #
|
||||
*.jar
|
||||
*.war
|
||||
*.ear
|
||||
# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored)
|
||||
!gradle-wrapper.jar
|
||||
|
||||
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
|
||||
hs_err_pid*
|
||||
# Cache of project
|
||||
.gradletasknamecache
|
||||
|
||||
target
|
||||
bin
|
||||
.project
|
||||
.classpath
|
||||
.settings
|
||||
# # Work around https://youtrack.jetbrains.com/issue/IDEA-116898
|
||||
# gradle/wrapper/gradle-wrapper.properties
|
||||
|
||||
sw-pom.xml
|
||||
*.iml
|
||||
test-config.xml
|
||||
.idea
|
||||
/.gradle/
|
||||
/gradle/
|
||||
*.bat
|
||||
/gradlew
|
||||
### Gradle Patch ###
|
||||
**/build/
|
||||
|
||||
# OSX
|
||||
# Icon must end with two \r
|
||||
Icon
|
||||
### Intellij ###
|
||||
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm
|
||||
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
|
||||
|
||||
# User-specific stuff
|
||||
.idea/**/workspace.xml
|
||||
.idea/**/tasks.xml
|
||||
.idea/**/usage.statistics.xml
|
||||
.idea/**/dictionaries
|
||||
.idea/**/shelf
|
||||
|
||||
# Generated files
|
||||
.idea/**/contentModel.xml
|
||||
|
||||
# Sensitive or high-churn files
|
||||
.idea/**/dataSources/
|
||||
.idea/**/dataSources.ids
|
||||
.idea/**/dataSources.local.xml
|
||||
.idea/**/sqlDataSources.xml
|
||||
.idea/**/dynamic.xml
|
||||
.idea/**/uiDesigner.xml
|
||||
.idea/**/dbnavigator.xml
|
||||
|
||||
# Gradle
|
||||
.idea/**/gradle.xml
|
||||
.idea/**/libraries
|
||||
|
||||
# Gradle and Maven with auto-import
|
||||
# When using Gradle or Maven with auto-import, you should exclude module files,
|
||||
# since they will be recreated, and may cause churn. Uncomment if using
|
||||
# auto-import.
|
||||
# .idea/modules.xml
|
||||
# .idea/*.iml
|
||||
# .idea/modules
|
||||
# *.iml
|
||||
# *.ipr
|
||||
|
||||
# CMake
|
||||
cmake-build-*/
|
||||
|
||||
# Mongo Explorer plugin
|
||||
.idea/**/mongoSettings.xml
|
||||
|
||||
# File-based project format
|
||||
*.iws
|
||||
|
||||
# IntelliJ
|
||||
out/
|
||||
|
||||
# mpeltonen/sbt-idea plugin
|
||||
.idea_modules/
|
||||
|
||||
# JIRA plugin
|
||||
atlassian-ide-plugin.xml
|
||||
|
||||
# Cursive Clojure plugin
|
||||
.idea/replstate.xml
|
||||
|
||||
# Crashlytics plugin (for Android Studio and IntelliJ)
|
||||
com_crashlytics_export_strings.xml
|
||||
crashlytics.properties
|
||||
crashlytics-build.properties
|
||||
fabric.properties
|
||||
|
||||
# Editor-based Rest Client
|
||||
.idea/httpRequests
|
||||
|
||||
# Android studio 3.1+ serialized cache file
|
||||
.idea/caches/build_file_checksums.ser
|
||||
|
||||
### Intellij Patch ###
|
||||
# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721
|
||||
|
||||
# *.iml
|
||||
# modules.xml
|
||||
# .idea/misc.xml
|
||||
# *.ipr
|
||||
|
||||
# Sonarlint plugin
|
||||
.idea/sonarlint
|
||||
|
||||
|
||||
._*
|
||||
.DS_Store
|
||||
.AppleDouble
|
||||
.LSOverride
|
||||
.DocumentRevisions-V100
|
||||
.fseventsd
|
||||
.Spotlight-V100
|
||||
.TemporaryItems
|
||||
.Trashes
|
||||
.VolumeIcon.icns
|
||||
.AppleDB
|
||||
.AppleDesktop
|
||||
Network Trash Folder
|
||||
Temporary Items
|
||||
.apdisk
|
||||
/.sonar/
|
||||
sonar-project.properties
|
||||
### Intellij+iml ###
|
||||
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm
|
||||
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
|
||||
|
||||
!/.mvn/wrapper/maven-wrapper.jar
|
||||
*.versionsBackup
|
||||
# User-specific stuff
|
||||
.idea/**/workspace.xml
|
||||
.idea/**/tasks.xml
|
||||
.idea/**/usage.statistics.xml
|
||||
.idea/**/dictionaries
|
||||
.idea/**/shelf
|
||||
|
||||
# Generated files
|
||||
.idea/**/contentModel.xml
|
||||
|
||||
# Sensitive or high-churn files
|
||||
.idea/**/dataSources/
|
||||
.idea/**/dataSources.ids
|
||||
.idea/**/dataSources.local.xml
|
||||
.idea/**/sqlDataSources.xml
|
||||
.idea/**/dynamic.xml
|
||||
.idea/**/uiDesigner.xml
|
||||
.idea/**/dbnavigator.xml
|
||||
|
||||
# Gradle
|
||||
.idea/**/gradle.xml
|
||||
.idea/**/libraries
|
||||
|
||||
# Gradle and Maven with auto-import
|
||||
# When using Gradle or Maven with auto-import, you should exclude module files,
|
||||
# since they will be recreated, and may cause churn. Uncomment if using
|
||||
# auto-import.
|
||||
# .idea/modules.xml
|
||||
# .idea/*.iml
|
||||
# .idea/modules
|
||||
# *.iml
|
||||
# *.ipr
|
||||
|
||||
# CMake
|
||||
cmake-build-*/
|
||||
|
||||
# Mongo Explorer plugin
|
||||
.idea/**/mongoSettings.xml
|
||||
|
||||
# File-based project format
|
||||
*.iws
|
||||
|
||||
# IntelliJ
|
||||
out/
|
||||
|
||||
# mpeltonen/sbt-idea plugin
|
||||
.idea_modules/
|
||||
|
||||
# JIRA plugin
|
||||
atlassian-ide-plugin.xml
|
||||
|
||||
# Cursive Clojure plugin
|
||||
.idea/replstate.xml
|
||||
|
||||
# Crashlytics plugin (for Android Studio and IntelliJ)
|
||||
com_crashlytics_export_strings.xml
|
||||
crashlytics.properties
|
||||
crashlytics-build.properties
|
||||
fabric.properties
|
||||
|
||||
# Editor-based Rest Client
|
||||
.idea/httpRequests
|
||||
|
||||
# Android studio 3.1+ serialized cache file
|
||||
.idea/caches/build_file_checksums.ser
|
||||
|
||||
### Intellij+iml Patch ###
|
||||
# Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-249601023
|
||||
|
||||
*.iml
|
||||
modules.xml
|
||||
.idea/misc.xml
|
||||
*.ipr
|
||||
|
||||
### Maven ###
|
||||
target/
|
||||
pom.xml.tag
|
||||
pom.xml.releaseBackup
|
||||
pom.xml.versionsBackup
|
||||
pom.xml.next
|
||||
release.properties
|
||||
dependency-reduced-pom.xml
|
||||
buildNumber.properties
|
||||
.mvn/timing.properties
|
||||
.mvn/wrapper/maven-wrapper.jar
|
||||
.flattened-pom.xml
|
||||
|
||||
# CMake
|
||||
cmake-build-*/
|
||||
|
||||
# Mongo Explorer plugin
|
||||
.idea/**/mongoSettings.xml
|
||||
|
||||
# File-based project format
|
||||
*.iws
|
||||
|
||||
# IntelliJ
|
||||
out/
|
||||
|
||||
# mpeltonen/sbt-idea plugin
|
||||
.idea_modules/
|
||||
|
||||
# JIRA plugin
|
||||
atlassian-ide-plugin.xml
|
||||
|
||||
# Cursive Clojure plugin
|
||||
.idea/replstate.xml
|
||||
|
||||
# Crashlytics plugin (for Android Studio and IntelliJ)
|
||||
com_crashlytics_export_strings.xml
|
||||
crashlytics.properties
|
||||
crashlytics-build.properties
|
||||
fabric.properties
|
||||
|
||||
# Editor-based Rest Client
|
||||
.idea/httpRequests
|
||||
|
||||
# Android studio 3.1+ serialized cache file
|
||||
.idea/caches/build_file_checksums.ser
|
||||
|
||||
### Intellij Patch ###
|
||||
# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721
|
||||
|
||||
# *.iml
|
||||
# modules.xml
|
||||
# .idea/misc.xml
|
||||
# *.ipr
|
||||
|
||||
# Sonarlint plugin
|
||||
.idea/sonarlint
|
||||
|
16
.idea/checkstyle-idea.xml
generated
Normal file
16
.idea/checkstyle-idea.xml
generated
Normal file
@ -0,0 +1,16 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="CheckStyle-IDEA" serialisationVersion="2">
|
||||
<checkstyleVersion>10.22.0</checkstyleVersion>
|
||||
<scanScope>JavaOnly</scanScope>
|
||||
<copyLibs>true</copyLibs>
|
||||
<option name="thirdPartyClasspath" />
|
||||
<option name="activeLocationIds" />
|
||||
<option name="locations">
|
||||
<list>
|
||||
<ConfigurationLocation id="bundled-sun-checks" type="BUNDLED" scope="All" description="Sun Checks">(bundled)</ConfigurationLocation>
|
||||
<ConfigurationLocation id="bundled-google-checks" type="BUNDLED" scope="All" description="Google Checks">(bundled)</ConfigurationLocation>
|
||||
</list>
|
||||
</option>
|
||||
</component>
|
||||
</project>
|
18
.idea/compiler.xml
generated
Normal file
18
.idea/compiler.xml
generated
Normal file
@ -0,0 +1,18 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="CompilerConfiguration">
|
||||
<annotationProcessing>
|
||||
<profile name="Maven default annotation processors profile" enabled="true">
|
||||
<sourceOutputDir name="target/generated-sources/annotations" />
|
||||
<sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
|
||||
<outputRelativeToContentRoot value="true" />
|
||||
<module name="wechat-j-open" />
|
||||
<module name="wechat-j-pay" />
|
||||
<module name="wechat-j-work" />
|
||||
<module name="wechat-j-common" />
|
||||
<module name="wechat-j-mp" />
|
||||
<module name="wechat-j-oa" />
|
||||
</profile>
|
||||
</annotationProcessing>
|
||||
</component>
|
||||
</project>
|
19
.idea/encodings.xml
generated
Normal file
19
.idea/encodings.xml
generated
Normal file
@ -0,0 +1,19 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="Encoding">
|
||||
<file url="file://$PROJECT_DIR$/common/src/main/java" charset="UTF-8" />
|
||||
<file url="file://$PROJECT_DIR$/common/src/main/resources" charset="UTF-8" />
|
||||
<file url="file://$PROJECT_DIR$/mp/src/main/java" charset="UTF-8" />
|
||||
<file url="file://$PROJECT_DIR$/mp/src/main/resources" charset="UTF-8" />
|
||||
<file url="file://$PROJECT_DIR$/oa/src/main/java" charset="UTF-8" />
|
||||
<file url="file://$PROJECT_DIR$/oa/src/main/resources" charset="UTF-8" />
|
||||
<file url="file://$PROJECT_DIR$/open/src/main/java" charset="UTF-8" />
|
||||
<file url="file://$PROJECT_DIR$/open/src/main/resources" charset="UTF-8" />
|
||||
<file url="file://$PROJECT_DIR$/pay/src/main/java" charset="UTF-8" />
|
||||
<file url="file://$PROJECT_DIR$/pay/src/main/resources" charset="UTF-8" />
|
||||
<file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
|
||||
<file url="file://$PROJECT_DIR$/src/main/resources" charset="UTF-8" />
|
||||
<file url="file://$PROJECT_DIR$/work/src/main/java" charset="UTF-8" />
|
||||
<file url="file://$PROJECT_DIR$/work/src/main/resources" charset="UTF-8" />
|
||||
</component>
|
||||
</project>
|
30
.idea/jarRepositories.xml
generated
Normal file
30
.idea/jarRepositories.xml
generated
Normal file
@ -0,0 +1,30 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="RemoteRepositoriesConfiguration">
|
||||
<remote-repository>
|
||||
<option name="id" value="ossez-repo-releases" />
|
||||
<option name="name" value="iSharkFly Private Releases" />
|
||||
<option name="url" value="https://repo.isharkfly.com/repository/isharkfly-maven-releases/" />
|
||||
</remote-repository>
|
||||
<remote-repository>
|
||||
<option name="id" value="central" />
|
||||
<option name="name" value="Central Repository" />
|
||||
<option name="url" value="https://repo.isharkfly.com/repository/maven/" />
|
||||
</remote-repository>
|
||||
<remote-repository>
|
||||
<option name="id" value="ossez-repo-snapshots" />
|
||||
<option name="name" value="iSharkFly Private Snapshots" />
|
||||
<option name="url" value="https://repo.isharkfly.com/repository/isharkfly-maven-snapshots/" />
|
||||
</remote-repository>
|
||||
<remote-repository>
|
||||
<option name="id" value="central" />
|
||||
<option name="name" value="Maven Central repository" />
|
||||
<option name="url" value="https://repo1.maven.org/maven2" />
|
||||
</remote-repository>
|
||||
<remote-repository>
|
||||
<option name="id" value="jboss.community" />
|
||||
<option name="name" value="JBoss Community repository" />
|
||||
<option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
|
||||
</remote-repository>
|
||||
</component>
|
||||
</project>
|
6
.idea/vcs.xml
generated
Normal file
6
.idea/vcs.xml
generated
Normal file
@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="" vcs="Git" />
|
||||
</component>
|
||||
</project>
|
BIN
.mvn/wrapper/maven-wrapper.jar
vendored
BIN
.mvn/wrapper/maven-wrapper.jar
vendored
Binary file not shown.
1
.mvn/wrapper/maven-wrapper.properties
vendored
1
.mvn/wrapper/maven-wrapper.properties
vendored
@ -1 +0,0 @@
|
||||
distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.5.2/apache-maven-3.5.2-bin.zip
|
27
.travis.yml
27
.travis.yml
@ -1,27 +0,0 @@
|
||||
language: java
|
||||
#sudo: false
|
||||
#install: true
|
||||
#addons:
|
||||
# sonarcloud:
|
||||
# token:
|
||||
# secure: "834110c7191f97ecb226970c46dcaff8e681da5a"
|
||||
|
||||
jdk:
|
||||
- oraclejdk8
|
||||
script: "./mvnw clean package -DskipTests=true"
|
||||
|
||||
#script:
|
||||
# - mvn clean org.jacoco:jacoco-maven-plugin:prepare-agent package sonar:sonar
|
||||
|
||||
branches:
|
||||
only:
|
||||
- develop
|
||||
|
||||
cache:
|
||||
directories:
|
||||
- '$HOME/.m2/repository'
|
||||
# - '$HOME/.sonar/cache'
|
||||
|
||||
notifications:
|
||||
email:
|
||||
- binarywang@vip.qq.com
|
214
LICENSE
214
LICENSE
@ -1,201 +1,21 @@
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
MIT License
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
Copyright (c) 2023 OSSEZ
|
||||
|
||||
1. Definitions.
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "{}"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright {yyyy} {name of copyright owner}
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
|
150
README.md
Normal file
150
README.md
Normal file
@ -0,0 +1,150 @@
|
||||
# WeChat-J - 微信开发 Java SDK
|
||||
|
||||
<p align="center">
|
||||
<a href="https://github.com/honeymoose">
|
||||
<img height=85 src="https://avatars1.githubusercontent.com/u/45009982?s=200&v=4">
|
||||
</a>
|
||||
<br>This project builds by JDK 11 and OpenJ9 for JVM.
|
||||
</p>
|
||||
|
||||
* [社区和讨论 (community)](https://www.ossez.com/tag/wechat)
|
||||
|
||||
WeChat-J 开发使用的库。
|
||||
|
||||
我们旨在提供一个初始化的开发框架,能够让应用在使用 Spring Boot 框架的基础上让你的微信公众号快速接入微信平台。
|
||||
|
||||
# 项目说明
|
||||
|
||||
我们在网上找了一些微信相关的 SDK,要不就是缺少维护,要不就是集成了非常多的功能,因我们的公众号希望能够尽量的自动化处理,所以我们在已有的基础上进行了一些修改和整合。
|
||||
|
||||
## 必要的准备
|
||||
|
||||
因微信开发 Java SDK 的开发其实并不非常复杂,主要是通过 HTTP 发送请求并且将获得的返回数据进行一些处理返回对象就可以了。
|
||||
|
||||
我们需要调用微信的 HTTP 接口,所以我们需要在 Java 中使用一个 Http 客户端,在当前我们的环境中,我们只使用 OkHttp 来进行实现。
|
||||
|
||||
在老的项目中,可能不少人会使用 Apache 的 HttpClient 来进行实现,但因为 OkHttp 广泛的被使用在安卓的手机上,所以使用 OkHttp
|
||||
会更加简便。
|
||||
|
||||
* [Retrofit 是什么](https://www.ossez.com/t/retrofit/14302)
|
||||
* [RxJava 是什么](https://www.ossez.com/t/rxjava/14305)
|
||||
* [微信测试平台获得测试账号](https://www.ossez.com/t/topic/14281)
|
||||
|
||||
### Maven 和依赖
|
||||
|
||||
当前我们还没有把正式版发布到仓库中,我们还在使用 0.0.1-SNAPSHOT 版本进行内部测试。
|
||||
|
||||
最好的版本就是下载我们的源代码后 Fork 到你本地,然后直接使用 Maven 来进行编译。
|
||||
|
||||
#### 微信公众号(WeChat Java Official Account)
|
||||
|
||||
模块名:wechat-j-oa
|
||||
|
||||
```xml
|
||||
|
||||
<dependency>
|
||||
<groupId>com.ossez.wechat</groupId>
|
||||
<artifactId>wechat-j-oa</artifactId>
|
||||
<version>0.0.1-SNAPSHOT</version>
|
||||
</dependency>
|
||||
```
|
||||
|
||||
#### 微信小程序(WeChat Java Mini Programs)
|
||||
|
||||
模块名:wechat-j-mp
|
||||
|
||||
```xml
|
||||
|
||||
<dependency>
|
||||
<groupId>com.ossez.wechat</groupId>
|
||||
<artifactId>wechat-j-mp</artifactId>
|
||||
<version>0.0.1-SNAPSHOT</version>
|
||||
</dependency>
|
||||
```
|
||||
|
||||
#### 微信支付(WeChat Java Pay)
|
||||
|
||||
模块名:wechat-j-pay
|
||||
|
||||
```xml
|
||||
|
||||
<dependency>
|
||||
<groupId>com.ossez.wechat</groupId>
|
||||
<artifactId>wechat-j-pay</artifactId>
|
||||
<version>0.0.1-SNAPSHOT</version>
|
||||
</dependency>
|
||||
```
|
||||
|
||||
#### 企业微信(WeChat Java WeCom)
|
||||
|
||||
模块名:wechat-j-work
|
||||
|
||||
```xml
|
||||
|
||||
<dependency>
|
||||
<groupId>com.ossez.wechat</groupId>
|
||||
<artifactId>wechat-j-work</artifactId>
|
||||
<version>0.0.1-SNAPSHOT</version>
|
||||
</dependency>
|
||||
```
|
||||
|
||||
#### 微信开放平台(WeChat Java Open)
|
||||
|
||||
模块名:wechat-j-open
|
||||
|
||||
```xml
|
||||
|
||||
<dependency>
|
||||
<groupId>com.ossez.wechat</groupId>
|
||||
<artifactId>wechat-j-open</artifactId>
|
||||
<version>0.0.1-SNAPSHOT</version>
|
||||
</dependency>
|
||||
```
|
||||
|
||||
### 其他内容
|
||||
|
||||
* 任何有关讨论,请访问 [社区](https://www.ossez.com/tag/wechat),您可以在这里提出功能需求,Bug 修复,问题解答。
|
||||
* 可以考虑使用 http://paste.ubuntu.com 来对你在提交问题的时候出现的为代码进行简化。
|
||||
|
||||
### 框架和案例
|
||||
|
||||
如果你想登记你的项目,请[访问这里](https://www.ossez.com/t/wechat-j-demo/14303)。
|
||||
|
||||
同时,我们也提供了一些开发框架,能够让你直接检出项目就可以直接对微信 SDK 进行接入和测试。
|
||||
|
||||
* [公众号 Spring Boot 测试程序](https://github.com/honeymoose/WeChat-Official-Account-Spring)
|
||||
|
||||
# 联系方式
|
||||
|
||||
请使用下面的联系方式和我们联系。
|
||||
|
||||
* [社区和讨论](https://www.ossez.com/tag/chat-gpt)
|
||||
|
||||
| 联系方式名称 | 联系方式 |
|
||||
|------------------|-----------------------------------------------|
|
||||
| 电子邮件(Email) | [yhu@ossez.com](mailto:yhu@ossez.com) |
|
||||
| QQ 或微信(WeChat) | 103899765 |
|
||||
| QQ 交流群 | 15186112 |
|
||||
| 社区论坛 (Community) | https://www.ossez.com/c/computer-technology/7 |
|
||||
|
||||
# 公众平台
|
||||
|
||||
我们建议您通过社区论坛来和我们进行沟通,请关注我们公众平台上的账号
|
||||
|
||||
## 微信公众号
|
||||
|
||||

|
||||
|
||||
## 头条号
|
||||
|
||||
我们也在头条号上创建了我们的公众号,请扫描下面的 QR 关注我们的头条号。
|
||||
|
||||

|
||||
|
||||
## 知乎
|
||||
|
||||
请关注我们的知乎:https://www.zhihu.com/people/huyuchengus
|
||||
|
||||
# License
|
||||
|
||||
[WeChat-J is licensed under the MIT License](https://src.ossez.com/honeymoose/WeChat-J/src/branch/main/LICENSE)
|
Binary file not shown.
Before Width: | Height: | Size: 55 KiB |
@ -1,2 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
./mvnw org.codehaus.mojo:versions-maven-plugin:display-dependency-updates
|
@ -1,2 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
./mvnw org.codehaus.mojo:versions-maven-plugin:display-plugin-updates
|
@ -1,2 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
./mvnw org.codehaus.mojo:versions-maven-plugin:display-property-updates
|
186
common/pom.xml
Normal file
186
common/pom.xml
Normal file
@ -0,0 +1,186 @@
|
||||
<?xml version="1.0"?>
|
||||
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
|
||||
xmlns="http://maven.apache.org/POM/4.0.0">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<groupId>com.ossez.wechat</groupId>
|
||||
<artifactId>wechat-j-common</artifactId>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<parent>
|
||||
<groupId>com.ossez.wechat</groupId>
|
||||
<artifactId>wechat-j</artifactId>
|
||||
<version>0.0.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
|
||||
<name>WeChat Java Common</name>
|
||||
<description>The module is common for all other package</description>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.jodd</groupId>
|
||||
<artifactId>jodd-http</artifactId>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.slf4j</groupId>
|
||||
<artifactId>slf4j-api</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.thoughtworks.xstream</groupId>
|
||||
<artifactId>xstream</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.httpcomponents</groupId>
|
||||
<artifactId>httpclient</artifactId>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<artifactId>commons-logging</artifactId>
|
||||
<groupId>commons-logging</groupId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.httpcomponents</groupId>
|
||||
<artifactId>httpmime</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.slf4j</groupId>
|
||||
<artifactId>jcl-over-slf4j</artifactId>
|
||||
<version>1.7.36</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.google.code.gson</groupId>
|
||||
<artifactId>gson</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>commons-codec</groupId>
|
||||
<artifactId>commons-codec</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>commons-io</groupId>
|
||||
<artifactId>commons-io</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.commons</groupId>
|
||||
<artifactId>commons-lang3</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.google.guava</groupId>
|
||||
<artifactId>guava</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>ch.qos.logback</groupId>
|
||||
<artifactId>logback-classic</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.google.inject</groupId>
|
||||
<artifactId>guice</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.eclipse.jetty</groupId>
|
||||
<artifactId>jetty-server</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.eclipse.jetty</groupId>
|
||||
<artifactId>jetty-servlet</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.assertj</groupId>
|
||||
<artifactId>assertj-guava</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.dom4j</groupId>
|
||||
<artifactId>dom4j</artifactId>
|
||||
<version>2.1.3</version>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>pull-parser</groupId>
|
||||
<artifactId>pull-parser</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>redis.clients</groupId>
|
||||
<artifactId>jedis</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.github.jedis-lock</groupId>
|
||||
<artifactId>jedis-lock</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.redisson</groupId>
|
||||
<artifactId>redisson</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.data</groupId>
|
||||
<artifactId>spring-data-redis</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.jetbrains</groupId>
|
||||
<artifactId>annotations</artifactId>
|
||||
<version>RELEASE</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-surefire-plugin</artifactId>
|
||||
<configuration>
|
||||
<suiteXmlFiles>
|
||||
<suiteXmlFile>src/test/resources/testng.xml</suiteXmlFile>
|
||||
</suiteXmlFiles>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
<profiles>
|
||||
<profile>
|
||||
<id>native-image</id>
|
||||
<activation>
|
||||
<activeByDefault>false</activeByDefault>
|
||||
</activation>
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<version>3.5.1</version>
|
||||
<configuration>
|
||||
<annotationProcessors>
|
||||
com.github.binarywang.wx.graal.GraalProcessor,lombok.launch.AnnotationProcessorHider$AnnotationProcessor,lombok.launch.AnnotationProcessorHider$ClaimingProcessor
|
||||
</annotationProcessors>
|
||||
<annotationProcessorPaths>
|
||||
<path>
|
||||
<groupId>com.github.binarywang</groupId>
|
||||
<artifactId>weixin-graal</artifactId>
|
||||
<version>${project.version}</version>
|
||||
</path>
|
||||
</annotationProcessorPaths>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
</profile>
|
||||
</profiles>
|
||||
|
||||
</project>
|
@ -1,4 +1,4 @@
|
||||
package me.chanjar.weixin.common.annotation;
|
||||
package com.ossez.wechat.common.annotation;
|
||||
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
@ -0,0 +1,32 @@
|
||||
package com.ossez.wechat.common.api;
|
||||
|
||||
import com.ossez.wechat.common.model.WeChatAccessToken;
|
||||
import com.ossez.wechat.common.model.WeChatApiDomainIp;
|
||||
import com.ossez.wechat.common.model.req.NetworkCheck;
|
||||
import com.ossez.wechat.common.model.req.QueryQuota;
|
||||
import com.ossez.wechat.common.model.res.NetworkCheckResponse;
|
||||
import com.ossez.wechat.common.model.res.QueryQuotaResponse;
|
||||
import io.reactivex.Single;
|
||||
import retrofit2.http.Body;
|
||||
import retrofit2.http.GET;
|
||||
import retrofit2.http.POST;
|
||||
import retrofit2.http.Query;
|
||||
|
||||
public interface WeChatOfficialAccountApi {
|
||||
|
||||
@GET("/cgi-bin/token")
|
||||
Single<WeChatAccessToken> getAccessToken(@Query("grant_type") String grantType, @Query("appid") String appId, @Query("secret") String secret);
|
||||
|
||||
@GET("/cgi-bin/get_api_domain_ip")
|
||||
Single<WeChatApiDomainIp> getDomainIPs();
|
||||
|
||||
@POST("/cgi-bin/callback/check")
|
||||
Single<NetworkCheckResponse> checkNetwork(@Body NetworkCheck request);
|
||||
|
||||
@POST("/cgi-bin/clear_quota")
|
||||
Single<NetworkCheckResponse> clearQuota(@Body NetworkCheck request);
|
||||
|
||||
@POST("/cgi-bin/openapi/quota/get")
|
||||
Single<QueryQuotaResponse> queryQuota(@Body QueryQuota request);
|
||||
|
||||
}
|
@ -0,0 +1,26 @@
|
||||
package com.ossez.wechat.common.api;
|
||||
|
||||
import com.ossez.wechat.common.model.WeChatAccessToken;
|
||||
import com.ossez.wechat.common.model.WeChatApiDomainIp;
|
||||
import com.ossez.wechat.common.model.WeChatOAuth2AccessToken;
|
||||
import com.ossez.wechat.common.model.entity.WeChatOAuth2UserInfo;
|
||||
import com.ossez.wechat.common.model.req.NetworkCheck;
|
||||
import com.ossez.wechat.common.model.req.QueryQuota;
|
||||
import com.ossez.wechat.common.model.res.NetworkCheckResponse;
|
||||
import com.ossez.wechat.common.model.res.QueryQuotaResponse;
|
||||
import io.reactivex.Single;
|
||||
import retrofit2.http.Body;
|
||||
import retrofit2.http.GET;
|
||||
import retrofit2.http.POST;
|
||||
import retrofit2.http.Query;
|
||||
|
||||
public interface WeChatOpenApi {
|
||||
|
||||
@GET("/sns/oauth2/access_token")
|
||||
Single<WeChatOAuth2AccessToken> getAccessToken(@Query("grant_type") String grantType, @Query("appid") String appId, @Query("secret") String secret, @Query("code") String code);
|
||||
|
||||
@GET("/sns/userinfo")
|
||||
Single<WeChatOAuth2UserInfo> getWeChatUserInfo(@Query("access_token") String accessToken, @Query("openid") String openId);
|
||||
|
||||
|
||||
}
|
@ -0,0 +1,14 @@
|
||||
package com.ossez.wechat.common.api;
|
||||
|
||||
import com.ossez.wechat.common.exception.WxErrorException;
|
||||
|
||||
/**
|
||||
* WxErrorException处理器.
|
||||
*
|
||||
* @author Daniel Qian
|
||||
*/
|
||||
public interface WxErrorExceptionHandler {
|
||||
|
||||
void handle(WxErrorException e);
|
||||
|
||||
}
|
@ -1,10 +1,12 @@
|
||||
package me.chanjar.weixin.common.api;
|
||||
package com.ossez.wechat.common.api;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 消息重复检查器.
|
||||
* 微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次
|
||||
* </pre>
|
||||
*
|
||||
* @author Daniel Qian
|
||||
*/
|
||||
public interface WxMessageDuplicateChecker {
|
||||
|
@ -0,0 +1,97 @@
|
||||
package com.ossez.wechat.common.api;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 默认消息重复检查器.
|
||||
* 将每个消息id保存在内存里,每隔5秒清理已经过期的消息id,每个消息id的过期时间是15秒
|
||||
* 替换类WxMessageInMemoryDuplicateCheckerSingleton
|
||||
* </pre>
|
||||
*
|
||||
* @author Daniel Qian
|
||||
*/
|
||||
@Deprecated
|
||||
public class WxMessageInMemoryDuplicateChecker implements WxMessageDuplicateChecker {
|
||||
|
||||
/**
|
||||
* 一个消息ID在内存的过期时间:15秒.
|
||||
*/
|
||||
private final Long timeToLive;
|
||||
|
||||
/**
|
||||
* 每隔多少周期检查消息ID是否过期:5秒.
|
||||
*/
|
||||
private final Long clearPeriod;
|
||||
|
||||
/**
|
||||
* 消息id->消息时间戳的map.
|
||||
*/
|
||||
private final ConcurrentHashMap<String, Long> msgId2Timestamp = new ConcurrentHashMap<>();
|
||||
|
||||
/**
|
||||
* 后台清理线程是否已经开启.
|
||||
*/
|
||||
private final AtomicBoolean backgroundProcessStarted = new AtomicBoolean(false);
|
||||
|
||||
/**
|
||||
* 无参构造方法.
|
||||
* <pre>
|
||||
* 一个消息ID在内存的过期时间:15秒
|
||||
* 每隔多少周期检查消息ID是否过期:5秒
|
||||
* </pre>
|
||||
*/
|
||||
public WxMessageInMemoryDuplicateChecker() {
|
||||
this.timeToLive = 15 * 1000L;
|
||||
this.clearPeriod = 5 * 1000L;
|
||||
}
|
||||
|
||||
/**
|
||||
* 构造方法.
|
||||
*
|
||||
* @param timeToLive 一个消息ID在内存的过期时间:毫秒
|
||||
* @param clearPeriod 每隔多少周期检查消息ID是否过期:毫秒
|
||||
*/
|
||||
public WxMessageInMemoryDuplicateChecker(Long timeToLive, Long clearPeriod) {
|
||||
this.timeToLive = timeToLive;
|
||||
this.clearPeriod = clearPeriod;
|
||||
}
|
||||
|
||||
protected void checkBackgroundProcessStarted() {
|
||||
if (this.backgroundProcessStarted.getAndSet(true)) {
|
||||
return;
|
||||
}
|
||||
Thread t = new Thread(() -> {
|
||||
try {
|
||||
while (true) {
|
||||
Thread.sleep(WxMessageInMemoryDuplicateChecker.this.clearPeriod);
|
||||
Long now = System.currentTimeMillis();
|
||||
for (Map.Entry<String, Long> entry :
|
||||
WxMessageInMemoryDuplicateChecker.this.msgId2Timestamp.entrySet()) {
|
||||
if (now - entry.getValue() > WxMessageInMemoryDuplicateChecker.this.timeToLive) {
|
||||
WxMessageInMemoryDuplicateChecker.this.msgId2Timestamp.entrySet().remove(entry);
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (InterruptedException e) {
|
||||
Thread.currentThread().interrupt();
|
||||
}
|
||||
});
|
||||
t.setDaemon(true);
|
||||
t.start();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isDuplicate(String messageId) {
|
||||
if (messageId == null) {
|
||||
return false;
|
||||
}
|
||||
checkBackgroundProcessStarted();
|
||||
Long timestamp = this.msgId2Timestamp.putIfAbsent(messageId, System.currentTimeMillis());
|
||||
return timestamp != null;
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -0,0 +1,91 @@
|
||||
package com.ossez.wechat.common.api;
|
||||
|
||||
import com.google.common.util.concurrent.ThreadFactoryBuilder;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.ScheduledThreadPoolExecutor;
|
||||
import java.util.concurrent.ThreadPoolExecutor;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
/**
|
||||
* @author jiangby
|
||||
* @version 1.0
|
||||
* <p>
|
||||
* 消息去重,记录消息ID首次出现时的时间戳,
|
||||
* 15S后定时任务触发时废除该记录消息ID
|
||||
* </p>
|
||||
* created on 2022/5/26 1:32
|
||||
*/
|
||||
@Slf4j
|
||||
public class WxMessageInMemoryDuplicateCheckerSingleton implements WxMessageDuplicateChecker {
|
||||
|
||||
/**
|
||||
* 一个消息ID在内存的过期时间:15秒.
|
||||
*/
|
||||
private static final Long TIME_TO_LIVE = 15L;
|
||||
|
||||
/**
|
||||
* 每隔多少周期检查消息ID是否过期:5秒.
|
||||
*/
|
||||
private static final Long CLEAR_PERIOD = 5L;
|
||||
|
||||
/**
|
||||
* 线程池
|
||||
*/
|
||||
private static final ScheduledThreadPoolExecutor SCHEDULED_THREAD_POOL_EXECUTOR = new ScheduledThreadPoolExecutor(1,
|
||||
new ThreadFactoryBuilder().setNameFormat("wxMessage-memory-pool-%d").setDaemon(true).build(), new ThreadPoolExecutor.AbortPolicy());
|
||||
|
||||
/**
|
||||
* 消息id->消息时间戳的map.
|
||||
*/
|
||||
private static final ConcurrentHashMap<String, Long> MSG_ID_2_TIMESTAMP = new ConcurrentHashMap<>();
|
||||
|
||||
static {
|
||||
SCHEDULED_THREAD_POOL_EXECUTOR.scheduleAtFixedRate(() -> {
|
||||
try {
|
||||
Long now = System.currentTimeMillis();
|
||||
MSG_ID_2_TIMESTAMP.entrySet().removeIf(entry -> now - entry.getValue() > TIME_TO_LIVE * 1000);
|
||||
} catch (Exception ex) {
|
||||
log.error("重复消息去重任务出现异常", ex);
|
||||
}
|
||||
}, 1, CLEAR_PERIOD, TimeUnit.SECONDS);
|
||||
}
|
||||
|
||||
/**
|
||||
* 私有化构造方法,避免外部调用
|
||||
*/
|
||||
private WxMessageInMemoryDuplicateCheckerSingleton() {
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取单例
|
||||
*
|
||||
* @return 单例对象
|
||||
*/
|
||||
public static WxMessageInMemoryDuplicateCheckerSingleton getInstance() {
|
||||
return WxMessageInnerClass.CHECKER_SINGLETON;
|
||||
}
|
||||
|
||||
/**
|
||||
* 内部类实现单例
|
||||
*/
|
||||
private static class WxMessageInnerClass {
|
||||
static final WxMessageInMemoryDuplicateCheckerSingleton CHECKER_SINGLETON = new WxMessageInMemoryDuplicateCheckerSingleton();
|
||||
}
|
||||
|
||||
/**
|
||||
* messageId是否重复
|
||||
*
|
||||
* @param messageId messageId
|
||||
* @return 是否
|
||||
*/
|
||||
@Override
|
||||
public boolean isDuplicate(String messageId) {
|
||||
if (messageId == null) {
|
||||
return false;
|
||||
}
|
||||
Long timestamp = MSG_ID_2_TIMESTAMP.putIfAbsent(messageId, System.currentTimeMillis());
|
||||
return timestamp != null;
|
||||
}
|
||||
}
|
@ -0,0 +1,15 @@
|
||||
package com.ossez.wechat.common.bean;
|
||||
|
||||
/**
|
||||
* 包含toJson()方法的接口.
|
||||
*
|
||||
* @author <a href="https://github.com/binarywang">Binary Wang</a>
|
||||
* created on 2020-10-05
|
||||
*/
|
||||
public interface ToJson {
|
||||
/**
|
||||
* 转换为json字符串
|
||||
* @return json字符串
|
||||
*/
|
||||
String toJson();
|
||||
}
|
@ -1,10 +1,10 @@
|
||||
package me.chanjar.weixin.common.bean;
|
||||
|
||||
import lombok.Data;
|
||||
import me.chanjar.weixin.common.util.ToStringUtils;
|
||||
package com.ossez.wechat.common.bean;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
import com.ossez.wechat.common.util.json.WxGsonBuilder;
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* 卡券Api签名.
|
||||
*
|
||||
@ -35,7 +35,6 @@ public class WxCardApiSignature implements Serializable {
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return ToStringUtils.toSimpleString(this);
|
||||
return WxGsonBuilder.create().toJson(this);
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,32 @@
|
||||
package com.ossez.wechat.common.bean;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
/**
|
||||
* jspai signature.
|
||||
*
|
||||
* @author Daniel Qian
|
||||
*/
|
||||
@Data
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class WxJsapiSignature implements Serializable {
|
||||
private static final long serialVersionUID = -1116808193154384804L;
|
||||
|
||||
private String appId;
|
||||
|
||||
private String nonceStr;
|
||||
|
||||
private long timestamp;
|
||||
|
||||
private String url;
|
||||
|
||||
private String signature;
|
||||
|
||||
}
|
@ -0,0 +1,42 @@
|
||||
package com.ossez.wechat.common.bean;
|
||||
|
||||
import com.ossez.wechat.common.util.json.WxGsonBuilder;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 网络检测.
|
||||
* @author billytomato
|
||||
*/
|
||||
@Data
|
||||
public class WxNetCheckResult implements Serializable {
|
||||
private static final long serialVersionUID = 6918924418847404172L;
|
||||
|
||||
private List<WxNetCheckDnsInfo> dnsInfos = new ArrayList<>();
|
||||
private List<WxNetCheckPingInfo> pingInfos = new ArrayList<>();
|
||||
|
||||
public static WxNetCheckResult fromJson(String json) {
|
||||
return WxGsonBuilder.create().fromJson(json, WxNetCheckResult.class);
|
||||
}
|
||||
|
||||
@Data
|
||||
public static class WxNetCheckDnsInfo implements Serializable{
|
||||
private static final long serialVersionUID = 82631178029516008L;
|
||||
private String ip;
|
||||
private String realOperator;
|
||||
}
|
||||
|
||||
@Data
|
||||
public static class WxNetCheckPingInfo implements Serializable{
|
||||
private static final long serialVersionUID = -1871970825359178319L;
|
||||
private String ip;
|
||||
private String fromOperator;
|
||||
private String packageLoss;
|
||||
private String time;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -0,0 +1,69 @@
|
||||
package com.ossez.wechat.common.bean.imgproc;
|
||||
|
||||
import com.google.gson.annotations.SerializedName;
|
||||
import com.ossez.wechat.common.util.json.WxGsonBuilder;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author Theo Nie
|
||||
*/
|
||||
@Data
|
||||
public class WxImgProcAiCropResult implements Serializable {
|
||||
private static final long serialVersionUID = -6470673963772979463L;
|
||||
|
||||
@SerializedName("img_size")
|
||||
private ImgSize imgSize;
|
||||
|
||||
@SerializedName("results")
|
||||
private List<Results> results;
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return WxGsonBuilder.create().toJson(this);
|
||||
}
|
||||
|
||||
public static WxImgProcAiCropResult fromJson(String json) {
|
||||
return WxGsonBuilder.create().fromJson(json, WxImgProcAiCropResult.class);
|
||||
}
|
||||
|
||||
@Data
|
||||
public static class ImgSize implements Serializable {
|
||||
private static final long serialVersionUID = -6470673963772979463L;
|
||||
|
||||
@SerializedName("w")
|
||||
private int w;
|
||||
|
||||
@SerializedName("h")
|
||||
private int h;
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return WxGsonBuilder.create().toJson(this);
|
||||
}
|
||||
}
|
||||
|
||||
@Data
|
||||
public static class Results implements Serializable {
|
||||
private static final long serialVersionUID = -6470673963772979463L;
|
||||
|
||||
@SerializedName("crop_left")
|
||||
private int cropLeft;
|
||||
|
||||
@SerializedName("crop_top")
|
||||
private int cropTop;
|
||||
|
||||
@SerializedName("crop_right")
|
||||
private int cropRight;
|
||||
|
||||
@SerializedName("crop_bottom")
|
||||
private int cropBottom;
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return WxGsonBuilder.create().toJson(this);
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,103 @@
|
||||
package com.ossez.wechat.common.bean.imgproc;
|
||||
|
||||
import com.google.gson.annotations.SerializedName;
|
||||
import com.ossez.wechat.common.util.json.WxGsonBuilder;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 二维码/条码识别返回结果
|
||||
*
|
||||
* @author Theo Nie
|
||||
*/
|
||||
@Data
|
||||
public class WxImgProcQrCodeResult implements Serializable {
|
||||
private static final long serialVersionUID = -1194154790100866123L;
|
||||
|
||||
@SerializedName("img_size")
|
||||
private ImgSize imgSize;
|
||||
|
||||
@SerializedName("code_results")
|
||||
private List<CodeResults> codeResults;
|
||||
|
||||
@Data
|
||||
public static class ImgSize implements Serializable {
|
||||
private static final long serialVersionUID = -8847603245514017839L;
|
||||
|
||||
@SerializedName("w")
|
||||
private int w;
|
||||
@SerializedName("h")
|
||||
private int h;
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return WxGsonBuilder.create().toJson(this);
|
||||
}
|
||||
}
|
||||
|
||||
@Data
|
||||
public static class CodeResults implements Serializable {
|
||||
private static final long serialVersionUID = -6138135951229076759L;
|
||||
|
||||
@SerializedName("type_name")
|
||||
private String typeName;
|
||||
|
||||
@SerializedName("data")
|
||||
private String data;
|
||||
|
||||
@SerializedName("pos")
|
||||
private Pos pos;
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return WxGsonBuilder.create().toJson(this);
|
||||
}
|
||||
|
||||
@Data
|
||||
public static class Pos implements Serializable {
|
||||
private static final long serialVersionUID = 7754894061212819602L;
|
||||
@SerializedName("left_top")
|
||||
private Coordinate leftTop;
|
||||
|
||||
@SerializedName("right_top")
|
||||
private Coordinate rightTop;
|
||||
|
||||
@SerializedName("right_bottom")
|
||||
private Coordinate rightBottom;
|
||||
|
||||
@SerializedName("left_bottom")
|
||||
private Coordinate leftBottom;
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return WxGsonBuilder.create().toJson(this);
|
||||
}
|
||||
|
||||
@Data
|
||||
public static class Coordinate implements Serializable {
|
||||
private static final long serialVersionUID = 8930443668927359677L;
|
||||
@SerializedName("x")
|
||||
private int x;
|
||||
|
||||
@SerializedName("y")
|
||||
private int y;
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return WxGsonBuilder.create().toJson(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static WxImgProcQrCodeResult fromJson(String json) {
|
||||
return WxGsonBuilder.create().fromJson(json, WxImgProcQrCodeResult.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return WxGsonBuilder.create().toJson(this);
|
||||
}
|
||||
}
|
@ -0,0 +1,28 @@
|
||||
package com.ossez.wechat.common.bean.imgproc;
|
||||
|
||||
import com.google.gson.annotations.SerializedName;
|
||||
import com.ossez.wechat.common.util.json.WxGsonBuilder;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* 图片高清化返回结果
|
||||
* @author Theo Nie
|
||||
*/
|
||||
@Data
|
||||
public class WxImgProcSuperResolutionResult implements Serializable {
|
||||
private static final long serialVersionUID = 8007440280170407021L;
|
||||
|
||||
@SerializedName("media_id")
|
||||
private String mediaId;
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return WxGsonBuilder.create().toJson(this);
|
||||
}
|
||||
|
||||
public static WxImgProcSuperResolutionResult fromJson(String json) {
|
||||
return WxGsonBuilder.create().fromJson(json, WxImgProcSuperResolutionResult.class);
|
||||
}
|
||||
}
|
@ -0,0 +1,29 @@
|
||||
package com.ossez.wechat.common.bean.ocr;
|
||||
|
||||
import com.google.gson.annotations.SerializedName;
|
||||
import com.ossez.wechat.common.util.json.WxGsonBuilder;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* 银行卡OCR识别结果
|
||||
*
|
||||
* @author Theo Nie
|
||||
*/
|
||||
@Data
|
||||
public class WxOcrBankCardResult implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = 554136620394204143L;
|
||||
@SerializedName("number")
|
||||
private String number;
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return WxGsonBuilder.create().toJson(this);
|
||||
}
|
||||
|
||||
public static WxOcrBankCardResult fromJson(String json) {
|
||||
return WxGsonBuilder.create().fromJson(json, WxOcrBankCardResult.class);
|
||||
}
|
||||
}
|
@ -0,0 +1,108 @@
|
||||
package com.ossez.wechat.common.bean.ocr;
|
||||
|
||||
import com.google.gson.annotations.SerializedName;
|
||||
import com.ossez.wechat.common.util.json.WxGsonBuilder;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @author Theo Nie
|
||||
*/
|
||||
@Data
|
||||
public class WxOcrBizLicenseResult implements Serializable {
|
||||
private static final long serialVersionUID = -5007671093920178291L;
|
||||
|
||||
/**
|
||||
* 注册号
|
||||
*/
|
||||
@SerializedName("reg_num")
|
||||
private String regNum;
|
||||
/**
|
||||
* 编号
|
||||
*/
|
||||
@SerializedName("serial")
|
||||
private String serial;
|
||||
/**
|
||||
* 法定代表人姓名
|
||||
*/
|
||||
@SerializedName("legal_representative")
|
||||
private String legalRepresentative;
|
||||
/**
|
||||
* 企业名称
|
||||
*/
|
||||
@SerializedName("enterprise_name")
|
||||
private String enterpriseName;
|
||||
/**
|
||||
* 组成形式
|
||||
*/
|
||||
@SerializedName("type_of_organization")
|
||||
private String typeOfOrganization;
|
||||
/**
|
||||
* 经营场所/企业住所
|
||||
*/
|
||||
@SerializedName("address")
|
||||
private String address;
|
||||
/**
|
||||
* 公司类型
|
||||
*/
|
||||
@SerializedName("type_of_enterprise")
|
||||
private String typeOfEnterprise;
|
||||
/**
|
||||
* 经营范围
|
||||
*/
|
||||
@SerializedName("business_scope")
|
||||
private String businessScope;
|
||||
/**
|
||||
* 注册资本
|
||||
*/
|
||||
@SerializedName("registered_capital")
|
||||
private String registeredCapital;
|
||||
/**
|
||||
* 实收资本
|
||||
*/
|
||||
@SerializedName("paid_in_capital")
|
||||
private String paidInCapital;
|
||||
/**
|
||||
* 营业期限
|
||||
*/
|
||||
@SerializedName("valid_period")
|
||||
private String validPeriod;
|
||||
/**
|
||||
* 注册日期/成立日期
|
||||
*/
|
||||
@SerializedName("registered_date")
|
||||
private String registeredDate;
|
||||
/**
|
||||
* 营业执照位置
|
||||
*/
|
||||
@SerializedName("cert_position")
|
||||
private CertPosition certPosition;
|
||||
/**
|
||||
* 图片大小
|
||||
*/
|
||||
@SerializedName("img_size")
|
||||
private WxOcrImgSize imgSize;
|
||||
|
||||
public static WxOcrBizLicenseResult fromJson(String json) {
|
||||
return WxGsonBuilder.create().fromJson(json, WxOcrBizLicenseResult.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return WxGsonBuilder.create().toJson(this);
|
||||
}
|
||||
|
||||
@Data
|
||||
public static class CertPosition implements Serializable {
|
||||
private static final long serialVersionUID = 290286813344131863L;
|
||||
|
||||
@SerializedName("pos")
|
||||
private WxOcrPos pos;
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return WxGsonBuilder.create().toJson(this);
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,45 @@
|
||||
package com.ossez.wechat.common.bean.ocr;
|
||||
|
||||
import com.google.gson.annotations.SerializedName;
|
||||
import com.ossez.wechat.common.util.json.WxGsonBuilder;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author Theo Nie
|
||||
*/
|
||||
@Data
|
||||
public class WxOcrCommResult implements Serializable {
|
||||
private static final long serialVersionUID = 455833771627756440L;
|
||||
|
||||
@SerializedName("img_size")
|
||||
private WxOcrImgSize imgSize;
|
||||
@SerializedName("items")
|
||||
private List<Items> items;
|
||||
|
||||
public static WxOcrCommResult fromJson(String json) {
|
||||
return WxGsonBuilder.create().fromJson(json, WxOcrCommResult.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return WxGsonBuilder.create().toJson(this);
|
||||
}
|
||||
|
||||
@Data
|
||||
public static class Items implements Serializable {
|
||||
private static final long serialVersionUID = 3066181677009102791L;
|
||||
|
||||
@SerializedName("text")
|
||||
private String text;
|
||||
@SerializedName("pos")
|
||||
private WxOcrPos pos;
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return WxGsonBuilder.create().toJson(this);
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,80 @@
|
||||
package com.ossez.wechat.common.bean.ocr;
|
||||
|
||||
import com.google.gson.annotations.SerializedName;
|
||||
import com.ossez.wechat.common.util.json.WxGsonBuilder;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @author Theo Nie
|
||||
*/
|
||||
@Data
|
||||
public class WxOcrDrivingLicenseResult implements Serializable {
|
||||
private static final long serialVersionUID = -6984670645802585738L;
|
||||
|
||||
/**
|
||||
* 证号
|
||||
*/
|
||||
@SerializedName("id_num")
|
||||
private String idNum;
|
||||
/**
|
||||
* 姓名
|
||||
*/
|
||||
@SerializedName("name")
|
||||
private String name;
|
||||
/**
|
||||
* 性别
|
||||
*/
|
||||
@SerializedName("sex")
|
||||
private String sex;
|
||||
/**
|
||||
* 国籍
|
||||
*/
|
||||
@SerializedName("nationality")
|
||||
private String nationality;
|
||||
/**
|
||||
* 住址
|
||||
*/
|
||||
@SerializedName("address")
|
||||
private String address;
|
||||
/**
|
||||
* 出生日期
|
||||
*/
|
||||
@SerializedName("birth_date")
|
||||
private String birthDate;
|
||||
/**
|
||||
* 初次领证日期
|
||||
*/
|
||||
@SerializedName("issue_date")
|
||||
private String issueDate;
|
||||
/**
|
||||
* 准驾车型
|
||||
*/
|
||||
@SerializedName("car_class")
|
||||
private String carClass;
|
||||
/**
|
||||
* 有效期限起始日
|
||||
*/
|
||||
@SerializedName("valid_from")
|
||||
private String validFrom;
|
||||
/**
|
||||
* 有效期限终止日
|
||||
*/
|
||||
@SerializedName("valid_to")
|
||||
private String validTo;
|
||||
/**
|
||||
* 印章文字
|
||||
*/
|
||||
@SerializedName("official_seal")
|
||||
private String officialSeal;
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return WxGsonBuilder.create().toJson(this);
|
||||
}
|
||||
|
||||
public static WxOcrDrivingLicenseResult fromJson(String json) {
|
||||
return WxGsonBuilder.create().fromJson(json, WxOcrDrivingLicenseResult.class);
|
||||
}
|
||||
}
|
@ -0,0 +1,133 @@
|
||||
package com.ossez.wechat.common.bean.ocr;
|
||||
|
||||
import com.google.gson.annotations.SerializedName;
|
||||
import com.ossez.wechat.common.util.json.WxGsonBuilder;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @author Theo Nie
|
||||
*/
|
||||
@Data
|
||||
public class WxOcrDrivingResult implements Serializable {
|
||||
private static final long serialVersionUID = -7477484374200211303L;
|
||||
|
||||
/**
|
||||
* 车牌号码
|
||||
*/
|
||||
@SerializedName("plate_num")
|
||||
private String plateNum;
|
||||
/**
|
||||
* 车辆类型
|
||||
*/
|
||||
@SerializedName("vehicle_type")
|
||||
private String vehicleType;
|
||||
/**
|
||||
* 所有人
|
||||
*/
|
||||
@SerializedName("owner")
|
||||
private String owner;
|
||||
/**
|
||||
* 住址
|
||||
*/
|
||||
@SerializedName("addr")
|
||||
private String addr;
|
||||
/**
|
||||
* 使用性质
|
||||
*/
|
||||
@SerializedName("use_character")
|
||||
private String useCharacter;
|
||||
/**
|
||||
* 品牌型号
|
||||
*/
|
||||
@SerializedName("model")
|
||||
private String model;
|
||||
/**
|
||||
* 车辆识别代码
|
||||
*/
|
||||
@SerializedName("vin")
|
||||
private String vin;
|
||||
/**
|
||||
* 发动机号码
|
||||
*/
|
||||
@SerializedName("engine_num")
|
||||
private String engineNum;
|
||||
/**
|
||||
* 注册日期
|
||||
*/
|
||||
@SerializedName("register_date")
|
||||
private String registerDate;
|
||||
/**
|
||||
* 发证日期
|
||||
*/
|
||||
@SerializedName("issue_date")
|
||||
private String issueDate;
|
||||
/**
|
||||
* 车牌号码
|
||||
*/
|
||||
@SerializedName("plate_num_b")
|
||||
private String plateNumB;
|
||||
/**
|
||||
* 号牌
|
||||
*/
|
||||
@SerializedName("record")
|
||||
private String record;
|
||||
/**
|
||||
* 核定载人数
|
||||
*/
|
||||
@SerializedName("passengers_num")
|
||||
private String passengersNum;
|
||||
/**
|
||||
* 总质量
|
||||
*/
|
||||
@SerializedName("total_quality")
|
||||
private String totalQuality;
|
||||
/**
|
||||
* 整备质量
|
||||
*/
|
||||
@SerializedName("prepare_quality")
|
||||
private String prepareQuality;
|
||||
/**
|
||||
* 外廓尺寸
|
||||
*/
|
||||
@SerializedName("overall_size")
|
||||
private String overallSize;
|
||||
/**
|
||||
* 卡片正面位置(检测到卡片正面才会返回)
|
||||
*/
|
||||
@SerializedName("card_position_front")
|
||||
private CardPosition cardPositionFront;
|
||||
/**
|
||||
* 卡片反面位置(检测到卡片反面才会返回)
|
||||
*/
|
||||
@SerializedName("card_position_back")
|
||||
private CardPosition cardPositionBack;
|
||||
/**
|
||||
* 图片大小
|
||||
*/
|
||||
@SerializedName("img_size")
|
||||
private WxOcrImgSize imgSize;
|
||||
|
||||
@Data
|
||||
public static class CardPosition implements Serializable {
|
||||
private static final long serialVersionUID = 2884515165228160517L;
|
||||
|
||||
@SerializedName("pos")
|
||||
private WxOcrPos pos;
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return WxGsonBuilder.create().toJson(this);
|
||||
}
|
||||
}
|
||||
|
||||
public static WxOcrDrivingResult fromJson(String json) {
|
||||
return WxGsonBuilder.create().fromJson(json, WxOcrDrivingResult.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return WxGsonBuilder.create().toJson(this);
|
||||
}
|
||||
}
|
@ -0,0 +1,38 @@
|
||||
package com.ossez.wechat.common.bean.ocr;
|
||||
|
||||
import com.google.gson.annotations.SerializedName;
|
||||
import com.ossez.wechat.common.util.json.WxGsonBuilder;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* OCR身份证识别结果.
|
||||
*
|
||||
* @author <a href="https://github.com/binarywang">Binary Wang</a>
|
||||
* created on 2019-06-23
|
||||
*/
|
||||
@Data
|
||||
public class WxOcrIdCardResult implements Serializable {
|
||||
private static final long serialVersionUID = 8184352486986729980L;
|
||||
|
||||
@SerializedName("type")
|
||||
private String type;
|
||||
@SerializedName("name")
|
||||
private String name;
|
||||
@SerializedName("id")
|
||||
private String id;
|
||||
@SerializedName("addr")
|
||||
private String addr;
|
||||
@SerializedName("gender")
|
||||
private String gender;
|
||||
@SerializedName("nationality")
|
||||
private String nationality;
|
||||
@SerializedName("valid_date")
|
||||
private String validDate;
|
||||
|
||||
public static WxOcrIdCardResult fromJson(String json) {
|
||||
return WxGsonBuilder.create().fromJson(json, WxOcrIdCardResult.class);
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,25 @@
|
||||
package com.ossez.wechat.common.bean.ocr;
|
||||
|
||||
import com.google.gson.annotations.SerializedName;
|
||||
import com.ossez.wechat.common.util.json.WxGsonBuilder;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @author Theo Nie
|
||||
*/
|
||||
@Data
|
||||
public class WxOcrImgSize implements Serializable {
|
||||
private static final long serialVersionUID = 5234409123551074168L;
|
||||
|
||||
@SerializedName("w")
|
||||
private int w;
|
||||
@SerializedName("h")
|
||||
private int h;
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return WxGsonBuilder.create().toJson(this);
|
||||
}
|
||||
}
|
@ -0,0 +1,43 @@
|
||||
package com.ossez.wechat.common.bean.ocr;
|
||||
|
||||
import com.google.gson.annotations.SerializedName;
|
||||
import com.ossez.wechat.common.util.json.WxGsonBuilder;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @author Theo Nie
|
||||
*/
|
||||
@Data
|
||||
public class WxOcrPos implements Serializable {
|
||||
private static final long serialVersionUID = 4204160206873907920L;
|
||||
|
||||
@SerializedName("left_top")
|
||||
private Coordinate leftTop;
|
||||
@SerializedName("right_top")
|
||||
private Coordinate rightTop;
|
||||
@SerializedName("right_bottom")
|
||||
private Coordinate rightBottom;
|
||||
@SerializedName("left_bottom")
|
||||
private Coordinate leftBottom;
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return WxGsonBuilder.create().toJson(this);
|
||||
}
|
||||
|
||||
@Data
|
||||
public static class Coordinate implements Serializable {
|
||||
private static final long serialVersionUID = 8675059935386304399L;
|
||||
@SerializedName("x")
|
||||
private int x;
|
||||
@SerializedName("y")
|
||||
private int y;
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return WxGsonBuilder.create().toJson(this);
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,31 @@
|
||||
package com.ossez.wechat.common.bean.result;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
import com.ossez.wechat.common.util.json.WxGsonBuilder;
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Daniel Qian
|
||||
*/
|
||||
@Data
|
||||
public class WxMediaUploadResult implements Serializable {
|
||||
private static final long serialVersionUID = 330834334738622341L;
|
||||
|
||||
private String url;
|
||||
private String type;
|
||||
private String mediaId;
|
||||
private String thumbMediaId;
|
||||
private long createdAt;
|
||||
|
||||
public static WxMediaUploadResult fromJson(String json) {
|
||||
return WxGsonBuilder.create().fromJson(json, WxMediaUploadResult.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return WxGsonBuilder.create().toJson(this);
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,39 @@
|
||||
package com.ossez.wechat.common.bean.result;
|
||||
|
||||
import com.google.gson.JsonObject;
|
||||
import com.google.gson.JsonParser;
|
||||
import com.ossez.wechat.common.util.json.WxGsonBuilder;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
@Data
|
||||
public class WxMinishopImageUploadCustomizeResult implements Serializable {
|
||||
private String errcode;
|
||||
private String errmsg;
|
||||
|
||||
private WxMinishopPicFileCustomizeResult imgInfo;
|
||||
|
||||
public static WxMinishopImageUploadCustomizeResult fromJson(String json) {
|
||||
JsonObject jsonObject = new JsonParser().parse(json).getAsJsonObject();
|
||||
WxMinishopImageUploadCustomizeResult result = new WxMinishopImageUploadCustomizeResult();
|
||||
result.setErrcode(jsonObject.get("errcode").getAsNumber().toString());
|
||||
if (result.getErrcode().equals("0")) {
|
||||
WxMinishopPicFileCustomizeResult picFileResult = new WxMinishopPicFileCustomizeResult();
|
||||
JsonObject picObject = jsonObject.get("img_info").getAsJsonObject();
|
||||
if (picObject.has("media_id")) {
|
||||
picFileResult.setMediaId(picObject.get("media_id").getAsString());
|
||||
}
|
||||
if (picObject.has("temp_img_url")) {
|
||||
picFileResult.setTempImgUrl(picObject.get("temp_img_url").getAsString());
|
||||
}
|
||||
result.setImgInfo(picFileResult);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return WxGsonBuilder.create().toJson(this);
|
||||
}
|
||||
}
|
@ -0,0 +1,45 @@
|
||||
package com.ossez.wechat.common.bean.result;
|
||||
|
||||
import com.google.gson.JsonElement;
|
||||
import com.google.gson.JsonObject;
|
||||
import com.google.gson.JsonParser;
|
||||
import com.ossez.wechat.common.util.json.WxGsonBuilder;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
@Data
|
||||
public class WxMinishopImageUploadResult implements Serializable {
|
||||
private static final long serialVersionUID = 330834334738622332L;
|
||||
|
||||
private String errcode;
|
||||
private String errmsg;
|
||||
|
||||
|
||||
private WxMinishopPicFileResult picFile;
|
||||
|
||||
|
||||
public static WxMinishopImageUploadResult fromJson(String json) {
|
||||
JsonObject jsonObject = new JsonParser().parse(json).getAsJsonObject();
|
||||
WxMinishopImageUploadResult result = new WxMinishopImageUploadResult();
|
||||
result.setErrcode(jsonObject.get("errcode").getAsNumber().toString());
|
||||
if (result.getErrcode().equals("0")) {
|
||||
WxMinishopPicFileResult picFileResult = new WxMinishopPicFileResult();
|
||||
JsonObject picObject = jsonObject.get("pic_file").getAsJsonObject();
|
||||
JsonElement mediaId = picObject.get("media_id");
|
||||
picFileResult.setMediaId(mediaId==null ? "" : mediaId.getAsString());
|
||||
JsonElement payMediaId = picObject.get("pay_media_id");
|
||||
picFileResult.setPayMediaId(payMediaId==null ? "" : payMediaId.getAsString());
|
||||
JsonElement tempImgUrl = picObject.get("temp_img_url");
|
||||
picFileResult.setTempImgUrl(tempImgUrl==null ? "" : tempImgUrl.getAsString());
|
||||
result.setPicFile(picFileResult);
|
||||
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return WxGsonBuilder.create().toJson(this);
|
||||
}
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
package com.ossez.wechat.common.bean.result;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
@Data
|
||||
public class WxMinishopPicFileCustomizeResult implements Serializable {
|
||||
private String mediaId;
|
||||
private String tempImgUrl;
|
||||
}
|
@ -0,0 +1,12 @@
|
||||
package com.ossez.wechat.common.bean.result;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
@Data
|
||||
public class WxMinishopPicFileResult implements Serializable {
|
||||
private String mediaId;
|
||||
private String payMediaId;
|
||||
private String tempImgUrl;
|
||||
}
|
@ -0,0 +1,19 @@
|
||||
package com.ossez.wechat.common.bean.subscribemsg;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* .
|
||||
*
|
||||
* @author <a href="https://github.com/binarywang">Binary Wang</a>
|
||||
* created on 2021-01-27
|
||||
*/
|
||||
@Data
|
||||
public class CategoryData implements Serializable {
|
||||
private static final long serialVersionUID = -5935548352317679892L;
|
||||
|
||||
private int id;
|
||||
private String name;
|
||||
}
|
@ -0,0 +1,21 @@
|
||||
package com.ossez.wechat.common.bean.subscribemsg;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* .
|
||||
*
|
||||
* @author <a href="https://github.com/binarywang">Binary Wang</a>
|
||||
* created on 2021-01-27
|
||||
*/
|
||||
@Data
|
||||
public class PubTemplateKeyword implements Serializable {
|
||||
private static final long serialVersionUID = -1100641668859815647L;
|
||||
|
||||
private int kid;
|
||||
private String name;
|
||||
private String example;
|
||||
private String rule;
|
||||
}
|
@ -0,0 +1,36 @@
|
||||
package com.ossez.wechat.common.bean.subscribemsg;
|
||||
|
||||
import com.ossez.wechat.common.util.json.WxGsonBuilder;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author ArBing
|
||||
*/
|
||||
@Data
|
||||
public class PubTemplateTitleListResult implements Serializable {
|
||||
private static final long serialVersionUID = -7718911668757837527L;
|
||||
|
||||
private int count;
|
||||
|
||||
private List<TemplateItem> data;
|
||||
|
||||
public static PubTemplateTitleListResult fromJson(String json) {
|
||||
return WxGsonBuilder.create().fromJson(json, PubTemplateTitleListResult.class);
|
||||
}
|
||||
|
||||
@Data
|
||||
public static class TemplateItem implements Serializable {
|
||||
private static final long serialVersionUID = 6888726696879905332L;
|
||||
|
||||
private Integer type;
|
||||
|
||||
private Integer tid;
|
||||
|
||||
private String categoryId;
|
||||
|
||||
private String title;
|
||||
}
|
||||
}
|
@ -0,0 +1,22 @@
|
||||
package com.ossez.wechat.common.bean.subscribemsg;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* .
|
||||
*
|
||||
* @author <a href="https://github.com/binarywang">Binary Wang</a>
|
||||
* created on 2021-01-27
|
||||
*/
|
||||
@Data
|
||||
public class TemplateInfo implements Serializable {
|
||||
private static final long serialVersionUID = 6971785763573992264L;
|
||||
|
||||
private String priTmplId;
|
||||
private String title;
|
||||
private String content;
|
||||
private String example;
|
||||
private int type;
|
||||
}
|
@ -0,0 +1,227 @@
|
||||
package com.ossez.wechat.common.config;
|
||||
|
||||
import com.ossez.wechat.common.model.WeChatAccessToken;
|
||||
import com.ossez.wechat.common.enums.TicketType;
|
||||
import com.ossez.wechat.common.util.http.apache.ApacheHttpClientBuilder;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.concurrent.locks.Lock;
|
||||
|
||||
/**
|
||||
* 微信客户端配置存储.
|
||||
*
|
||||
* @author chanjarster
|
||||
*/
|
||||
public interface ConfigStorage {
|
||||
/**
|
||||
* Gets access token.
|
||||
*
|
||||
* @return the access token
|
||||
*/
|
||||
String getAccessToken();
|
||||
|
||||
/**
|
||||
* Gets access token lock.
|
||||
*
|
||||
* @return the access token lock
|
||||
*/
|
||||
Lock getAccessTokenLock();
|
||||
|
||||
/**
|
||||
* Is access token expired boolean.
|
||||
*
|
||||
* @return the boolean
|
||||
*/
|
||||
boolean isAccessTokenExpired();
|
||||
|
||||
/**
|
||||
* 强制将access token过期掉.
|
||||
*/
|
||||
void expireAccessToken();
|
||||
|
||||
/**
|
||||
* 应该是线程安全的.
|
||||
*
|
||||
* @param accessToken 要更新的WxAccessToken对象
|
||||
*/
|
||||
void updateAccessToken(WeChatAccessToken accessToken);
|
||||
|
||||
/**
|
||||
* 应该是线程安全的.
|
||||
*
|
||||
* @param accessToken 新的accessToken值
|
||||
* @param expiresInSeconds 过期时间,以秒为单位
|
||||
*/
|
||||
void updateAccessToken(String accessToken, int expiresInSeconds);
|
||||
|
||||
/**
|
||||
* Gets ticket.
|
||||
*
|
||||
* @param type the type
|
||||
* @return the ticket
|
||||
*/
|
||||
String getTicket(TicketType type);
|
||||
|
||||
/**
|
||||
* Gets ticket lock.
|
||||
*
|
||||
* @param type the type
|
||||
* @return the ticket lock
|
||||
*/
|
||||
Lock getTicketLock(TicketType type);
|
||||
|
||||
/**
|
||||
* Is ticket expired boolean.
|
||||
*
|
||||
* @param type the type
|
||||
* @return the boolean
|
||||
*/
|
||||
boolean isTicketExpired(TicketType type);
|
||||
|
||||
/**
|
||||
* 强制将ticket过期掉.
|
||||
*
|
||||
* @param type the type
|
||||
*/
|
||||
void expireTicket(TicketType type);
|
||||
|
||||
/**
|
||||
* 更新ticket.
|
||||
* 应该是线程安全的
|
||||
*
|
||||
* @param type ticket类型
|
||||
* @param ticket 新的ticket值
|
||||
* @param expiresInSeconds 过期时间,以秒为单位
|
||||
*/
|
||||
void updateTicket(TicketType type, String ticket, int expiresInSeconds);
|
||||
|
||||
String getOpenAppId();
|
||||
String getOpenSecret();
|
||||
/**
|
||||
* Gets app id.
|
||||
*
|
||||
* @return the app id
|
||||
*/
|
||||
String getAppId();
|
||||
|
||||
/**
|
||||
* Gets secret.
|
||||
*
|
||||
* @return the secret
|
||||
*/
|
||||
String getSecret();
|
||||
|
||||
/**
|
||||
* Gets token.
|
||||
*
|
||||
* @return the token
|
||||
*/
|
||||
String getToken();
|
||||
|
||||
/**
|
||||
* Gets aes key.
|
||||
*
|
||||
* @return the aes key
|
||||
*/
|
||||
String getAesKey();
|
||||
|
||||
/**
|
||||
* Gets template id.
|
||||
*
|
||||
* @return the template id
|
||||
*/
|
||||
String getTemplateId();
|
||||
|
||||
/**
|
||||
* Gets expires time.
|
||||
*
|
||||
* @return the expires time
|
||||
*/
|
||||
long getExpiresTime();
|
||||
|
||||
/**
|
||||
* Gets oauth 2 redirect uri.
|
||||
*
|
||||
* @return the oauth 2 redirect uri
|
||||
*/
|
||||
String getOauth2redirectUri();
|
||||
|
||||
/**
|
||||
* Gets http proxy host.
|
||||
*
|
||||
* @return the http proxy host
|
||||
*/
|
||||
String getHttpProxyHost();
|
||||
|
||||
/**
|
||||
* Gets http proxy port.
|
||||
*
|
||||
* @return the http proxy port
|
||||
*/
|
||||
int getHttpProxyPort();
|
||||
|
||||
/**
|
||||
* Gets http proxy username.
|
||||
*
|
||||
* @return the http proxy username
|
||||
*/
|
||||
String getHttpProxyUsername();
|
||||
|
||||
/**
|
||||
* Gets http proxy password.
|
||||
*
|
||||
* @return the http proxy password
|
||||
*/
|
||||
String getHttpProxyPassword();
|
||||
|
||||
/**
|
||||
* http 请求重试间隔
|
||||
* <pre>
|
||||
* {@link BaseWeChatOfficialAccountServiceImpl#setRetrySleepMillis(int)}
|
||||
* </pre>
|
||||
*/
|
||||
int getRetrySleepMillis();
|
||||
|
||||
/**
|
||||
* http 请求最大重试次数
|
||||
* <pre>
|
||||
* {@link BaseWeChatOfficialAccountServiceImpl#setMaxRetryTimes(int)}
|
||||
* </pre>
|
||||
*/
|
||||
int getMaxRetryTimes();
|
||||
|
||||
/**
|
||||
* Gets tmp dir file.
|
||||
*
|
||||
* @return the tmp dir file
|
||||
*/
|
||||
File getTmpDirFile();
|
||||
|
||||
/**
|
||||
* http client builder.
|
||||
*
|
||||
* @return ApacheHttpClientBuilder apache http client builder
|
||||
*/
|
||||
ApacheHttpClientBuilder getApacheHttpClientBuilder();
|
||||
|
||||
/**
|
||||
* 是否自动刷新token.
|
||||
*
|
||||
* @return the boolean
|
||||
*/
|
||||
boolean autoRefreshToken();
|
||||
|
||||
/**
|
||||
* 得到微信接口地址域名部分的自定义设置信息.
|
||||
*
|
||||
* @return the host config
|
||||
*/
|
||||
WxMpHostConfig getHostConfig();
|
||||
|
||||
/**
|
||||
* 设置微信接口地址域名部分的自定义设置信息.
|
||||
*
|
||||
* @param hostConfig host config
|
||||
*/
|
||||
void setHostConfig(WxMpHostConfig hostConfig);
|
||||
}
|
@ -0,0 +1,194 @@
|
||||
package com.ossez.wechat.common.config;
|
||||
|
||||
import lombok.Data;
|
||||
import com.ossez.wechat.common.model.WeChatAccessToken;
|
||||
import com.ossez.wechat.common.enums.TicketType;
|
||||
import com.ossez.wechat.common.util.http.apache.ApacheHttpClientBuilder;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.Serializable;
|
||||
import java.util.concurrent.locks.Lock;
|
||||
import java.util.concurrent.locks.ReentrantLock;
|
||||
|
||||
/**
|
||||
* 基于内存的微信配置provider,在实际生产环境中应该将这些配置持久化.
|
||||
*
|
||||
* @author chanjarster
|
||||
*/
|
||||
@Data
|
||||
public class DefaultConfigStorage implements ConfigStorage, Serializable {
|
||||
private static final long serialVersionUID = -6646519023303395185L;
|
||||
|
||||
protected volatile String openAppId;
|
||||
protected volatile String openSecret;
|
||||
protected volatile String appId;
|
||||
protected volatile String secret;
|
||||
protected volatile String token;
|
||||
protected volatile String templateId;
|
||||
protected volatile String accessToken;
|
||||
protected volatile String aesKey;
|
||||
protected volatile long expiresTime;
|
||||
|
||||
protected volatile String oauth2redirectUri;
|
||||
|
||||
protected volatile String httpProxyHost;
|
||||
protected volatile int httpProxyPort;
|
||||
protected volatile String httpProxyUsername;
|
||||
protected volatile String httpProxyPassword;
|
||||
|
||||
protected volatile int retrySleepMillis = 1000;
|
||||
protected volatile int maxRetryTimes = 5;
|
||||
|
||||
protected volatile String jsapiTicket;
|
||||
protected volatile long jsapiTicketExpiresTime;
|
||||
|
||||
protected volatile String sdkTicket;
|
||||
protected volatile long sdkTicketExpiresTime;
|
||||
|
||||
protected volatile String cardApiTicket;
|
||||
protected volatile long cardApiTicketExpiresTime;
|
||||
|
||||
protected volatile Lock accessTokenLock = new ReentrantLock();
|
||||
protected volatile Lock jsapiTicketLock = new ReentrantLock();
|
||||
protected volatile Lock sdkTicketLock = new ReentrantLock();
|
||||
protected volatile Lock cardApiTicketLock = new ReentrantLock();
|
||||
|
||||
protected volatile File tmpDirFile;
|
||||
|
||||
protected volatile ApacheHttpClientBuilder apacheHttpClientBuilder;
|
||||
|
||||
private WxMpHostConfig hostConfig = null;
|
||||
|
||||
@Override
|
||||
public boolean isAccessTokenExpired() {
|
||||
return System.currentTimeMillis() > this.expiresTime;
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized void updateAccessToken(WeChatAccessToken accessToken) {
|
||||
updateAccessToken(accessToken.getAccessToken(), accessToken.getExpiresIn());
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized void updateAccessToken(String accessToken, int expiresInSeconds) {
|
||||
this.accessToken = accessToken;
|
||||
this.expiresTime = System.currentTimeMillis() + (expiresInSeconds - 200) * 1000L;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void expireAccessToken() {
|
||||
this.expiresTime = 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getTicket(TicketType type) {
|
||||
switch (type) {
|
||||
case SDK:
|
||||
return this.sdkTicket;
|
||||
case JSAPI:
|
||||
return this.jsapiTicket;
|
||||
case WX_CARD:
|
||||
return this.cardApiTicket;
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public void setTicket(TicketType type, String ticket) {
|
||||
switch (type) {
|
||||
case JSAPI:
|
||||
this.jsapiTicket = ticket;
|
||||
break;
|
||||
case WX_CARD:
|
||||
this.cardApiTicket = ticket;
|
||||
break;
|
||||
case SDK:
|
||||
this.sdkTicket = ticket;
|
||||
break;
|
||||
default:
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Lock getTicketLock(TicketType type) {
|
||||
switch (type) {
|
||||
case SDK:
|
||||
return this.sdkTicketLock;
|
||||
case JSAPI:
|
||||
return this.jsapiTicketLock;
|
||||
case WX_CARD:
|
||||
return this.cardApiTicketLock;
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isTicketExpired(TicketType type) {
|
||||
switch (type) {
|
||||
case SDK:
|
||||
return System.currentTimeMillis() > this.sdkTicketExpiresTime;
|
||||
case JSAPI:
|
||||
return System.currentTimeMillis() > this.jsapiTicketExpiresTime;
|
||||
case WX_CARD:
|
||||
return System.currentTimeMillis() > this.cardApiTicketExpiresTime;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized void updateTicket(TicketType type, String ticket, int expiresInSeconds) {
|
||||
switch (type) {
|
||||
case JSAPI:
|
||||
this.jsapiTicket = ticket;
|
||||
// 预留200秒的时间
|
||||
this.jsapiTicketExpiresTime = System.currentTimeMillis() + (expiresInSeconds - 200) * 1000L;
|
||||
break;
|
||||
case WX_CARD:
|
||||
this.cardApiTicket = ticket;
|
||||
// 预留200秒的时间
|
||||
this.cardApiTicketExpiresTime = System.currentTimeMillis() + (expiresInSeconds - 200) * 1000L;
|
||||
break;
|
||||
case SDK:
|
||||
this.sdkTicket = ticket;
|
||||
// 预留200秒的时间
|
||||
this.sdkTicketExpiresTime = System.currentTimeMillis() + (expiresInSeconds - 200) * 1000L;
|
||||
break;
|
||||
default:
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void expireTicket(TicketType type) {
|
||||
switch (type) {
|
||||
case JSAPI:
|
||||
this.jsapiTicketExpiresTime = 0;
|
||||
break;
|
||||
case WX_CARD:
|
||||
this.cardApiTicketExpiresTime = 0;
|
||||
break;
|
||||
case SDK:
|
||||
this.sdkTicketExpiresTime = 0;
|
||||
break;
|
||||
default:
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean autoRefreshToken() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public WxMpHostConfig getHostConfig() {
|
||||
return this.hostConfig;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setHostConfig(WxMpHostConfig hostConfig) {
|
||||
this.hostConfig = hostConfig;
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,45 @@
|
||||
package com.ossez.wechat.common.config;
|
||||
|
||||
import com.ossez.wechat.common.config.DefaultConfigStorage;
|
||||
import lombok.Data;
|
||||
import com.ossez.wechat.common.model.WeChatAccessToken;
|
||||
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
/**
|
||||
* @author Brayden Wong
|
||||
* created on 2021/1/16
|
||||
* 提供accesstoken保存在concurrenthashmap中的实现,支持高并发。仅限于单机部署。
|
||||
*/
|
||||
public class MapConfigStorage extends DefaultConfigStorage {
|
||||
|
||||
private static final long serialVersionUID = 5311395137835650104L;
|
||||
|
||||
private static final ConcurrentHashMap<String, String> CONCURRENT_HASH_MAP = new ConcurrentHashMap<>(1);
|
||||
|
||||
private static final String MAP_KEY = "access_token";
|
||||
|
||||
|
||||
@Override
|
||||
public String getAccessToken() {
|
||||
return CONCURRENT_HASH_MAP.get(MAP_KEY);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setAccessToken(String accessToken) {
|
||||
CONCURRENT_HASH_MAP.put(MAP_KEY, accessToken);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateAccessToken(WeChatAccessToken accessToken) {
|
||||
updateAccessToken(accessToken.getAccessToken(), accessToken.getExpiresIn());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateAccessToken(String accessToken, int expiresInSeconds) {
|
||||
CONCURRENT_HASH_MAP.put(MAP_KEY, accessToken);
|
||||
this.expiresTime = System.currentTimeMillis() + (expiresInSeconds - 200) * 1000L;
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -0,0 +1,98 @@
|
||||
package com.ossez.wechat.common.config;
|
||||
|
||||
import com.ossez.wechat.common.config.DefaultConfigStorage;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import com.ossez.wechat.common.enums.TicketType;
|
||||
import com.ossez.wechat.common.redis.WxRedisOps;
|
||||
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
/**
|
||||
* 基于Redis的微信配置provider.
|
||||
*
|
||||
* <pre>
|
||||
* 使用说明:本实现仅供参考,并不完整,
|
||||
* 比如为减少项目依赖,未加入redis分布式锁的实现,如有需要请自行实现。
|
||||
* </pre>
|
||||
*
|
||||
* @author nickwong
|
||||
*/
|
||||
public class RedisConfigStorage extends DefaultConfigStorage {
|
||||
private static final long serialVersionUID = -988502871997239733L;
|
||||
|
||||
private static final String ACCESS_TOKEN_KEY_TPL = "%s:access_token:%s";
|
||||
private static final String TICKET_KEY_TPL = "%s:ticket:key:%s:%s";
|
||||
private static final String LOCK_KEY_TPL = "%s:lock:%s:";
|
||||
|
||||
private final WxRedisOps redisOps;
|
||||
private final String keyPrefix;
|
||||
|
||||
private String accessTokenKey;
|
||||
private String lockKey;
|
||||
|
||||
public RedisConfigStorage(WxRedisOps redisOps, String keyPrefix) {
|
||||
this.redisOps = redisOps;
|
||||
this.keyPrefix = keyPrefix;
|
||||
}
|
||||
|
||||
/**
|
||||
* 每个公众号生成独有的存储key.
|
||||
*/
|
||||
@Override
|
||||
public void setAppId(String appId) {
|
||||
super.setAppId(appId);
|
||||
this.accessTokenKey = String.format(ACCESS_TOKEN_KEY_TPL, this.keyPrefix, appId);
|
||||
this.lockKey = String.format(LOCK_KEY_TPL, this.keyPrefix, appId);
|
||||
accessTokenLock = this.redisOps.getLock(lockKey.concat("accessTokenLock"));
|
||||
jsapiTicketLock = this.redisOps.getLock(lockKey.concat("jsapiTicketLock"));
|
||||
sdkTicketLock = this.redisOps.getLock(lockKey.concat("sdkTicketLock"));
|
||||
cardApiTicketLock = this.redisOps.getLock(lockKey.concat("cardApiTicketLock"));
|
||||
}
|
||||
|
||||
private String getTicketRedisKey(TicketType type) {
|
||||
return String.format(TICKET_KEY_TPL, this.keyPrefix, appId, type.getCode());
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getAccessToken() {
|
||||
return redisOps.getValue(this.accessTokenKey);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isAccessTokenExpired() {
|
||||
Long expire = redisOps.getExpire(this.accessTokenKey);
|
||||
return expire == null || expire < 2;
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized void updateAccessToken(String accessToken, int expiresInSeconds) {
|
||||
redisOps.setValue(this.accessTokenKey, accessToken, expiresInSeconds - 200, TimeUnit.SECONDS);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void expireAccessToken() {
|
||||
redisOps.expire(this.accessTokenKey, 0, TimeUnit.SECONDS);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getTicket(TicketType type) {
|
||||
return redisOps.getValue(this.getTicketRedisKey(type));
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isTicketExpired(TicketType type) {
|
||||
return redisOps.getExpire(this.getTicketRedisKey(type)) < 2;
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized void updateTicket(TicketType type, String jsapiTicket, int expiresInSeconds) {
|
||||
redisOps.setValue(this.getTicketRedisKey(type), jsapiTicket, expiresInSeconds - 200, TimeUnit.SECONDS);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void expireTicket(TicketType type) {
|
||||
redisOps.expire(this.getTicketRedisKey(type), 0, TimeUnit.SECONDS);
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,68 @@
|
||||
package com.ossez.wechat.common.config;
|
||||
|
||||
import com.ossez.wechat.common.constant.WeChatConstant;
|
||||
|
||||
/**
|
||||
* 微信接口地址域名部分的自定义设置信息.
|
||||
*/
|
||||
public class WxMpHostConfig {
|
||||
|
||||
/**
|
||||
* 对应于:https://api.weixin.qq.com
|
||||
*/
|
||||
private String apiHost;
|
||||
|
||||
/**
|
||||
* 对应于:https://open.weixin.qq.com
|
||||
*/
|
||||
private String openHost;
|
||||
|
||||
/**
|
||||
* 对应于:https://mp.weixin.qq.com
|
||||
*/
|
||||
private String mpHost;
|
||||
|
||||
public static String buildUrl(WxMpHostConfig hostConfig, String prefix, String path) {
|
||||
if (hostConfig == null) {
|
||||
return prefix + path;
|
||||
}
|
||||
|
||||
if (hostConfig.getApiHost() != null && prefix.equals(WeChatConstant.ENDPOINT_WECHAT)) {
|
||||
return hostConfig.getApiHost() + path;
|
||||
}
|
||||
|
||||
if (hostConfig.getMpHost() != null && prefix.equals(WeChatConstant.ENDPOINT_MP)) {
|
||||
return hostConfig.getMpHost() + path;
|
||||
}
|
||||
|
||||
if (hostConfig.getOpenHost() != null && prefix.equals(WeChatConstant.ENDPOINT_OPEN)) {
|
||||
return hostConfig.getOpenHost() + path;
|
||||
}
|
||||
|
||||
return prefix + path;
|
||||
}
|
||||
|
||||
public String getApiHost() {
|
||||
return apiHost;
|
||||
}
|
||||
|
||||
public void setApiHost(String apiHost) {
|
||||
this.apiHost = apiHost;
|
||||
}
|
||||
|
||||
public String getOpenHost() {
|
||||
return openHost;
|
||||
}
|
||||
|
||||
public void setOpenHost(String openHost) {
|
||||
this.openHost = openHost;
|
||||
}
|
||||
|
||||
public String getMpHost() {
|
||||
return mpHost;
|
||||
}
|
||||
|
||||
public void setMpHost(String mpHost) {
|
||||
this.mpHost = mpHost;
|
||||
}
|
||||
}
|
@ -0,0 +1,16 @@
|
||||
package com.ossez.wechat.common.constant;
|
||||
|
||||
import com.google.common.net.MediaType;
|
||||
|
||||
/**
|
||||
* HttpClient send request the type constant.
|
||||
* Because okHttp need to use MediaType to construct object, but if we use guava MediaType, the two package will get conflict
|
||||
* at the same class.
|
||||
* <p>
|
||||
* So, we get MediaType String first before we convert to okHttp MediaType.
|
||||
*
|
||||
* @author YuCheng Hu
|
||||
*/
|
||||
public final class HttpClientMediaType {
|
||||
public static final String APPLICATION_JSON = MediaType.JSON_UTF_8.toString();
|
||||
}
|
@ -0,0 +1,154 @@
|
||||
package com.ossez.wechat.common.constant;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 微信公众号事件的相关常量
|
||||
* Created by Binary Wang on 2017-5-10.
|
||||
* </pre>
|
||||
*
|
||||
* @author <a href="https://github.com/binarywang">Binary Wang</a>
|
||||
*/
|
||||
public class OfficialAccountEventConstants {
|
||||
/**
|
||||
* 门店审核事件.
|
||||
*/
|
||||
public static final String POI_CHECK_NOTIFY = "poi_check_notify";
|
||||
|
||||
/**
|
||||
* 接收会员信息事件.
|
||||
*/
|
||||
public static final String SUBMIT_MEMBERCARD_USER_INFO = "submit_membercard_user_info";
|
||||
|
||||
/**
|
||||
* 微信摇一摇周边>>摇一摇事件通知.
|
||||
*/
|
||||
public static final String SHAKEAROUND_USER_SHAKE = "ShakearoundUserShake";
|
||||
|
||||
|
||||
/**
|
||||
* 卡券相关事件.
|
||||
*/
|
||||
public static class Card {
|
||||
public static final String CARD_PASS_CHECK = "card_pass_check";
|
||||
public static final String CARD_NOT_PASS_CHECK = "card_not_pass_check";
|
||||
public static final String USER_GET_CARD = "user_get_card";
|
||||
public static final String USER_DEL_CARD = "user_del_card";
|
||||
public static final String USER_CONSUME_CARD = "user_consume_card";
|
||||
public static final String USER_PAY_FROM_PAY_CELL = "user_pay_from_pay_cell";
|
||||
public static final String USER_VIEW_CARD = "user_view_card";
|
||||
public static final String USER_ENTER_SESSION_FROM_CARD = "user_enter_session_from_card";
|
||||
|
||||
/**
|
||||
* 卡券转赠事件.
|
||||
*/
|
||||
public static final String USER_GIFTING_CARD = "user_gifting_card";
|
||||
|
||||
/**
|
||||
* 库存报警.
|
||||
*/
|
||||
public static final String CARD_SKU_REMIND = "card_sku_remind";
|
||||
|
||||
/**
|
||||
* 会员卡内容更新事件.
|
||||
*/
|
||||
public static final String UPDATE_MEMBER_CARD = "update_member_card";
|
||||
|
||||
/**
|
||||
* 券点流水详情事件.
|
||||
*/
|
||||
public static final String CARD_PAY_ORDER = "card_pay_order";
|
||||
|
||||
/**
|
||||
* 用户购买礼品卡付款成功事件.
|
||||
*/
|
||||
public static final String GIFTCARD_PAY_DONE = "giftcard_pay_done";
|
||||
|
||||
/**
|
||||
* 用户购买后赠送事件.
|
||||
*/
|
||||
public static final String GIFTCARD_SEND_TO_FRIEND = "giftcard_send_to_friend";
|
||||
|
||||
/**
|
||||
* 用户领取礼品卡成功事件.
|
||||
*/
|
||||
public static final String GIFTCARD_USER_ACCEPT = "giftcard_user_accept";
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 客服相关事件.
|
||||
*/
|
||||
public static class CustomerService {
|
||||
/**
|
||||
* 客服接入会话.
|
||||
*/
|
||||
public static final String KF_CREATE_SESSION = "kf_create_session";
|
||||
|
||||
/**
|
||||
* 客服关闭会话.
|
||||
*/
|
||||
public static final String KF_CLOSE_SESSION = "kf_close_session";
|
||||
|
||||
/**
|
||||
* 客服转接会话.
|
||||
*/
|
||||
public static final String KF_SWITCH_SESSION = "kf_switch_session";
|
||||
}
|
||||
|
||||
/**
|
||||
* 微信认证事件.
|
||||
*/
|
||||
public static class Qualification {
|
||||
|
||||
/**
|
||||
* 资质认证成功.
|
||||
*/
|
||||
public static final String QUALIFICATION_VERIFY_SUCCESS = "qualification_verify_success";
|
||||
/**
|
||||
* 资质认证失败.
|
||||
*/
|
||||
public static final String QUALIFICATION_VERIFY_FAIL = "qualification_verify_fail";
|
||||
/**
|
||||
* 名称认证成功.
|
||||
*/
|
||||
public static final String NAMING_VERIFY_SUCCESS = "naming_verify_success";
|
||||
/**
|
||||
* 名称认证失败.
|
||||
*/
|
||||
public static final String NAMING_VERIFY_FAIL = "naming_verify_fail";
|
||||
/**
|
||||
* 年审通知.
|
||||
*/
|
||||
public static final String ANNUAL_RENEW = "annual_renew";
|
||||
/**
|
||||
* 认证过期失效通知.
|
||||
*/
|
||||
public static final String VERIFY_EXPIRED = "verify_expired";
|
||||
}
|
||||
|
||||
/**
|
||||
* 电子发票.
|
||||
*/
|
||||
public static class Invoice {
|
||||
/**
|
||||
* 用户授权事件.
|
||||
*/
|
||||
public static final String USER_AUTHORIZE_INVOICE = "user_authorize_invoice";
|
||||
|
||||
/**
|
||||
* 统一开票接口-异步通知开票结果.
|
||||
*/
|
||||
public static final String CLOUD_INVOICE_INVOICERESULT_EVENT = "cloud_invoice_invoiceresult_event";
|
||||
}
|
||||
|
||||
/**
|
||||
* 对话助手相关事件
|
||||
*/
|
||||
public static class Guide {
|
||||
/**
|
||||
* 顾问邀请结果通知事件.
|
||||
*/
|
||||
public static final String GUIDE_INVITE_RESULT_EVENT = "guide_invite_result_event";
|
||||
|
||||
}
|
||||
}
|
@ -0,0 +1,5 @@
|
||||
package com.ossez.wechat.common.constant;
|
||||
|
||||
public class WeChatApiParameter {
|
||||
public static final String ACCESS_TOKEN_GRANT_TYPE_CLIENT_CREDENTIAL = "client_credential";
|
||||
}
|
@ -0,0 +1,556 @@
|
||||
package com.ossez.wechat.common.constant;
|
||||
|
||||
import com.ossez.wechat.common.enums.WeChatErrorCode;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* The constant of WeChat
|
||||
*
|
||||
* @author YuCheng Hu
|
||||
*/
|
||||
public class WeChatConstant {
|
||||
|
||||
public static final String ENDPOINT_WECHAT = "https://api.weixin.qq.com";
|
||||
public static final String ENDPOINT_MP = "https://mp.weixin.qq.com";
|
||||
public static final String ENDPOINT_OPEN = "https://open.weixin.qq.com";
|
||||
|
||||
|
||||
/**
|
||||
* access_token 相关错误代码
|
||||
* <pre>
|
||||
* 发生以下情况时尝试刷新access_token
|
||||
* 40001 获取access_token时AppSecret错误,或者access_token无效
|
||||
* 42001 access_token超时
|
||||
* 40014 不合法的access_token,请开发者认真比对access_token的有效性(如是否过期),或查看是否正在为恰当的公众号调用接口
|
||||
* </pre>
|
||||
*/
|
||||
|
||||
public static final EnumSet<WeChatErrorCode> ACCESS_TOKEN_ERROR_CODES_SET = EnumSet.of(WeChatErrorCode.CODE_40001, WeChatErrorCode.CODE_40014, WeChatErrorCode.CODE_42001);
|
||||
|
||||
@Deprecated
|
||||
public static final List<Integer> ACCESS_TOKEN_ERROR_CODES = Arrays.asList(WeChatErrorCode.CODE_40001.getCode(),
|
||||
WeChatErrorCode.CODE_40014.getCode(), WeChatErrorCode.CODE_42001.getCode());
|
||||
|
||||
/**
|
||||
* 微信推送过来的消息的类型,和发送给微信xml格式消息的消息类型.
|
||||
*/
|
||||
public static class XmlMsgType {
|
||||
public static final String TEXT = "text";
|
||||
public static final String IMAGE = "image";
|
||||
public static final String VOICE = "voice";
|
||||
public static final String SHORTVIDEO = "shortvideo";
|
||||
public static final String VIDEO = "video";
|
||||
public static final String NEWS = "news";
|
||||
public static final String MUSIC = "music";
|
||||
public static final String LOCATION = "location";
|
||||
public static final String LINK = "link";
|
||||
public static final String EVENT = "event";
|
||||
public static final String DEVICE_TEXT = "device_text";
|
||||
public static final String DEVICE_EVENT = "device_event";
|
||||
public static final String DEVICE_STATUS = "device_status";
|
||||
public static final String HARDWARE = "hardware";
|
||||
public static final String TRANSFER_CUSTOMER_SERVICE = "transfer_customer_service";
|
||||
public static final String UPDATE_TASKCARD = "update_taskcard";
|
||||
public static final String UPDATE_BUTTON = "update_button";
|
||||
}
|
||||
|
||||
/**
|
||||
* 主动发送消息(即客服消息)的消息类型.
|
||||
*/
|
||||
public static class MsgType {
|
||||
/**
|
||||
* 消息类型:
|
||||
* text(文本)
|
||||
* image(图片)
|
||||
* voice(语音)
|
||||
* video(视频)
|
||||
* music(音乐)
|
||||
* news(图文消息 - 点击跳转到外链)
|
||||
* mpnews(图文消息 - 点击跳转到图文消息页面)
|
||||
* wxcard(卡券)
|
||||
* miniprogrampage(小程序)
|
||||
* markdown(目前仅支持markdown语法的子集,微工作台(原企业号)不支持展示markdown消息)
|
||||
* file(发送文件 - CP专用)
|
||||
* textcard(文本卡片消息 - CP专用)
|
||||
* wxcard(卡券消息)
|
||||
*/
|
||||
public static final String TEXT = "text";
|
||||
public static final String IMAGE = "image";
|
||||
public static final String VOICE = "voice";
|
||||
public static final String VIDEO = "video";
|
||||
public static final String MUSIC = "music";
|
||||
public static final String NEWS = "news";
|
||||
public static final String MPNEWS = "mpnews";
|
||||
public static final String MARKDOWN = "markdown";
|
||||
public static final String FILE = "file";
|
||||
public static final String TEXTCARD = "textcard";
|
||||
public static final String WXCARD = "wxcard";
|
||||
/**
|
||||
* 转发到客服的消息.
|
||||
*/
|
||||
public static final String TRANSFER_CUSTOMER_SERVICE = "transfer_customer_service";
|
||||
|
||||
/**
|
||||
* 小程序卡片(要求小程序与公众号已关联).
|
||||
*/
|
||||
public static final String MINIPROGRAMPAGE = "miniprogrampage";
|
||||
|
||||
/**
|
||||
* 任务卡片消息.
|
||||
*/
|
||||
public static final String TASKCARD = "taskcard";
|
||||
|
||||
/**
|
||||
* 菜单消息.
|
||||
*/
|
||||
public static final String MSGMENU = "msgmenu";
|
||||
|
||||
/**
|
||||
* 小程序通知消息.
|
||||
*/
|
||||
public static final String MINIPROGRAM_NOTICE = "miniprogram_notice";
|
||||
|
||||
/**
|
||||
* 模板卡片消息.
|
||||
*/
|
||||
public static final String TEMPLATE_CARD = "template_card";
|
||||
|
||||
/**
|
||||
* 发送图文消息(点击跳转到图文消息页面)使用通过 “发布” 系列接口得到的 article_id(草稿箱功能上线后不再支持客服接口中带 media_id 的 mpnews 类型的图文消息)
|
||||
*/
|
||||
public static final String MP_NEWS_ARTICLE = "mpnewsarticle";
|
||||
}
|
||||
|
||||
/**
|
||||
* 发送「学校通知」类型
|
||||
* https://developer.work.weixin.qq.com/document/path/92321
|
||||
*/
|
||||
public static class SchoolContactMsgType {
|
||||
|
||||
/**
|
||||
* 文本消息.
|
||||
*/
|
||||
public static final String TEXT = "text";
|
||||
|
||||
/**
|
||||
* 图片消息.
|
||||
*/
|
||||
public static final String IMAGE = "image";
|
||||
|
||||
/**
|
||||
* 语音消息.
|
||||
*/
|
||||
public static final String VOICE = "voice";
|
||||
|
||||
/**
|
||||
* 视频消息.
|
||||
*/
|
||||
public static final String VIDEO = "video";
|
||||
|
||||
/**
|
||||
* 文件消息
|
||||
*/
|
||||
public static final String FILE = "file";
|
||||
|
||||
/**
|
||||
* 图文消息
|
||||
*/
|
||||
public static final String NEWS = "news";
|
||||
|
||||
/**
|
||||
* 图文消息(mpnews)
|
||||
*/
|
||||
public static final String MPNEWS = "mpnews";
|
||||
|
||||
/**
|
||||
* 小程序消息
|
||||
*/
|
||||
public static final String MINIPROGRAM = "miniprogram";
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 企业微信模板卡片消息的卡片类型
|
||||
*/
|
||||
public static class TemplateCardType {
|
||||
/**
|
||||
* 文本通知型卡片
|
||||
*/
|
||||
public static final String TEXT_NOTICE = "text_notice";
|
||||
/**
|
||||
* 图文展示型卡片
|
||||
*/
|
||||
public static final String NEWS_NOTICE = "news_notice";
|
||||
/**
|
||||
* 按钮交互型卡片
|
||||
*/
|
||||
public static final String BUTTON_INTERACTION = "button_interaction";
|
||||
/**
|
||||
* 投票选择型卡片
|
||||
*/
|
||||
public static final String VOTE_INTERACTION = "vote_interaction";
|
||||
/**
|
||||
* 多项选择型卡片
|
||||
*/
|
||||
public static final String MULTIPLE_INTERACTION = "multiple_interaction";
|
||||
}
|
||||
|
||||
/**
|
||||
* 表示是否是保密消息,0表示否,1表示是,默认0.
|
||||
*/
|
||||
public static class KefuMsgSafe {
|
||||
public static final String NO = "0";
|
||||
public static final String YES = "1";
|
||||
}
|
||||
|
||||
/**
|
||||
* 群发消息的消息类型.
|
||||
*/
|
||||
public static class MassMsgType {
|
||||
public static final String MPNEWS = "mpnews";
|
||||
public static final String TEXT = "text";
|
||||
public static final String VOICE = "voice";
|
||||
public static final String IMAGE = "image";
|
||||
public static final String IMAGES = "images";
|
||||
public static final String MPVIDEO = "mpvideo";
|
||||
}
|
||||
|
||||
/**
|
||||
* 群发消息后微信端推送给服务器的反馈消息.
|
||||
*/
|
||||
public static class MassMsgStatus {
|
||||
public static final String SEND_SUCCESS = "send success";
|
||||
public static final String SEND_FAIL = "send fail";
|
||||
public static final String ERR_10001 = "err(10001)";
|
||||
public static final String ERR_20001 = "err(20001)";
|
||||
public static final String ERR_20004 = "err(20004)";
|
||||
public static final String ERR_20002 = "err(20002)";
|
||||
public static final String ERR_20006 = "err(20006)";
|
||||
public static final String ERR_20008 = "err(20008)";
|
||||
public static final String ERR_20013 = "err(20013)";
|
||||
public static final String ERR_22000 = "err(22000)";
|
||||
public static final String ERR_21000 = "err(21000)";
|
||||
public static final String ERR_30001 = "err(30001)";
|
||||
public static final String ERR_30002 = "err(30002)";
|
||||
public static final String ERR_30003 = "err(30003)";
|
||||
public static final String ERR_40001 = "err(40001)";
|
||||
public static final String ERR_40002 = "err(40002)";
|
||||
|
||||
|
||||
/**
|
||||
* 群发反馈消息代码所对应的文字描述.
|
||||
*/
|
||||
public static final Map<String, String> STATUS_DESC = new HashMap<>();
|
||||
|
||||
static {
|
||||
STATUS_DESC.put(SEND_SUCCESS, "发送成功");
|
||||
STATUS_DESC.put(SEND_FAIL, "发送失败");
|
||||
STATUS_DESC.put(ERR_10001, "涉嫌广告");
|
||||
STATUS_DESC.put(ERR_20001, "涉嫌政治");
|
||||
STATUS_DESC.put(ERR_20004, "涉嫌社会");
|
||||
STATUS_DESC.put(ERR_20002, "涉嫌色情");
|
||||
STATUS_DESC.put(ERR_20006, "涉嫌违法犯罪");
|
||||
STATUS_DESC.put(ERR_20008, "涉嫌欺诈");
|
||||
STATUS_DESC.put(ERR_20013, "涉嫌版权");
|
||||
STATUS_DESC.put(ERR_22000, "涉嫌互推_互相宣传");
|
||||
STATUS_DESC.put(ERR_21000, "涉嫌其他");
|
||||
STATUS_DESC.put(ERR_30001, "原创校验出现系统错误且用户选择了被判为转载就不群发");
|
||||
STATUS_DESC.put(ERR_30002, "原创校验被判定为不能群发");
|
||||
STATUS_DESC.put(ERR_30003, "原创校验被判定为转载文且用户选择了被判为转载就不群发");
|
||||
STATUS_DESC.put(ERR_40001, "管理员拒绝");
|
||||
STATUS_DESC.put(ERR_40002, "管理员30分钟内无响应,超时");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 微信端推送过来的事件类型.
|
||||
*/
|
||||
public static class EventType {
|
||||
public static final String SUBSCRIBE = "subscribe";
|
||||
public static final String UNSUBSCRIBE = "unsubscribe";
|
||||
public static final String SCAN = "SCAN";
|
||||
public static final String LOCATION = "LOCATION";
|
||||
public static final String CLICK = "CLICK";
|
||||
public static final String VIEW = "VIEW";
|
||||
public static final String MASS_SEND_JOB_FINISH = "MASSSENDJOBFINISH";
|
||||
/**
|
||||
* 扫码推事件的事件推送
|
||||
*/
|
||||
public static final String SCANCODE_PUSH = "scancode_push";
|
||||
/**
|
||||
* 扫码推事件且弹出“消息接收中”提示框的事件推送.
|
||||
*/
|
||||
public static final String SCANCODE_WAITMSG = "scancode_waitmsg";
|
||||
/**
|
||||
* 弹出系统拍照发图的事件推送.
|
||||
*/
|
||||
public static final String PIC_SYSPHOTO = "pic_sysphoto";
|
||||
/**
|
||||
* 弹出拍照或者相册发图的事件推送.
|
||||
*/
|
||||
public static final String PIC_PHOTO_OR_ALBUM = "pic_photo_or_album";
|
||||
/**
|
||||
* 弹出微信相册发图器的事件推送.
|
||||
*/
|
||||
public static final String PIC_WEIXIN = "pic_weixin";
|
||||
/**
|
||||
* 弹出地理位置选择器的事件推送.
|
||||
*/
|
||||
public static final String LOCATION_SELECT = "location_select";
|
||||
|
||||
/**
|
||||
* 授权用户资料变更事件
|
||||
* 1、 当部分用户的资料存在风险时,平台会对用户资料进行清理,并通过消息推送服务器通知最近30天授权过的公众号开发者,我们建议开发者留意响应该事件,及时主动更新或清理用户的头像及昵称,降低风险。
|
||||
* 2、 当用户撤回授权信息时,平台会通过消息推送服务器通知给公众号开发者,请开发者注意及时删除用户信息。
|
||||
*/
|
||||
public static final String USER_INFO_MODIFIED = "user_info_modified";
|
||||
|
||||
/**
|
||||
* 用户撤回授权事件
|
||||
*/
|
||||
public static final String USER_AUTHORIZATION_REVOKE = "user_authorization_revoke";
|
||||
|
||||
/**
|
||||
* 群发模板回调事件
|
||||
*/
|
||||
public static final String TEMPLATE_SEND_JOB_FINISH = "TEMPLATESENDJOBFINISH";
|
||||
|
||||
/**
|
||||
* 微信小店 订单付款通知.
|
||||
*/
|
||||
public static final String MERCHANT_ORDER = "merchant_order";
|
||||
|
||||
/**
|
||||
* 卡券事件:卡券通过审核
|
||||
*/
|
||||
public static final String CARD_PASS_CHECK = "card_pass_check";
|
||||
|
||||
/**
|
||||
* 卡券事件:卡券未通过审核
|
||||
*/
|
||||
public static final String CARD_NOT_PASS_CHECK = "card_not_pass_check";
|
||||
|
||||
/**
|
||||
* 卡券事件:用户领取卡券
|
||||
*/
|
||||
public static final String CARD_USER_GET_CARD = "user_get_card";
|
||||
|
||||
/**
|
||||
* 卡券事件:用户转赠卡券
|
||||
*/
|
||||
public static final String CARD_USER_GIFTING_CARD = "user_gifting_card";
|
||||
|
||||
/**
|
||||
* 异步安全校验事件
|
||||
*/
|
||||
public static final String WXA_MEDIA_CHECK = "wxa_media_check";
|
||||
|
||||
/**
|
||||
* 卡券事件:用户核销卡券
|
||||
*/
|
||||
public static final String CARD_USER_CONSUME_CARD = "user_consume_card";
|
||||
|
||||
|
||||
/**
|
||||
* 卡券事件:用户通过卡券的微信买单完成时推送
|
||||
*/
|
||||
public static final String CARD_USER_PAY_FROM_PAY_CELL = "user_pay_from_pay_cell";
|
||||
|
||||
|
||||
/**
|
||||
* 卡券事件:用户提交会员卡开卡信息
|
||||
*/
|
||||
public static final String CARD_SUBMIT_MEMBERCARD_USER_INFO = "submit_membercard_user_info";
|
||||
|
||||
/**
|
||||
* 卡券事件:用户打开查看卡券
|
||||
*/
|
||||
public static final String CARD_USER_VIEW_CARD = "user_view_card";
|
||||
|
||||
/**
|
||||
* 卡券事件:用户删除卡券
|
||||
*/
|
||||
public static final String CARD_USER_DEL_CARD = "user_del_card";
|
||||
|
||||
/**
|
||||
* 卡券事件:用户在卡券里点击查看公众号进入会话时(需要用户已经关注公众号)
|
||||
*/
|
||||
public static final String CARD_USER_ENTER_SESSION_FROM_CARD = "user_enter_session_from_card";
|
||||
|
||||
/**
|
||||
* 卡券事件:当用户的会员卡积分余额发生变动时
|
||||
*/
|
||||
public static final String CARD_UPDATE_MEMBER_CARD = "update_member_card";
|
||||
|
||||
/**
|
||||
* 卡券事件:当某个card_id的初始库存数大于200且当前库存小于等于100时,用户尝试领券会触发发送事件给商户,事件每隔12h发送一次
|
||||
*/
|
||||
public static final String CARD_SKU_REMIND = "card_sku_remind";
|
||||
|
||||
/**
|
||||
* 卡券事件:当商户朋友的券券点发生变动时
|
||||
*/
|
||||
public static final String CARD_PAY_ORDER = "card_pay_order";
|
||||
|
||||
/**
|
||||
* 小程序审核事件:审核通过
|
||||
*/
|
||||
public static final String WEAPP_AUDIT_SUCCESS = "weapp_audit_success";
|
||||
|
||||
/**
|
||||
* 小程序审核事件:审核不通过
|
||||
*/
|
||||
public static final String WEAPP_AUDIT_FAIL = "weapp_audit_fail";
|
||||
|
||||
/**
|
||||
* 小程序自定义交易组件支付通知
|
||||
*/
|
||||
public static final String OPEN_PRODUCT_ORDER_PAY = "open_product_order_pay";
|
||||
/**
|
||||
* 点击菜单跳转小程序的事件推送
|
||||
*/
|
||||
public static final String VIEW_MINIPROGRAM = "view_miniprogram";
|
||||
|
||||
/**
|
||||
* 订阅通知事件:用户操作订阅通知弹窗
|
||||
*/
|
||||
public static final String SUBSCRIBE_MSG_POPUP_EVENT = "subscribe_msg_popup_event";
|
||||
|
||||
/**
|
||||
* 订阅通知事件:用户管理订阅通知
|
||||
*/
|
||||
public static final String SUBSCRIBE_MSG_CHANGE_EVENT = "subscribe_msg_change_event";
|
||||
|
||||
/**
|
||||
* 订阅通知事件:发送订阅通知回调
|
||||
*/
|
||||
public static final String SUBSCRIBE_MSG_SENT_EVENT = "subscribe_msg_sent_event";
|
||||
}
|
||||
|
||||
/**
|
||||
* 上传多媒体(临时素材)文件的类型.
|
||||
*/
|
||||
public static class MediaFileType {
|
||||
public static final String IMAGE = "image";
|
||||
public static final String VOICE = "voice";
|
||||
public static final String VIDEO = "video";
|
||||
public static final String THUMB = "thumb";
|
||||
public static final String FILE = "file";
|
||||
}
|
||||
|
||||
/**
|
||||
* 自定义菜单的按钮类型.
|
||||
*/
|
||||
public static class MenuButtonType {
|
||||
/**
|
||||
* 点击推事件.
|
||||
*/
|
||||
public static final String CLICK = "click";
|
||||
/**
|
||||
* 跳转URL.
|
||||
*/
|
||||
public static final String VIEW = "view";
|
||||
/**
|
||||
* 跳转到小程序.
|
||||
*/
|
||||
public static final String MINIPROGRAM = "miniprogram";
|
||||
/**
|
||||
* 扫码推事件.
|
||||
*/
|
||||
public static final String SCANCODE_PUSH = "scancode_push";
|
||||
/**
|
||||
* 扫码推事件且弹出“消息接收中”提示框.
|
||||
*/
|
||||
public static final String SCANCODE_WAITMSG = "scancode_waitmsg";
|
||||
/**
|
||||
* 弹出系统拍照发图.
|
||||
*/
|
||||
public static final String PIC_SYSPHOTO = "pic_sysphoto";
|
||||
/**
|
||||
* 弹出拍照或者相册发图.
|
||||
*/
|
||||
public static final String PIC_PHOTO_OR_ALBUM = "pic_photo_or_album";
|
||||
/**
|
||||
* 弹出微信相册发图器.
|
||||
*/
|
||||
public static final String PIC_WEIXIN = "pic_weixin";
|
||||
/**
|
||||
* 弹出地理位置选择器.
|
||||
*/
|
||||
public static final String LOCATION_SELECT = "location_select";
|
||||
/**
|
||||
* 下发消息(除文本消息).
|
||||
*/
|
||||
public static final String MEDIA_ID = "media_id";
|
||||
/**
|
||||
* 跳转图文消息URL.
|
||||
*/
|
||||
public static final String VIEW_LIMITED = "view_limited";
|
||||
}
|
||||
|
||||
/**
|
||||
* oauth2网页授权的scope.
|
||||
*/
|
||||
public static class OAuth2Scope {
|
||||
/**
|
||||
* 不弹出授权页面,直接跳转,只能获取用户openid.
|
||||
*/
|
||||
public static final String SNSAPI_BASE = "snsapi_base";
|
||||
|
||||
/**
|
||||
* 弹出授权页面,可通过openid拿到昵称、性别、所在地。并且,即使在未关注的情况下,只要用户授权,也能获取其信息.
|
||||
*/
|
||||
public static final String SNSAPI_USERINFO = "snsapi_userinfo";
|
||||
|
||||
/**
|
||||
* 手动授权,可获取成员的详细信息,包含手机、邮箱。只适用于企业微信或企业号.
|
||||
*/
|
||||
public static final String SNSAPI_PRIVATEINFO = "snsapi_privateinfo";
|
||||
}
|
||||
|
||||
/**
|
||||
* 网页应用登录授权作用域.
|
||||
*/
|
||||
public static class QrConnectScope {
|
||||
public static final String SNSAPI_LOGIN = "snsapi_login";
|
||||
}
|
||||
|
||||
/**
|
||||
* 永久素材类型.
|
||||
*/
|
||||
public static class MaterialType {
|
||||
public static final String NEWS = "news";
|
||||
public static final String VOICE = "voice";
|
||||
public static final String IMAGE = "image";
|
||||
public static final String VIDEO = "video";
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 网络检测入参.
|
||||
*/
|
||||
public static class NetCheckArgs {
|
||||
public static final String ACTIONDNS = "dns";
|
||||
public static final String ACTIONPING = "ping";
|
||||
public static final String ACTIONALL = "all";
|
||||
public static final String OPERATORUNICOM = "UNICOM";
|
||||
public static final String OPERATORCHINANET = "CHINANET";
|
||||
public static final String OPERATORCAP = "CAP";
|
||||
public static final String OPERATORDEFAULT = "DEFAULT";
|
||||
}
|
||||
|
||||
/**
|
||||
* appId 类型
|
||||
*/
|
||||
public static class AppIdType {
|
||||
/**
|
||||
* 公众号appId类型
|
||||
*/
|
||||
public static final String MP_TYPE = "mp";
|
||||
/**
|
||||
* 小程序appId类型
|
||||
*/
|
||||
public static final String MINI_TYPE = "mini";
|
||||
}
|
||||
}
|
@ -0,0 +1,20 @@
|
||||
package com.ossez.wechat.common.enums;
|
||||
|
||||
/**
|
||||
* The language for WeChat API can support
|
||||
*
|
||||
* @author YuCheng Hu
|
||||
*/
|
||||
public enum Language {
|
||||
ZH_CN("zh_CN"), EN_US("en_US");
|
||||
|
||||
private String code;
|
||||
|
||||
Language(String code) {
|
||||
this.code = code;
|
||||
}
|
||||
|
||||
public String getCode() {
|
||||
return code;
|
||||
}
|
||||
}
|
@ -0,0 +1,35 @@
|
||||
package com.ossez.wechat.common.enums;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* ticket类型枚举
|
||||
* Created by Binary Wang on 2018/11/18.
|
||||
* </pre>
|
||||
*
|
||||
* @author <a href="https://github.com/binarywang">Binary Wang</a>
|
||||
*/
|
||||
@Getter
|
||||
@RequiredArgsConstructor
|
||||
public enum TicketType {
|
||||
/**
|
||||
* jsapi
|
||||
*/
|
||||
JSAPI("jsapi"),
|
||||
/**
|
||||
* sdk
|
||||
*/
|
||||
SDK("2"),
|
||||
/**
|
||||
* 微信卡券
|
||||
*/
|
||||
WX_CARD("wx_card");
|
||||
|
||||
/**
|
||||
* type代码
|
||||
*/
|
||||
private final String code;
|
||||
|
||||
}
|
@ -0,0 +1,207 @@
|
||||
package com.ossez.wechat.common.enums;
|
||||
|
||||
import com.google.common.collect.Maps;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* WeChat Error Code
|
||||
* <pre>
|
||||
* 微信公众平台全局返回码.
|
||||
* 参考文档:<a href="https://developers.weixin.qq.com/doc/offiaccount/Getting_Started/Global_Return_Code.html">公众平台全局返回码</a>
|
||||
* </pre>
|
||||
*
|
||||
* @author YuCheng Hu
|
||||
*/
|
||||
public enum WeChatErrorCode {
|
||||
CODE_1(-1, "系统繁忙,此时请开发者稍候再试"),
|
||||
CODE_0(0, "请求成功"),
|
||||
CODE_40001(40001, "获取 access_token 时 AppSecret 错误,或者 access_token 无效。请开发者认真比对 AppSecret 的正确性,或查看是否正在为恰当的公众号调用接口"),
|
||||
CODE_40002(40002, "不合法的凭证类型"),
|
||||
CODE_40003(40003, "不合法的 OpenID ,请开发者确认 OpenID (该用户)是否已关注公众号,或是否是其他公众号的 OpenID"),
|
||||
CODE_40004(40004, "不合法的媒体文件类型"),
|
||||
CODE_40005(40005, "不合法的文件类型"),
|
||||
CODE_40006(40006, "不合法的文件大小"),
|
||||
CODE_40007(40007, "不合法的媒体文件 id"),
|
||||
CODE_40008(40008, "不合法的消息类型"),
|
||||
CODE_40009(40009, "不合法的图片文件大小"),
|
||||
CODE_40010(40010, "不合法的语音文件大小"),
|
||||
CODE_40011(40011, "不合法的视频文件大小"),
|
||||
CODE_40012(40012, "不合法的缩略图文件大小"),
|
||||
CODE_40013(40013, "不合法的 AppID ,请开发者检查 AppID 的正确性,避免异常字符,注意大小写"),
|
||||
CODE_40014(40014, "不合法的 access_token ,请开发者认真比对 access_token 的有效性(如是否过期),或查看是否正在为恰当的公众号调用接口"),
|
||||
CODE_40015(40015, "不合法的菜单类型"),
|
||||
CODE_40016(40016, "不合法的按钮个数"),
|
||||
CODE_40017(40017, "不合法的按钮类型"),
|
||||
CODE_40018(40018, "不合法的按钮名字长度"),
|
||||
CODE_40019(40019, "不合法的按钮 KEY 长度"),
|
||||
CODE_40020(40020, "不合法的按钮 URL 长度"),
|
||||
CODE_40021(40021, "不合法的菜单版本号"),
|
||||
CODE_40022(40022, "不合法的子菜单级数"),
|
||||
CODE_40023(40023, "不合法的子菜单按钮个数"),
|
||||
CODE_40024(40024, "不合法的子菜单按钮类型"),
|
||||
CODE_40025(40025, "不合法的子菜单按钮名字长度"),
|
||||
CODE_40026(40026, "不合法的子菜单按钮 KEY 长度"),
|
||||
CODE_40027(40027, "不合法的子菜单按钮 URL 长度"),
|
||||
CODE_40028(40028, "不合法的自定义菜单使用用户"),
|
||||
CODE_40029(40029, "不合法的 oauth_code"),
|
||||
CODE_40030(40030, "不合法的 refresh_token"),
|
||||
CODE_40031(40031, "不合法的 openid 列表"),
|
||||
CODE_40032(40032, "不合法的 openid 列表长度"),
|
||||
CODE_40033(40033, "不合法的请求字符,不能包含\\uxxxx 格式的字符"),
|
||||
CODE_40035(40035, "不合法的参数"),
|
||||
CODE_40038(40038, "不合法的请求格式"),
|
||||
CODE_40039(40039, "不合法的 URL 长度"),
|
||||
CODE_40050(40050, "不合法的分组 id"),
|
||||
CODE_40051(40051, "分组名字不合法"),
|
||||
CODE_40060(40060, "删除单篇图文时,指定的 article_idx 不合法"),
|
||||
CODE_40117(40117, "分组名字不合法"),
|
||||
CODE_40118(40118, "media_id 大小不合法"),
|
||||
CODE_40119(40119, "button 类型错误"),
|
||||
CODE_40120(40120, "button 类型错误"),
|
||||
CODE_40121(40121, "不合法的 media_id 类型"),
|
||||
CODE_40132(40132, "微信号不合法"),
|
||||
CODE_40137(40137, "不支持的图片格式"),
|
||||
CODE_40155(40155, "请勿添加其他公众号的主页链接"),
|
||||
CODE_40163(40163, "oauth_code已使用"),
|
||||
CODE_41001(41001, "缺少 access_token 参数"),
|
||||
CODE_41002(41002, "缺少 appid 参数"),
|
||||
CODE_41003(41003, "缺少 refresh_token 参数"),
|
||||
CODE_41004(41004, "缺少 secret 参数"),
|
||||
CODE_41005(41005, "缺少多媒体文件数据"),
|
||||
CODE_41006(41006, "缺少 media_id 参数"),
|
||||
CODE_41007(41007, "缺少子菜单数据"),
|
||||
CODE_41008(41008, "缺少 oauth code"),
|
||||
CODE_41009(41009, "缺少 openid"),
|
||||
CODE_42001(42001, "access_token 超时,请检查 access_token 的有效期,请参考基础支持 - 获取 access_token 中,对 access_token 的详细机制说明"),
|
||||
CODE_42002(42002, "refresh_token 超时"),
|
||||
CODE_42003(42003, "oauth_code 超时"),
|
||||
CODE_42007(42007, "用户修改微信密码, accesstoken 和 refreshtoken 失效,需要重新授权"),
|
||||
CODE_43001(43001, "需要 GET 请求"),
|
||||
CODE_43002(43002, "需要 POST 请求"),
|
||||
CODE_43003(43003, "需要 HTTPS 请求"),
|
||||
CODE_43004(43004, "需要接收者关注"),
|
||||
CODE_43005(43005, "需要好友关系"),
|
||||
CODE_43019(43019, "需要将接收者从黑名单中移除"),
|
||||
CODE_44001(44001, "多媒体文件为空"),
|
||||
CODE_44002(44002, "POST 的数据包为空"),
|
||||
CODE_44003(44003, "图文消息内容为空"),
|
||||
CODE_44004(44004, "文本消息内容为空"),
|
||||
CODE_45001(45001, "多媒体文件大小超过限制"),
|
||||
CODE_45002(45002, "消息内容超过限制"),
|
||||
CODE_45003(45003, "标题字段超过限制"),
|
||||
CODE_45004(45004, "描述字段超过限制"),
|
||||
CODE_45005(45005, "链接字段超过限制"),
|
||||
CODE_45006(45006, "图片链接字段超过限制"),
|
||||
CODE_45007(45007, "语音播放时间超过限制"),
|
||||
CODE_45008(45008, "图文消息超过限制"),
|
||||
CODE_45009(45009, "接口调用超过限制"),
|
||||
CODE_45010(45010, "创建菜单个数超过限制"),
|
||||
CODE_45011(45011, "API 调用太频繁,请稍候再试"),
|
||||
CODE_45015(45015, "回复时间超过限制"),
|
||||
CODE_45016(45016, "系统分组,不允许修改"),
|
||||
CODE_45017(45017, "分组名字过长"),
|
||||
CODE_45018(45018, "分组数量超过上限"),
|
||||
CODE_45047(45047, "客服接口下行条数超过上限"),
|
||||
CODE_45159(45159, "非法的tag_id"),
|
||||
CODE_45065(45065, "相同 clientmsgid 已存在群发记录,返回数据中带有已存在的群发任务的 msgid"),
|
||||
CODE_45066(45066, "相同 clientmsgid 重试速度过快,请间隔1分钟重试"),
|
||||
CODE_45067(45067, "clientmsgid 长度超过限制"),
|
||||
CODE_46001(46001, "不存在媒体数据"),
|
||||
CODE_46002(46002, "不存在的菜单版本"),
|
||||
CODE_46003(46003, "不存在的菜单数据"),
|
||||
CODE_46004(46004, "不存在的用户"),
|
||||
CODE_47001(47001, "解析 JSON/XML 内容错误"),
|
||||
CODE_48001(48001, "api 功能未授权,请确认公众号已获得该接口,可以在公众平台官网 - 开发者中心页中查看接口权限"),
|
||||
CODE_48002(48002, "粉丝拒收消息(粉丝在公众号选项中,关闭了 “ 接收消息 ” )"),
|
||||
CODE_48004(48004, "api 接口被封禁,请登录 mp.weixin.qq.com 查看详情"),
|
||||
CODE_48005(48005, "api 禁止删除被自动回复和自定义菜单引用的素材"),
|
||||
CODE_48006(48006, "api 禁止清零调用次数,因为清零次数达到上限"),
|
||||
CODE_48008(48008, "没有该类型消息的发送权限"),
|
||||
CODE_50001(50001, "用户未授权该 api"),
|
||||
CODE_50002(50002, "用户受限,可能是违规后接口被封禁"),
|
||||
CODE_50005(50005, "用户未关注公众号"),
|
||||
CODE_61451(61451, "参数错误 (invalid parameter)"),
|
||||
CODE_61452(61452, "无效客服账号 (invalid kf_account)"),
|
||||
CODE_61453(61453, "客服帐号已存在 (kf_account exsited)"),
|
||||
CODE_61454(61454, "客服帐号名长度超过限制 ( 仅允许 10 个英文字符,不包括 @ 及 @ 后的公众号的微信号 )(invalid kf_acount length)"),
|
||||
CODE_61455(61455, "客服帐号名包含非法字符 ( 仅允许英文 + 数字 )(illegal character in kf_account)"),
|
||||
CODE_61456(61456, "客服帐号个数超过限制 (10 个客服账号 )(kf_account count exceeded)"),
|
||||
CODE_61457(61457, "无效头像文件类型 (invalid file type)"),
|
||||
CODE_61450(61450, "系统错误 (system error)"),
|
||||
CODE_61500(61500, "日期格式错误"),
|
||||
CODE_65301(65301, "不存在此 menuid 对应的个性化菜单"),
|
||||
CODE_65302(65302, "没有相应的用户"),
|
||||
CODE_65303(65303, "没有默认菜单,不能创建个性化菜单"),
|
||||
CODE_65304(65304, "MatchRule 信息为空"),
|
||||
CODE_65305(65305, "个性化菜单数量受限"),
|
||||
CODE_65306(65306, "不支持个性化菜单的帐号"),
|
||||
CODE_65307(65307, "个性化菜单信息为空"),
|
||||
CODE_65308(65308, "包含没有响应类型的 button"),
|
||||
CODE_65309(65309, "个性化菜单开关处于关闭状态"),
|
||||
CODE_65310(65310, "填写了省份或城市信息,国家信息不能为空"),
|
||||
CODE_65311(65311, "填写了城市信息,省份信息不能为空"),
|
||||
CODE_65312(65312, "不合法的国家信息"),
|
||||
CODE_65313(65313, "不合法的省份信息"),
|
||||
CODE_65314(65314, "不合法的城市信息"),
|
||||
CODE_65316(65316, "该公众号的菜单设置了过多的域名外跳(最多跳转到 3 个域名的链接)"),
|
||||
CODE_65317(65317, "不合法的 URL"),
|
||||
CODE_9001001(9001001, "POST 数据参数不合法"),
|
||||
CODE_9001002(9001002, "远端服务不可用"),
|
||||
CODE_9001003(9001003, "Ticket 不合法"),
|
||||
CODE_9001004(9001004, "获取摇周边用户信息失败"),
|
||||
CODE_9001005(9001005, "获取商户信息失败"),
|
||||
CODE_9001006(9001006, "获取 OpenID 失败"),
|
||||
CODE_9001007(9001007, "上传文件缺失"),
|
||||
CODE_9001008(9001008, "上传素材的文件类型不合法"),
|
||||
CODE_9001009(9001009, "上传素材的文件尺寸不合法"),
|
||||
CODE_9001010(9001010, "上传失败"),
|
||||
CODE_9001020(9001020, "帐号不合法"),
|
||||
CODE_9001021(9001021, "已有设备激活率低于 50% ,不能新增设备"),
|
||||
CODE_9001022(9001022, "设备申请数不合法,必须为大于 0 的数字"),
|
||||
CODE_9001023(9001023, "已存在审核中的设备 ID 申请"),
|
||||
CODE_9001024(9001024, "一次查询设备 ID 数量不能超过 50"),
|
||||
CODE_9001025(9001025, "设备 ID 不合法"),
|
||||
CODE_9001026(9001026, "页面 ID 不合法"),
|
||||
CODE_9001027(9001027, "页面参数不合法"),
|
||||
CODE_9001028(9001028, "一次删除页面 ID 数量不能超过 10"),
|
||||
CODE_9001029(9001029, "页面已应用在设备中,请先解除应用关系再删除"),
|
||||
CODE_9001030(9001030, "一次查询页面 ID 数量不能超过 50"),
|
||||
CODE_9001032(9001032, "保存设备与页面的绑定关系参数错误"),
|
||||
CODE_9001033(9001033, "门店 ID 不合法"),
|
||||
CODE_9001034(9001034, "设备备注信息过长"),
|
||||
CODE_9001035(9001035, "设备申请参数不合法"),
|
||||
CODE_9001036(9001036, "查询起始值 begin 不合法"),
|
||||
CODE_45083(45083, "设置的 speed 参数不在0到4的范围内"),
|
||||
CODE_45084(45084, "没有设置 speed 参数");
|
||||
|
||||
private final int code;
|
||||
private final String msg;
|
||||
|
||||
WeChatErrorCode(int code, String msg) {
|
||||
this.code = code;
|
||||
this.msg = msg;
|
||||
}
|
||||
|
||||
public int getCode() {
|
||||
return code;
|
||||
}
|
||||
|
||||
public String getMsg() {
|
||||
return msg;
|
||||
}
|
||||
|
||||
static final Map<Integer, String> valueMap = Maps.newHashMap();
|
||||
|
||||
static {
|
||||
for (WeChatErrorCode value : WeChatErrorCode.values()) {
|
||||
valueMap.put(value.code, value.msg);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过错误代码查找其中文含义..
|
||||
*/
|
||||
public static String findMsgByCode(int code) {
|
||||
return valueMap.getOrDefault(code, null);
|
||||
}
|
||||
}
|
@ -0,0 +1,12 @@
|
||||
package com.ossez.wechat.common.enums;
|
||||
|
||||
/**
|
||||
* WeChat's Storage Category
|
||||
*
|
||||
* We provide implement for MEM(RAM) and REDIS
|
||||
*
|
||||
* @author YuCheng Hu
|
||||
*/
|
||||
public enum WeChatStorageCategory {
|
||||
MEM, REDIS
|
||||
}
|
@ -0,0 +1,25 @@
|
||||
package com.ossez.wechat.common.enums;
|
||||
|
||||
/**
|
||||
* 微信卡券
|
||||
*
|
||||
* @author YuCheng
|
||||
*/
|
||||
public enum WxCardType {
|
||||
MEMBER_CARD("MEMBER_CARD"),
|
||||
GROUPON("GROUPON"),
|
||||
CASH("CASH"),
|
||||
DISCOUNT("DISCOUNT"),
|
||||
GIFT("GIFT"),
|
||||
GENERAL_COUPON("GENERAL_COUPON");
|
||||
|
||||
private String code;
|
||||
|
||||
WxCardType(String code) {
|
||||
this.code = code;
|
||||
}
|
||||
|
||||
public String getCode() {
|
||||
return code;
|
||||
}
|
||||
}
|
1464
common/src/main/java/com/ossez/wechat/common/enums/WxMpApiUrl.java
Normal file
1464
common/src/main/java/com/ossez/wechat/common/enums/WxMpApiUrl.java
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,32 @@
|
||||
package com.ossez.wechat.common.enums;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 微信类型枚举.
|
||||
* Created by BinaryWang on 2018/5/14.
|
||||
* </pre>
|
||||
*
|
||||
* @author <a href="https://github.com/binarywang">Binary Wang</a>
|
||||
*/
|
||||
public enum WxType {
|
||||
/**
|
||||
* 企业微信.
|
||||
*/
|
||||
CP,
|
||||
/**
|
||||
* 微信公众号.
|
||||
*/
|
||||
MP,
|
||||
/**
|
||||
* 微信小程序.
|
||||
*/
|
||||
MiniApp,
|
||||
/**
|
||||
* 微信开放平台.
|
||||
*/
|
||||
Open,
|
||||
/**
|
||||
* 微信支付.
|
||||
*/
|
||||
Pay;
|
||||
}
|
@ -0,0 +1,26 @@
|
||||
package com.ossez.wechat.common.exception;
|
||||
|
||||
/**
|
||||
* @author Daniel Qian
|
||||
*/
|
||||
public class DataStructureException extends WxErrorException {
|
||||
private static final long serialVersionUID = -6357149550353160810L;
|
||||
|
||||
private final WxError error;
|
||||
|
||||
private static final int DEFAULT_ERROR_CODE = -99;
|
||||
|
||||
public DataStructureException(String message) {
|
||||
this(WxError.builder().errorCode(DEFAULT_ERROR_CODE).errorMsg(message).build());
|
||||
}
|
||||
|
||||
public DataStructureException(WxError error) {
|
||||
super(error.toString());
|
||||
this.error = error;
|
||||
}
|
||||
|
||||
|
||||
public WxError getError() {
|
||||
return this.error;
|
||||
}
|
||||
}
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,111 @@
|
||||
package com.ossez.wechat.common.exception;
|
||||
|
||||
import com.ossez.wechat.common.enums.WeChatErrorCode;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
import com.ossez.wechat.common.enums.WxType;
|
||||
import com.ossez.wechat.common.util.json.WxGsonBuilder;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* 微信错误码.
|
||||
* 请阅读:
|
||||
* 公众平台:<a href="https://developers.weixin.qq.com/doc/offiaccount/Getting_Started/Global_Return_Code.html">全局返回码说明</a>
|
||||
* 企业微信:<a href="https://work.weixin.qq.com/api/doc#10649">全局错误码</a>
|
||||
*
|
||||
* @author Daniel Qian & Binary Wang
|
||||
*/
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@Builder
|
||||
public class WxError implements Serializable {
|
||||
private static final long serialVersionUID = -2696724276555657960L;
|
||||
|
||||
/**
|
||||
* 微信错误代码.
|
||||
*/
|
||||
private int errorCode;
|
||||
|
||||
/**
|
||||
* 微信错误信息.
|
||||
* (如果可以翻译为中文,就为中文)
|
||||
*/
|
||||
private String errorMsg;
|
||||
|
||||
/**
|
||||
* 微信接口返回的错误原始信息(英文).
|
||||
*/
|
||||
private String errorMsgEn;
|
||||
|
||||
private String json;
|
||||
|
||||
public WxError(int errorCode, String errorMsg) {
|
||||
this.errorCode = errorCode;
|
||||
this.errorMsg = errorMsg;
|
||||
}
|
||||
|
||||
public static WxError fromJson(String json) {
|
||||
return fromJson(json, null);
|
||||
}
|
||||
|
||||
public static WxError fromJson(String json, WxType type) {
|
||||
final WxError wxError = WxGsonBuilder.create().fromJson(json, WxError.class);
|
||||
if (wxError.getErrorCode() == 0 || type == null) {
|
||||
return wxError;
|
||||
}
|
||||
|
||||
if (StringUtils.isNotEmpty(wxError.getErrorMsg())) {
|
||||
wxError.setErrorMsgEn(wxError.getErrorMsg());
|
||||
}
|
||||
|
||||
switch (type) {
|
||||
case MP: {
|
||||
final String msg = WeChatErrorCode.findMsgByCode(wxError.getErrorCode());
|
||||
if (msg != null) {
|
||||
wxError.setErrorMsg(msg);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case CP: {
|
||||
final String msg = WxCpErrorMsgEnum.findMsgByCode(wxError.getErrorCode());
|
||||
if (msg != null) {
|
||||
wxError.setErrorMsg(msg);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case MiniApp: {
|
||||
final String msg = WxMaErrorMsgEnum.findMsgByCode(wxError.getErrorCode());
|
||||
if (msg != null) {
|
||||
wxError.setErrorMsg(msg);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case Open: {
|
||||
final String msg = WxOpenErrorMsgEnum.findMsgByCode(wxError.getErrorCode());
|
||||
if (msg != null) {
|
||||
wxError.setErrorMsg(msg);
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
return wxError;
|
||||
}
|
||||
|
||||
return wxError;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
if (this.json == null) {
|
||||
return "错误代码:" + this.errorCode + ", 错误信息:" + this.errorMsg;
|
||||
}
|
||||
|
||||
return "错误代码:" + this.errorCode + ", 错误信息:" + this.errorMsg + ",微信原始报文:" + this.json;
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,37 @@
|
||||
package com.ossez.wechat.common.exception;
|
||||
|
||||
import static com.ossez.wechat.common.exception.WxError.*;
|
||||
|
||||
/**
|
||||
* @author Daniel Qian
|
||||
*/
|
||||
public class WxErrorException extends Exception {
|
||||
private static final long serialVersionUID = -6357149550353160810L;
|
||||
|
||||
private final WxError error;
|
||||
|
||||
private static final int DEFAULT_ERROR_CODE = -99;
|
||||
|
||||
public WxErrorException(String message) {
|
||||
this(WxError.builder().errorCode(DEFAULT_ERROR_CODE).errorMsg(message).build());
|
||||
}
|
||||
|
||||
public WxErrorException(WxError error) {
|
||||
super(error.toString());
|
||||
this.error = error;
|
||||
}
|
||||
|
||||
public WxErrorException(WxError error, Throwable cause) {
|
||||
super(error.toString(), cause);
|
||||
this.error = error;
|
||||
}
|
||||
|
||||
public WxErrorException(Throwable cause) {
|
||||
super(cause.getMessage(), cause);
|
||||
this.error = WxError.builder().errorCode(DEFAULT_ERROR_CODE).errorMsg(cause.getMessage()).build();
|
||||
}
|
||||
|
||||
public WxError getError() {
|
||||
return this.error;
|
||||
}
|
||||
}
|
@ -0,0 +1,684 @@
|
||||
package com.ossez.wechat.common.exception;
|
||||
|
||||
import com.google.common.collect.Maps;
|
||||
import lombok.Getter;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* 微信小程序错误码
|
||||
*
|
||||
* @author <a href="https://github.com/biggates">biggates</a>
|
||||
*/
|
||||
@Getter
|
||||
public enum WxMaErrorMsgEnum {
|
||||
/**
|
||||
* <pre>
|
||||
* 获取 access_token 时 AppSecret 错误,
|
||||
* 或者 access_token 无效。请开发者认真比对 AppSecret 的正确性,或查看是否正在为恰当的小程序调用接口
|
||||
* 对应操作:<code>sendCustomerMessage</code>
|
||||
* 对应地址:
|
||||
* POST https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=ACCESS_TOKEN
|
||||
* 参考文档地址: https://developers.weixin.qq.com/miniprogram/dev/api/open-api/customer-message/sendCustomerMessage.html
|
||||
* </pre>
|
||||
*/
|
||||
CODE_40001(40001, "access_token 无效或 AppSecret 错误"),
|
||||
/**
|
||||
* <pre>
|
||||
* 不合法的凭证类型
|
||||
* 对应操作:<code>sendCustomerMessage</code>
|
||||
* 对应地址:
|
||||
* POST https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=ACCESS_TOKEN
|
||||
* 参考文档地址: https://developers.weixin.qq.com/miniprogram/dev/api/open-api/customer-message/sendCustomerMessage.html
|
||||
* </pre>
|
||||
*/
|
||||
CODE_40002(40002, "不合法的凭证类型"),
|
||||
/**
|
||||
* <pre>
|
||||
* touser不是正确的openid.
|
||||
* 对应操作:<code>sendCustomerMessage</code>, <code>sendUniformMessage</code>
|
||||
* 对应地址:
|
||||
* POST https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=ACCESS_TOKEN
|
||||
* POST https://api.weixin.qq.com/cgi-bin/message/wxopen/template/uniform_send?access_token=ACCESS_TOKEN
|
||||
* 参考文档地址: https://developers.weixin.qq.com/miniprogram/dev/api/open-api/customer-message/sendCustomerMessage.html
|
||||
* https://developers.weixin.qq.com/miniprogram/dev/api/open-api/uniform-message/sendUniformMessage.html
|
||||
* </pre>
|
||||
*/
|
||||
CODE_40003(40003, "openid 不正确"),
|
||||
/**
|
||||
* <pre>
|
||||
* 无效媒体文件类型
|
||||
* 对应操作:<code>uploadTempMedia</code>
|
||||
* 对应地址:
|
||||
* POST https://api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE
|
||||
* 参考文档地址: https://developers.weixin.qq.com/miniprogram/dev/api/open-api/customer-message/uploadTempMedia.html
|
||||
* </pre>
|
||||
*/
|
||||
CODE_40004(40004, "无效媒体文件类型"),
|
||||
/**
|
||||
* <pre>
|
||||
* 无效媒体文件 ID.
|
||||
* 对应操作:<code>getTempMedia</code>
|
||||
* 对应地址:
|
||||
* GET https://api.weixin.qq.com/cgi-bin/media/get?access_token=ACCESS_TOKEN&media_id=MEDIA_ID
|
||||
* 参考文档地址: https://developers.weixin.qq.com/miniprogram/dev/api/open-api/customer-message/getTempMedia.html
|
||||
* </pre>
|
||||
*/
|
||||
CODE_40007(40007, "无效媒体文件 ID"),
|
||||
/**
|
||||
* <pre>
|
||||
* appid不正确,或者不符合绑定关系要求.
|
||||
* 对应操作:<code>sendUniformMessage</code>
|
||||
* 对应地址:
|
||||
* POST https://api.weixin.qq.com/cgi-bin/message/wxopen/template/uniform_send?access_token=ACCESS_TOKEN
|
||||
* 参考文档地址: https://developers.weixin.qq.com/miniprogram/dev/api/open-api/uniform-message/sendUniformMessage.html
|
||||
* </pre>
|
||||
*/
|
||||
CODE_40013(40013, "appid不正确,或者不符合绑定关系要求"),
|
||||
/**
|
||||
* <pre>
|
||||
* template_id 不正确.
|
||||
* 对应操作:<code>sendUniformMessage</code>, <code>sendTemplateMessage</code>
|
||||
* 对应地址:
|
||||
* POST https://api.weixin.qq.com/cgi-bin/message/wxopen/template/uniform_send?access_token=ACCESS_TOKEN
|
||||
* POST https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token=ACCESS_TOKEN
|
||||
* 参考文档地址: https://developers.weixin.qq.com/miniprogram/dev/api/open-api/uniform-message/sendUniformMessage.html
|
||||
* https://developers.weixin.qq.com/miniprogram/dev/api/open-api/template-message/sendTemplateMessage.html
|
||||
* </pre>
|
||||
*/
|
||||
CODE_40037(40037, "template_id 不正确"),
|
||||
/**
|
||||
* <pre>
|
||||
* form_id不正确,或者过期.
|
||||
* 对应操作:<code>sendUniformMessage</code>, <code>sendTemplateMessage</code>
|
||||
* 对应地址:
|
||||
* POST https://api.weixin.qq.com/cgi-bin/message/wxopen/template/uniform_send?access_token=ACCESS_TOKEN
|
||||
* POST https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token=ACCESS_TOKEN
|
||||
* 参考文档地址: https://developers.weixin.qq.com/miniprogram/dev/api/open-api/uniform-message/sendUniformMessage.html
|
||||
* https://developers.weixin.qq.com/miniprogram/dev/api/open-api/template-message/sendTemplateMessage.html
|
||||
* </pre>
|
||||
*/
|
||||
CODE_41028(41028, "form_id 不正确,或者过期"),
|
||||
/**
|
||||
* <pre>
|
||||
* code 或 template_id 不正确.
|
||||
* 对应操作:<code>code2Session</code>, <code>sendUniformMessage</code>, <code>sendTemplateMessage</code>
|
||||
* 对应地址:
|
||||
* GET https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code
|
||||
* POST https://api.weixin.qq.com/cgi-bin/message/wxopen/template/uniform_send?access_token=ACCESS_TOKEN
|
||||
* POST https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token=ACCESS_TOKEN
|
||||
* 参考文档地址: https://developers.weixin.qq.com/miniprogram/dev/api/open-api/login/code2Session.html
|
||||
* https://developers.weixin.qq.com/miniprogram/dev/api/open-api/uniform-message/sendUniformMessage.html
|
||||
* https://developers.weixin.qq.com/miniprogram/dev/api/open-api/template-message/sendTemplateMessage.html
|
||||
* </pre>
|
||||
*/
|
||||
CODE_41029(41029, "请求的参数不正确"),
|
||||
/**
|
||||
* <pre>
|
||||
* form_id 已被使用,或者所传page页面不存在,或者小程序没有发布
|
||||
* 对应操作:<code>sendUniformMessage</coce>, <code>getWXACodeUnlimit</code>
|
||||
* 对应地址:
|
||||
* POST https://api.weixin.qq.com/cgi-bin/message/wxopen/template/uniform_send?access_token=ACCESS_TOKEN
|
||||
* POST https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=ACCESS_TOKEN
|
||||
* 参考文档地址: https://developers.weixin.qq.com/miniprogram/dev/api/open-api/uniform-message/sendUniformMessage.html
|
||||
* https://developers.weixin.qq.com/miniprogram/dev/api/open-api/qr-code/getWXACodeUnlimit.html
|
||||
* </pre>
|
||||
*/
|
||||
CODE_41030(41030, "请求的参数不正确"),
|
||||
/**
|
||||
* <pre>
|
||||
* 调用分钟频率受限.
|
||||
* 对应操作:<code>getWXACodeUnlimit</code>, <code>sendUniformMessage</code>, <code>sendTemplateMessage</code>
|
||||
* 对应地址:
|
||||
* POST https://api.weixin.qq.com/cgi-bin/message/wxopen/template/uniform_send?access_token=ACCESS_TOKEN
|
||||
* POST https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=ACCESS_TOKEN
|
||||
* POST https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token=ACCESS_TOKEN
|
||||
* 参考文档地址: https://developers.weixin.qq.com/miniprogram/dev/api/open-api/uniform-message/sendUniformMessage.html
|
||||
* https://developers.weixin.qq.com/miniprogram/dev/api/open-api/qr-code/getWXACodeUnlimit.html
|
||||
* </pre>
|
||||
*/
|
||||
CODE_45009(45009, "调用分钟频率受限"),
|
||||
/**
|
||||
* <pre>
|
||||
* 频率限制,每个用户每分钟100次.
|
||||
* 对应操作:<code>code2Session</code>
|
||||
* 对应地址:
|
||||
* GET https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code
|
||||
* 参考文档地址: https://developers.weixin.qq.com/miniprogram/dev/api/open-api/login/code2Session.html
|
||||
* </pre>
|
||||
*/
|
||||
CODE_45011(45011, "频率限制,每个用户每分钟100次"),
|
||||
/**
|
||||
* <pre>
|
||||
* 回复时间超过限制.
|
||||
* 对应操作:<code>sendCustomerMessage</code>
|
||||
* 对应地址:
|
||||
* POST https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=ACCESS_TOKEN
|
||||
* 参考文档地址: https://developers.weixin.qq.com/miniprogram/dev/api/open-api/customer-message/sendCustomerMessage.html
|
||||
* </pre>
|
||||
*/
|
||||
CODE_45015(45015, "回复时间超过限制"),
|
||||
/**
|
||||
* <pre>
|
||||
* 接口调用超过限额, 或生成码个数总和到达最大个数限制.
|
||||
* 对应操作:<code>createWXAQRCode</code>, <code>sendTemplateMessage</code>
|
||||
* 对应地址:
|
||||
* POST https://api.weixin.qq.com/cgi-bin/wxaapp/createwxaqrcode?access_token=ACCESS_TOKEN
|
||||
* POST https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token=ACCESS_TOKEN
|
||||
* 参考文档地址: https://developers.weixin.qq.com/miniprogram/dev/api/open-api/qr-code/getWXACode.html
|
||||
* https://developers.weixin.qq.com/miniprogram/dev/api/open-api/template-message/sendTemplateMessage.html
|
||||
* </pre>
|
||||
*/
|
||||
CODE_45029(45029, "接口调用超过限额"),
|
||||
/**
|
||||
* <pre>
|
||||
* 客服接口下行条数超过上限.
|
||||
* 对应操作:<code>sendCustomerMessage</code>
|
||||
* 对应地址:
|
||||
* POST https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=ACCESS_TOKEN
|
||||
* 参考文档地址: https://developers.weixin.qq.com/miniprogram/dev/api/open-api/customer-message/sendCustomerMessage.html
|
||||
* </pre>
|
||||
*/
|
||||
CODE_45047(45047, "客服接口下行条数超过上限"),
|
||||
/**
|
||||
* <pre>
|
||||
* command字段取值不对
|
||||
* 对应操作:<code>customerTyping</code>
|
||||
* 对应地址:
|
||||
* POST https://api.weixin.qq.com/cgi-bin/message/custom/typing?access_token=ACCESS_TOKEN
|
||||
* 参考文档地址: https://developers.weixin.qq.com/miniprogram/dev/api/open-api/customer-message/customerTyping.html
|
||||
* </pre>
|
||||
*/
|
||||
CODE_45072(45072, "command字段取值不对"),
|
||||
/**
|
||||
* <pre>
|
||||
* 下发输入状态,需要之前30秒内跟用户有过消息交互.
|
||||
* 对应操作:<code>customerTyping</code>
|
||||
* 对应地址:
|
||||
* POST https://api.weixin.qq.com/cgi-bin/message/custom/typing?access_token=ACCESS_TOKEN
|
||||
* 参考文档地址: https://developers.weixin.qq.com/miniprogram/dev/api/open-api/customer-message/customerTyping.html
|
||||
*/
|
||||
CODE_45080(45080, "下发输入状态,需要之前30秒内跟用户有过消息交互"),
|
||||
/**
|
||||
* <pre>
|
||||
* 已经在输入状态,不可重复下发.
|
||||
* 对应操作:<code>customerTyping</code>
|
||||
* 对应地址:
|
||||
* POST https://api.weixin.qq.com/cgi-bin/message/custom/typing?access_token=ACCESS_TOKEN
|
||||
* 参考文档地址: https://developers.weixin.qq.com/miniprogram/dev/api/open-api/customer-message/customerTyping.html
|
||||
* </pre>
|
||||
*/
|
||||
CODE_45081(45081, "已经在输入状态,不可重复下发"),
|
||||
/**
|
||||
* <pre>
|
||||
* API 功能未授权,请确认小程序已获得该接口.
|
||||
* 对应操作:<code>sendCustomerMessage</code>
|
||||
* 对应地址:
|
||||
* POST https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=ACCESS_TOKEN
|
||||
* 参考文档地址: https://developers.weixin.qq.com/miniprogram/dev/api/open-api/customer-message/sendCustomerMessage.html
|
||||
* </pre>
|
||||
*/
|
||||
CODE_48001(48001, "API 功能未授权"),
|
||||
/**
|
||||
* <pre>
|
||||
* 内容含有违法违规内容.
|
||||
* 对应操作:<code>imgSecCheck</code>, <code>msgSecCheck</code>
|
||||
* 对应地址:
|
||||
* POST https://api.weixin.qq.com/wxa/img_sec_check?access_token=ACCESS_TOKEN
|
||||
* POST https://api.weixin.qq.com/wxa/msg_sec_check?access_token=ACCESS_TOKEN
|
||||
* 参考文档地址: https://developers.weixin.qq.com/miniprogram/dev/api/open-api/sec-check/imgSecCheck.html
|
||||
* https://developers.weixin.qq.com/miniprogram/dev/api/open-api/sec-check/msgSecCheck.html
|
||||
* </pre>
|
||||
*/
|
||||
CODE_87014(87014, "内容含有违法违规内容"),
|
||||
/**
|
||||
* 系统繁忙,此时请开发者稍候再试.
|
||||
*/
|
||||
CODE_MINUS_1(-1, "系统繁忙,此时请开发者稍候再试"),
|
||||
/**
|
||||
* code 无效.
|
||||
*/
|
||||
CODE_40029(40029, "code 无效"),
|
||||
/**
|
||||
* access_token 过期.
|
||||
*/
|
||||
CODE_42001(42001, "access_token 过期"),
|
||||
/**
|
||||
* post 数据为空.
|
||||
*/
|
||||
CODE_44002(44002, "post 数据为空"),
|
||||
/**
|
||||
* post 数据中参数缺失.
|
||||
*/
|
||||
CODE_47001(47001, "post 数据中参数缺失"),
|
||||
/**
|
||||
* 参数 activity_id 错误.
|
||||
*/
|
||||
CODE_47501(47501, "参数 activity_id 错误"),
|
||||
/**
|
||||
* 参数 target_state 错误.
|
||||
*/
|
||||
CODE_47502(47502, "参数 target_state 错误"),
|
||||
/**
|
||||
* 参数 version_type 错误.
|
||||
*/
|
||||
CODE_47503(47503, "参数 version_type 错误"),
|
||||
/**
|
||||
* activity_id 过期.
|
||||
*/
|
||||
CODE_47504(47504, "activity_id 过期"),
|
||||
/**
|
||||
* 没有绑定开放平台帐号.
|
||||
*/
|
||||
CODE_89002(89002, "没有绑定开放平台帐号"),
|
||||
/**
|
||||
* 订单无效.
|
||||
*/
|
||||
CODE_89300(89300, "订单无效"),
|
||||
|
||||
/**
|
||||
* 代小程序实现业务的错误码,部分和小程序业务一致
|
||||
* https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/Mini_Programs/Intro.html
|
||||
*/
|
||||
CODE_85060(85060, "无效的taskid"),
|
||||
|
||||
CODE_85027(85027, "身份证绑定管理员名额达到上限"),
|
||||
|
||||
CODE_85061(85061, "手机号绑定管理员名额达到上限"),
|
||||
|
||||
CODE_85026(85026, "微信号绑定管理员名额达到上限"),
|
||||
|
||||
CODE_85063(85063, "身份证黑名单"),
|
||||
|
||||
CODE_85062(85062, "手机号黑名单"),
|
||||
|
||||
CODE_85016(85016, "域名数量超过限制"),
|
||||
|
||||
CODE_85017(85017, "没有新增域名,请确认小程序已经添加了域名或该域名是否没有在第三方平台添加"),
|
||||
|
||||
CODE_85018(85018, "域名没有在第三方平台设置"),
|
||||
|
||||
CODE_89019(89019, "业务域名无更改,无需重复设置"),
|
||||
|
||||
CODE_89020(89020, "尚未设置小程序业务域名,请先在第三方平台中设置小程序业务域名后在调用本接口"),
|
||||
|
||||
CODE_89021(89021, "请求保存的域名不是第三方平台中已设置的小程序业务域名或子域名"),
|
||||
|
||||
CODE_89029(89029, "业务域名数量超过限制"),
|
||||
|
||||
CODE_89231(89231, "个人小程序不支持调用 setwebviewdomain 接口"),
|
||||
|
||||
CODE_91001(91001, "不是公众号快速创建的小程序"),
|
||||
|
||||
CODE_91002(91002, "小程序发布后不可改名"),
|
||||
|
||||
CODE_91003(91003, "改名状态不合法"),
|
||||
|
||||
CODE_91004(91004, "昵称不合法"),
|
||||
|
||||
CODE_91005(91005, "昵称 15 天主体保护"),
|
||||
|
||||
CODE_91006(91006, "昵称命中微信号"),
|
||||
|
||||
CODE_91007(91007, "昵称已被占用"),
|
||||
|
||||
CODE_91008(91008, "昵称命中 7 天侵权保护期"),
|
||||
|
||||
CODE_91009(91009, "需要提交材料"),
|
||||
|
||||
CODE_91010(91010, "其他错误"),
|
||||
|
||||
CODE_91011(91011, "查不到昵称修改审核单信息"),
|
||||
|
||||
CODE_91012(91012, "其他错误"),
|
||||
|
||||
CODE_91013(91013, "占用名字过多"),
|
||||
|
||||
CODE_91014(91014, "+号规则 同一类型关联名主体不一致"),
|
||||
|
||||
CODE_91015(91015, "原始名不同类型主体不一致"),
|
||||
|
||||
CODE_91016(91016, "名称占用者 ≥2"),
|
||||
|
||||
CODE_91017(91017, "+号规则 不同类型关联名主体不一致"),
|
||||
|
||||
CODE_40097(40097, "参数错误"),
|
||||
|
||||
CODE_41006(41006, "media_id 不能为空"),
|
||||
|
||||
CODE_46001(46001, "media_id 不存在"),
|
||||
|
||||
CODE_40009(40009, "图片尺寸太大"),
|
||||
|
||||
CODE_53202(53202, "本月头像修改次数已用完"),
|
||||
|
||||
CODE_53200(53200, "本月功能介绍修改次数已用完"),
|
||||
|
||||
CODE_53201(53201, "功能介绍内容命中黑名单关键字"),
|
||||
|
||||
CODE_85083(85083, "搜索标记位被封禁,无法修改"),
|
||||
|
||||
CODE_85084(85084, "非法的 status 值,只能填 0 或者 1"),
|
||||
|
||||
CODE_85013(85013, "无效的自定义配置"),
|
||||
|
||||
CODE_85014(85014, "无效的模版编号"),
|
||||
|
||||
CODE_85043(85043, "模版错误"),
|
||||
|
||||
CODE_85044(85044, "代码包超过大小限制"),
|
||||
|
||||
CODE_85045(85045, "ext_json 有不存在的路径"),
|
||||
|
||||
CODE_85046(85046, "tabBar 中缺少 path"),
|
||||
|
||||
CODE_85047(85047, "pages 字段为空"),
|
||||
|
||||
CODE_85048(85048, "ext_json 解析失败"),
|
||||
|
||||
CODE_80082(80082, "没有权限使用该插件"),
|
||||
|
||||
CODE_80067(80067, "找不到使用的插件"),
|
||||
|
||||
CODE_80066(80066, "非法的插件版本"),
|
||||
|
||||
CODE_86000(86000, "不是由第三方代小程序进行调用"),
|
||||
|
||||
CODE_86001(86001, "不存在第三方的已经提交的代码"),
|
||||
|
||||
CODE_85006(85006, "标签格式错误"),
|
||||
|
||||
CODE_85007(85007, "页面路径错误"),
|
||||
|
||||
CODE_85008(85008, "类目填写错误"),
|
||||
|
||||
CODE_85009(85009, "已经有正在审核的版本"),
|
||||
|
||||
CODE_85010(85010, "item_list 有项目为空"),
|
||||
|
||||
CODE_85011(85011, "标题填写错误"),
|
||||
|
||||
CODE_85023(85023, "审核列表填写的项目数不在 1-5 以内"),
|
||||
|
||||
CODE_85077(85077, "小程序类目信息失效(类目中含有官方下架的类目,请重新选择类目)"),
|
||||
|
||||
CODE_86002(86002, "小程序还未设置昵称、头像、简介。请先设置完后再重新提交"),
|
||||
|
||||
CODE_85085(85085, "近 7 天提交审核的小程序数量过多,请耐心等待审核完毕后再次提交"),
|
||||
|
||||
CODE_85086(85086, "提交代码审核之前需提前上传代码"),
|
||||
|
||||
CODE_85087(85087, "小程序已使用 api navigateToMiniProgram,请声明跳转 appid 列表后再次提交"),
|
||||
|
||||
CODE_85012(85012, "无效的审核 id"),
|
||||
|
||||
CODE_87013(87013, "撤回次数达到上限(每天5次,每个月 10 次)"),
|
||||
|
||||
CODE_85019(85019, "没有审核版本"),
|
||||
|
||||
CODE_85020(85020, "审核状态未满足发布"),
|
||||
|
||||
CODE_87011(87011, "现网已经在灰度发布,不能进行版本回退"),
|
||||
|
||||
CODE_87012(87012, "该版本不能回退,可能的原因:1:无上一个线上版用于回退 2:此版本为已回退版本,不能回退 3:此版本为回退功能上线之前的版本,不能回退"),
|
||||
|
||||
CODE_85079(85079, "小程序没有线上版本,不能进行灰度"),
|
||||
|
||||
CODE_85080(85080, "小程序提交的审核未审核通过"),
|
||||
|
||||
CODE_85081(85081, "无效的发布比例"),
|
||||
|
||||
CODE_85082(85082, "当前的发布比例需要比之前设置的高"),
|
||||
|
||||
CODE_85021(85021, "状态不可变"),
|
||||
|
||||
CODE_85022(85022, "action 非法"),
|
||||
|
||||
CODE_89401(89401, "系统不稳定,请稍后再试,如多次失败请通过社区反馈"),
|
||||
|
||||
CODE_89402(89402, "该审核单不在待审核队列,请检查是否已提交审核或已审完"),
|
||||
|
||||
CODE_89403(89403, "本单属于平台不支持加急种类,请等待正常审核流程"),
|
||||
|
||||
CODE_89404(89404, "本单已加速成功,请勿重复提交"),
|
||||
|
||||
CODE_89405(89405, "本月加急额度不足,请提升提审质量以获取更多额度"),
|
||||
|
||||
CODE_85064(85064, "找不到模版/草稿"),
|
||||
|
||||
CODE_85065(85065, "模版库已满"),
|
||||
|
||||
/**
|
||||
* 小程序订阅消息错误码
|
||||
* https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/subscribe-message/subscribeMessage.send.html
|
||||
*/
|
||||
CODE_43101(43101, "用户拒绝接受消息,如果用户之前曾经订阅过,则表示用户取消了订阅关系"),
|
||||
|
||||
CODE_47003(47003, "模板参数不准确,可能为空或者不满足规则,errmsg会提示具体是哪个字段出错"),
|
||||
|
||||
/**
|
||||
* 小程序绑定体验者
|
||||
*/
|
||||
CODE_85001(85001, "微信号不存在或微信号设置为不可搜索"),
|
||||
|
||||
CODE_85002(85002, "小程序绑定的体验者数量达到上限"),
|
||||
|
||||
CODE_85003(85003, "微信号绑定的小程序体验者达到上限"),
|
||||
|
||||
CODE_85004(85004, "微信号已经绑定"),
|
||||
|
||||
/**
|
||||
* 53010
|
||||
* 名称格式不合法
|
||||
*/
|
||||
CODE_53010(53010, "名称格式不合法"),
|
||||
|
||||
/**
|
||||
* 53011
|
||||
* 名称检测命中频率限制
|
||||
*/
|
||||
CODE_53011(53011, "名称检测命中频率限制"),
|
||||
|
||||
/**
|
||||
* 53012
|
||||
* 禁止使用该名称
|
||||
*/
|
||||
CODE_53012(53012, "禁止使用该名称"),
|
||||
|
||||
/**
|
||||
* 53013
|
||||
* 公众号:名称与已有公众号名称重复;小程序:该名称与已有小程序名称重复
|
||||
*/
|
||||
CODE_53013(53013, "公众号:名称与已有公众号名称重复;小程序:该名称与已有小程序名称重复"),
|
||||
|
||||
/**
|
||||
* 53014
|
||||
* 公众号:公众号已有{名称 A+}时,需与该帐号相同主体才可申请{名称 A};小程序:小程序已有{名称 A+}时,需与该帐号相同主体才可申请{名称 A}
|
||||
*/
|
||||
CODE_53014(53014, "公众号:公众号已有{名称 A+}时,需与该帐号相同主体才可申请{名称 A};小程序:小程序已有{名称 A+}时,需与该帐号相同主体才可申请{名称 A}"),
|
||||
|
||||
/**
|
||||
* 53015
|
||||
* 公众号:该名称与已有小程序名称重复,需与该小程序帐号相同主体才可申请;小程序:该名称与已有公众号名称重复,需与该公众号帐号相同主体才可申请
|
||||
*/
|
||||
CODE_53015(53015, "公众号:该名称与已有小程序名称重复,需与该小程序帐号相同主体才可申请;小程序:该名称与已有公众号名称重复,需与该公众号帐号相同主体才可申请"),
|
||||
|
||||
/**
|
||||
* 53016
|
||||
* 公众号:该名称与已有多个小程序名称重复,暂不支持申请;小程序:该名称与已有多个公众号名称重复,暂不支持申请
|
||||
*/
|
||||
CODE_53016(53016, "公众号:该名称与已有多个小程序名称重复,暂不支持申请;小程序:该名称与已有多个公众号名称重复,暂不支持申请"),
|
||||
|
||||
/**
|
||||
* 53017
|
||||
* 公众号:小程序已有{名称 A+}时,需与该帐号相同主体才可申请{名称 A};小程序:公众号已有{名称 A+}时,需与该帐号相同主体才可申请{名称 A}
|
||||
*/
|
||||
CODE_53017(53017, "公众号:小程序已有{名称 A+}时,需与该帐号相同主体才可申请{名称 A};小程序:公众号已有{名称 A+}时,需与该帐号相同主体才可申请{名称 A}"),
|
||||
|
||||
/**
|
||||
* 53018
|
||||
* 名称命中微信号
|
||||
*/
|
||||
CODE_53018(53018, "名称命中微信号"),
|
||||
|
||||
/**
|
||||
* 53019
|
||||
* 名称在保护期内
|
||||
*/
|
||||
CODE_53019(53019, "名称在保护期内"),
|
||||
|
||||
/**
|
||||
* 61070
|
||||
* 法人姓名与微信号不一致 name, wechat name not in accordance
|
||||
*/
|
||||
CODE_61070(61070, "法人姓名与微信号不一致"),
|
||||
|
||||
/**
|
||||
* 85015
|
||||
* 该账号不是小程序账号
|
||||
*/
|
||||
CODE_85015(85015, "该账号不是小程序账号"),
|
||||
|
||||
/**
|
||||
* 85066
|
||||
* 链接错误
|
||||
*/
|
||||
CODE_85066(85066, "链接错误"),
|
||||
|
||||
/**
|
||||
* 85068
|
||||
* 测试链接不是子链接
|
||||
*/
|
||||
CODE_85068(85068, "测试链接不是子链接"),
|
||||
|
||||
/**
|
||||
* 85069
|
||||
* 校验文件失败
|
||||
*/
|
||||
CODE_85069(85069, "校验文件失败"),
|
||||
|
||||
/**
|
||||
* 85070
|
||||
* 个人类型小程序无法设置二维码规则
|
||||
*/
|
||||
CODE_85070(85070, "个人类型小程序无法设置二维码规则"),
|
||||
|
||||
/**
|
||||
* 85071
|
||||
* 已添加该链接,请勿重复添加
|
||||
*/
|
||||
CODE_85071(85071, "已添加该链接,请勿重复添加"),
|
||||
|
||||
/**
|
||||
* 85072
|
||||
* 该链接已被占用
|
||||
*/
|
||||
CODE_85072(85072, "该链接已被占用"),
|
||||
|
||||
/**
|
||||
* 85073
|
||||
* 二维码规则已满
|
||||
*/
|
||||
CODE_85073(85073, "二维码规则已满"),
|
||||
|
||||
/**
|
||||
* 85074
|
||||
* 小程序未发布, 小程序必须先发布代码才可以发布二维码跳转规则
|
||||
*/
|
||||
CODE_85074(85074, "小程序未发布, 小程序必须先发布代码才可以发布二维码跳转规则"),
|
||||
|
||||
/**
|
||||
* 85075
|
||||
* 个人类型小程序无法设置二维码规则
|
||||
*/
|
||||
CODE_85075(85075, "个人类型小程序无法设置二维码规则"),
|
||||
|
||||
/**
|
||||
* 86004
|
||||
* 无效微信号 invalid wechat
|
||||
*/
|
||||
CODE_86004(86004, "无效微信号"),
|
||||
|
||||
/**
|
||||
* 89247
|
||||
* 内部错误 inner error
|
||||
*/
|
||||
CODE_89247(89247, "内部错误"),
|
||||
|
||||
/**
|
||||
* 89248
|
||||
* 企业代码类型无效,请选择正确类型填写 invalid code_type type
|
||||
*/
|
||||
CODE_89248(89248, "企业代码类型无效,请选择正确类型填写"),
|
||||
|
||||
/**
|
||||
* 89249
|
||||
* 该主体已有任务执行中,距上次任务 24h 后再试 task running
|
||||
*/
|
||||
CODE_89249(89249, "该主体已有任务执行中,距上次任务 24h 后再试"),
|
||||
|
||||
/**
|
||||
* 89250
|
||||
* 未找到该任务 task not found
|
||||
*/
|
||||
CODE_89250(89250, "未找到该任务"),
|
||||
|
||||
|
||||
/**
|
||||
* 89251
|
||||
* 待法人人脸核身校验 legal person checking
|
||||
*/
|
||||
CODE_89251(89251, "待法人人脸核身校验"),
|
||||
|
||||
/**
|
||||
* 89252
|
||||
* 法人&企业信息一致性校验中 front checking
|
||||
*/
|
||||
CODE_89252(89252, "法人&企业信息一致性校验中"),
|
||||
|
||||
/**
|
||||
* 89253
|
||||
* 缺少参数 lack of some params
|
||||
*/
|
||||
CODE_89253(89253, "缺少参数s"),
|
||||
|
||||
|
||||
/**
|
||||
* 89254
|
||||
* 第三方权限集不全,补全权限集全网发布后生效 lack of some component rights
|
||||
*/
|
||||
CODE_89254(89254, "第三方权限集不全,补全权限集全网发布后生效"),
|
||||
|
||||
/**
|
||||
* 89255
|
||||
* code参数无效,请检查code长度以及内容是否正确 code参数无效,请检查code长度以及内容是否正确_;
|
||||
* 注意code_type的值不同需要传的code长度不一样 ;注意code_type的值不同需要传的code长度不一样 enterprise code_invalid invalid
|
||||
*/
|
||||
CODE_89255(89255, "code参数无效,请检查code长度以及内容是否正确_;注意code_type的值不同需要传的code长度不一样 ;注意code_type的值不同需要传的code长度不一样"),
|
||||
|
||||
// CODE_504002(-504002, "云函数未找到 Function not found"),
|
||||
;
|
||||
|
||||
private final int code;
|
||||
private final String msg;
|
||||
|
||||
WxMaErrorMsgEnum(int code, String msg) {
|
||||
this.code = code;
|
||||
this.msg = msg;
|
||||
}
|
||||
|
||||
static final Map<Integer, String> valueMap = Maps.newHashMap();
|
||||
|
||||
static {
|
||||
for (WxMaErrorMsgEnum value : WxMaErrorMsgEnum.values()) {
|
||||
valueMap.put(value.code, value.msg);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过错误代码查找其中文含义.
|
||||
*/
|
||||
public static String findMsgByCode(int code) {
|
||||
return valueMap.getOrDefault(code, null);
|
||||
}
|
||||
}
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,23 @@
|
||||
package com.ossez.wechat.common.exception;
|
||||
|
||||
/**
|
||||
* WxJava专用的runtime exception.
|
||||
*
|
||||
* @author <a href="https://github.com/binarywang">Binary Wang</a>
|
||||
* created on 2020-09-26
|
||||
*/
|
||||
public class WxRuntimeException extends RuntimeException {
|
||||
private static final long serialVersionUID = 4881698471192264412L;
|
||||
|
||||
public WxRuntimeException(Throwable e) {
|
||||
super(e);
|
||||
}
|
||||
|
||||
public WxRuntimeException(String msg) {
|
||||
super(msg);
|
||||
}
|
||||
|
||||
public WxRuntimeException(String msg, Throwable e) {
|
||||
super(msg, e);
|
||||
}
|
||||
}
|
@ -0,0 +1,44 @@
|
||||
package com.ossez.wechat.common.model;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
import com.ossez.wechat.common.util.json.WxGsonBuilder;
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* WeChatAccessToken Response Object
|
||||
*
|
||||
* @author YuCheng Hu
|
||||
*/
|
||||
|
||||
public class WeChatAccessToken {
|
||||
|
||||
|
||||
@JsonProperty("access_token")
|
||||
private String accessToken;
|
||||
|
||||
@JsonProperty("expires_in")
|
||||
private int expiresIn = -1;
|
||||
|
||||
public static WeChatAccessToken fromJson(String json) {
|
||||
return WxGsonBuilder.create().fromJson(json, WeChatAccessToken.class);
|
||||
}
|
||||
|
||||
public String getAccessToken() {
|
||||
return accessToken;
|
||||
}
|
||||
|
||||
public void setAccessToken(String accessToken) {
|
||||
this.accessToken = accessToken;
|
||||
}
|
||||
|
||||
public int getExpiresIn() {
|
||||
return expiresIn;
|
||||
}
|
||||
|
||||
public void setExpiresIn(int expiresIn) {
|
||||
this.expiresIn = expiresIn;
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,27 @@
|
||||
package com.ossez.wechat.common.model;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
import com.ossez.wechat.common.util.json.WxGsonBuilder;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* WeChatAccessToken Response Object
|
||||
*
|
||||
* @author YuCheng Hu
|
||||
*/
|
||||
|
||||
public class WeChatApiDomainIp {
|
||||
|
||||
|
||||
@JsonProperty("ip_list")
|
||||
private List<String> ipList;
|
||||
|
||||
public List<String> getIpList() {
|
||||
return ipList;
|
||||
}
|
||||
|
||||
public void setIpList(List<String> ipList) {
|
||||
this.ipList = ipList;
|
||||
}
|
||||
}
|
@ -0,0 +1,16 @@
|
||||
package com.ossez.wechat.common.model;
|
||||
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
@Data
|
||||
@Accessors(chain = true)
|
||||
public class WeChatHost implements Serializable {
|
||||
private static final long serialVersionUID = -7648920647310280817L;
|
||||
private String apiHost;
|
||||
private String openHost;
|
||||
private String mpHost;
|
||||
|
||||
}
|
@ -0,0 +1,107 @@
|
||||
package com.ossez.wechat.common.model;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
import com.google.gson.annotations.SerializedName;
|
||||
import com.ossez.wechat.common.util.json.WxGsonBuilder;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842
|
||||
*
|
||||
* @author Daniel Qian
|
||||
*/
|
||||
public class WeChatOAuth2AccessToken implements Serializable {
|
||||
private static final long serialVersionUID = 5755678830089329526L;
|
||||
|
||||
@JsonProperty("access_token")
|
||||
private String accessToken;
|
||||
|
||||
@JsonProperty("expires_in")
|
||||
private int expiresIn = -1;
|
||||
|
||||
@JsonProperty("refresh_token")
|
||||
private String refreshToken;
|
||||
|
||||
@JsonProperty("openid")
|
||||
private String openId;
|
||||
|
||||
@JsonProperty("scope")
|
||||
private String scope;
|
||||
|
||||
@JsonProperty("is_snapshotuser")
|
||||
private Integer snapshotUser;
|
||||
|
||||
/**
|
||||
* https://mp.weixin.qq.com/cgi-bin/announce?action=getannouncement&announce_id=11513156443eZYea&version=&lang=zh_CN.
|
||||
* 本接口在scope参数为snsapi_base时不再提供unionID字段。
|
||||
*/
|
||||
@SerializedName("unionid")
|
||||
private String unionId;
|
||||
|
||||
public static WeChatOAuth2AccessToken fromJson(String json) {
|
||||
return WxGsonBuilder.create().fromJson(json, WeChatOAuth2AccessToken.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return WxGsonBuilder.create().toJson(this);
|
||||
}
|
||||
|
||||
public String getAccessToken() {
|
||||
return accessToken;
|
||||
}
|
||||
|
||||
public void setAccessToken(String accessToken) {
|
||||
this.accessToken = accessToken;
|
||||
}
|
||||
|
||||
public int getExpiresIn() {
|
||||
return expiresIn;
|
||||
}
|
||||
|
||||
public void setExpiresIn(int expiresIn) {
|
||||
this.expiresIn = expiresIn;
|
||||
}
|
||||
|
||||
public String getRefreshToken() {
|
||||
return refreshToken;
|
||||
}
|
||||
|
||||
public void setRefreshToken(String refreshToken) {
|
||||
this.refreshToken = refreshToken;
|
||||
}
|
||||
|
||||
public String getOpenId() {
|
||||
return openId;
|
||||
}
|
||||
|
||||
public void setOpenId(String openId) {
|
||||
this.openId = openId;
|
||||
}
|
||||
|
||||
public String getScope() {
|
||||
return scope;
|
||||
}
|
||||
|
||||
public void setScope(String scope) {
|
||||
this.scope = scope;
|
||||
}
|
||||
|
||||
public Integer getSnapshotUser() {
|
||||
return snapshotUser;
|
||||
}
|
||||
|
||||
public void setSnapshotUser(Integer snapshotUser) {
|
||||
this.snapshotUser = snapshotUser;
|
||||
}
|
||||
|
||||
public String getUnionId() {
|
||||
return unionId;
|
||||
}
|
||||
|
||||
public void setUnionId(String unionId) {
|
||||
this.unionId = unionId;
|
||||
}
|
||||
}
|
@ -0,0 +1,34 @@
|
||||
package com.ossez.wechat.common.model;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
|
||||
/**
|
||||
* WeChatStatus Response Object
|
||||
*
|
||||
* @author YuCheng Hu
|
||||
*/
|
||||
|
||||
public class WeChatStatus {
|
||||
|
||||
@JsonProperty("errcode")
|
||||
private int errCode = 0;
|
||||
|
||||
@JsonProperty("errmsg")
|
||||
private String errMsg;
|
||||
|
||||
public int getErrCode() {
|
||||
return errCode;
|
||||
}
|
||||
|
||||
public void setErrCode(int errCode) {
|
||||
this.errCode = errCode;
|
||||
}
|
||||
|
||||
public String getErrMsg() {
|
||||
return errMsg;
|
||||
}
|
||||
|
||||
public void setErrMsg(String errMsg) {
|
||||
this.errMsg = errMsg;
|
||||
}
|
||||
}
|
@ -0,0 +1,129 @@
|
||||
package com.ossez.wechat.common.model.entity;
|
||||
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
import com.google.gson.annotations.SerializedName;
|
||||
import com.ossez.wechat.common.util.json.WxGsonBuilder;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* oauth2用户个人信息.
|
||||
* <pre>
|
||||
* {
|
||||
* "openid":"OPENID",
|
||||
* "nickname":"NICKNAME",
|
||||
* "sex":1,
|
||||
* "province":"PROVINCE",
|
||||
* "city":"CITY",
|
||||
* "country":"COUNTRY",
|
||||
* "headimgurl": "https://thirdwx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/0",
|
||||
* "privilege":[
|
||||
* "PRIVILEGE1",
|
||||
* "PRIVILEGE2"
|
||||
* ],
|
||||
* "unionid": " o6_bmasdasdsad6_2sgVt7hMZOPfL"
|
||||
*
|
||||
* }
|
||||
* </pre>
|
||||
*
|
||||
* @author YuCheng
|
||||
*/
|
||||
@Data
|
||||
public class WeChatOAuth2UserInfo implements Serializable {
|
||||
private static final long serialVersionUID = 3181943506448954725L;
|
||||
|
||||
@JsonProperty("openid")
|
||||
private String openid;
|
||||
@JsonProperty("nickname")
|
||||
private String nickname;
|
||||
@JsonProperty("sex")
|
||||
private Integer sex;
|
||||
@JsonProperty("city")
|
||||
private String city;
|
||||
@JsonProperty("province")
|
||||
private String province;
|
||||
@JsonProperty("country")
|
||||
private String country;
|
||||
@JsonProperty("headimgurl")
|
||||
private String headImgUrl;
|
||||
|
||||
@JsonProperty("unionid")
|
||||
private String unionId;
|
||||
|
||||
@JsonProperty("privilege")
|
||||
private String[] privileges;
|
||||
|
||||
public String getOpenid() {
|
||||
return openid;
|
||||
}
|
||||
|
||||
public void setOpenid(String openid) {
|
||||
this.openid = openid;
|
||||
}
|
||||
|
||||
public String getNickname() {
|
||||
return nickname;
|
||||
}
|
||||
|
||||
public void setNickname(String nickname) {
|
||||
this.nickname = nickname;
|
||||
}
|
||||
|
||||
public Integer getSex() {
|
||||
return sex;
|
||||
}
|
||||
|
||||
public void setSex(Integer sex) {
|
||||
this.sex = sex;
|
||||
}
|
||||
|
||||
public String getCity() {
|
||||
return city;
|
||||
}
|
||||
|
||||
public void setCity(String city) {
|
||||
this.city = city;
|
||||
}
|
||||
|
||||
public String getProvince() {
|
||||
return province;
|
||||
}
|
||||
|
||||
public void setProvince(String province) {
|
||||
this.province = province;
|
||||
}
|
||||
|
||||
public String getCountry() {
|
||||
return country;
|
||||
}
|
||||
|
||||
public void setCountry(String country) {
|
||||
this.country = country;
|
||||
}
|
||||
|
||||
public String getHeadImgUrl() {
|
||||
return headImgUrl;
|
||||
}
|
||||
|
||||
public void setHeadImgUrl(String headImgUrl) {
|
||||
this.headImgUrl = headImgUrl;
|
||||
}
|
||||
|
||||
public String getUnionId() {
|
||||
return unionId;
|
||||
}
|
||||
|
||||
public void setUnionId(String unionId) {
|
||||
this.unionId = unionId;
|
||||
}
|
||||
|
||||
public String[] getPrivileges() {
|
||||
return privileges;
|
||||
}
|
||||
|
||||
public void setPrivileges(String[] privileges) {
|
||||
this.privileges = privileges;
|
||||
}
|
||||
}
|
@ -0,0 +1,31 @@
|
||||
package com.ossez.wechat.common.model.entity;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
|
||||
/**
|
||||
* WeChatAccessToken Response Object
|
||||
*
|
||||
* @author YuCheng Hu
|
||||
*/
|
||||
public class WeChatResponseStatus {
|
||||
@JsonProperty("errcode")
|
||||
private Integer errorCode;
|
||||
@JsonProperty("errmsg")
|
||||
private String errorMsg;
|
||||
|
||||
public Integer getErrorCode() {
|
||||
return errorCode;
|
||||
}
|
||||
|
||||
public void setErrorCode(Integer errorCode) {
|
||||
this.errorCode = errorCode;
|
||||
}
|
||||
|
||||
public String getErrorMsg() {
|
||||
return errorMsg;
|
||||
}
|
||||
|
||||
public void setErrorMsg(String errorMsg) {
|
||||
this.errorMsg = errorMsg;
|
||||
}
|
||||
}
|
@ -0,0 +1,104 @@
|
||||
package com.ossez.wechat.common.model.entity;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
@Accessors(chain = true)
|
||||
public class WeChatUser {
|
||||
|
||||
@JsonProperty(value = "openid", required = true)
|
||||
private String openId;
|
||||
|
||||
@JsonProperty(required = true)
|
||||
private String nickname;
|
||||
|
||||
private Integer sex;
|
||||
|
||||
private String language;
|
||||
|
||||
private String city;
|
||||
|
||||
private String province;
|
||||
|
||||
private String country;
|
||||
|
||||
@JsonProperty(value = "headimgurl")
|
||||
private String headImgURL;
|
||||
|
||||
@JsonProperty(value = "unionid", required = true)
|
||||
private String unionId;
|
||||
|
||||
public String getOpenId() {
|
||||
return openId;
|
||||
}
|
||||
|
||||
public void setOpenId(String openId) {
|
||||
this.openId = openId;
|
||||
}
|
||||
|
||||
public String getNickname() {
|
||||
return nickname;
|
||||
}
|
||||
|
||||
public void setNickname(String nickname) {
|
||||
this.nickname = nickname;
|
||||
}
|
||||
|
||||
public Integer getSex() {
|
||||
return sex;
|
||||
}
|
||||
|
||||
public void setSex(Integer sex) {
|
||||
this.sex = sex;
|
||||
}
|
||||
|
||||
public String getLanguage() {
|
||||
return language;
|
||||
}
|
||||
|
||||
public void setLanguage(String language) {
|
||||
this.language = language;
|
||||
}
|
||||
|
||||
public String getCity() {
|
||||
return city;
|
||||
}
|
||||
|
||||
public void setCity(String city) {
|
||||
this.city = city;
|
||||
}
|
||||
|
||||
public String getProvince() {
|
||||
return province;
|
||||
}
|
||||
|
||||
public void setProvince(String province) {
|
||||
this.province = province;
|
||||
}
|
||||
|
||||
public String getCountry() {
|
||||
return country;
|
||||
}
|
||||
|
||||
public void setCountry(String country) {
|
||||
this.country = country;
|
||||
}
|
||||
|
||||
public String getHeadImgURL() {
|
||||
return headImgURL;
|
||||
}
|
||||
|
||||
public void setHeadImgURL(String headImgURL) {
|
||||
this.headImgURL = headImgURL;
|
||||
}
|
||||
|
||||
public String getUnionId() {
|
||||
return unionId;
|
||||
}
|
||||
|
||||
public void setUnionId(String unionId) {
|
||||
this.unionId = unionId;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -0,0 +1,43 @@
|
||||
package com.ossez.wechat.common.model.entity.builder;
|
||||
|
||||
import com.ossez.wechat.common.model.entity.menu.MenuButton;
|
||||
import com.ossez.wechat.common.model.req.MenuRequest;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class MenuButtonBuilder {
|
||||
private List<MenuButton> subButtonList;
|
||||
private String type;
|
||||
private String name;
|
||||
private String key;
|
||||
private String url;
|
||||
|
||||
public MenuButtonBuilder setSubButtonList(List<MenuButton> subButtonList) {
|
||||
this.subButtonList = subButtonList;
|
||||
return this;
|
||||
}
|
||||
|
||||
public MenuButtonBuilder setType(String type) {
|
||||
this.type = type;
|
||||
return this;
|
||||
}
|
||||
|
||||
public MenuButtonBuilder setName(String name) {
|
||||
this.name = name;
|
||||
return this;
|
||||
}
|
||||
|
||||
public MenuButtonBuilder setKey(String key) {
|
||||
this.key = key;
|
||||
return this;
|
||||
}
|
||||
|
||||
public MenuButtonBuilder setUrl(String url) {
|
||||
this.url = url;
|
||||
return this;
|
||||
}
|
||||
|
||||
public MenuButton createMenuButton() {
|
||||
return new MenuButton(subButtonList, type, name, key, url);
|
||||
}
|
||||
}
|
@ -0,0 +1,40 @@
|
||||
package com.ossez.wechat.common.model.entity.menu;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
import com.google.gson.annotations.SerializedName;
|
||||
import com.ossez.wechat.common.model.req.MenuRequest;
|
||||
import com.ossez.wechat.common.util.json.WxGsonBuilder;
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* menu button.
|
||||
*
|
||||
* @author Daniel Qian
|
||||
*/
|
||||
@Data
|
||||
public class MenuButton implements Serializable {
|
||||
private static final long serialVersionUID = -1070939403109776555L;
|
||||
|
||||
public MenuButton(List<MenuButton> subButtonList, String type, String name, String key, String url) {
|
||||
this.subButtonList = subButtonList;
|
||||
this.type = type;
|
||||
this.name = name;
|
||||
this.key = key;
|
||||
this.url = url;
|
||||
}
|
||||
|
||||
@JsonProperty(value = "sub_button")
|
||||
private List<MenuButton> subButtonList;
|
||||
@JsonProperty("type")
|
||||
private String type;
|
||||
@JsonProperty("name")
|
||||
private String name;
|
||||
@JsonProperty("key")
|
||||
private String key;
|
||||
@JsonProperty("url")
|
||||
private String url;
|
||||
}
|
@ -1,8 +1,4 @@
|
||||
package me.chanjar.weixin.common.bean.menu;
|
||||
|
||||
import lombok.Data;
|
||||
import me.chanjar.weixin.common.util.ToStringUtils;
|
||||
import me.chanjar.weixin.common.util.json.WxGsonBuilder;
|
||||
package com.ossez.wechat.common.model.entity.menu;
|
||||
|
||||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
@ -11,6 +7,9 @@ import java.nio.charset.StandardCharsets;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import com.ossez.wechat.common.util.json.WxGsonBuilder;
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* 菜单(公众号和企业号共用的).
|
||||
*
|
||||
@ -20,13 +19,16 @@ import java.util.List;
|
||||
public class WxMenu implements Serializable {
|
||||
private static final long serialVersionUID = -7083914585539687746L;
|
||||
|
||||
private List<WxMenuButton> buttons = new ArrayList<>();
|
||||
private List<MenuButton> buttons = new ArrayList<>();
|
||||
|
||||
private WxMenuRule matchRule;
|
||||
|
||||
/**
|
||||
* 要用 http://mp.weixin.qq.com/wiki/16/ff9b7b85220e1396ffa16794a9d95adc.html 格式来反序列化
|
||||
* 相比 http://mp.weixin.qq.com/wiki/13/43de8269be54a0a6f64413e4dfa94f39.html 的格式,外层多套了一个menu
|
||||
*
|
||||
* @param json
|
||||
* @return
|
||||
*/
|
||||
public static WxMenu fromJson(String json) {
|
||||
return WxGsonBuilder.create().fromJson(json, WxMenu.class);
|
||||
@ -47,7 +49,7 @@ public class WxMenu implements Serializable {
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return ToStringUtils.toSimpleString(this);
|
||||
return this.toJson();
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,35 @@
|
||||
package com.ossez.wechat.common.model.entity.menu;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
import com.google.gson.annotations.SerializedName;
|
||||
import com.ossez.wechat.common.util.json.WxGsonBuilder;
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* menu rule.
|
||||
*
|
||||
* @author Daniel Qian
|
||||
*/
|
||||
@Data
|
||||
public class WxMenuRule implements Serializable {
|
||||
private static final long serialVersionUID = -4587181819499286670L;
|
||||
|
||||
/**
|
||||
* 变态的微信接口,反序列化时这里反人类的使用和序列化时不一样的名字.
|
||||
*/
|
||||
@SerializedName(value = "tag_id", alternate = "group_id")
|
||||
private String tagId;
|
||||
private String sex;
|
||||
private String country;
|
||||
private String province;
|
||||
private String city;
|
||||
@SerializedName("client_platform_type")
|
||||
private String clientPlatformType;
|
||||
private String language;
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return WxGsonBuilder.create().toJson(this);
|
||||
}
|
||||
}
|
@ -0,0 +1,128 @@
|
||||
package com.ossez.wechat.common.model.req;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
import com.google.gson.annotations.SerializedName;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* CustomMessage
|
||||
*
|
||||
* @author YuCheng
|
||||
*/
|
||||
public class CustomMessage implements Serializable {
|
||||
private static final long serialVersionUID = -9196732086954365246L;
|
||||
|
||||
@JsonProperty("touser")
|
||||
private String toUser;
|
||||
|
||||
@JsonProperty("msgtype")
|
||||
private String msgType;
|
||||
|
||||
@JsonProperty("text")
|
||||
private KfText text;
|
||||
|
||||
@JsonProperty("image")
|
||||
private KfImage image;
|
||||
|
||||
@JsonProperty("link")
|
||||
private KfLink link;
|
||||
|
||||
@JsonProperty("miniprogrampage")
|
||||
private KfMaPage maPage;
|
||||
|
||||
@Data
|
||||
@AllArgsConstructor
|
||||
public static class KfText implements Serializable {
|
||||
private static final long serialVersionUID = 151122958720941270L;
|
||||
|
||||
private String content;
|
||||
}
|
||||
|
||||
@Data
|
||||
@AllArgsConstructor
|
||||
public static class KfImage implements Serializable {
|
||||
private static final long serialVersionUID = -5409342945117300782L;
|
||||
|
||||
@SerializedName("media_id")
|
||||
private String mediaId;
|
||||
}
|
||||
|
||||
@Data
|
||||
@Builder
|
||||
public static class KfLink implements Serializable {
|
||||
private static final long serialVersionUID = -6728776817556127413L;
|
||||
|
||||
private String title;
|
||||
private String description;
|
||||
private String url;
|
||||
|
||||
@SerializedName("thumb_url")
|
||||
private String thumbUrl;
|
||||
}
|
||||
|
||||
@Data
|
||||
@Builder
|
||||
public static class KfMaPage implements Serializable {
|
||||
private static final long serialVersionUID = -5633492281871634466L;
|
||||
|
||||
private String title;
|
||||
|
||||
@SerializedName("pagepath")
|
||||
private String pagePath;
|
||||
|
||||
@SerializedName("thumb_media_id")
|
||||
private String thumbMediaId;
|
||||
}
|
||||
|
||||
public String getToUser() {
|
||||
return toUser;
|
||||
}
|
||||
|
||||
public void setToUser(String toUser) {
|
||||
this.toUser = toUser;
|
||||
}
|
||||
|
||||
public String getMsgType() {
|
||||
return msgType;
|
||||
}
|
||||
|
||||
public void setMsgType(String msgType) {
|
||||
this.msgType = msgType;
|
||||
}
|
||||
|
||||
public KfText getText() {
|
||||
return text;
|
||||
}
|
||||
|
||||
public void setText(KfText text) {
|
||||
this.text = text;
|
||||
}
|
||||
|
||||
public KfImage getImage() {
|
||||
return image;
|
||||
}
|
||||
|
||||
public void setImage(KfImage image) {
|
||||
this.image = image;
|
||||
}
|
||||
|
||||
public KfLink getLink() {
|
||||
return link;
|
||||
}
|
||||
|
||||
public void setLink(KfLink link) {
|
||||
this.link = link;
|
||||
}
|
||||
|
||||
public KfMaPage getMaPage() {
|
||||
return maPage;
|
||||
}
|
||||
|
||||
public void setMaPage(KfMaPage maPage) {
|
||||
this.maPage = maPage;
|
||||
}
|
||||
}
|
@ -0,0 +1,40 @@
|
||||
package com.ossez.wechat.common.model.req;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
import com.google.gson.annotations.SerializedName;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* CustomMessage
|
||||
*
|
||||
* @author YuCheng
|
||||
*/
|
||||
public class DataCubeRequest implements Serializable {
|
||||
private static final long serialVersionUID = -9196732086954365246L;
|
||||
|
||||
@JsonProperty(value = "begin_date", required = true)
|
||||
private String beginDate;
|
||||
|
||||
@JsonProperty(value = "end_date", required = true)
|
||||
private String endDate;
|
||||
|
||||
public String getBeginDate() {
|
||||
return beginDate;
|
||||
}
|
||||
|
||||
public void setBeginDate(String beginDate) {
|
||||
this.beginDate = beginDate;
|
||||
}
|
||||
|
||||
public String getEndDate() {
|
||||
return endDate;
|
||||
}
|
||||
|
||||
public void setEndDate(String endDate) {
|
||||
this.endDate = endDate;
|
||||
}
|
||||
}
|
@ -0,0 +1,28 @@
|
||||
package com.ossez.wechat.common.model.req;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
import com.ossez.wechat.common.model.entity.menu.MenuButton;
|
||||
import com.ossez.wechat.common.model.res.DataCubeArticle;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* CustomMessage
|
||||
*
|
||||
* @author YuCheng
|
||||
*/
|
||||
public class MenuRequest implements Serializable {
|
||||
private static final long serialVersionUID = -9196732086954365246L;
|
||||
@JsonProperty(value = "button", required = true)
|
||||
private List<MenuButton> buttonList;
|
||||
|
||||
|
||||
public List<MenuButton> getButtonList() {
|
||||
return buttonList;
|
||||
}
|
||||
|
||||
public void setButtonList(List<MenuButton> buttonList) {
|
||||
this.buttonList = buttonList;
|
||||
}
|
||||
}
|
@ -0,0 +1,33 @@
|
||||
package com.ossez.wechat.common.model.req;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
import com.ossez.wechat.common.util.json.WxGsonBuilder;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
/**
|
||||
* WeChatAccessToken Response Object
|
||||
*
|
||||
* @author YuCheng Hu
|
||||
*/
|
||||
public class NetworkCheck {
|
||||
@JsonProperty("action")
|
||||
private String action = "all";
|
||||
@JsonProperty("check_operator")
|
||||
private String checkOperator = StringUtils.upperCase("DEFAULT");
|
||||
|
||||
public String getAction() {
|
||||
return action;
|
||||
}
|
||||
|
||||
public void setAction(String action) {
|
||||
this.action = action;
|
||||
}
|
||||
|
||||
public String getCheckOperator() {
|
||||
return checkOperator;
|
||||
}
|
||||
|
||||
public void setCheckOperator(String checkOperator) {
|
||||
this.checkOperator = checkOperator;
|
||||
}
|
||||
}
|
@ -0,0 +1,22 @@
|
||||
package com.ossez.wechat.common.model.req;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
/**
|
||||
* WeChatAccessToken Response Object
|
||||
*
|
||||
* @author YuCheng Hu
|
||||
*/
|
||||
public class QueryQuota {
|
||||
@JsonProperty("cgi_path")
|
||||
private String cgiPath = "/cgi-bin/message/custom/send";
|
||||
|
||||
public String getCgiPath() {
|
||||
return cgiPath;
|
||||
}
|
||||
|
||||
public void setCgiPath(String cgiPath) {
|
||||
this.cgiPath = cgiPath;
|
||||
}
|
||||
}
|
@ -0,0 +1,130 @@
|
||||
package com.ossez.wechat.common.model.res;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* UserSummaryResponse Object
|
||||
*
|
||||
* @author YuCheng Hu
|
||||
*/
|
||||
public class DataCubeArticle {
|
||||
@JsonProperty("list")
|
||||
private List<ArticleData> articleDataList;
|
||||
|
||||
public static class ArticleData {
|
||||
@JsonProperty("ref_date")
|
||||
private String refDate;
|
||||
|
||||
@JsonProperty("msgid")
|
||||
private String msgId;
|
||||
@JsonProperty("title")
|
||||
private String title;
|
||||
@JsonProperty("int_page_read_user")
|
||||
private Long intPageReadUser;
|
||||
@JsonProperty("ori_page_read_user")
|
||||
private Long oriPageReadUser;
|
||||
@JsonProperty("ori_page_read_count")
|
||||
private Long oriPageReadCount;
|
||||
@JsonProperty("share_user")
|
||||
private Long shareUser;
|
||||
|
||||
@JsonProperty("shareCount")
|
||||
private Long shareCount;
|
||||
|
||||
@JsonProperty("add_to_fav_user")
|
||||
private Long addToFavUser;
|
||||
|
||||
@JsonProperty("add_to_fav_count")
|
||||
private Long addToFavCount;
|
||||
|
||||
public String getRefDate() {
|
||||
return refDate;
|
||||
}
|
||||
|
||||
public void setRefDate(String refDate) {
|
||||
this.refDate = refDate;
|
||||
}
|
||||
|
||||
public String getMsgId() {
|
||||
return msgId;
|
||||
}
|
||||
|
||||
public void setMsgId(String msgId) {
|
||||
this.msgId = msgId;
|
||||
}
|
||||
|
||||
public String getTitle() {
|
||||
return title;
|
||||
}
|
||||
|
||||
public void setTitle(String title) {
|
||||
this.title = title;
|
||||
}
|
||||
|
||||
public Long getIntPageReadUser() {
|
||||
return intPageReadUser;
|
||||
}
|
||||
|
||||
public void setIntPageReadUser(Long intPageReadUser) {
|
||||
this.intPageReadUser = intPageReadUser;
|
||||
}
|
||||
|
||||
public Long getOriPageReadUser() {
|
||||
return oriPageReadUser;
|
||||
}
|
||||
|
||||
public void setOriPageReadUser(Long oriPageReadUser) {
|
||||
this.oriPageReadUser = oriPageReadUser;
|
||||
}
|
||||
|
||||
public Long getOriPageReadCount() {
|
||||
return oriPageReadCount;
|
||||
}
|
||||
|
||||
public void setOriPageReadCount(Long oriPageReadCount) {
|
||||
this.oriPageReadCount = oriPageReadCount;
|
||||
}
|
||||
|
||||
public Long getShareUser() {
|
||||
return shareUser;
|
||||
}
|
||||
|
||||
public void setShareUser(Long shareUser) {
|
||||
this.shareUser = shareUser;
|
||||
}
|
||||
|
||||
public Long getShareCount() {
|
||||
return shareCount;
|
||||
}
|
||||
|
||||
public void setShareCount(Long shareCount) {
|
||||
this.shareCount = shareCount;
|
||||
}
|
||||
|
||||
public Long getAddToFavUser() {
|
||||
return addToFavUser;
|
||||
}
|
||||
|
||||
public void setAddToFavUser(Long addToFavUser) {
|
||||
this.addToFavUser = addToFavUser;
|
||||
}
|
||||
|
||||
public Long getAddToFavCount() {
|
||||
return addToFavCount;
|
||||
}
|
||||
|
||||
public void setAddToFavCount(Long addToFavCount) {
|
||||
this.addToFavCount = addToFavCount;
|
||||
}
|
||||
}
|
||||
|
||||
public List<ArticleData> getArticleDataList() {
|
||||
return articleDataList;
|
||||
}
|
||||
|
||||
public void setArticleDataList(List<ArticleData> articleDataList) {
|
||||
this.articleDataList = articleDataList;
|
||||
}
|
||||
}
|
@ -0,0 +1,78 @@
|
||||
package com.ossez.wechat.common.model.res;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* UserSummaryResponse Object
|
||||
*
|
||||
* @author YuCheng Hu
|
||||
*/
|
||||
public class DataCubeUser {
|
||||
@JsonProperty("list")
|
||||
private List<UserData> userDataList;
|
||||
|
||||
public static class UserData {
|
||||
@JsonProperty("ref_date")
|
||||
private String refDate;
|
||||
@JsonProperty("user_source")
|
||||
private Long userSource;
|
||||
|
||||
@JsonProperty("new_user")
|
||||
private Long newUser;
|
||||
@JsonProperty("cancel_user")
|
||||
private Long cancelUser;
|
||||
|
||||
@JsonProperty("cumulate_user")
|
||||
private Long cumulateUser;
|
||||
|
||||
public String getRefDate() {
|
||||
return refDate;
|
||||
}
|
||||
|
||||
public void setRefDate(String refDate) {
|
||||
this.refDate = refDate;
|
||||
}
|
||||
|
||||
public Long getUserSource() {
|
||||
return userSource;
|
||||
}
|
||||
|
||||
public void setUserSource(Long userSource) {
|
||||
this.userSource = userSource;
|
||||
}
|
||||
|
||||
public Long getNewUser() {
|
||||
return newUser;
|
||||
}
|
||||
|
||||
public void setNewUser(Long newUser) {
|
||||
this.newUser = newUser;
|
||||
}
|
||||
|
||||
public Long getCancelUser() {
|
||||
return cancelUser;
|
||||
}
|
||||
|
||||
public void setCancelUser(Long cancelUser) {
|
||||
this.cancelUser = cancelUser;
|
||||
}
|
||||
|
||||
public Long getCumulateUser() {
|
||||
return cumulateUser;
|
||||
}
|
||||
|
||||
public void setCumulateUser(Long cumulateUser) {
|
||||
this.cumulateUser = cumulateUser;
|
||||
}
|
||||
}
|
||||
|
||||
public List<UserData> getUserDataList() {
|
||||
return userDataList;
|
||||
}
|
||||
|
||||
public void setUserDataList(List<UserData> userDataList) {
|
||||
this.userDataList = userDataList;
|
||||
}
|
||||
}
|
@ -0,0 +1,35 @@
|
||||
package com.ossez.wechat.common.model.res;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
import com.ossez.wechat.common.api.WxMessageInMemoryDuplicateCheckerSingleton;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
/**
|
||||
* WeChatAccessToken Response Object
|
||||
*
|
||||
* @author YuCheng Hu
|
||||
*/
|
||||
public class NetworkCheckResponse {
|
||||
@JsonProperty("dns")
|
||||
private String dns;
|
||||
@JsonProperty("ping")
|
||||
private Ping ping;
|
||||
|
||||
private static class dns {
|
||||
@JsonProperty("ip")
|
||||
private String ip;
|
||||
@JsonProperty("real_operator")
|
||||
private String realOperator;
|
||||
}
|
||||
|
||||
private static class Ping {
|
||||
@JsonProperty("ip")
|
||||
private String ip;
|
||||
@JsonProperty("from_operator")
|
||||
private String fromOperator;
|
||||
@JsonProperty("package_loss")
|
||||
private String packageLoss;
|
||||
@JsonProperty("time")
|
||||
private String time;
|
||||
}
|
||||
}
|
@ -0,0 +1,66 @@
|
||||
package com.ossez.wechat.common.model.res;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
|
||||
/**
|
||||
* WeChatAccessToken Response Object
|
||||
*
|
||||
* @author YuCheng Hu
|
||||
*/
|
||||
public class QueryQuotaResponse {
|
||||
@JsonProperty("errcode")
|
||||
private Integer errorCode;
|
||||
@JsonProperty("errmsg")
|
||||
private String errorMsg;
|
||||
@JsonProperty("quota")
|
||||
private Quota quota;
|
||||
|
||||
private static class Quota {
|
||||
@JsonProperty("daily_limit")
|
||||
private String dailyLimit;
|
||||
@JsonProperty("used")
|
||||
private String used;
|
||||
@JsonProperty("remain")
|
||||
private String remain;
|
||||
|
||||
public String getDailyLimit() {
|
||||
return dailyLimit;
|
||||
}
|
||||
|
||||
public void setDailyLimit(String dailyLimit) {
|
||||
this.dailyLimit = dailyLimit;
|
||||
}
|
||||
|
||||
public String getUsed() {
|
||||
return used;
|
||||
}
|
||||
|
||||
public void setUsed(String used) {
|
||||
this.used = used;
|
||||
}
|
||||
|
||||
public String getRemain() {
|
||||
return remain;
|
||||
}
|
||||
|
||||
public void setRemain(String remain) {
|
||||
this.remain = remain;
|
||||
}
|
||||
}
|
||||
|
||||
public Integer getErrorCode() {
|
||||
return errorCode;
|
||||
}
|
||||
|
||||
public void setErrorCode(Integer errorCode) {
|
||||
this.errorCode = errorCode;
|
||||
}
|
||||
|
||||
public String getErrorMsg() {
|
||||
return errorMsg;
|
||||
}
|
||||
|
||||
public void setErrorMsg(String errorMsg) {
|
||||
this.errorMsg = errorMsg;
|
||||
}
|
||||
}
|
@ -0,0 +1,37 @@
|
||||
package com.ossez.wechat.common.redis;
|
||||
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.concurrent.locks.Lock;
|
||||
|
||||
/**
|
||||
* 微信redis操作基本类
|
||||
* <p>
|
||||
* 非内置实现redis相关操作, 请实现该类
|
||||
*/
|
||||
public abstract class BaseWxRedisOps implements WxRedisOps {
|
||||
|
||||
@Override
|
||||
public String getValue(String key) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setValue(String key, String value, int expire, TimeUnit timeUnit) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Long getExpire(String key) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void expire(String key, int expire, TimeUnit timeUnit) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Lock getLock(String key) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
}
|
@ -0,0 +1,44 @@
|
||||
package com.ossez.wechat.common.redis;
|
||||
|
||||
import lombok.NonNull;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import com.ossez.wechat.common.util.locks.RedisTemplateSimpleDistributedLock;
|
||||
import org.springframework.data.redis.core.StringRedisTemplate;
|
||||
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.concurrent.locks.Lock;
|
||||
|
||||
@RequiredArgsConstructor
|
||||
public class RedisTemplateWxRedisOps implements WxRedisOps {
|
||||
|
||||
private final StringRedisTemplate redisTemplate;
|
||||
|
||||
@Override
|
||||
public String getValue(String key) {
|
||||
return redisTemplate.opsForValue().get(key);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setValue(String key, String value, int expire, TimeUnit timeUnit) {
|
||||
if (expire <= 0) {
|
||||
redisTemplate.opsForValue().set(key, value);
|
||||
} else {
|
||||
redisTemplate.opsForValue().set(key, value, expire, timeUnit);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Long getExpire(String key) {
|
||||
return redisTemplate.getExpire(key);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void expire(String key, int expire, TimeUnit timeUnit) {
|
||||
redisTemplate.expire(key, expire, timeUnit);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Lock getLock(@NonNull String key) {
|
||||
return new RedisTemplateSimpleDistributedLock(redisTemplate, key, 60 * 1000);
|
||||
}
|
||||
}
|
@ -0,0 +1,47 @@
|
||||
package com.ossez.wechat.common.redis;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.redisson.api.RedissonClient;
|
||||
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.concurrent.locks.Lock;
|
||||
|
||||
@RequiredArgsConstructor
|
||||
public class RedissonWxRedisOps implements WxRedisOps {
|
||||
|
||||
private final RedissonClient redissonClient;
|
||||
|
||||
@Override
|
||||
public String getValue(String key) {
|
||||
Object value = redissonClient.getBucket(key).get();
|
||||
return value == null ? null : value.toString();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setValue(String key, String value, int expire, TimeUnit timeUnit) {
|
||||
if (expire <= 0) {
|
||||
redissonClient.getBucket(key).set(value);
|
||||
} else {
|
||||
redissonClient.getBucket(key).set(value, expire, timeUnit);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Long getExpire(String key) {
|
||||
long expire = redissonClient.getBucket(key).remainTimeToLive();
|
||||
if (expire > 0) {
|
||||
expire = expire / 1000;
|
||||
}
|
||||
return expire;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void expire(String key, int expire, TimeUnit timeUnit) {
|
||||
redissonClient.getBucket(key).expire(expire, timeUnit);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Lock getLock(String key) {
|
||||
return redissonClient.getLock(key);
|
||||
}
|
||||
}
|
@ -0,0 +1,28 @@
|
||||
package com.ossez.wechat.common.redis;
|
||||
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.concurrent.locks.Lock;
|
||||
|
||||
/**
|
||||
* 微信Redis相关操作
|
||||
* <p>
|
||||
* 该接口不承诺稳定, 外部实现请继承{@link BaseWxRedisOps}
|
||||
*
|
||||
* @author Mario Luo
|
||||
* @see BaseWxRedisOps 实现需要继承该类
|
||||
* @see JedisWxRedisOps jedis实现
|
||||
* @see RedissonWxRedisOps redisson实现
|
||||
* @see RedisTemplateWxRedisOps redisTemplate实现
|
||||
*/
|
||||
public interface WxRedisOps {
|
||||
|
||||
String getValue(String key);
|
||||
|
||||
void setValue(String key, String value, int expire, TimeUnit timeUnit);
|
||||
|
||||
Long getExpire(String key);
|
||||
|
||||
void expire(String key, int expire, TimeUnit timeUnit);
|
||||
|
||||
Lock getLock(String key);
|
||||
}
|
@ -0,0 +1,57 @@
|
||||
package com.ossez.wechat.common.requestexecuter.ocr;
|
||||
|
||||
import com.ossez.wechat.common.enums.WxType;
|
||||
import com.ossez.wechat.common.exception.WxError;
|
||||
import com.ossez.wechat.common.exception.WxErrorException;
|
||||
import com.ossez.wechat.common.util.http.RequestHttp;
|
||||
import com.ossez.wechat.common.util.http.apache.Utf8ResponseHandler;
|
||||
import org.apache.http.HttpEntity;
|
||||
import org.apache.http.HttpHost;
|
||||
import org.apache.http.client.config.RequestConfig;
|
||||
import org.apache.http.client.methods.CloseableHttpResponse;
|
||||
import org.apache.http.client.methods.HttpPost;
|
||||
import org.apache.http.entity.mime.HttpMultipartMode;
|
||||
import org.apache.http.entity.mime.MultipartEntityBuilder;
|
||||
import org.apache.http.impl.client.CloseableHttpClient;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
|
||||
/**
|
||||
* .
|
||||
*
|
||||
* @author : zhayueran
|
||||
* created on 2019/6/27 14:06
|
||||
*/
|
||||
public class OcrDiscernApacheHttpRequestExecutor extends OcrDiscernRequestExecutor<CloseableHttpClient, HttpHost> {
|
||||
public OcrDiscernApacheHttpRequestExecutor(RequestHttp requestHttp) {
|
||||
super(requestHttp);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String execute(String uri, File file, WxType wxType) throws WxErrorException, IOException {
|
||||
HttpPost httpPost = new HttpPost(uri);
|
||||
if (requestHttp.getRequestHttpProxy() != null) {
|
||||
RequestConfig config = RequestConfig.custom().setProxy(requestHttp.getRequestHttpProxy()).build();
|
||||
httpPost.setConfig(config);
|
||||
}
|
||||
if (file != null) {
|
||||
HttpEntity entity = MultipartEntityBuilder
|
||||
.create()
|
||||
.addBinaryBody("file", file)
|
||||
.setMode(HttpMultipartMode.RFC6532)
|
||||
.build();
|
||||
httpPost.setEntity(entity);
|
||||
}
|
||||
try (CloseableHttpResponse response = requestHttp.getRequestHttpClient().execute(httpPost)) {
|
||||
String responseContent = Utf8ResponseHandler.INSTANCE.handleResponse(response);
|
||||
WxError error = WxError.fromJson(responseContent, wxType);
|
||||
if (error.getErrorCode() != 0) {
|
||||
throw new WxErrorException(error);
|
||||
}
|
||||
return responseContent;
|
||||
} finally {
|
||||
httpPost.releaseConnection();
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,38 @@
|
||||
package com.ossez.wechat.common.requestexecuter.ocr;
|
||||
|
||||
import com.ossez.wechat.common.enums.WxType;
|
||||
import com.ossez.wechat.common.exception.WxErrorException;
|
||||
import com.ossez.wechat.common.util.http.RequestExecutor;
|
||||
import com.ossez.wechat.common.util.http.RequestHttp;
|
||||
import com.ossez.wechat.common.util.http.ResponseHandler;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
|
||||
/**
|
||||
* .
|
||||
*
|
||||
* @author zhayueran
|
||||
* created on 2019/6/27 15:06
|
||||
*/
|
||||
public abstract class OcrDiscernRequestExecutor<H, P> implements RequestExecutor<String, File> {
|
||||
protected RequestHttp<H, P> requestHttp;
|
||||
|
||||
public OcrDiscernRequestExecutor(RequestHttp requestHttp) {
|
||||
this.requestHttp = requestHttp;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(String uri, File data, ResponseHandler<String> handler, WxType wxType) throws WxErrorException, IOException {
|
||||
handler.handle(this.execute(uri, data, wxType));
|
||||
}
|
||||
|
||||
public static RequestExecutor<String, File> create(RequestHttp requestHttp) {
|
||||
switch (requestHttp.getRequestType()) {
|
||||
case APACHE_HTTP:
|
||||
return new OcrDiscernApacheHttpRequestExecutor(requestHttp);
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,121 @@
|
||||
package com.ossez.wechat.common.service;
|
||||
|
||||
import com.ossez.wechat.common.exception.WxErrorException;
|
||||
import com.ossez.wechat.common.bean.imgproc.WxImgProcAiCropResult;
|
||||
import com.ossez.wechat.common.bean.imgproc.WxImgProcQrCodeResult;
|
||||
import com.ossez.wechat.common.bean.imgproc.WxImgProcSuperResolutionResult;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
/**
|
||||
* 多项图像处理能力相关的API.
|
||||
* https://developers.weixin.qq.com/doc/offiaccount/Intelligent_Interface/Img_Proc.html
|
||||
*
|
||||
* @author Theo Nie
|
||||
*/
|
||||
public interface WxImgProcService {
|
||||
|
||||
/**
|
||||
* 二维码/条码识别接口
|
||||
* 说明:
|
||||
* 1.图片支持使用img参数实时上传,也支持使用img_url参数传送图片地址,由微信后台下载图片进行识别
|
||||
* 2.文件大小限制:小于2M
|
||||
* 3.支持条码、二维码、DataMatrix和PDF417的识别。
|
||||
* 4.二维码、DataMatrix会返回位置坐标,条码和PDF417暂不返回位置坐标。
|
||||
*
|
||||
* @param imgUrl 图片url地址
|
||||
* @return WxMpImgProcQrCodeResult
|
||||
* @throws WxErrorException .
|
||||
*/
|
||||
WxImgProcQrCodeResult qrCode(String imgUrl) throws WxErrorException;
|
||||
|
||||
/**
|
||||
* 二维码/条码识别接口
|
||||
* 说明:
|
||||
* 1.图片支持使用img参数实时上传,也支持使用img_url参数传送图片地址,由微信后台下载图片进行识别
|
||||
* 2.文件大小限制:小于2M
|
||||
* 3.支持条码、二维码、DataMatrix和PDF417的识别。
|
||||
* 4.二维码、DataMatrix会返回位置坐标,条码和PDF417暂不返回位置坐标。
|
||||
*
|
||||
* @param imgFile 图片文件对象
|
||||
* @return WxMpImgProcQrCodeResult
|
||||
* @throws WxErrorException .
|
||||
*/
|
||||
WxImgProcQrCodeResult qrCode(File imgFile) throws WxErrorException;
|
||||
|
||||
/**
|
||||
* 图片高清化接口
|
||||
* 说明:
|
||||
* 1.图片支持使用img参数实时上传,也支持使用img_url参数传送图片地址,由微信后台下载图片进行识别
|
||||
* 2.文件大小限制:小于2M
|
||||
* 3.目前支持将图片超分辨率高清化2倍,即生成图片分辨率为原图2倍大小
|
||||
* 返回的media_id有效期为3天,期间可以通过“获取临时素材”接口获取图片二进制
|
||||
*
|
||||
* @param imgUrl 图片url地址
|
||||
* @return WxMpImgProcSuperResolutionResult
|
||||
* @throws WxErrorException .
|
||||
*/
|
||||
WxImgProcSuperResolutionResult superResolution(String imgUrl) throws WxErrorException;
|
||||
|
||||
/**
|
||||
* 图片高清化接口
|
||||
* 说明:
|
||||
* 1.图片支持使用img参数实时上传,也支持使用img_url参数传送图片地址,由微信后台下载图片进行识别
|
||||
* 2.文件大小限制:小于2M
|
||||
* 3.目前支持将图片超分辨率高清化2倍,即生成图片分辨率为原图2倍大小
|
||||
* 返回的media_id有效期为3天,期间可以通过“获取临时素材”接口获取图片二进制
|
||||
*
|
||||
* @param imgFile 图片文件对象
|
||||
* @return WxMpImgProcSuperResolutionResult
|
||||
* @throws WxErrorException .
|
||||
*/
|
||||
WxImgProcSuperResolutionResult superResolution(File imgFile) throws WxErrorException;
|
||||
|
||||
/**
|
||||
* 图片智能裁剪接口
|
||||
* 说明:
|
||||
* 1.图片支持使用img参数实时上传,也支持使用img_url参数传送图片地址,由微信后台下载图片进行识别
|
||||
* 2.文件大小限制:小于2M
|
||||
* 3.该接口默认使用最佳宽高比
|
||||
* @param imgUrl 图片url地址
|
||||
* @return WxMpImgProcAiCropResult
|
||||
* @throws WxErrorException .
|
||||
*/
|
||||
WxImgProcAiCropResult aiCrop(String imgUrl) throws WxErrorException;
|
||||
|
||||
/**
|
||||
* 图片智能裁剪接口
|
||||
* 说明:
|
||||
* 1.图片支持使用img参数实时上传,也支持使用img_url参数传送图片地址,由微信后台下载图片进行识别
|
||||
* 2.文件大小限制:小于2M
|
||||
* @param imgUrl 图片url地址
|
||||
* @param ratios 宽高比,最多支持5个,请以英文逗号分隔
|
||||
* @return WxMpImgProcAiCropResult
|
||||
* @throws WxErrorException .
|
||||
*/
|
||||
WxImgProcAiCropResult aiCrop(String imgUrl, String ratios) throws WxErrorException;
|
||||
|
||||
/**
|
||||
* 图片智能裁剪接口
|
||||
* 说明:
|
||||
* 1.图片支持使用img参数实时上传,也支持使用img_url参数传送图片地址,由微信后台下载图片进行识别
|
||||
* 2.文件大小限制:小于2M
|
||||
* 3.该接口默认使用最佳宽高比
|
||||
* @param imgFile 图片文件对象
|
||||
* @return WxMpImgProcAiCropResult
|
||||
* @throws WxErrorException .
|
||||
*/
|
||||
WxImgProcAiCropResult aiCrop(File imgFile) throws WxErrorException;
|
||||
|
||||
/**
|
||||
* 图片智能裁剪接口
|
||||
* 说明:
|
||||
* 1.图片支持使用img参数实时上传,也支持使用img_url参数传送图片地址,由微信后台下载图片进行识别
|
||||
* 2.文件大小限制:小于2M
|
||||
* @param imgFile 图片文件对象
|
||||
* @param ratios 宽高比,最多支持5个,请以英文逗号分隔
|
||||
* @return WxMpImgProcAiCropResult
|
||||
* @throws WxErrorException .
|
||||
*/
|
||||
WxImgProcAiCropResult aiCrop(File imgFile, String ratios) throws WxErrorException;
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user