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.
- 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,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
|