rails_wechat 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/LICENSE +20 -165
- data/README.md +28 -20
- data/app/apis/wechat/access_token_expired_error.rb +3 -0
- data/app/apis/wechat/api/base/datacube.rb +14 -0
- data/app/apis/wechat/api/base/sns.rb +36 -0
- data/app/apis/wechat/api/base.rb +40 -0
- data/app/apis/wechat/api/platform/component.rb +54 -0
- data/app/apis/wechat/api/platform.rb +15 -0
- data/app/apis/wechat/api/program/wxa.rb +21 -0
- data/app/apis/wechat/api/program/wxaapi.rb +31 -0
- data/app/apis/wechat/api/program.rb +11 -0
- data/app/apis/wechat/api/public/base.rb +73 -0
- data/app/apis/wechat/api/public/material.rb +54 -0
- data/app/apis/wechat/api/public/menu.rb +43 -0
- data/app/apis/wechat/api/public/mp.rb +11 -0
- data/app/apis/wechat/api/public/user.rb +73 -0
- data/app/apis/wechat/api/public.rb +12 -0
- data/app/apis/wechat/api/work/agent.rb +26 -0
- data/app/apis/wechat/api/work/menu.rb +47 -0
- data/app/apis/wechat/api/work/user.rb +116 -0
- data/app/apis/wechat/api/work.rb +14 -0
- data/app/apis/wechat/api.rb +7 -0
- data/app/apis/wechat/app_not_found.rb +3 -0
- data/app/apis/wechat/cipher.rb +82 -0
- data/app/apis/wechat/http_client.rb +80 -0
- data/app/apis/wechat/invalid_credential_error.rb +3 -0
- data/app/apis/wechat/message/base.rb +17 -0
- data/app/apis/wechat/message/mass/public.rb +40 -0
- data/app/apis/wechat/message/mass/work.rb +84 -0
- data/app/apis/wechat/message/mass.rb +22 -0
- data/app/apis/wechat/message.rb +7 -0
- data/app/apis/wechat/response_error.rb +10 -0
- data/app/apis/wechat/signature.rb +32 -0
- data/app/apis/wechat/wechat_error.rb +3 -0
- data/app/controllers/wechat/admin/accounts_controller.rb +25 -0
- data/app/controllers/wechat/admin/apps_controller.rb +66 -0
- data/app/controllers/wechat/admin/base_controller.rb +7 -1
- data/app/controllers/wechat/admin/extractors_controller.rb +49 -0
- data/app/controllers/wechat/admin/menus_controller.rb +69 -0
- data/app/controllers/wechat/admin/news_reply_items_controller.rb +16 -0
- data/app/controllers/wechat/admin/notices_controller.rb +40 -0
- data/app/controllers/wechat/admin/registers_controller.rb +82 -0
- data/app/controllers/wechat/admin/replies_controller.rb +55 -0
- data/app/controllers/wechat/admin/requests_controller.rb +23 -0
- data/app/controllers/wechat/admin/responses_controller.rb +66 -0
- data/app/controllers/wechat/admin/tags_controller.rb +43 -0
- data/app/controllers/wechat/admin/templates_controller.rb +48 -0
- data/app/controllers/wechat/admin/wechat_users_controller.rb +31 -0
- data/app/controllers/wechat/apps_controller.rb +62 -0
- data/app/controllers/wechat/base_controller.rb +5 -0
- data/app/controllers/wechat/controller/application.rb +78 -0
- data/app/controllers/wechat/my/base_controller.rb +4 -0
- data/app/controllers/wechat/my/medias_controller.rb +56 -0
- data/app/controllers/wechat/my/registers_controller.rb +74 -0
- data/app/controllers/wechat/my/subscribes_controller.rb +18 -0
- data/app/controllers/wechat/my/users_controller.rb +18 -0
- data/app/controllers/wechat/my/wechat_users_controller.rb +37 -0
- data/app/controllers/wechat/panel/agencies_controller.rb +26 -0
- data/app/controllers/wechat/panel/apps_controller.rb +50 -0
- data/app/controllers/wechat/panel/base_controller.rb +3 -2
- data/app/controllers/wechat/panel/menus_controller.rb +60 -0
- data/app/controllers/wechat/panel/platforms_controller.rb +38 -0
- data/app/controllers/wechat/panel/template_configs_controller.rb +39 -0
- data/app/controllers/wechat/platforms_controller.rb +60 -0
- data/app/controllers/wechat/program_users_controller.rb +86 -0
- data/app/controllers/wechat/share/apps_controller.rb +21 -0
- data/app/controllers/wechat/share/base_controller.rb +10 -0
- data/app/controllers/wechat/share/menus_controller.rb +93 -0
- data/app/controllers/wechat/share/scenes_controller.rb +62 -0
- data/app/controllers/wechat/share/wechat_users_controller.rb +57 -0
- data/app/controllers/wechat/wechat_controller.rb +39 -0
- data/app/controllers/wechat/wechats_controller.rb +41 -19
- data/app/jobs/wechat/agency_job.rb +9 -0
- data/app/jobs/wechat/annunciate_job.rb +10 -0
- data/app/jobs/wechat/file_reply_upload_job.rb +10 -0
- data/app/jobs/wechat/media_job.rb +10 -0
- data/app/jobs/wechat/notice_send_job.rb +10 -0
- data/app/jobs/wechat/qrcode_job.rb +10 -0
- data/app/jobs/wechat/tag_job.rb +10 -0
- data/app/jobs/wechat/user_info_job.rb +11 -0
- data/app/jobs/wechat/user_job.rb +11 -0
- data/app/jobs/wechat/user_tag_job.rb +11 -0
- data/app/jobs/wechat/user_tag_remove_job.rb +11 -0
- data/app/mailboxes/application_mailbox.rb +3 -0
- data/app/mailboxes/wechat_mailbox.rb +17 -0
- data/app/models/app/wechat/mobile_app.rb +5 -0
- data/app/models/app/wechat/program_app.rb +5 -0
- data/app/models/app/wechat/public_app.rb +5 -0
- data/app/models/app/wechat/read_app.rb +5 -0
- data/app/models/app/wechat/work_app.rb +5 -0
- data/app/models/menu/wechat/click_menu.rb +5 -0
- data/app/models/menu/wechat/mini_program_menu.rb +5 -0
- data/app/models/menu/wechat/parent_menu.rb +5 -0
- data/app/models/menu/wechat/scan_push_menu.rb +5 -0
- data/app/models/menu/wechat/scan_wait_menu.rb +5 -0
- data/app/models/menu/wechat/view_menu.rb +5 -0
- data/app/models/notice/wechat/program_notice.rb +5 -0
- data/app/models/notice/wechat/public_notice.rb +5 -0
- data/app/models/oauth_user/wechat/program_user.rb +5 -0
- data/app/models/oauth_user/wechat/wechat_user.rb +5 -0
- data/app/models/reply/wechat/image_reply.rb +5 -0
- data/app/models/reply/wechat/music_reply.rb +5 -0
- data/app/models/reply/wechat/news_reply.rb +5 -0
- data/app/models/reply/wechat/success_reply.rb +5 -0
- data/app/models/reply/wechat/text_reply.rb +5 -0
- data/app/models/reply/wechat/video_reply.rb +5 -0
- data/app/models/reply/wechat/voice_reply.rb +5 -0
- data/app/models/request/wechat/click_request.rb +5 -0
- data/app/models/request/wechat/image_request.rb +5 -0
- data/app/models/request/wechat/link_request.rb +5 -0
- data/app/models/request/wechat/location_request.rb +5 -0
- data/app/models/request/wechat/scan_request.rb +5 -0
- data/app/models/request/wechat/short_video_request.rb +4 -0
- data/app/models/request/wechat/subscribe_request.rb +5 -0
- data/app/models/request/wechat/text_request.rb +5 -0
- data/app/models/request/wechat/unsubscribe_request.rb +5 -0
- data/app/models/request/wechat/video_request.rb +5 -0
- data/app/models/request/wechat/view_request.rb +5 -0
- data/app/models/request/wechat/voice_request.rb +5 -0
- data/app/models/service/wechat/image_service.rb +5 -0
- data/app/models/service/wechat/mpnews_service.rb +5 -0
- data/app/models/service/wechat/msgmenu_service.rb +5 -0
- data/app/models/service/wechat/news_service.rb +5 -0
- data/app/models/service/wechat/text_service.rb +5 -0
- data/app/models/service/wechat/video_service.rb +5 -0
- data/app/models/service/wechat/voice_service.rb +5 -0
- data/app/models/template_config/wechat/template_program.rb +5 -0
- data/app/models/template_config/wechat/template_public.rb +5 -0
- data/app/models/wechat/agency.rb +6 -0
- data/app/models/wechat/app.rb +6 -0
- data/app/models/wechat/application_record.rb +5 -0
- data/app/models/wechat/auth.rb +5 -0
- data/app/models/wechat/ext/effective.rb +10 -0
- data/app/models/wechat/ext/organ.rb +14 -0
- data/app/models/wechat/ext/subscribed.rb +14 -0
- data/app/models/wechat/ext/user.rb +21 -0
- data/app/models/wechat/ext/user_tag.rb +38 -0
- data/app/models/wechat/extraction.rb +5 -0
- data/app/models/wechat/extractor.rb +5 -0
- data/app/models/wechat/hook.rb +5 -0
- data/app/models/wechat/media.rb +5 -0
- data/app/models/wechat/menu.rb +5 -0
- data/app/models/wechat/model/account.rb +23 -0
- data/app/models/wechat/model/agency.rb +70 -0
- data/app/models/wechat/model/annunciate.rb +32 -0
- data/app/models/wechat/model/app/mobile_app.rb +11 -0
- data/app/models/wechat/model/app/program_app.rb +18 -0
- data/app/models/wechat/model/app/public_app.rb +46 -0
- data/app/models/wechat/model/app/read_app.rb +24 -0
- data/app/models/wechat/model/app/work_app.rb +33 -0
- data/app/models/wechat/model/app.rb +198 -0
- data/app/models/wechat/model/app_sync.rb +35 -0
- data/app/models/wechat/model/auth.rb +35 -0
- data/app/models/wechat/model/extraction.rb +21 -0
- data/app/models/wechat/model/extractor.rb +77 -0
- data/app/models/wechat/model/hook.rb +13 -0
- data/app/models/wechat/model/media.rb +33 -0
- data/app/models/wechat/model/menu/click_menu.rb +18 -0
- data/app/models/wechat/model/menu/mini_program_menu.rb +20 -0
- data/app/models/wechat/model/menu/parent_menu.rb +17 -0
- data/app/models/wechat/model/menu/scan_push_menu.rb +18 -0
- data/app/models/wechat/model/menu/scan_wait_menu.rb +18 -0
- data/app/models/wechat/model/menu/view_menu.rb +37 -0
- data/app/models/wechat/model/menu.rb +28 -0
- data/app/models/wechat/model/news_reply_item.rb +29 -0
- data/app/models/wechat/model/notice/program_notice.rb +19 -0
- data/app/models/wechat/model/notice/public_notice.rb +25 -0
- data/app/models/wechat/model/notice.rb +56 -0
- data/app/models/wechat/model/oauth_user/program_user.rb +29 -0
- data/app/models/wechat/model/oauth_user/wechat_user.rb +109 -0
- data/app/models/wechat/model/platform.rb +87 -0
- data/app/models/wechat/model/post.rb +34 -0
- data/app/models/wechat/model/receive.rb +120 -0
- data/app/models/wechat/model/register.rb +137 -0
- data/app/models/wechat/model/reply/image_reply.rb +41 -0
- data/app/models/wechat/model/reply/music_reply.rb +20 -0
- data/app/models/wechat/model/reply/news_reply.rb +24 -0
- data/app/models/wechat/model/reply/success_reply.rb +9 -0
- data/app/models/wechat/model/reply/text_reply.rb +14 -0
- data/app/models/wechat/model/reply/video_reply.rb +20 -0
- data/app/models/wechat/model/reply/voice_reply.rb +16 -0
- data/app/models/wechat/model/reply.rb +39 -0
- data/app/models/wechat/model/request/click_request.rb +25 -0
- data/app/models/wechat/model/request/image_request.rb +9 -0
- data/app/models/wechat/model/request/link_request.rb +9 -0
- data/app/models/wechat/model/request/location_request.rb +9 -0
- data/app/models/wechat/model/request/scan_request.rb +17 -0
- data/app/models/wechat/model/request/subscribe_request.rb +10 -0
- data/app/models/wechat/model/request/text_request.rb +20 -0
- data/app/models/wechat/model/request/unsubscribe_request.rb +4 -0
- data/app/models/wechat/model/request/video_request.rb +9 -0
- data/app/models/wechat/model/request/view_request.rb +4 -0
- data/app/models/wechat/model/request/voice_request.rb +9 -0
- data/app/models/wechat/model/request.rb +168 -0
- data/app/models/wechat/model/response.rb +41 -0
- data/app/models/wechat/model/scene.rb +101 -0
- data/app/models/wechat/model/scene_menu.rb +12 -0
- data/app/models/wechat/model/service/image_service.rb +18 -0
- data/app/models/wechat/model/service/mpnews_service.rb +10 -0
- data/app/models/wechat/model/service/msgmenu_service.rb +10 -0
- data/app/models/wechat/model/service/news_service.rb +10 -0
- data/app/models/wechat/model/service/text_service.rb +18 -0
- data/app/models/wechat/model/service/video_service.rb +10 -0
- data/app/models/wechat/model/service/voice_service.rb +10 -0
- data/app/models/wechat/model/service.rb +42 -0
- data/app/models/wechat/model/subscribe.rb +20 -0
- data/app/models/wechat/model/tag.rb +56 -0
- data/app/models/wechat/model/template.rb +82 -0
- data/app/models/wechat/model/template_config/template_program.rb +31 -0
- data/app/models/wechat/model/template_config/template_public.rb +37 -0
- data/app/models/wechat/model/template_config.rb +44 -0
- data/app/models/wechat/model/template_key_word.rb +20 -0
- data/app/models/wechat/model/ticket.rb +28 -0
- data/app/models/wechat/model/user_tag.rb +42 -0
- data/app/models/wechat/model/user_tagged.rb +22 -0
- data/app/models/wechat/model/wechat_message_tag.rb +11 -0
- data/app/models/wechat/news_reply_item.rb +5 -0
- data/app/models/wechat/notice.rb +5 -0
- data/app/models/wechat/platform.rb +5 -0
- data/app/models/wechat/receive.rb +5 -0
- data/app/models/wechat/reply.rb +5 -0
- data/app/models/wechat/request.rb +5 -0
- data/app/models/wechat/response.rb +5 -0
- data/app/models/wechat/scene.rb +5 -0
- data/app/models/wechat/scene_menu.rb +5 -0
- data/app/models/wechat/service.rb +5 -0
- data/app/models/wechat/subscribe.rb +5 -0
- data/app/models/wechat/tag.rb +5 -0
- data/app/models/wechat/template.rb +5 -0
- data/app/models/wechat/template_config.rb +5 -0
- data/app/models/wechat/template_key_word.rb +5 -0
- data/app/models/wechat/ticket.rb +5 -0
- data/app/models/wechat/user_tag.rb +5 -0
- data/app/models/wechat.rb +11 -0
- data/app/views/admin/_wechat_nav.html.erb +11 -0
- data/app/views/application/wechat_require_login.json.jbuilder +2 -0
- data/app/views/my/_wechat_nav.html+phone.erb +10 -0
- data/app/views/my/_wechat_nav.html.erb +4 -0
- data/app/views/panel/_wechat_nav.html.erb +13 -0
- data/app/{assets/config/rails_wechat_manifest.js → views/wechat/admin/accounts/qrcode.json.jbuilder} +0 -0
- data/app/views/wechat/admin/accounts/qrcode.turbo_stream.erb +3 -0
- data/app/views/wechat/admin/apps/_cert_form.html.erb +4 -0
- data/app/views/wechat/admin/apps/_edit_form.html.erb +4 -0
- data/app/views/wechat/admin/apps/_filter_form.html.erb +9 -0
- data/app/views/wechat/admin/apps/_form.html.erb +6 -0
- data/app/views/wechat/admin/apps/_index_tbody.html.erb +61 -0
- data/app/views/wechat/admin/apps/_index_thead.html.erb +7 -0
- data/app/views/wechat/admin/apps/_index_tr.html.erb +22 -0
- data/app/views/wechat/admin/apps/_info.html.erb +20 -0
- data/app/views/wechat/admin/apps/_new_form.html.erb +4 -0
- data/app/views/wechat/admin/apps/_pay_form.html.erb +7 -0
- data/app/views/wechat/admin/apps/_qy_form.html.erb +4 -0
- data/app/views/wechat/admin/apps/_show.json.jbuilder +1 -0
- data/app/views/wechat/admin/apps/_show_table.html.erb +36 -0
- data/app/views/wechat/admin/apps/_wechat_app.json.jbuilder +18 -0
- data/app/views/wechat/admin/apps/edit_cert.html.erb +3 -0
- data/app/views/wechat/admin/apps/index.html.erb +5 -0
- data/app/views/wechat/admin/apps/index.json.jbuilder +1 -0
- data/app/views/wechat/admin/apps/info.html.erb +3 -0
- data/app/views/wechat/admin/base/_nav.html.erb +3 -0
- data/app/views/wechat/admin/base/_wechat_nav_user.html.erb +18 -0
- data/app/views/wechat/admin/extractors/_breadcrumb.html.erb +8 -0
- data/app/views/wechat/admin/extractors/_edit_form.html.erb +4 -0
- data/app/views/wechat/admin/extractors/_filter_form.html.erb +9 -0
- data/app/views/wechat/admin/extractors/_form.html.erb +21 -0
- data/app/views/wechat/admin/extractors/_index_tbody.html.erb +24 -0
- data/app/views/wechat/admin/extractors/_index_thead.html.erb +17 -0
- data/app/views/wechat/admin/extractors/_new_form.html.erb +4 -0
- data/app/views/wechat/admin/extractors/_show_table.html.erb +32 -0
- data/app/views/wechat/admin/extractors/index.html.erb +5 -0
- data/app/views/wechat/admin/menus/_breadcrumb.html.erb +9 -0
- data/app/views/wechat/admin/menus/_button.html.erb +9 -0
- data/app/views/wechat/admin/menus/_edit_form.html.erb +6 -0
- data/app/views/wechat/admin/menus/_edit_parent_form.html.erb +5 -0
- data/app/views/wechat/admin/menus/_filter_form.html.erb +8 -0
- data/app/views/wechat/admin/menus/_form.html.erb +7 -0
- data/app/views/wechat/admin/menus/_index_tbody.html.erb +16 -0
- data/app/views/wechat/admin/menus/_index_thead.html.erb +9 -0
- data/app/views/wechat/admin/menus/_index_tr.html.erb +24 -0
- data/app/views/wechat/admin/menus/_new_form.html.erb +6 -0
- data/app/views/wechat/admin/menus/_new_parent_form.html.erb +7 -0
- data/app/views/wechat/admin/menus/_show_table.html.erb +20 -0
- data/app/views/wechat/admin/menus/edit_parent.html.erb +3 -0
- data/app/views/wechat/admin/menus/index.html.erb +4 -0
- data/app/views/wechat/admin/menus/new_parent.html.erb +3 -0
- data/app/views/wechat/admin/menus/sync.turbo_stream.erb +3 -0
- data/app/views/wechat/admin/notices/_edit_form.html.erb +7 -0
- data/app/views/wechat/admin/notices/_filter_form.html.erb +9 -0
- data/app/views/wechat/admin/notices/_form.html.erb +3 -0
- data/app/views/wechat/admin/notices/_index_tbody.erb +3 -0
- data/app/views/wechat/admin/notices/_index_thead.html.erb +3 -0
- data/app/views/wechat/admin/notices/_new_form.html.erb +5 -0
- data/app/views/wechat/admin/notices/_show_table.html.erb +8 -0
- data/app/views/wechat/admin/notices/index.html.erb +5 -0
- data/app/views/wechat/admin/registers/_app_form.html.erb +5 -0
- data/app/views/wechat/admin/registers/_assign_form.html.erb +6 -0
- data/app/views/wechat/admin/registers/_bind_form.html.erb +5 -0
- data/app/views/wechat/admin/registers/_button.html.erb +3 -0
- data/app/views/wechat/admin/registers/_edit_form.html.erb +4 -0
- data/app/views/wechat/admin/registers/_filter_form.html.erb +10 -0
- data/app/views/wechat/admin/registers/_form.html.erb +5 -0
- data/app/views/wechat/admin/registers/_index_tbody.html.erb +37 -0
- data/app/views/wechat/admin/registers/_index_thead.html.erb +23 -0
- data/app/views/wechat/admin/registers/_index_tr.html.erb +25 -0
- data/app/views/wechat/admin/registers/_new_form.html.erb +4 -0
- data/app/views/wechat/admin/registers/_qrcode_form.html.erb +5 -0
- data/app/views/wechat/admin/registers/_show_table.html.erb +32 -0
- data/app/views/wechat/admin/registers/edit_app.turbo_stream.erb +3 -0
- data/app/views/wechat/admin/registers/edit_assign.turbo_stream.erb +3 -0
- data/app/views/wechat/admin/registers/edit_bind.turbo_stream.erb +3 -0
- data/app/views/wechat/admin/registers/edit_qrcode.turbo_stream.erb +3 -0
- data/app/views/wechat/admin/registers/index.html.erb +5 -0
- data/app/views/wechat/admin/replies/_breadcrumb.html.erb +7 -0
- data/app/views/wechat/admin/replies/_edit_form.html.erb +4 -0
- data/app/views/wechat/admin/replies/_filter_form.html.erb +9 -0
- data/app/views/wechat/admin/replies/_filter_table.html.erb +11 -0
- data/app/views/wechat/admin/replies/_form.html.erb +3 -0
- data/app/views/wechat/admin/replies/_image_form.html.erb +1 -0
- data/app/views/wechat/admin/replies/_index_tbody.html.erb +29 -0
- data/app/views/wechat/admin/replies/_index_thead.html.erb +3 -0
- data/app/views/wechat/admin/replies/_new_form.html.erb +4 -0
- data/app/views/wechat/admin/replies/_news_form.html.erb +6 -0
- data/app/views/wechat/admin/replies/_show_table.html.erb +12 -0
- data/app/views/wechat/admin/replies/_text_form.html.erb +1 -0
- data/app/views/wechat/admin/replies/add.html.erb +11 -0
- data/app/views/wechat/admin/replies/build.turbo_stream.erb +7 -0
- data/app/views/wechat/admin/replies/index.html.erb +5 -0
- data/app/views/wechat/admin/replies/index.js +12 -0
- data/app/views/wechat/admin/requests/_breadcrumb.html.erb +7 -0
- data/app/views/wechat/admin/requests/_button.html.erb +3 -0
- data/app/views/wechat/admin/requests/_filter_form.html.erb +10 -0
- data/app/views/wechat/admin/requests/_filter_table.html.erb +11 -0
- data/app/views/wechat/admin/requests/_index_tbody.html.erb +21 -0
- data/app/views/wechat/admin/requests/_index_thead.html.erb +6 -0
- data/app/views/wechat/admin/requests/_index_tr.html.erb +13 -0
- data/app/views/wechat/admin/requests/_show_table.html.erb +18 -0
- data/app/views/wechat/admin/requests/index.html.erb +5 -0
- data/app/views/wechat/admin/responses/_breadcrumb.html.erb +7 -0
- data/app/views/wechat/admin/responses/_edit_form.html.erb +4 -0
- data/app/views/wechat/admin/responses/_filter_form.html.erb +9 -0
- data/app/views/wechat/admin/responses/_filter_table.html.erb +11 -0
- data/app/views/wechat/admin/responses/_form.html.erb +4 -0
- data/app/views/wechat/admin/responses/_index_tbody.html.erb +27 -0
- data/app/views/wechat/admin/responses/_index_thead.html.erb +14 -0
- data/app/views/wechat/admin/responses/_index_tr.html.erb +19 -0
- data/app/views/wechat/admin/responses/_new_form.html.erb +4 -0
- data/app/views/wechat/admin/responses/_reply_body.html.erb +4 -0
- data/app/views/wechat/admin/responses/_reply_form.html.erb +5 -0
- data/app/views/wechat/admin/responses/_show/_breadcrumb.html.erb +8 -0
- data/app/views/wechat/admin/responses/_show_table.html.erb +35 -0
- data/app/views/wechat/admin/responses/edit_reply.html.erb +3 -0
- data/app/views/wechat/admin/responses/filter_reply.turbo_stream.erb +1 -0
- data/app/views/wechat/admin/responses/index.html.erb +5 -0
- data/app/views/wechat/admin/responses/show.html.erb +4 -0
- data/app/views/wechat/admin/tags/_button.html.erb +6 -0
- data/app/views/wechat/admin/tags/_edit_form.html.erb +4 -0
- data/app/views/wechat/admin/tags/_filter_form.html.erb +9 -0
- data/app/views/wechat/admin/tags/_form.html.erb +2 -0
- data/app/views/wechat/admin/tags/_index_tbody.html.erb +4 -0
- data/app/views/wechat/admin/tags/_index_thead.html.erb +5 -0
- data/app/views/wechat/admin/tags/_index_tr.html.erb +16 -0
- data/app/views/wechat/admin/tags/_new_form.html.erb +4 -0
- data/app/views/wechat/admin/tags/_show_table.html.erb +12 -0
- data/app/views/wechat/admin/tags/index.html.erb +6 -0
- data/app/views/wechat/admin/tags/sync.turbo_stream.erb +3 -0
- data/app/views/wechat/admin/templates/_breadcrumb.html.erb +7 -0
- data/app/views/wechat/admin/templates/_button.html.erb +5 -0
- data/app/views/wechat/admin/templates/_edit_form.html.erb +4 -0
- data/app/views/wechat/admin/templates/_filter_form.html.erb +9 -0
- data/app/views/wechat/admin/templates/_form.html.erb +6 -0
- data/app/views/wechat/admin/templates/_index_tbody.html.erb +13 -0
- data/app/views/wechat/admin/templates/_index_template_config.html.erb +16 -0
- data/app/views/wechat/admin/templates/_index_thead.html.erb +9 -0
- data/app/views/wechat/admin/templates/_new_form.html.erb +4 -0
- data/app/views/wechat/admin/templates/_show_table.html.erb +20 -0
- data/app/views/wechat/admin/templates/index.html.erb +5 -0
- data/app/views/wechat/admin/wechat_users/_edit_form.html.erb +5 -0
- data/app/views/wechat/admin/wechat_users/_filter_form.html.erb +9 -0
- data/app/views/wechat/admin/wechat_users/_index_tbody.html.erb +16 -0
- data/app/views/wechat/admin/wechat_users/_index_thead.html.erb +13 -0
- data/app/views/wechat/admin/wechat_users/_show_table.html.erb +20 -0
- data/app/views/wechat/admin/wechat_users/index.html.erb +7 -0
- data/app/views/wechat/apps/login.html.erb +1 -0
- data/app/views/wechat/my/medias/_edit_form.html.erb +4 -0
- data/app/views/wechat/my/medias/_filter_form.html.erb +9 -0
- data/app/views/wechat/my/medias/_form.html.erb +6 -0
- data/app/views/wechat/my/medias/_index_tbody.html.erb +5 -0
- data/app/views/wechat/my/medias/_index_thead.html.erb +6 -0
- data/app/views/wechat/my/medias/_new_form.html.erb +4 -0
- data/app/views/wechat/my/medias/_show_table.html.erb +20 -0
- data/app/views/wechat/my/medias/create.turbo_stream.erb +0 -0
- data/app/views/wechat/my/medias/index.html.erb +5 -0
- data/app/views/wechat/my/registers/_edit_form.html.erb +4 -0
- data/app/views/wechat/my/registers/_filter_form.html.erb +9 -0
- data/app/views/wechat/my/registers/_form.html+phone.erb +11 -0
- data/app/views/wechat/my/registers/_form.html.erb +4 -0
- data/app/views/wechat/my/registers/_new_form.html+phone.erb +4 -0
- data/app/views/wechat/my/registers/_new_form.html.erb +4 -0
- data/app/views/wechat/my/registers/_show_table.html.erb +8 -0
- data/app/views/wechat/my/registers/_wechat_register.html.erb +32 -0
- data/app/views/wechat/my/registers/_wechat_register_done.html.erb +29 -0
- data/app/views/wechat/my/registers/edit_code.html.erb +12 -0
- data/app/views/wechat/my/registers/index.html+phone.erb +16 -0
- data/app/views/wechat/my/registers/index.html.erb +36 -0
- data/app/views/wechat/my/registers/new.html.erb +1 -0
- data/app/views/wechat/my/subscribes/_filter_form.html.erb +7 -0
- data/app/views/wechat/my/subscribes/_form.html.erb +7 -0
- data/app/views/wechat/my/subscribes/_show_table.html.erb +12 -0
- data/app/views/wechat/my/subscribes/index.html.erb +40 -0
- data/app/views/wechat/my/users/invite_qrcode.html+phone.erb +35 -0
- data/app/views/wechat/my/users/invite_qrcode.html.erb +6 -0
- data/app/views/wechat/my/users/requests.html+phone.erb +53 -0
- data/app/views/wechat/panel/agencies/_breadcrumb.html.erb +6 -0
- data/app/views/wechat/panel/agencies/_button.html.erb +0 -0
- data/app/views/wechat/panel/agencies/_edit_form.html.erb +4 -0
- data/app/views/wechat/panel/agencies/_filter_form.html.erb +9 -0
- data/app/views/wechat/panel/agencies/_form.html.erb +6 -0
- data/app/views/wechat/panel/agencies/_index_tbody.html.erb +17 -0
- data/app/views/wechat/panel/agencies/_index_thead.html.erb +15 -0
- data/app/views/wechat/panel/agencies/_show_table.html.erb +20 -0
- data/app/views/wechat/panel/agencies/index.html.erb +5 -0
- data/app/views/wechat/panel/apps/_edit_form.html.erb +4 -0
- data/app/views/wechat/panel/apps/_filter_form.html.erb +9 -0
- data/app/views/wechat/panel/apps/_form.html.erb +17 -0
- data/app/views/wechat/panel/apps/_index_tbody.html.erb +52 -0
- data/app/views/wechat/panel/apps/_index_thead.html.erb +6 -0
- data/app/views/wechat/panel/apps/_index_tr.html.erb +16 -0
- data/app/views/wechat/panel/apps/_new_form.html.erb +4 -0
- data/app/views/wechat/panel/apps/_show.json.jbuilder +1 -0
- data/app/views/wechat/panel/apps/_show_table.html.erb +36 -0
- data/app/views/wechat/panel/apps/_wechat_app.json.jbuilder +18 -0
- data/app/views/wechat/panel/apps/edit_cert.html.erb +3 -0
- data/app/views/wechat/panel/apps/index.html.erb +5 -0
- data/app/views/wechat/panel/apps/index.json.jbuilder +1 -0
- data/app/views/wechat/panel/base/_nav.html.erb +3 -0
- data/app/views/wechat/panel/menus/_breadcrumb.html.erb +5 -0
- data/app/views/wechat/panel/menus/_button.html.erb +6 -0
- data/app/views/wechat/panel/menus/_edit_form.html.erb +6 -0
- data/app/views/wechat/panel/menus/_edit_parent_form.html.erb +5 -0
- data/app/views/wechat/panel/menus/_filter_form.html.erb +8 -0
- data/app/views/wechat/panel/menus/_form.html.erb +7 -0
- data/app/views/wechat/panel/menus/_index_tbody.html.erb +15 -0
- data/app/views/wechat/panel/menus/_index_thead.html.erb +8 -0
- data/app/views/wechat/panel/menus/_index_tr.html.erb +22 -0
- data/app/views/wechat/panel/menus/_new_form.html.erb +5 -0
- data/app/views/wechat/panel/menus/_new_parent_form.html.erb +7 -0
- data/app/views/wechat/panel/menus/_show_table.html.erb +20 -0
- data/app/views/wechat/panel/menus/edit_parent.turbo_stream.erb +1 -0
- data/app/views/wechat/panel/menus/index.html.erb +5 -0
- data/app/views/wechat/panel/menus/new_parent.html.erb +3 -0
- data/app/views/wechat/panel/platforms/_edit_form.html.erb +4 -0
- data/app/views/wechat/panel/platforms/_filter_form.html.erb +9 -0
- data/app/views/wechat/panel/platforms/_form.html.erb +7 -0
- data/app/views/wechat/panel/platforms/_index_tbody.html.erb +12 -0
- data/app/views/wechat/panel/platforms/_index_thead.html.erb +13 -0
- data/app/views/wechat/panel/platforms/_index_tr.html.erb +22 -0
- data/app/views/wechat/panel/platforms/_new_form.html.erb +4 -0
- data/app/views/wechat/panel/platforms/_show_table.html.erb +32 -0
- data/app/views/wechat/panel/platforms/index.html.erb +5 -0
- data/app/views/wechat/panel/template_configs/_edit_form.html.erb +10 -0
- data/app/views/wechat/panel/template_configs/_filter.html.erb +9 -0
- data/app/views/wechat/panel/template_configs/_index_tbody.html.erb +10 -0
- data/app/views/wechat/panel/template_configs/_index_thead.html.erb +11 -0
- data/app/views/wechat/panel/template_configs/_item_form.html.erb +6 -0
- data/app/views/wechat/panel/template_configs/_new_form.html.erb +7 -0
- data/app/views/wechat/panel/template_configs/_show_table.html.erb +28 -0
- data/app/views/wechat/panel/template_configs/index.html.erb +5 -0
- data/app/views/wechat/platforms/callback.html.erb +0 -0
- data/app/views/wechat/program_users/mobile_err.json.jbuilder +2 -0
- data/app/views/wechat/share/apps/_button.html.erb +0 -0
- data/app/views/wechat/share/apps/_filter_form.html.erb +9 -0
- data/app/views/wechat/share/apps/_form.html.erb +17 -0
- data/app/views/wechat/share/apps/_index_tbody.html.erb +27 -0
- data/app/views/wechat/share/apps/_index_thead.html.erb +5 -0
- data/app/views/wechat/share/apps/_index_tr.html.erb +10 -0
- data/app/views/wechat/share/apps/_show.json.jbuilder +1 -0
- data/app/views/wechat/share/apps/_show_table.html.erb +36 -0
- data/app/views/wechat/share/apps/_wechat_app.json.jbuilder +18 -0
- data/app/views/wechat/share/apps/index.html.erb +5 -0
- data/app/views/wechat/share/apps/index.json.jbuilder +1 -0
- data/app/views/wechat/share/base/_nav.html.erb +3 -0
- data/app/views/wechat/share/menus/_breadcrumb.html.erb +9 -0
- data/app/views/wechat/share/menus/_button.html.erb +9 -0
- data/app/views/wechat/share/menus/_edit_form.html.erb +6 -0
- data/app/views/wechat/share/menus/_edit_parent_form.html.erb +5 -0
- data/app/views/wechat/share/menus/_filter_form.html.erb +8 -0
- data/app/views/wechat/share/menus/_form.html.erb +10 -0
- data/app/views/wechat/share/menus/_index_tbody.html.erb +20 -0
- data/app/views/wechat/share/menus/_index_thead.html.erb +9 -0
- data/app/views/wechat/share/menus/_index_tr.html.erb +25 -0
- data/app/views/wechat/share/menus/_new_form.html.erb +5 -0
- data/app/views/wechat/share/menus/_new_parent_form.html.erb +7 -0
- data/app/views/wechat/share/menus/_show_table.html.erb +20 -0
- data/app/views/wechat/share/menus/edit_parent.turbo_stream.erb +1 -0
- data/app/views/wechat/share/menus/index.html.erb +4 -0
- data/app/views/wechat/share/menus/new_parent.html.erb +3 -0
- data/app/views/wechat/share/menus/sync.turbo_stream.erb +3 -0
- data/app/views/wechat/share/scenes/_breadcrumb.html.erb +7 -0
- data/app/views/wechat/share/scenes/_edit_form.html.erb +4 -0
- data/app/views/wechat/share/scenes/_filter_form.html.erb +9 -0
- data/app/views/wechat/share/scenes/_form.html.erb +3 -0
- data/app/views/wechat/share/scenes/_index_tbody.html.erb +9 -0
- data/app/views/wechat/share/scenes/_index_thead.html.erb +7 -0
- data/app/views/wechat/share/scenes/_index_tr.html.erb +25 -0
- data/app/views/wechat/share/scenes/_new_form.html.erb +4 -0
- data/app/views/wechat/share/scenes/_show_table.html.erb +10 -0
- data/app/views/wechat/share/scenes/index.html.erb +5 -0
- data/app/views/wechat/share/scenes/sync.turbo_stream.erb +3 -0
- data/app/views/wechat/share/wechat_users/_breadcrumb.html.erb +9 -0
- data/app/views/wechat/share/wechat_users/_button.html.erb +0 -0
- data/app/views/wechat/share/wechat_users/_edit_form.html.erb +4 -0
- data/app/views/wechat/share/wechat_users/_filter_form.html.erb +9 -0
- data/app/views/wechat/share/wechat_users/_index_tbody.html.erb +11 -0
- data/app/views/wechat/share/wechat_users/_index_thead.html.erb +12 -0
- data/app/views/wechat/share/wechat_users/_index_tr.html.erb +13 -0
- data/app/views/wechat/share/wechat_users/_show_table.html.erb +20 -0
- data/app/views/wechat/share/wechat_users/index.html.erb +5 -0
- data/app/views/wechat/share/wechat_users/try_match.turbo_stream.erb +3 -0
- data/app/views/wechat/wechat/login.html.erb +9 -0
- data/config/locales/en.controller.yml +28 -0
- data/config/locales/en.enum.yml +30 -0
- data/config/locales/zh.attributes.yml +66 -0
- data/config/locales/zh.controller.yml +79 -0
- data/config/locales/zh.enum.yml +65 -0
- data/config/routes.rb +142 -11
- data/lib/omniauth/strategies/wechat.rb +74 -0
- data/lib/omniauth/strategies/wechat_qiye.rb +82 -0
- data/lib/omniauth/strategies/wechat_qr.rb +21 -0
- data/lib/rails_wechat/config.rb +88 -0
- data/lib/rails_wechat/engine.rb +38 -0
- data/lib/rails_wechat/helpers.rb +32 -0
- data/lib/rails_wechat.rb +14 -3
- metadata +549 -44
- data/app/controllers/wechat/admin/wechat_configs_controller.rb +0 -86
- data/app/controllers/wechat/panel/wechat_configs_controller.rb +0 -62
- data/app/models/rails_wechat/organ.rb +0 -11
- data/app/models/wechat_config.rb +0 -44
- data/app/models/wechat_session.rb +0 -16
- data/app/views/wechat/admin/wechat_configs/_filter.html.erb +0 -8
- data/app/views/wechat/admin/wechat_configs/_form.html.erb +0 -21
- data/app/views/wechat/admin/wechat_configs/_show_table.html.erb +0 -80
- data/app/views/wechat/admin/wechat_configs/_wechat_config.json.jbuilder +0 -21
- data/app/views/wechat/admin/wechat_configs/edit.html.erb +0 -9
- data/app/views/wechat/admin/wechat_configs/edit.js.erb +0 -3
- data/app/views/wechat/admin/wechat_configs/index.html.erb +0 -84
- data/app/views/wechat/admin/wechat_configs/index.json.jbuilder +0 -1
- data/app/views/wechat/admin/wechat_configs/new.html.erb +0 -9
- data/app/views/wechat/admin/wechat_configs/new.js.erb +0 -3
- data/app/views/wechat/admin/wechat_configs/show.html.erb +0 -7
- data/app/views/wechat/admin/wechat_configs/show.js.erb +0 -3
- data/app/views/wechat/admin/wechat_configs/show.json.jbuilder +0 -1
- data/app/views/wechat/panel/wechat_configs/_filter.html.erb +0 -8
- data/app/views/wechat/panel/wechat_configs/_form.html.erb +0 -21
- data/app/views/wechat/panel/wechat_configs/_show_table.html.erb +0 -80
- data/app/views/wechat/panel/wechat_configs/_wechat_config.json.jbuilder +0 -21
- data/app/views/wechat/panel/wechat_configs/edit.html.erb +0 -9
- data/app/views/wechat/panel/wechat_configs/edit.js.erb +0 -3
- data/app/views/wechat/panel/wechat_configs/index.html.erb +0 -84
- data/app/views/wechat/panel/wechat_configs/index.json.jbuilder +0 -1
- data/app/views/wechat/panel/wechat_configs/new.html.erb +0 -9
- data/app/views/wechat/panel/wechat_configs/new.js.erb +0 -3
- data/app/views/wechat/panel/wechat_configs/show.html.erb +0 -7
- data/app/views/wechat/panel/wechat_configs/show.js.erb +0 -3
- data/app/views/wechat/panel/wechat_configs/show.json.jbuilder +0 -1
- data/lib/tasks/rails_wechat_tasks.rake +0 -4
@@ -0,0 +1,38 @@
|
|
1
|
+
module Wechat
|
2
|
+
module Ext::UserTag
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do
|
6
|
+
has_many :tags, class_name: 'Wechat::Tag', dependent: :destroy
|
7
|
+
|
8
|
+
after_save_commit :sync_tag_later, if: -> { saved_change_to_name? }
|
9
|
+
end
|
10
|
+
|
11
|
+
def sync_tag_later
|
12
|
+
Wechat::TagJob.perform_later(self)
|
13
|
+
end
|
14
|
+
|
15
|
+
def sync_tag
|
16
|
+
_app = app
|
17
|
+
return unless _app
|
18
|
+
wt = tags.find_or_initialize_by(appid: _app.appid)
|
19
|
+
wt.name = self.name
|
20
|
+
wt.save
|
21
|
+
end
|
22
|
+
|
23
|
+
def app
|
24
|
+
if self.respond_to? :organ_id
|
25
|
+
_organ_id = organ_id
|
26
|
+
else
|
27
|
+
_organ_id = nil
|
28
|
+
end
|
29
|
+
|
30
|
+
if App.column_names.include?('organ_id')
|
31
|
+
App.find_by(organ_id: _organ_id, primary: true)
|
32
|
+
else
|
33
|
+
App.find_by(primary: true)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Wechat
|
2
|
+
module Model::Account
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do
|
6
|
+
has_one :response, as: :effective
|
7
|
+
has_one :wechat_user, class_name: 'Wechat::WechatUser'
|
8
|
+
end
|
9
|
+
|
10
|
+
def invoke_effect(wechat_user)
|
11
|
+
old_account = wechat_user.account
|
12
|
+
if old_account == self
|
13
|
+
"您的微信账号已经绑定到账号 #{identity} 了"
|
14
|
+
elsif old_account
|
15
|
+
old_account.access_tokens.delete_all # 更改绑定关系后,old account 登陆失效
|
16
|
+
"您的微信账号已更换绑定账号, 之前绑定的账号是#{old_account.identity}, 已经绑定到#{identity}"
|
17
|
+
else
|
18
|
+
"您的微信账号绑定至账号 #{identity} 成功"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
module Wechat
|
2
|
+
module Model::Agency
|
3
|
+
SERVICE_TYPE = {
|
4
|
+
'0' => 'WechatRead',
|
5
|
+
'1' => 'WechatRead',
|
6
|
+
'2' => 'WechatPublic'
|
7
|
+
}.freeze
|
8
|
+
extend ActiveSupport::Concern
|
9
|
+
|
10
|
+
included do
|
11
|
+
attribute :appid, :string
|
12
|
+
attribute :access_token, :string
|
13
|
+
attribute :access_token_expires_at, :datetime
|
14
|
+
attribute :refresh_token, :string
|
15
|
+
attribute :func_infos, :string, array: true
|
16
|
+
attribute :nick_name, :string
|
17
|
+
attribute :head_img, :string
|
18
|
+
attribute :user_name, :string
|
19
|
+
attribute :principal_name, :string
|
20
|
+
attribute :alias_name, :string
|
21
|
+
attribute :qrcode_url, :string
|
22
|
+
attribute :business_info, :json
|
23
|
+
attribute :service_type, :string
|
24
|
+
attribute :verify_type, :string
|
25
|
+
|
26
|
+
belongs_to :platform
|
27
|
+
belongs_to :app, foreign_key: :appid, primary_key: :appid, optional: true
|
28
|
+
|
29
|
+
after_create_commit :store_info_later
|
30
|
+
before_save :init_app, if: -> { appid_changed? && appid }
|
31
|
+
end
|
32
|
+
|
33
|
+
def api
|
34
|
+
return @api if defined? @api
|
35
|
+
@api = Wechat::Api::Public.new(self)
|
36
|
+
end
|
37
|
+
|
38
|
+
def init_app
|
39
|
+
app || build_app
|
40
|
+
app.save
|
41
|
+
end
|
42
|
+
|
43
|
+
def refresh_access_token
|
44
|
+
r = platform.api.authorizer_token(appid, refresh_token)
|
45
|
+
store_access_token(r)
|
46
|
+
end
|
47
|
+
|
48
|
+
def store_info_later
|
49
|
+
AgencyJob.perform_later(self)
|
50
|
+
end
|
51
|
+
|
52
|
+
def store_info
|
53
|
+
r = platform.api.get_authorizer_info(appid)
|
54
|
+
self.assign_attributes r.slice('nick_name', 'head_img', 'user_name', 'principal_name', 'qrcode_url', 'business_info')
|
55
|
+
self.alias_name = r['alias']
|
56
|
+
self.service_type = r.dig('service_type_info', 'id')
|
57
|
+
self.verify_type = r.dig('verify_type_info', 'id')
|
58
|
+
self.save
|
59
|
+
end
|
60
|
+
|
61
|
+
def store_access_token(r)
|
62
|
+
self.access_token = r['authorizer_access_token']
|
63
|
+
self.access_token_expires_at = Time.current + r['expires_in'].to_i
|
64
|
+
self.refresh_token = r['authorizer_refresh_token']
|
65
|
+
self.func_infos = r['func_info'].map { |i| i.dig('funcscope_category', 'id') } if r['func_info'].is_a?(Array)
|
66
|
+
self.save
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Wechat
|
2
|
+
module Model::Annunciate
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do
|
6
|
+
after_create_commit :to_wechat_later
|
7
|
+
end
|
8
|
+
|
9
|
+
def to_wechat_later
|
10
|
+
AnnunciateJob.perform_later(self)
|
11
|
+
end
|
12
|
+
|
13
|
+
def to_wechat
|
14
|
+
app = PublicApp.valid.find_by(organ_id: annunciation.organ_id, primary: true)
|
15
|
+
|
16
|
+
return unless app
|
17
|
+
|
18
|
+
tag_ids = app.tags.where(user_tag_id: user_tag_id).pluck(:tag_id)
|
19
|
+
if tag_ids.present?
|
20
|
+
api = app.api
|
21
|
+
tag_ids.each do |tag_id|
|
22
|
+
api.message_mass_sendall(body, tag_id)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def body
|
28
|
+
annunciation.body
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Wechat
|
2
|
+
module Model::App::ProgramApp
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do
|
6
|
+
end
|
7
|
+
|
8
|
+
def api
|
9
|
+
return @api if defined? @api
|
10
|
+
@api = Wechat::Api::Program.new(self)
|
11
|
+
end
|
12
|
+
|
13
|
+
def template_messenger(template)
|
14
|
+
Wechat::Message::Template::Program.new(self, template)
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module Wechat
|
2
|
+
module Model::App::PublicApp
|
3
|
+
|
4
|
+
def sync_templates
|
5
|
+
templates = api.templates
|
6
|
+
templates.each do |template|
|
7
|
+
template = templates.find_or_initialize_by(template_id: template['template_id'])
|
8
|
+
template.assign_attributes template.slice('title', 'content', 'example')
|
9
|
+
template.save
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def oauth2_url(scope = 'snsapi_userinfo', state: SecureRandom.hex(16), **host_options)
|
14
|
+
h = {
|
15
|
+
appid: appid,
|
16
|
+
redirect_uri: Rails.application.routes.url_for(controller: 'wechat/apps', action: 'login', id: id, **host_options),
|
17
|
+
response_type: 'code',
|
18
|
+
scope: scope,
|
19
|
+
state: state
|
20
|
+
}
|
21
|
+
logger.debug "\e[35m Detail: #{h} \e[0m"
|
22
|
+
"https://open.weixin.qq.com/connect/oauth2/authorize?#{h.to_query}#wechat_redirect"
|
23
|
+
end
|
24
|
+
|
25
|
+
def oauth2_data_url(scope = 'snsapi_userinfo', **host_options)
|
26
|
+
r = oauth2_url(scope, **host_options)
|
27
|
+
QrcodeHelper.data_url(r)
|
28
|
+
end
|
29
|
+
|
30
|
+
def generate_wechat_user(code)
|
31
|
+
h = {
|
32
|
+
appid: appid,
|
33
|
+
secret: secret,
|
34
|
+
code: code,
|
35
|
+
grant_type: 'authorization_code'
|
36
|
+
}
|
37
|
+
r = HTTPX.get "https://api.weixin.qq.com/sns/oauth2/access_token?#{h.to_query}"
|
38
|
+
result = JSON.parse(r.body.to_s)
|
39
|
+
wechat_user = wechat_users.find_or_initialize_by(uid: result['openid'])
|
40
|
+
wechat_user.assign_attributes result.slice('access_token', 'refresh_token', 'unionid')
|
41
|
+
wechat_user.expires_at = Time.current + result['expires_in'].to_i
|
42
|
+
wechat_user
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Wechat
|
2
|
+
module Model::App::ReadApp
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do
|
6
|
+
|
7
|
+
end
|
8
|
+
|
9
|
+
|
10
|
+
def oauth2_url(scope = 'snsapi_userinfo', **host_options)
|
11
|
+
options = Rails.application.routes.default_url_options
|
12
|
+
h = {
|
13
|
+
appid: appid,
|
14
|
+
redirect_uri: url_helpers.app_url(id, **options),
|
15
|
+
response_type: 'code',
|
16
|
+
scope: scope,
|
17
|
+
state: SecureRandom.hex(16)
|
18
|
+
}
|
19
|
+
"https://open.weixin.qq.com/connect/oauth2/authorize?#{h.to_query}#wechat_redirect"
|
20
|
+
end
|
21
|
+
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Wechat
|
2
|
+
module Model::App::WorkApp
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do
|
6
|
+
validates :agentid, presence: true
|
7
|
+
|
8
|
+
alias_attribute :corpid, :appid
|
9
|
+
alias_attribute :corpsecret, :secret
|
10
|
+
end
|
11
|
+
|
12
|
+
def api
|
13
|
+
return @api if defined? @api
|
14
|
+
@api = Wechat::Api::Work.new(self)
|
15
|
+
end
|
16
|
+
|
17
|
+
def wechat_corp_oauth2(oauth2_params, account = nil)
|
18
|
+
userid = cookies.signed_or_encrypted[:we_userid]
|
19
|
+
deviceid = cookies.signed_or_encrypted[:we_deviceid]
|
20
|
+
if userid.present? && deviceid.present?
|
21
|
+
yield userid, { 'UserId' => userid, 'DeviceId' => deviceid }
|
22
|
+
elsif params[:code].present? && params[:state] == oauth2_params[:state]
|
23
|
+
userinfo = wechat(account).getuserinfo(params[:code])
|
24
|
+
cookies.signed_or_encrypted[:we_userid] = { value: userinfo['UserId'], expires: self.class.oauth2_cookie_duration.from_now }
|
25
|
+
cookies.signed_or_encrypted[:we_deviceid] = { value: userinfo['DeviceId'], expires: self.class.oauth2_cookie_duration.from_now }
|
26
|
+
yield userinfo['UserId'], userinfo
|
27
|
+
else
|
28
|
+
redirect_to generate_oauth2_url(oauth2_params)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,198 @@
|
|
1
|
+
module Wechat
|
2
|
+
module Model::App
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do
|
6
|
+
attribute :type, :string, default: 'Wechat::PublicApp'
|
7
|
+
attribute :name, :string
|
8
|
+
attribute :enabled, :boolean, default: true
|
9
|
+
attribute :shared, :boolean, default: false
|
10
|
+
attribute :appid, :string
|
11
|
+
attribute :secret, :string
|
12
|
+
attribute :token, :string, default: -> { SecureRandom.hex }
|
13
|
+
attribute :agentid, :string, comment: '企业微信所用'
|
14
|
+
attribute :mch_id, :string, comment: '支付专用、商户号'
|
15
|
+
attribute :key, :string, comment: '支付专用'
|
16
|
+
attribute :key_v3, :string, comment: '支付通知解密'
|
17
|
+
attribute :encrypt_mode, :boolean, default: true
|
18
|
+
attribute :encoding_aes_key, :string
|
19
|
+
attribute :access_token, :string
|
20
|
+
attribute :access_token_expires_at, :datetime
|
21
|
+
attribute :jsapi_ticket, :string
|
22
|
+
attribute :oauth2_state, :string
|
23
|
+
attribute :jsapi_ticket_expires_at, :datetime
|
24
|
+
attribute :user_name, :string
|
25
|
+
attribute :oauth_enable, :boolean, default: true
|
26
|
+
attribute :apiclient_cert, :string
|
27
|
+
attribute :apiclient_key, :string
|
28
|
+
attribute :serial_no, :string
|
29
|
+
|
30
|
+
belongs_to :organ, class_name: 'Org::Organ', optional: true
|
31
|
+
|
32
|
+
has_many :post_syncs, as: :synced, dependent: :delete_all
|
33
|
+
has_many :posts, through: :post_syncs
|
34
|
+
|
35
|
+
has_one :organ_domain, -> { where(default: true) }, class_name: 'Org::OrganDomain', foreign_key: :appid, primary_key: :appid
|
36
|
+
has_many :organ_domains, class_name: 'Org::OrganDomain', foreign_key: :appid, primary_key: :appid
|
37
|
+
|
38
|
+
has_one :agency, foreign_key: :appid, primary_key: :appid
|
39
|
+
has_many :agencies, foreign_key: :appid, primary_key: :appid
|
40
|
+
has_many :scenes, foreign_key: :appid, primary_key: :appid
|
41
|
+
has_many :tags, foreign_key: :appid, primary_key: :appid
|
42
|
+
has_many :templates, foreign_key: :appid, primary_key: :appid
|
43
|
+
|
44
|
+
scope :valid, -> { where(enabled: true) }
|
45
|
+
scope :shared, -> { where(shared: true) }
|
46
|
+
|
47
|
+
validates :appid, presence: true, uniqueness: true
|
48
|
+
|
49
|
+
before_validation do
|
50
|
+
self.encoding_aes_key ||= SecureRandom.alphanumeric(43) if encrypt_mode
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def url
|
55
|
+
Rails.application.routes.url_for(controller: 'wechat/wechats', action: 'show', id: self.id, host: host)
|
56
|
+
end
|
57
|
+
|
58
|
+
def sync_menu
|
59
|
+
api.menu_delete
|
60
|
+
api.menu_create menu
|
61
|
+
end
|
62
|
+
|
63
|
+
def menu
|
64
|
+
{
|
65
|
+
button: default_menus + within_menus
|
66
|
+
}
|
67
|
+
end
|
68
|
+
|
69
|
+
def default_menus
|
70
|
+
if organ && organ.respond_to?(:limit_wechat_menu)
|
71
|
+
limit = 3 - organ.limit_wechat_menu
|
72
|
+
else
|
73
|
+
limit = 3
|
74
|
+
end
|
75
|
+
Menu.where(parent_id: nil, appid: nil).limit(limit).as_json
|
76
|
+
end
|
77
|
+
|
78
|
+
def within_menus
|
79
|
+
if organ && organ.respond_to?(:limit_wechat_menu)
|
80
|
+
self.menus.limit(organ.limit_wechat_menu).where(parent_id: nil).order(position: :asc).as_json
|
81
|
+
else
|
82
|
+
self.menus.where(parent_id: nil).order(position: :asc).as_json
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def refresh_access_token
|
87
|
+
r = api.token
|
88
|
+
if r['access_token']
|
89
|
+
store_access_token(r)
|
90
|
+
else
|
91
|
+
logger.debug "\e[35m #{r['errmsg']} \e[0m"
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def store_access_token(token_hash)
|
96
|
+
self.access_token = token_hash['access_token']
|
97
|
+
self.access_token_expires_at = Time.current + token_hash['expires_in'].to_i
|
98
|
+
self.save
|
99
|
+
end
|
100
|
+
|
101
|
+
def jsapi_ticket
|
102
|
+
if jsapi_ticket_valid?
|
103
|
+
super
|
104
|
+
else
|
105
|
+
refresh_jsapi_ticket
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
def jsapi_ticket_valid?
|
110
|
+
return false unless jsapi_ticket_expires_at.acts_like?(:time)
|
111
|
+
jsapi_ticket_expires_at > Time.current
|
112
|
+
end
|
113
|
+
|
114
|
+
def refresh_jsapi_ticket
|
115
|
+
r = api.jsapi_ticket
|
116
|
+
store_jsapi_ticket(r)
|
117
|
+
jsapi_ticket
|
118
|
+
end
|
119
|
+
|
120
|
+
def store_jsapi_ticket(ticket_hash)
|
121
|
+
self.jsapi_ticket = ticket_hash['ticket']
|
122
|
+
self.jsapi_ticket_expires_at = Time.current + ticket_hash['expires_in'].to_i
|
123
|
+
self.save
|
124
|
+
end
|
125
|
+
|
126
|
+
def api
|
127
|
+
return @api if defined? @api
|
128
|
+
if secret.present?
|
129
|
+
@api = Wechat::Api::Public.new(self)
|
130
|
+
elsif agency
|
131
|
+
@api = Wechat::Api::Public.new(agency)
|
132
|
+
else
|
133
|
+
raise 'Must has secret or under agency'
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
def oauth2_qrcode_url(**host_options)
|
138
|
+
q = {
|
139
|
+
appid: appid,
|
140
|
+
redirect_uri: Rails.application.routes.url_for(controller: 'wechat/apps', action: 'show', id: id, **host_options),
|
141
|
+
scope: 'snsapi_login',
|
142
|
+
response_type: 'code',
|
143
|
+
state: SecureRandom.hex(16)
|
144
|
+
}
|
145
|
+
|
146
|
+
"https://open.weixin.qq.com/connect/qrconnect?#{q.to_query}#wechat_redirect"
|
147
|
+
end
|
148
|
+
|
149
|
+
def sync_tags
|
150
|
+
results = api.tags
|
151
|
+
results.fetch('tags', []).each do |result|
|
152
|
+
tag = tags.find_or_initialize_by(name: result['name'])
|
153
|
+
tag.count = result['count']
|
154
|
+
tag.tag_id = result['id']
|
155
|
+
tag.save
|
156
|
+
end
|
157
|
+
tags.where(tag_id: nil).each do |tag|
|
158
|
+
tag.sync_to_wechat_later
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
# 小程序
|
163
|
+
def sync_templates
|
164
|
+
templates = api.templates
|
165
|
+
templates.each do |template|
|
166
|
+
template = templates.find_or_initialize_by(template_id: template['priTmplId'])
|
167
|
+
template.template_type = template['type']
|
168
|
+
template.assign_attributes template.slice('title', 'content', 'example')
|
169
|
+
template.save
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
# 公众号
|
174
|
+
def sync_template_configs
|
175
|
+
templates = api.templates
|
176
|
+
templates.each do |template|
|
177
|
+
template_config = TemplatePublic.new(title: template['title'])
|
178
|
+
data_keys = Template.new(content: template['content']).data_keys
|
179
|
+
data_keys.each do |key|
|
180
|
+
template_config.template_key_words.build(name: key)
|
181
|
+
end
|
182
|
+
template_config.save
|
183
|
+
end
|
184
|
+
end
|
185
|
+
|
186
|
+
def template_ids(notifiable_type, *code)
|
187
|
+
ids = TemplateConfig.where(notifiable_type: notifiable_type, code: code).pluck(:id)
|
188
|
+
templates.where(template_config_id: ids).pluck(:template_id)
|
189
|
+
end
|
190
|
+
|
191
|
+
def host
|
192
|
+
if oauth_enable
|
193
|
+
organ_domain&.identifier || organ_domains.first&.identifier
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
197
|
+
end
|
198
|
+
end
|