rails_wechat 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (566) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +20 -165
  3. data/README.md +28 -20
  4. data/app/apis/wechat/access_token_expired_error.rb +3 -0
  5. data/app/apis/wechat/api/base/datacube.rb +14 -0
  6. data/app/apis/wechat/api/base/sns.rb +36 -0
  7. data/app/apis/wechat/api/base.rb +40 -0
  8. data/app/apis/wechat/api/platform/component.rb +54 -0
  9. data/app/apis/wechat/api/platform.rb +15 -0
  10. data/app/apis/wechat/api/program/wxa.rb +21 -0
  11. data/app/apis/wechat/api/program/wxaapi.rb +31 -0
  12. data/app/apis/wechat/api/program.rb +11 -0
  13. data/app/apis/wechat/api/public/base.rb +73 -0
  14. data/app/apis/wechat/api/public/material.rb +54 -0
  15. data/app/apis/wechat/api/public/menu.rb +43 -0
  16. data/app/apis/wechat/api/public/mp.rb +11 -0
  17. data/app/apis/wechat/api/public/user.rb +73 -0
  18. data/app/apis/wechat/api/public.rb +12 -0
  19. data/app/apis/wechat/api/work/agent.rb +26 -0
  20. data/app/apis/wechat/api/work/menu.rb +47 -0
  21. data/app/apis/wechat/api/work/user.rb +116 -0
  22. data/app/apis/wechat/api/work.rb +14 -0
  23. data/app/apis/wechat/api.rb +7 -0
  24. data/app/apis/wechat/app_not_found.rb +3 -0
  25. data/app/apis/wechat/cipher.rb +82 -0
  26. data/app/apis/wechat/http_client.rb +80 -0
  27. data/app/apis/wechat/invalid_credential_error.rb +3 -0
  28. data/app/apis/wechat/message/base.rb +17 -0
  29. data/app/apis/wechat/message/mass/public.rb +40 -0
  30. data/app/apis/wechat/message/mass/work.rb +84 -0
  31. data/app/apis/wechat/message/mass.rb +22 -0
  32. data/app/apis/wechat/message.rb +7 -0
  33. data/app/apis/wechat/response_error.rb +10 -0
  34. data/app/apis/wechat/signature.rb +32 -0
  35. data/app/apis/wechat/wechat_error.rb +3 -0
  36. data/app/controllers/wechat/admin/accounts_controller.rb +25 -0
  37. data/app/controllers/wechat/admin/apps_controller.rb +66 -0
  38. data/app/controllers/wechat/admin/base_controller.rb +7 -1
  39. data/app/controllers/wechat/admin/extractors_controller.rb +49 -0
  40. data/app/controllers/wechat/admin/menus_controller.rb +69 -0
  41. data/app/controllers/wechat/admin/news_reply_items_controller.rb +16 -0
  42. data/app/controllers/wechat/admin/notices_controller.rb +40 -0
  43. data/app/controllers/wechat/admin/registers_controller.rb +82 -0
  44. data/app/controllers/wechat/admin/replies_controller.rb +55 -0
  45. data/app/controllers/wechat/admin/requests_controller.rb +23 -0
  46. data/app/controllers/wechat/admin/responses_controller.rb +66 -0
  47. data/app/controllers/wechat/admin/tags_controller.rb +43 -0
  48. data/app/controllers/wechat/admin/templates_controller.rb +48 -0
  49. data/app/controllers/wechat/admin/wechat_users_controller.rb +31 -0
  50. data/app/controllers/wechat/apps_controller.rb +62 -0
  51. data/app/controllers/wechat/base_controller.rb +5 -0
  52. data/app/controllers/wechat/controller/application.rb +78 -0
  53. data/app/controllers/wechat/my/base_controller.rb +4 -0
  54. data/app/controllers/wechat/my/medias_controller.rb +56 -0
  55. data/app/controllers/wechat/my/registers_controller.rb +74 -0
  56. data/app/controllers/wechat/my/subscribes_controller.rb +18 -0
  57. data/app/controllers/wechat/my/users_controller.rb +18 -0
  58. data/app/controllers/wechat/my/wechat_users_controller.rb +37 -0
  59. data/app/controllers/wechat/panel/agencies_controller.rb +26 -0
  60. data/app/controllers/wechat/panel/apps_controller.rb +50 -0
  61. data/app/controllers/wechat/panel/base_controller.rb +3 -2
  62. data/app/controllers/wechat/panel/menus_controller.rb +60 -0
  63. data/app/controllers/wechat/panel/platforms_controller.rb +38 -0
  64. data/app/controllers/wechat/panel/template_configs_controller.rb +39 -0
  65. data/app/controllers/wechat/platforms_controller.rb +60 -0
  66. data/app/controllers/wechat/program_users_controller.rb +86 -0
  67. data/app/controllers/wechat/share/apps_controller.rb +21 -0
  68. data/app/controllers/wechat/share/base_controller.rb +10 -0
  69. data/app/controllers/wechat/share/menus_controller.rb +93 -0
  70. data/app/controllers/wechat/share/scenes_controller.rb +62 -0
  71. data/app/controllers/wechat/share/wechat_users_controller.rb +57 -0
  72. data/app/controllers/wechat/wechat_controller.rb +39 -0
  73. data/app/controllers/wechat/wechats_controller.rb +41 -19
  74. data/app/jobs/wechat/agency_job.rb +9 -0
  75. data/app/jobs/wechat/annunciate_job.rb +10 -0
  76. data/app/jobs/wechat/file_reply_upload_job.rb +10 -0
  77. data/app/jobs/wechat/media_job.rb +10 -0
  78. data/app/jobs/wechat/notice_send_job.rb +10 -0
  79. data/app/jobs/wechat/qrcode_job.rb +10 -0
  80. data/app/jobs/wechat/tag_job.rb +10 -0
  81. data/app/jobs/wechat/user_info_job.rb +11 -0
  82. data/app/jobs/wechat/user_job.rb +11 -0
  83. data/app/jobs/wechat/user_tag_job.rb +11 -0
  84. data/app/jobs/wechat/user_tag_remove_job.rb +11 -0
  85. data/app/mailboxes/application_mailbox.rb +3 -0
  86. data/app/mailboxes/wechat_mailbox.rb +17 -0
  87. data/app/models/app/wechat/mobile_app.rb +5 -0
  88. data/app/models/app/wechat/program_app.rb +5 -0
  89. data/app/models/app/wechat/public_app.rb +5 -0
  90. data/app/models/app/wechat/read_app.rb +5 -0
  91. data/app/models/app/wechat/work_app.rb +5 -0
  92. data/app/models/menu/wechat/click_menu.rb +5 -0
  93. data/app/models/menu/wechat/mini_program_menu.rb +5 -0
  94. data/app/models/menu/wechat/parent_menu.rb +5 -0
  95. data/app/models/menu/wechat/scan_push_menu.rb +5 -0
  96. data/app/models/menu/wechat/scan_wait_menu.rb +5 -0
  97. data/app/models/menu/wechat/view_menu.rb +5 -0
  98. data/app/models/notice/wechat/program_notice.rb +5 -0
  99. data/app/models/notice/wechat/public_notice.rb +5 -0
  100. data/app/models/oauth_user/wechat/program_user.rb +5 -0
  101. data/app/models/oauth_user/wechat/wechat_user.rb +5 -0
  102. data/app/models/reply/wechat/image_reply.rb +5 -0
  103. data/app/models/reply/wechat/music_reply.rb +5 -0
  104. data/app/models/reply/wechat/news_reply.rb +5 -0
  105. data/app/models/reply/wechat/success_reply.rb +5 -0
  106. data/app/models/reply/wechat/text_reply.rb +5 -0
  107. data/app/models/reply/wechat/video_reply.rb +5 -0
  108. data/app/models/reply/wechat/voice_reply.rb +5 -0
  109. data/app/models/request/wechat/click_request.rb +5 -0
  110. data/app/models/request/wechat/image_request.rb +5 -0
  111. data/app/models/request/wechat/link_request.rb +5 -0
  112. data/app/models/request/wechat/location_request.rb +5 -0
  113. data/app/models/request/wechat/scan_request.rb +5 -0
  114. data/app/models/request/wechat/short_video_request.rb +4 -0
  115. data/app/models/request/wechat/subscribe_request.rb +5 -0
  116. data/app/models/request/wechat/text_request.rb +5 -0
  117. data/app/models/request/wechat/unsubscribe_request.rb +5 -0
  118. data/app/models/request/wechat/video_request.rb +5 -0
  119. data/app/models/request/wechat/view_request.rb +5 -0
  120. data/app/models/request/wechat/voice_request.rb +5 -0
  121. data/app/models/service/wechat/image_service.rb +5 -0
  122. data/app/models/service/wechat/mpnews_service.rb +5 -0
  123. data/app/models/service/wechat/msgmenu_service.rb +5 -0
  124. data/app/models/service/wechat/news_service.rb +5 -0
  125. data/app/models/service/wechat/text_service.rb +5 -0
  126. data/app/models/service/wechat/video_service.rb +5 -0
  127. data/app/models/service/wechat/voice_service.rb +5 -0
  128. data/app/models/template_config/wechat/template_program.rb +5 -0
  129. data/app/models/template_config/wechat/template_public.rb +5 -0
  130. data/app/models/wechat/agency.rb +6 -0
  131. data/app/models/wechat/app.rb +6 -0
  132. data/app/models/wechat/application_record.rb +5 -0
  133. data/app/models/wechat/auth.rb +5 -0
  134. data/app/models/wechat/ext/effective.rb +10 -0
  135. data/app/models/wechat/ext/organ.rb +14 -0
  136. data/app/models/wechat/ext/subscribed.rb +14 -0
  137. data/app/models/wechat/ext/user.rb +21 -0
  138. data/app/models/wechat/ext/user_tag.rb +38 -0
  139. data/app/models/wechat/extraction.rb +5 -0
  140. data/app/models/wechat/extractor.rb +5 -0
  141. data/app/models/wechat/hook.rb +5 -0
  142. data/app/models/wechat/media.rb +5 -0
  143. data/app/models/wechat/menu.rb +5 -0
  144. data/app/models/wechat/model/account.rb +23 -0
  145. data/app/models/wechat/model/agency.rb +70 -0
  146. data/app/models/wechat/model/annunciate.rb +32 -0
  147. data/app/models/wechat/model/app/mobile_app.rb +11 -0
  148. data/app/models/wechat/model/app/program_app.rb +18 -0
  149. data/app/models/wechat/model/app/public_app.rb +46 -0
  150. data/app/models/wechat/model/app/read_app.rb +24 -0
  151. data/app/models/wechat/model/app/work_app.rb +33 -0
  152. data/app/models/wechat/model/app.rb +198 -0
  153. data/app/models/wechat/model/app_sync.rb +35 -0
  154. data/app/models/wechat/model/auth.rb +35 -0
  155. data/app/models/wechat/model/extraction.rb +21 -0
  156. data/app/models/wechat/model/extractor.rb +77 -0
  157. data/app/models/wechat/model/hook.rb +13 -0
  158. data/app/models/wechat/model/media.rb +33 -0
  159. data/app/models/wechat/model/menu/click_menu.rb +18 -0
  160. data/app/models/wechat/model/menu/mini_program_menu.rb +20 -0
  161. data/app/models/wechat/model/menu/parent_menu.rb +17 -0
  162. data/app/models/wechat/model/menu/scan_push_menu.rb +18 -0
  163. data/app/models/wechat/model/menu/scan_wait_menu.rb +18 -0
  164. data/app/models/wechat/model/menu/view_menu.rb +37 -0
  165. data/app/models/wechat/model/menu.rb +28 -0
  166. data/app/models/wechat/model/news_reply_item.rb +29 -0
  167. data/app/models/wechat/model/notice/program_notice.rb +19 -0
  168. data/app/models/wechat/model/notice/public_notice.rb +25 -0
  169. data/app/models/wechat/model/notice.rb +56 -0
  170. data/app/models/wechat/model/oauth_user/program_user.rb +29 -0
  171. data/app/models/wechat/model/oauth_user/wechat_user.rb +109 -0
  172. data/app/models/wechat/model/platform.rb +87 -0
  173. data/app/models/wechat/model/post.rb +34 -0
  174. data/app/models/wechat/model/receive.rb +120 -0
  175. data/app/models/wechat/model/register.rb +137 -0
  176. data/app/models/wechat/model/reply/image_reply.rb +41 -0
  177. data/app/models/wechat/model/reply/music_reply.rb +20 -0
  178. data/app/models/wechat/model/reply/news_reply.rb +24 -0
  179. data/app/models/wechat/model/reply/success_reply.rb +9 -0
  180. data/app/models/wechat/model/reply/text_reply.rb +14 -0
  181. data/app/models/wechat/model/reply/video_reply.rb +20 -0
  182. data/app/models/wechat/model/reply/voice_reply.rb +16 -0
  183. data/app/models/wechat/model/reply.rb +39 -0
  184. data/app/models/wechat/model/request/click_request.rb +25 -0
  185. data/app/models/wechat/model/request/image_request.rb +9 -0
  186. data/app/models/wechat/model/request/link_request.rb +9 -0
  187. data/app/models/wechat/model/request/location_request.rb +9 -0
  188. data/app/models/wechat/model/request/scan_request.rb +17 -0
  189. data/app/models/wechat/model/request/subscribe_request.rb +10 -0
  190. data/app/models/wechat/model/request/text_request.rb +20 -0
  191. data/app/models/wechat/model/request/unsubscribe_request.rb +4 -0
  192. data/app/models/wechat/model/request/video_request.rb +9 -0
  193. data/app/models/wechat/model/request/view_request.rb +4 -0
  194. data/app/models/wechat/model/request/voice_request.rb +9 -0
  195. data/app/models/wechat/model/request.rb +168 -0
  196. data/app/models/wechat/model/response.rb +41 -0
  197. data/app/models/wechat/model/scene.rb +101 -0
  198. data/app/models/wechat/model/scene_menu.rb +12 -0
  199. data/app/models/wechat/model/service/image_service.rb +18 -0
  200. data/app/models/wechat/model/service/mpnews_service.rb +10 -0
  201. data/app/models/wechat/model/service/msgmenu_service.rb +10 -0
  202. data/app/models/wechat/model/service/news_service.rb +10 -0
  203. data/app/models/wechat/model/service/text_service.rb +18 -0
  204. data/app/models/wechat/model/service/video_service.rb +10 -0
  205. data/app/models/wechat/model/service/voice_service.rb +10 -0
  206. data/app/models/wechat/model/service.rb +42 -0
  207. data/app/models/wechat/model/subscribe.rb +20 -0
  208. data/app/models/wechat/model/tag.rb +56 -0
  209. data/app/models/wechat/model/template.rb +82 -0
  210. data/app/models/wechat/model/template_config/template_program.rb +31 -0
  211. data/app/models/wechat/model/template_config/template_public.rb +37 -0
  212. data/app/models/wechat/model/template_config.rb +44 -0
  213. data/app/models/wechat/model/template_key_word.rb +20 -0
  214. data/app/models/wechat/model/ticket.rb +28 -0
  215. data/app/models/wechat/model/user_tag.rb +42 -0
  216. data/app/models/wechat/model/user_tagged.rb +22 -0
  217. data/app/models/wechat/model/wechat_message_tag.rb +11 -0
  218. data/app/models/wechat/news_reply_item.rb +5 -0
  219. data/app/models/wechat/notice.rb +5 -0
  220. data/app/models/wechat/platform.rb +5 -0
  221. data/app/models/wechat/receive.rb +5 -0
  222. data/app/models/wechat/reply.rb +5 -0
  223. data/app/models/wechat/request.rb +5 -0
  224. data/app/models/wechat/response.rb +5 -0
  225. data/app/models/wechat/scene.rb +5 -0
  226. data/app/models/wechat/scene_menu.rb +5 -0
  227. data/app/models/wechat/service.rb +5 -0
  228. data/app/models/wechat/subscribe.rb +5 -0
  229. data/app/models/wechat/tag.rb +5 -0
  230. data/app/models/wechat/template.rb +5 -0
  231. data/app/models/wechat/template_config.rb +5 -0
  232. data/app/models/wechat/template_key_word.rb +5 -0
  233. data/app/models/wechat/ticket.rb +5 -0
  234. data/app/models/wechat/user_tag.rb +5 -0
  235. data/app/models/wechat.rb +11 -0
  236. data/app/views/admin/_wechat_nav.html.erb +11 -0
  237. data/app/views/application/wechat_require_login.json.jbuilder +2 -0
  238. data/app/views/my/_wechat_nav.html+phone.erb +10 -0
  239. data/app/views/my/_wechat_nav.html.erb +4 -0
  240. data/app/views/panel/_wechat_nav.html.erb +13 -0
  241. data/app/{assets/config/rails_wechat_manifest.js → views/wechat/admin/accounts/qrcode.json.jbuilder} +0 -0
  242. data/app/views/wechat/admin/accounts/qrcode.turbo_stream.erb +3 -0
  243. data/app/views/wechat/admin/apps/_cert_form.html.erb +4 -0
  244. data/app/views/wechat/admin/apps/_edit_form.html.erb +4 -0
  245. data/app/views/wechat/admin/apps/_filter_form.html.erb +9 -0
  246. data/app/views/wechat/admin/apps/_form.html.erb +6 -0
  247. data/app/views/wechat/admin/apps/_index_tbody.html.erb +61 -0
  248. data/app/views/wechat/admin/apps/_index_thead.html.erb +7 -0
  249. data/app/views/wechat/admin/apps/_index_tr.html.erb +22 -0
  250. data/app/views/wechat/admin/apps/_info.html.erb +20 -0
  251. data/app/views/wechat/admin/apps/_new_form.html.erb +4 -0
  252. data/app/views/wechat/admin/apps/_pay_form.html.erb +7 -0
  253. data/app/views/wechat/admin/apps/_qy_form.html.erb +4 -0
  254. data/app/views/wechat/admin/apps/_show.json.jbuilder +1 -0
  255. data/app/views/wechat/admin/apps/_show_table.html.erb +36 -0
  256. data/app/views/wechat/admin/apps/_wechat_app.json.jbuilder +18 -0
  257. data/app/views/wechat/admin/apps/edit_cert.html.erb +3 -0
  258. data/app/views/wechat/admin/apps/index.html.erb +5 -0
  259. data/app/views/wechat/admin/apps/index.json.jbuilder +1 -0
  260. data/app/views/wechat/admin/apps/info.html.erb +3 -0
  261. data/app/views/wechat/admin/base/_nav.html.erb +3 -0
  262. data/app/views/wechat/admin/base/_wechat_nav_user.html.erb +18 -0
  263. data/app/views/wechat/admin/extractors/_breadcrumb.html.erb +8 -0
  264. data/app/views/wechat/admin/extractors/_edit_form.html.erb +4 -0
  265. data/app/views/wechat/admin/extractors/_filter_form.html.erb +9 -0
  266. data/app/views/wechat/admin/extractors/_form.html.erb +21 -0
  267. data/app/views/wechat/admin/extractors/_index_tbody.html.erb +24 -0
  268. data/app/views/wechat/admin/extractors/_index_thead.html.erb +17 -0
  269. data/app/views/wechat/admin/extractors/_new_form.html.erb +4 -0
  270. data/app/views/wechat/admin/extractors/_show_table.html.erb +32 -0
  271. data/app/views/wechat/admin/extractors/index.html.erb +5 -0
  272. data/app/views/wechat/admin/menus/_breadcrumb.html.erb +9 -0
  273. data/app/views/wechat/admin/menus/_button.html.erb +9 -0
  274. data/app/views/wechat/admin/menus/_edit_form.html.erb +6 -0
  275. data/app/views/wechat/admin/menus/_edit_parent_form.html.erb +5 -0
  276. data/app/views/wechat/admin/menus/_filter_form.html.erb +8 -0
  277. data/app/views/wechat/admin/menus/_form.html.erb +7 -0
  278. data/app/views/wechat/admin/menus/_index_tbody.html.erb +16 -0
  279. data/app/views/wechat/admin/menus/_index_thead.html.erb +9 -0
  280. data/app/views/wechat/admin/menus/_index_tr.html.erb +24 -0
  281. data/app/views/wechat/admin/menus/_new_form.html.erb +6 -0
  282. data/app/views/wechat/admin/menus/_new_parent_form.html.erb +7 -0
  283. data/app/views/wechat/admin/menus/_show_table.html.erb +20 -0
  284. data/app/views/wechat/admin/menus/edit_parent.html.erb +3 -0
  285. data/app/views/wechat/admin/menus/index.html.erb +4 -0
  286. data/app/views/wechat/admin/menus/new_parent.html.erb +3 -0
  287. data/app/views/wechat/admin/menus/sync.turbo_stream.erb +3 -0
  288. data/app/views/wechat/admin/notices/_edit_form.html.erb +7 -0
  289. data/app/views/wechat/admin/notices/_filter_form.html.erb +9 -0
  290. data/app/views/wechat/admin/notices/_form.html.erb +3 -0
  291. data/app/views/wechat/admin/notices/_index_tbody.erb +3 -0
  292. data/app/views/wechat/admin/notices/_index_thead.html.erb +3 -0
  293. data/app/views/wechat/admin/notices/_new_form.html.erb +5 -0
  294. data/app/views/wechat/admin/notices/_show_table.html.erb +8 -0
  295. data/app/views/wechat/admin/notices/index.html.erb +5 -0
  296. data/app/views/wechat/admin/registers/_app_form.html.erb +5 -0
  297. data/app/views/wechat/admin/registers/_assign_form.html.erb +6 -0
  298. data/app/views/wechat/admin/registers/_bind_form.html.erb +5 -0
  299. data/app/views/wechat/admin/registers/_button.html.erb +3 -0
  300. data/app/views/wechat/admin/registers/_edit_form.html.erb +4 -0
  301. data/app/views/wechat/admin/registers/_filter_form.html.erb +10 -0
  302. data/app/views/wechat/admin/registers/_form.html.erb +5 -0
  303. data/app/views/wechat/admin/registers/_index_tbody.html.erb +37 -0
  304. data/app/views/wechat/admin/registers/_index_thead.html.erb +23 -0
  305. data/app/views/wechat/admin/registers/_index_tr.html.erb +25 -0
  306. data/app/views/wechat/admin/registers/_new_form.html.erb +4 -0
  307. data/app/views/wechat/admin/registers/_qrcode_form.html.erb +5 -0
  308. data/app/views/wechat/admin/registers/_show_table.html.erb +32 -0
  309. data/app/views/wechat/admin/registers/edit_app.turbo_stream.erb +3 -0
  310. data/app/views/wechat/admin/registers/edit_assign.turbo_stream.erb +3 -0
  311. data/app/views/wechat/admin/registers/edit_bind.turbo_stream.erb +3 -0
  312. data/app/views/wechat/admin/registers/edit_qrcode.turbo_stream.erb +3 -0
  313. data/app/views/wechat/admin/registers/index.html.erb +5 -0
  314. data/app/views/wechat/admin/replies/_breadcrumb.html.erb +7 -0
  315. data/app/views/wechat/admin/replies/_edit_form.html.erb +4 -0
  316. data/app/views/wechat/admin/replies/_filter_form.html.erb +9 -0
  317. data/app/views/wechat/admin/replies/_filter_table.html.erb +11 -0
  318. data/app/views/wechat/admin/replies/_form.html.erb +3 -0
  319. data/app/views/wechat/admin/replies/_image_form.html.erb +1 -0
  320. data/app/views/wechat/admin/replies/_index_tbody.html.erb +29 -0
  321. data/app/views/wechat/admin/replies/_index_thead.html.erb +3 -0
  322. data/app/views/wechat/admin/replies/_new_form.html.erb +4 -0
  323. data/app/views/wechat/admin/replies/_news_form.html.erb +6 -0
  324. data/app/views/wechat/admin/replies/_show_table.html.erb +12 -0
  325. data/app/views/wechat/admin/replies/_text_form.html.erb +1 -0
  326. data/app/views/wechat/admin/replies/add.html.erb +11 -0
  327. data/app/views/wechat/admin/replies/build.turbo_stream.erb +7 -0
  328. data/app/views/wechat/admin/replies/index.html.erb +5 -0
  329. data/app/views/wechat/admin/replies/index.js +12 -0
  330. data/app/views/wechat/admin/requests/_breadcrumb.html.erb +7 -0
  331. data/app/views/wechat/admin/requests/_button.html.erb +3 -0
  332. data/app/views/wechat/admin/requests/_filter_form.html.erb +10 -0
  333. data/app/views/wechat/admin/requests/_filter_table.html.erb +11 -0
  334. data/app/views/wechat/admin/requests/_index_tbody.html.erb +21 -0
  335. data/app/views/wechat/admin/requests/_index_thead.html.erb +6 -0
  336. data/app/views/wechat/admin/requests/_index_tr.html.erb +13 -0
  337. data/app/views/wechat/admin/requests/_show_table.html.erb +18 -0
  338. data/app/views/wechat/admin/requests/index.html.erb +5 -0
  339. data/app/views/wechat/admin/responses/_breadcrumb.html.erb +7 -0
  340. data/app/views/wechat/admin/responses/_edit_form.html.erb +4 -0
  341. data/app/views/wechat/admin/responses/_filter_form.html.erb +9 -0
  342. data/app/views/wechat/admin/responses/_filter_table.html.erb +11 -0
  343. data/app/views/wechat/admin/responses/_form.html.erb +4 -0
  344. data/app/views/wechat/admin/responses/_index_tbody.html.erb +27 -0
  345. data/app/views/wechat/admin/responses/_index_thead.html.erb +14 -0
  346. data/app/views/wechat/admin/responses/_index_tr.html.erb +19 -0
  347. data/app/views/wechat/admin/responses/_new_form.html.erb +4 -0
  348. data/app/views/wechat/admin/responses/_reply_body.html.erb +4 -0
  349. data/app/views/wechat/admin/responses/_reply_form.html.erb +5 -0
  350. data/app/views/wechat/admin/responses/_show/_breadcrumb.html.erb +8 -0
  351. data/app/views/wechat/admin/responses/_show_table.html.erb +35 -0
  352. data/app/views/wechat/admin/responses/edit_reply.html.erb +3 -0
  353. data/app/views/wechat/admin/responses/filter_reply.turbo_stream.erb +1 -0
  354. data/app/views/wechat/admin/responses/index.html.erb +5 -0
  355. data/app/views/wechat/admin/responses/show.html.erb +4 -0
  356. data/app/views/wechat/admin/tags/_button.html.erb +6 -0
  357. data/app/views/wechat/admin/tags/_edit_form.html.erb +4 -0
  358. data/app/views/wechat/admin/tags/_filter_form.html.erb +9 -0
  359. data/app/views/wechat/admin/tags/_form.html.erb +2 -0
  360. data/app/views/wechat/admin/tags/_index_tbody.html.erb +4 -0
  361. data/app/views/wechat/admin/tags/_index_thead.html.erb +5 -0
  362. data/app/views/wechat/admin/tags/_index_tr.html.erb +16 -0
  363. data/app/views/wechat/admin/tags/_new_form.html.erb +4 -0
  364. data/app/views/wechat/admin/tags/_show_table.html.erb +12 -0
  365. data/app/views/wechat/admin/tags/index.html.erb +6 -0
  366. data/app/views/wechat/admin/tags/sync.turbo_stream.erb +3 -0
  367. data/app/views/wechat/admin/templates/_breadcrumb.html.erb +7 -0
  368. data/app/views/wechat/admin/templates/_button.html.erb +5 -0
  369. data/app/views/wechat/admin/templates/_edit_form.html.erb +4 -0
  370. data/app/views/wechat/admin/templates/_filter_form.html.erb +9 -0
  371. data/app/views/wechat/admin/templates/_form.html.erb +6 -0
  372. data/app/views/wechat/admin/templates/_index_tbody.html.erb +13 -0
  373. data/app/views/wechat/admin/templates/_index_template_config.html.erb +16 -0
  374. data/app/views/wechat/admin/templates/_index_thead.html.erb +9 -0
  375. data/app/views/wechat/admin/templates/_new_form.html.erb +4 -0
  376. data/app/views/wechat/admin/templates/_show_table.html.erb +20 -0
  377. data/app/views/wechat/admin/templates/index.html.erb +5 -0
  378. data/app/views/wechat/admin/wechat_users/_edit_form.html.erb +5 -0
  379. data/app/views/wechat/admin/wechat_users/_filter_form.html.erb +9 -0
  380. data/app/views/wechat/admin/wechat_users/_index_tbody.html.erb +16 -0
  381. data/app/views/wechat/admin/wechat_users/_index_thead.html.erb +13 -0
  382. data/app/views/wechat/admin/wechat_users/_show_table.html.erb +20 -0
  383. data/app/views/wechat/admin/wechat_users/index.html.erb +7 -0
  384. data/app/views/wechat/apps/login.html.erb +1 -0
  385. data/app/views/wechat/my/medias/_edit_form.html.erb +4 -0
  386. data/app/views/wechat/my/medias/_filter_form.html.erb +9 -0
  387. data/app/views/wechat/my/medias/_form.html.erb +6 -0
  388. data/app/views/wechat/my/medias/_index_tbody.html.erb +5 -0
  389. data/app/views/wechat/my/medias/_index_thead.html.erb +6 -0
  390. data/app/views/wechat/my/medias/_new_form.html.erb +4 -0
  391. data/app/views/wechat/my/medias/_show_table.html.erb +20 -0
  392. data/app/views/wechat/my/medias/create.turbo_stream.erb +0 -0
  393. data/app/views/wechat/my/medias/index.html.erb +5 -0
  394. data/app/views/wechat/my/registers/_edit_form.html.erb +4 -0
  395. data/app/views/wechat/my/registers/_filter_form.html.erb +9 -0
  396. data/app/views/wechat/my/registers/_form.html+phone.erb +11 -0
  397. data/app/views/wechat/my/registers/_form.html.erb +4 -0
  398. data/app/views/wechat/my/registers/_new_form.html+phone.erb +4 -0
  399. data/app/views/wechat/my/registers/_new_form.html.erb +4 -0
  400. data/app/views/wechat/my/registers/_show_table.html.erb +8 -0
  401. data/app/views/wechat/my/registers/_wechat_register.html.erb +32 -0
  402. data/app/views/wechat/my/registers/_wechat_register_done.html.erb +29 -0
  403. data/app/views/wechat/my/registers/edit_code.html.erb +12 -0
  404. data/app/views/wechat/my/registers/index.html+phone.erb +16 -0
  405. data/app/views/wechat/my/registers/index.html.erb +36 -0
  406. data/app/views/wechat/my/registers/new.html.erb +1 -0
  407. data/app/views/wechat/my/subscribes/_filter_form.html.erb +7 -0
  408. data/app/views/wechat/my/subscribes/_form.html.erb +7 -0
  409. data/app/views/wechat/my/subscribes/_show_table.html.erb +12 -0
  410. data/app/views/wechat/my/subscribes/index.html.erb +40 -0
  411. data/app/views/wechat/my/users/invite_qrcode.html+phone.erb +35 -0
  412. data/app/views/wechat/my/users/invite_qrcode.html.erb +6 -0
  413. data/app/views/wechat/my/users/requests.html+phone.erb +53 -0
  414. data/app/views/wechat/panel/agencies/_breadcrumb.html.erb +6 -0
  415. data/app/views/wechat/panel/agencies/_button.html.erb +0 -0
  416. data/app/views/wechat/panel/agencies/_edit_form.html.erb +4 -0
  417. data/app/views/wechat/panel/agencies/_filter_form.html.erb +9 -0
  418. data/app/views/wechat/panel/agencies/_form.html.erb +6 -0
  419. data/app/views/wechat/panel/agencies/_index_tbody.html.erb +17 -0
  420. data/app/views/wechat/panel/agencies/_index_thead.html.erb +15 -0
  421. data/app/views/wechat/panel/agencies/_show_table.html.erb +20 -0
  422. data/app/views/wechat/panel/agencies/index.html.erb +5 -0
  423. data/app/views/wechat/panel/apps/_edit_form.html.erb +4 -0
  424. data/app/views/wechat/panel/apps/_filter_form.html.erb +9 -0
  425. data/app/views/wechat/panel/apps/_form.html.erb +17 -0
  426. data/app/views/wechat/panel/apps/_index_tbody.html.erb +52 -0
  427. data/app/views/wechat/panel/apps/_index_thead.html.erb +6 -0
  428. data/app/views/wechat/panel/apps/_index_tr.html.erb +16 -0
  429. data/app/views/wechat/panel/apps/_new_form.html.erb +4 -0
  430. data/app/views/wechat/panel/apps/_show.json.jbuilder +1 -0
  431. data/app/views/wechat/panel/apps/_show_table.html.erb +36 -0
  432. data/app/views/wechat/panel/apps/_wechat_app.json.jbuilder +18 -0
  433. data/app/views/wechat/panel/apps/edit_cert.html.erb +3 -0
  434. data/app/views/wechat/panel/apps/index.html.erb +5 -0
  435. data/app/views/wechat/panel/apps/index.json.jbuilder +1 -0
  436. data/app/views/wechat/panel/base/_nav.html.erb +3 -0
  437. data/app/views/wechat/panel/menus/_breadcrumb.html.erb +5 -0
  438. data/app/views/wechat/panel/menus/_button.html.erb +6 -0
  439. data/app/views/wechat/panel/menus/_edit_form.html.erb +6 -0
  440. data/app/views/wechat/panel/menus/_edit_parent_form.html.erb +5 -0
  441. data/app/views/wechat/panel/menus/_filter_form.html.erb +8 -0
  442. data/app/views/wechat/panel/menus/_form.html.erb +7 -0
  443. data/app/views/wechat/panel/menus/_index_tbody.html.erb +15 -0
  444. data/app/views/wechat/panel/menus/_index_thead.html.erb +8 -0
  445. data/app/views/wechat/panel/menus/_index_tr.html.erb +22 -0
  446. data/app/views/wechat/panel/menus/_new_form.html.erb +5 -0
  447. data/app/views/wechat/panel/menus/_new_parent_form.html.erb +7 -0
  448. data/app/views/wechat/panel/menus/_show_table.html.erb +20 -0
  449. data/app/views/wechat/panel/menus/edit_parent.turbo_stream.erb +1 -0
  450. data/app/views/wechat/panel/menus/index.html.erb +5 -0
  451. data/app/views/wechat/panel/menus/new_parent.html.erb +3 -0
  452. data/app/views/wechat/panel/platforms/_edit_form.html.erb +4 -0
  453. data/app/views/wechat/panel/platforms/_filter_form.html.erb +9 -0
  454. data/app/views/wechat/panel/platforms/_form.html.erb +7 -0
  455. data/app/views/wechat/panel/platforms/_index_tbody.html.erb +12 -0
  456. data/app/views/wechat/panel/platforms/_index_thead.html.erb +13 -0
  457. data/app/views/wechat/panel/platforms/_index_tr.html.erb +22 -0
  458. data/app/views/wechat/panel/platforms/_new_form.html.erb +4 -0
  459. data/app/views/wechat/panel/platforms/_show_table.html.erb +32 -0
  460. data/app/views/wechat/panel/platforms/index.html.erb +5 -0
  461. data/app/views/wechat/panel/template_configs/_edit_form.html.erb +10 -0
  462. data/app/views/wechat/panel/template_configs/_filter.html.erb +9 -0
  463. data/app/views/wechat/panel/template_configs/_index_tbody.html.erb +10 -0
  464. data/app/views/wechat/panel/template_configs/_index_thead.html.erb +11 -0
  465. data/app/views/wechat/panel/template_configs/_item_form.html.erb +6 -0
  466. data/app/views/wechat/panel/template_configs/_new_form.html.erb +7 -0
  467. data/app/views/wechat/panel/template_configs/_show_table.html.erb +28 -0
  468. data/app/views/wechat/panel/template_configs/index.html.erb +5 -0
  469. data/app/views/wechat/platforms/callback.html.erb +0 -0
  470. data/app/views/wechat/program_users/mobile_err.json.jbuilder +2 -0
  471. data/app/views/wechat/share/apps/_button.html.erb +0 -0
  472. data/app/views/wechat/share/apps/_filter_form.html.erb +9 -0
  473. data/app/views/wechat/share/apps/_form.html.erb +17 -0
  474. data/app/views/wechat/share/apps/_index_tbody.html.erb +27 -0
  475. data/app/views/wechat/share/apps/_index_thead.html.erb +5 -0
  476. data/app/views/wechat/share/apps/_index_tr.html.erb +10 -0
  477. data/app/views/wechat/share/apps/_show.json.jbuilder +1 -0
  478. data/app/views/wechat/share/apps/_show_table.html.erb +36 -0
  479. data/app/views/wechat/share/apps/_wechat_app.json.jbuilder +18 -0
  480. data/app/views/wechat/share/apps/index.html.erb +5 -0
  481. data/app/views/wechat/share/apps/index.json.jbuilder +1 -0
  482. data/app/views/wechat/share/base/_nav.html.erb +3 -0
  483. data/app/views/wechat/share/menus/_breadcrumb.html.erb +9 -0
  484. data/app/views/wechat/share/menus/_button.html.erb +9 -0
  485. data/app/views/wechat/share/menus/_edit_form.html.erb +6 -0
  486. data/app/views/wechat/share/menus/_edit_parent_form.html.erb +5 -0
  487. data/app/views/wechat/share/menus/_filter_form.html.erb +8 -0
  488. data/app/views/wechat/share/menus/_form.html.erb +10 -0
  489. data/app/views/wechat/share/menus/_index_tbody.html.erb +20 -0
  490. data/app/views/wechat/share/menus/_index_thead.html.erb +9 -0
  491. data/app/views/wechat/share/menus/_index_tr.html.erb +25 -0
  492. data/app/views/wechat/share/menus/_new_form.html.erb +5 -0
  493. data/app/views/wechat/share/menus/_new_parent_form.html.erb +7 -0
  494. data/app/views/wechat/share/menus/_show_table.html.erb +20 -0
  495. data/app/views/wechat/share/menus/edit_parent.turbo_stream.erb +1 -0
  496. data/app/views/wechat/share/menus/index.html.erb +4 -0
  497. data/app/views/wechat/share/menus/new_parent.html.erb +3 -0
  498. data/app/views/wechat/share/menus/sync.turbo_stream.erb +3 -0
  499. data/app/views/wechat/share/scenes/_breadcrumb.html.erb +7 -0
  500. data/app/views/wechat/share/scenes/_edit_form.html.erb +4 -0
  501. data/app/views/wechat/share/scenes/_filter_form.html.erb +9 -0
  502. data/app/views/wechat/share/scenes/_form.html.erb +3 -0
  503. data/app/views/wechat/share/scenes/_index_tbody.html.erb +9 -0
  504. data/app/views/wechat/share/scenes/_index_thead.html.erb +7 -0
  505. data/app/views/wechat/share/scenes/_index_tr.html.erb +25 -0
  506. data/app/views/wechat/share/scenes/_new_form.html.erb +4 -0
  507. data/app/views/wechat/share/scenes/_show_table.html.erb +10 -0
  508. data/app/views/wechat/share/scenes/index.html.erb +5 -0
  509. data/app/views/wechat/share/scenes/sync.turbo_stream.erb +3 -0
  510. data/app/views/wechat/share/wechat_users/_breadcrumb.html.erb +9 -0
  511. data/app/views/wechat/share/wechat_users/_button.html.erb +0 -0
  512. data/app/views/wechat/share/wechat_users/_edit_form.html.erb +4 -0
  513. data/app/views/wechat/share/wechat_users/_filter_form.html.erb +9 -0
  514. data/app/views/wechat/share/wechat_users/_index_tbody.html.erb +11 -0
  515. data/app/views/wechat/share/wechat_users/_index_thead.html.erb +12 -0
  516. data/app/views/wechat/share/wechat_users/_index_tr.html.erb +13 -0
  517. data/app/views/wechat/share/wechat_users/_show_table.html.erb +20 -0
  518. data/app/views/wechat/share/wechat_users/index.html.erb +5 -0
  519. data/app/views/wechat/share/wechat_users/try_match.turbo_stream.erb +3 -0
  520. data/app/views/wechat/wechat/login.html.erb +9 -0
  521. data/config/locales/en.controller.yml +28 -0
  522. data/config/locales/en.enum.yml +30 -0
  523. data/config/locales/zh.attributes.yml +66 -0
  524. data/config/locales/zh.controller.yml +79 -0
  525. data/config/locales/zh.enum.yml +65 -0
  526. data/config/routes.rb +142 -11
  527. data/lib/omniauth/strategies/wechat.rb +74 -0
  528. data/lib/omniauth/strategies/wechat_qiye.rb +82 -0
  529. data/lib/omniauth/strategies/wechat_qr.rb +21 -0
  530. data/lib/rails_wechat/config.rb +88 -0
  531. data/lib/rails_wechat/engine.rb +38 -0
  532. data/lib/rails_wechat/helpers.rb +32 -0
  533. data/lib/rails_wechat.rb +14 -3
  534. metadata +549 -44
  535. data/app/controllers/wechat/admin/wechat_configs_controller.rb +0 -86
  536. data/app/controllers/wechat/panel/wechat_configs_controller.rb +0 -62
  537. data/app/models/rails_wechat/organ.rb +0 -11
  538. data/app/models/wechat_config.rb +0 -44
  539. data/app/models/wechat_session.rb +0 -16
  540. data/app/views/wechat/admin/wechat_configs/_filter.html.erb +0 -8
  541. data/app/views/wechat/admin/wechat_configs/_form.html.erb +0 -21
  542. data/app/views/wechat/admin/wechat_configs/_show_table.html.erb +0 -80
  543. data/app/views/wechat/admin/wechat_configs/_wechat_config.json.jbuilder +0 -21
  544. data/app/views/wechat/admin/wechat_configs/edit.html.erb +0 -9
  545. data/app/views/wechat/admin/wechat_configs/edit.js.erb +0 -3
  546. data/app/views/wechat/admin/wechat_configs/index.html.erb +0 -84
  547. data/app/views/wechat/admin/wechat_configs/index.json.jbuilder +0 -1
  548. data/app/views/wechat/admin/wechat_configs/new.html.erb +0 -9
  549. data/app/views/wechat/admin/wechat_configs/new.js.erb +0 -3
  550. data/app/views/wechat/admin/wechat_configs/show.html.erb +0 -7
  551. data/app/views/wechat/admin/wechat_configs/show.js.erb +0 -3
  552. data/app/views/wechat/admin/wechat_configs/show.json.jbuilder +0 -1
  553. data/app/views/wechat/panel/wechat_configs/_filter.html.erb +0 -8
  554. data/app/views/wechat/panel/wechat_configs/_form.html.erb +0 -21
  555. data/app/views/wechat/panel/wechat_configs/_show_table.html.erb +0 -80
  556. data/app/views/wechat/panel/wechat_configs/_wechat_config.json.jbuilder +0 -21
  557. data/app/views/wechat/panel/wechat_configs/edit.html.erb +0 -9
  558. data/app/views/wechat/panel/wechat_configs/edit.js.erb +0 -3
  559. data/app/views/wechat/panel/wechat_configs/index.html.erb +0 -84
  560. data/app/views/wechat/panel/wechat_configs/index.json.jbuilder +0 -1
  561. data/app/views/wechat/panel/wechat_configs/new.html.erb +0 -9
  562. data/app/views/wechat/panel/wechat_configs/new.js.erb +0 -3
  563. data/app/views/wechat/panel/wechat_configs/show.html.erb +0 -7
  564. data/app/views/wechat/panel/wechat_configs/show.js.erb +0 -3
  565. data/app/views/wechat/panel/wechat_configs/show.json.jbuilder +0 -1
  566. data/lib/tasks/rails_wechat_tasks.rake +0 -4
@@ -0,0 +1,25 @@
1
+ module Wechat
2
+ module Model::Notice::PublicNotice
3
+ BASE = 'https://api.weixin.qq.com/cgi-bin/'
4
+
5
+ def do_send
6
+ r = app.api.post 'message/template/send', **message_hash, base: BASE
7
+ if r['errcode'] == 0
8
+ self.update msg_id: r['msgid']
9
+ subscribe.update sending_at: Time.now if subscribe
10
+ else
11
+ r
12
+ end
13
+ end
14
+
15
+ def message_hash
16
+ {
17
+ touser: wechat_user.uid,
18
+ template_id: template.template_id,
19
+ url: link,
20
+ data: data
21
+ }
22
+ end
23
+
24
+ end
25
+ end
@@ -0,0 +1,56 @@
1
+ module Wechat
2
+ module Model::Notice
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ attribute :link, :string, default: 'index'
7
+ attribute :msg_id, :string
8
+ attribute :status, :string
9
+ attribute :type, :string
10
+ attribute :appid, :string
11
+ attribute :open_id, :string
12
+
13
+ belongs_to :notification
14
+ belongs_to :template
15
+ belongs_to :app, foreign_key: :appid, primary_key: :appid
16
+ belongs_to :wechat_user, class_name: 'OauthUser', foreign_key: :open_id, primary_key: :uid
17
+ belongs_to :subscribe, optional: true
18
+
19
+ before_validation do
20
+ self.link = notification.link
21
+ self.app ||= template.app
22
+ #self.subscribe = wechat_user.subscribe todo deal with
23
+ end
24
+ after_create_commit :do_send_later
25
+ end
26
+
27
+ def data
28
+ r = {}
29
+ template.data_mappings.each do |key, value|
30
+ if key == 'first' && value[:value].blank?
31
+ r.merge! first: { value: notification.title }
32
+ else
33
+ r.merge! key => {
34
+ value: notification.notifiable_detail[value[:value]]
35
+ }
36
+ end
37
+ end
38
+ r
39
+ end
40
+
41
+ def do_send_later
42
+ NoticeSendJob.perform_later(self)
43
+ end
44
+
45
+ def do_send
46
+ r = do_send
47
+ if r['errcode'] == 0
48
+ self.update msg_id: r['msgid']
49
+ subscribe.update sending_at: Time.current if subscribe
50
+ else
51
+ r
52
+ end
53
+ end
54
+
55
+ end
56
+ end
@@ -0,0 +1,29 @@
1
+ module Wechat
2
+ module Model::OauthUser::ProgramUser
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ attribute :provider, :string, default: 'wechat_program'
7
+
8
+ belongs_to :app, foreign_key: :appid, primary_key: :appid
9
+ end
10
+
11
+ def get_phone_number(encrypted_data, iv, session_key)
12
+ r = Wechat::Cipher.program_decrypt(encrypted_data, iv, session_key)
13
+ if r['phoneNumber']
14
+ r['phoneNumber']
15
+ else
16
+ self.errors.add :base, "手机号获取失败,session_key 为:#{session_key}"
17
+ nil
18
+ end
19
+ end
20
+
21
+ def auth_token(session_key = nil)
22
+ at = authorized_tokens.valid.take || authorized_tokens.build
23
+ at.session_key = session_key if session_key.present?
24
+ at.save
25
+ at.token
26
+ end
27
+
28
+ end
29
+ end
@@ -0,0 +1,109 @@
1
+ module Wechat
2
+ module Model::OauthUser::WechatUser
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ attribute :provider, :string, default: 'wechat'
7
+ attribute :remark, :string
8
+
9
+ belongs_to :request, optional: true
10
+ belongs_to :app, foreign_key: :app_id, primary_key: :appid, optional: true
11
+
12
+ has_many :requests, foreign_key: :open_id, primary_key: :uid
13
+ has_many :subscribes, dependent: :delete_all
14
+ has_many :user_tags, foreign_key: :open_id, primary_key: :uid, dependent: :destroy
15
+ has_many :tags, through: :user_tags
16
+ has_many :notices, foreign_key: :open_id, primary_key: :uid
17
+
18
+ after_save_commit :sync_remark_later, if: -> { saved_change_to_remark? }
19
+ after_save_commit :sync_user_info_later, if: -> { saved_change_to_access_token? && (attributes['name'].blank? && attributes['avatar_url'].blank?) }
20
+ after_save_commit :sync_inviter, if: -> { request && saved_change_to_request_id? }
21
+ after_create_commit :auto_link, if: -> { unionid.present? }
22
+ end
23
+
24
+ def name
25
+ super.blank? ? "Wechat #{id}" : super
26
+ end
27
+
28
+ def try_match
29
+ app.api.menu_trymatch(uid)
30
+ end
31
+
32
+ def auto_link
33
+ if self.unionid && self.same_oauth_user
34
+ self.account ||= same_oauth_user.account
35
+ end
36
+ self.save
37
+ end
38
+
39
+ def sync_inviter
40
+ inviter_id = request.body.delete_prefix 'invite_by_'
41
+ self.account&.update inviter_id: inviter_id
42
+ self.user&.update inviter_id: inviter_id
43
+ end
44
+
45
+ def sync_remark_later
46
+ WechatUserJob.perform_later(self)
47
+ end
48
+
49
+ def sync_remark_to_wechat
50
+ return unless app
51
+ app.api.user_update_remark(uid, remark)
52
+ rescue Wechat::WechatError => e
53
+ logger.info e.message
54
+ end
55
+
56
+ def sync_user_info_later
57
+ UserInfoJob.perform_later(self)
58
+ end
59
+
60
+ def sync_user_info
61
+ params = {
62
+ access_token: access_token,
63
+ openid: uid
64
+ }
65
+ user_response = HTTPX.get('https://api.weixin.qq.com/sns/userinfo', params: params)
66
+ res = JSON.parse(user_response.to_s)
67
+
68
+ if res['errcode'].present?
69
+ self.errors.add :base, "#{res['errcode']}, #{res['errmsg']}"
70
+ end
71
+
72
+ self.name = res['nickname']
73
+ self.avatar_url = res['headimgurl']
74
+ self.save
75
+ res
76
+ end
77
+
78
+ def refresh_access_token
79
+ params = {
80
+ appid: app_id,
81
+ grant_type: 'refresh_token',
82
+ refresh_token: refresh_token
83
+ }
84
+
85
+ response = HTTPX.get 'https://api.weixin.qq.com/sns/oauth2/refresh_token', params: params
86
+ res = JSON.parse(response.to_s)
87
+ self.assign_attributes res.slice('access_token', 'refresh_token')
88
+ self.expires_at = Time.current + res['expires_in'].to_i
89
+ self.save
90
+ res
91
+ end
92
+
93
+ def assign_info(oauth_params)
94
+ info_params = oauth_params.fetch('info', {})
95
+ self.name = info_params['nickname']
96
+ self.avatar_url = info_params['headimgurl']
97
+
98
+ raw_info = oauth_params.dig('extra', 'raw_info') || {}
99
+ self.unionid = raw_info['unionid']
100
+ self.app_id ||= raw_info['app_id']
101
+
102
+ credential_params = oauth_params.fetch('credentials', {})
103
+ self.access_token = credential_params['token']
104
+ self.refresh_token = credential_params['refresh_token']
105
+ self.expires_at = Time.current + credential_params['expires_in'].to_i
106
+ end
107
+
108
+ end
109
+ end
@@ -0,0 +1,87 @@
1
+ module Wechat
2
+ module Model::Platform
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ attribute :name, :string
7
+ attribute :appid, :string
8
+ attribute :secret, :string
9
+ attribute :token, :string
10
+ attribute :encoding_aes_key, :string
11
+ attribute :verify_ticket, :string
12
+ attribute :access_token, :string
13
+ attribute :access_token_expires_at, :datetime
14
+ attribute :pre_auth_code, :string
15
+ attribute :pre_auth_code_expires_at, :datetime
16
+
17
+ has_many :agencies
18
+ has_many :auths
19
+ has_many :receives, dependent: :nullify
20
+ end
21
+
22
+ def api
23
+ return @api if defined? @api
24
+ @api = Wechat::Api::Platform.new(self)
25
+ end
26
+
27
+ def refresh_pre_auth_code
28
+ token_hash = api.create_preauthcode
29
+ if token_hash.is_a?(Hash) && token_hash['pre_auth_code']
30
+ self.pre_auth_code = token_hash['pre_auth_code']
31
+ self.pre_auth_code_expires_at = Time.current + token_hash['expires_in'].to_i
32
+ self.save
33
+ else
34
+ raise Wechat::InvalidCredentialError, Hash(token_hash)['errmsg']
35
+ end
36
+ end
37
+
38
+ def access_token_valid?
39
+ return false unless access_token_expires_at.acts_like?(:time)
40
+ access_token_expires_at > Time.current
41
+ end
42
+
43
+ def pre_auth_code_valid?
44
+ return false unless pre_auth_code_expires_at.acts_like?(:time)
45
+ pre_auth_code_expires_at > 3.minutes.since
46
+ end
47
+
48
+ def refresh_access_token
49
+ r = api.component_token
50
+ store_access_token(r)
51
+ end
52
+
53
+ def store_access_token(token_hash)
54
+ self.access_token = token_hash['component_access_token']
55
+ self.access_token_expires_at = Time.current + token_hash['expires_in'].to_i
56
+ self.save
57
+ end
58
+
59
+ def auth_url
60
+ return if verify_ticket.blank?
61
+ refresh_pre_auth_code unless pre_auth_code_valid?
62
+ url = URI('https://mp.weixin.qq.com/dashboard/cgi-bin/componentloginpage')
63
+ url.query = {
64
+ component_appid: appid,
65
+ pre_auth_code: pre_auth_code,
66
+ redirect_uri: Rails.application.routes.url_for(controller: 'wechat/platforms', action: 'callback', id: self.id)
67
+ }.to_query
68
+ url.to_s
69
+ end
70
+
71
+ def click_auth_url
72
+ return if verify_ticket.blank?
73
+ refresh_pre_auth_code unless pre_auth_code_valid?
74
+ url = URI('https://mp.weixin.qq.com/safe/bindcomponent')
75
+ url.query = {
76
+ action: 'bindcomponent',
77
+ auth_type: 1,
78
+ no_scan: 1,
79
+ component_appid: appid,
80
+ pre_auth_code: pre_auth_code,
81
+ redirect_uri: Rails.application.routes.url_for(controller: 'wechat/platforms', action: 'callback', id: self.id)
82
+ }.to_query
83
+ url.to_s
84
+ end
85
+
86
+ end
87
+ end
@@ -0,0 +1,34 @@
1
+ module Wechat
2
+ module Model::Post
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ attribute :thumb_media_id, :string
7
+ end
8
+
9
+ def to_wechat
10
+ r = app.api.material_add_news xx
11
+ if r['media_id']
12
+ post_sync = app.post_syncs.find_or_initialize_by(source_id: r['media_id'])
13
+ post_sync.post = self
14
+ post_sync.save
15
+ end
16
+ end
17
+
18
+ def app
19
+ return @app if defined? @app
20
+ @app = WechatApp.first
21
+ end
22
+
23
+ def xx
24
+ {
25
+ title: title,
26
+ thumb_media_id: thumb_media_id,
27
+ show_cover_pic: 0,
28
+ content: content,
29
+ content_source_url: 'https://one.work'
30
+ }
31
+ end
32
+
33
+ end
34
+ end
@@ -0,0 +1,120 @@
1
+ module Wechat
2
+ module Model::Receive
3
+ # see: https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Receiving_standard_messages.html
4
+ MSG_TYPE = {
5
+ 'text' => 'Wechat::TextRequest',
6
+ 'image' => 'Wechat::ImageRequest',
7
+ 'voice' => 'Wechat::VoiceRequest',
8
+ 'video' => 'Wechat::VideoRequest',
9
+ 'shortvideo' => 'Wechat::ShortVideoRequest',
10
+ 'location' => 'Wechat::LocationRequest',
11
+ 'link' => 'Wechat::LinkRequest',
12
+ 'event' => 'Wechat::EventRequest'
13
+ }.freeze
14
+ # https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Receiving_event_pushes.html
15
+ # https://work.weixin.qq.com/api/doc/90000/90135/90240
16
+ EVENT = {
17
+ 'subscribe' => 'Wechat::SubscribeRequest',
18
+ 'unsubscribe' => 'Wechat::UnsubscribeRequest',
19
+ 'LOCATION' => 'Wechat::LocationRequest', # 公众号与企业微信通用
20
+ 'CLICK' => 'Wechat::ClickRequest',
21
+ 'VIEW' => 'Wechat::ViewRequest',
22
+ 'SCAN' => 'Wechat::ScanRequest',
23
+ 'click' => 'Wechat::Request',
24
+ 'view' => 'Wechat::Request', # 企业微信使用
25
+ 'scancode_push' => 'Wechat::Request',
26
+ 'scancode_waitmsg' => 'Wechat::Request',
27
+ 'pic_sysphoto' => 'Wechat::Request',
28
+ 'pic_photo_or_album' => 'Wechat::Request',
29
+ 'pic_weixin' => 'Wechat::Request',
30
+ 'location_select' => 'Wechat::Request',
31
+ 'enter_agent' => 'Wechat::Request',
32
+ 'batch_job_result' => 'Wechat::Request' # 企业微信使用
33
+ }.freeze
34
+ extend ActiveSupport::Concern
35
+
36
+ included do
37
+ attribute :appid, :string, index: true
38
+ attribute :open_id, :string, index: true
39
+ attribute :msg_id, :string
40
+ attribute :msg_type, :string
41
+ attribute :content, :string
42
+ attribute :encrypt_data, :string
43
+ attribute :message_hash, :json
44
+
45
+ belongs_to :platform, optional: true
46
+ belongs_to :app, foreign_key: :appid, primary_key: :appid, optional: true
47
+ belongs_to :wechat_user, foreign_key: :open_id, primary_key: :uid, optional: true
48
+
49
+ has_one :request
50
+
51
+ before_save :decrypt_data, if: -> { encrypt_data_changed? && encrypt_data.present? }
52
+ before_save :parse_message_hash, if: -> { message_hash_changed? && message_hash.present? }
53
+ after_create :parse_content
54
+ after_create_commit :check_app
55
+ end
56
+
57
+ def decrypt_data
58
+ aes_key = platform ? platform.encoding_aes_key : app.encoding_aes_key
59
+ r = Wechat::Cipher.decrypt(Base64.decode64(encrypt_data), aes_key)
60
+ content, _ = Wechat::Cipher.unpack(r)
61
+
62
+ self.message_hash = Hash.from_xml(content).fetch('xml', {})
63
+ end
64
+
65
+ def parse_message_hash
66
+ self.open_id = message_hash['FromUserName']
67
+ self.msg_type = message_hash['MsgType']
68
+ self.msg_id = message_hash['MsgId']
69
+ end
70
+
71
+ def compute_type
72
+ if msg_type == 'event'
73
+ EVENT[message_hash['Event']]
74
+ else
75
+ MSG_TYPE[msg_type]
76
+ end
77
+ end
78
+
79
+ def parse_content
80
+ build_request(type: compute_type)
81
+ request.appid = appid
82
+ request.open_id = open_id
83
+ request.generate_wechat_user # Should before get reply
84
+ request.msg_type = msg_type
85
+ request.raw_body = message_hash.except('ToUserName', 'FromUserName', 'CreateTime', 'MsgType')
86
+
87
+ case msg_type
88
+ when 'text'
89
+ request.body = message_hash['Content']
90
+ when 'event'
91
+ request.event = message_hash['Event']
92
+ request.event_key = message_hash['EventKey'] || message_hash.dig('ScanCodeInfo', 'ScanResult')
93
+ if request.event == 'subscribe'
94
+ request.body = request.event_key.delete_prefix('qrscene_')
95
+ else
96
+ request.body = request.event_key
97
+ end
98
+ when 'image'
99
+ request.body = message_hash['PicUrl']
100
+ when 'voice'
101
+ request.body = message_hash['Recognition'].presence || message_hash['MediaId']
102
+ when 'video', 'shortvideo'
103
+ request.body = message_hash['MediaId']
104
+ when 'location'
105
+ request.body = "#{message_hash['Location_X']}:#{message_hash['Location_Y']}"
106
+ when 'link'
107
+ request.body = message_hash['Url']
108
+ else
109
+ warn "Don't know how to parse message as #{message_hash['MsgType']}", uplevel: 1
110
+ end
111
+
112
+ self.save # will auto save wechat request
113
+ end
114
+
115
+ def check_app
116
+ app.update user_name: message_hash['ToUserName'] if app
117
+ end
118
+
119
+ end
120
+ end