• 微信公众号订阅消息 wx-open-subscribe 的实现及闭坑指南


    先来个实现成功的效果图:

    主要看图片底部 success 的日志  status 为 accept 时表示用户点击了授权,为 reject 时表示用户拒绝了授权。

     

     下面来看实现,本文采用的是uniapp框架,运行在微信浏览器H5端

    避坑指南:

    1. wx-open-subscribe 标签,在安卓显示,IOS不显示?

    解决方案:在 manifest.json 文件路由模式改为 hash 。并且在访问你的应用第一个页面的时候,就进行 wx.config 配置。

    2. wx-open-subscribe 标签样式设置很麻烦?或者设置了不生效?

    解决方案:在外层包裹一个div,复杂的样式写在外层,开放标签尽量写简单的样式,不生效的话可以借鉴我后面贴的代码。

    3. wx-open-subscribe组件,怎样监听用户点击“取消”、“允许”?为什么官方的success事件返回没有例如:{ errMsg: "subscribe:ok", subscribeDetails: "{"TenvU22BA1jCp4YHfYEpRuESXYReQyDuhs4vbdWA99I":"{\"status\":\"accept\"}"},而是返回

    解决方案:success里面接收的参数要写成success({detail})格式才行,写成success(e)就不会有e.detail。

    1. <wx-open-subscribe id="subscribe-btn" ref="subscribeBtn"
    2. style="position: fixed;z-idnex:9999; top: 0px, left: 0px;bottom:0px;right:0px;width: 100%;height: 100%;"
    3. template="Qw2bWImUYSgS5y9UoAGa-fd3RUC2aXZ5m25MApxIpA4" id="subscribe-btn">
    4. <!-- Qw2bWImUYSgS5y9UoAGa-fd3RUC2aXZ5m25MApxIpA4 测试 -->
    5. <!-- NtmNRrJl5FMKND8FuyZhZxL_jbRLNg0-h-iNCr0z0ak 正式 -->
    6. <script type="text/wxtag-template">
    7. <div style="position: fixed;z-idnex:9999; top: 0px, left: 0px;bottom:0px;right:0px;width: 100%;height: 100%;" />
    8. </script>
    9. </wx-open-subscribe>
    10. // wx-open-subscribe 原生绑定点击事件
    11. this.$nextTick(() => {
    12. var btn = this.$refs.subscribeBtn;
    13. btn.addEventListener('success', ({detail}) => {
    14. console.log('success1', detail);
    15. });
    16. btn.addEventListener('error', ({detail}) => {
    17. console.log('fail1', detail);
    18. });
    19. })

    4. wx-open-subscribe组件外层的div,点击事件不生效?

    解决方案:wx-open-subscribe 组件的事件不会冒泡,可以在 success 返回后做事件处理。

    实现代码:

    1. <view class="subscribeBlock" v-if="showSubscribe">
    2. <wx-open-subscribe id="subscribe-btn" ref="subscribeBtn"
    3. style="position: fixed;z-idnex:9999; top: 0px, left: 0px;bottom:0px;right:0px;width: 100%;height: 100%;"
    4. template="Qw2bWImUYSgS5y9UoAGa-fd3RUC2aXZ5m25MApxIpA4" id="subscribe-btn">
    5. <!-- Qw2bWImUYSgS5y9UoAGa-fd3RUC2aXZ5m25MApxIpA4 测试 -->
    6. <!-- NtmNRrJl5FMKND8FuyZhZxL_jbRLNg0-h-iNCr0z0ak 正式 -->
    7. <script type="text/wxtag-template">
    8. <div style="position: fixed;z-idnex:9999; top: 0px, left: 0px;bottom:0px;right:0px;width: 100%;height: 100%;" />
    9. </script>
    10. </wx-open-subscribe>
    11. </view>

     js

    1. <script>
    2. var that;
    3. export default {
    4. components: {
    5. search
    6. },
    7. data() {
    8. return {
    9. showSubscribe: false,
    10. };
    11. },
    12. onReady() {
    13. // wx-open-subscribe 原生绑定点击事件
    14. this.$nextTick(() => {
    15. var btn = this.$refs.subscribeBtn;
    16. btn.addEventListener('success', ({detail}) => {
    17. console.log('success1', detail);
    18. this.clickSubscribe()
    19. });
    20. btn.addEventListener('error', ({detail}) => {
    21. console.log('fail1', detail);
    22. this.clickSubscribe()
    23. });
    24. })
    25. },
    26. onLoad(option) {
    27. },
    28. methods: {
    29. clickSubscribe() {
    30. console.log('点击了订阅');
    31. this.showSubscribe = false;
    32. },
    33. goTest() {
    34. // let url = '/pages/test/test'
    35. // this.goOtherPages(url)
    36. },
    37. }
    38. };
    39. </script>

     css

    1. .subscribeBlock {
    2. z-index: 99999;
    3. position: fixed;
    4. width: 100vw;
    5. height: 100vh;
    6. left: 0px;
    7. right: 0px;
    8. top: 0px;
    9. bottom: 0px;
    10. }

     jssdk封装文件:  需要node安装 jweixin-module ,具体安装可以百度查一下

    1. import config from "./config.js";
    2. import api from "./api.js";
    3. import myRequest from "./request.js";
    4. let jweixin = require('jweixin-module')
    5. Vue.prototype.$wx = jweixin
    6. var wxjssdk = (_wx) => {
    7. return new Promise(rr => {
    8. let url = location.href;
    9. if (url.indexOf('http://localhost') !== -1) url = config.http_url
    10. console.log('url', url)
    11. let data = {
    12. url: encodeURIComponent(url)
    13. }
    14. myRequest.request(api.sdk.wechatJsSdkTicket, data).then(res => {
    15. console.log('wechatJsSdkTicket',res);
    16. let configData = res.data;
    17. console.log('configData',configData);
    18. _wx.config({
    19. // debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
    20. debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
    21. appId: configData.appId, // 必填,公众号的唯一标识
    22. timestamp: configData.timestamp, // 必填,生成签名的时间戳
    23. nonceStr: configData.nonceStr, // 必填,生成签名的随机串
    24. signature: configData.signature, // 必填,签名
    25. jsApiList: ['updateAppMessageShareData', 'getNetworkType',
    26. 'updateTimelineShareData', 'getLocation'
    27. ],
    28. openTagList: ['wx-open-launch-weapp','wx-open-subscribe']
    29. });
    30. _wx.ready(function(res) {
    31. console.log('wx-jssdk-ready', res)
    32. rr(true)
    33. // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
    34. });
    35. _wx.error(function(err) {
    36. console.log('wx-jssdk-error', err)
    37. rr(false)
    38. // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
    39. });
    40. })
    41. })
    42. }
    43. export default wxjssdk;

  • 相关阅读:
    最新前端面试题整理
    因为axios请求后端,接收不到token的问引出的问题
    01-mysql5.7安装部署-二进制安装
    基于Java SSM+layui+mysql实现的图书借记管理系统源代码+数据库
    Linux常用命令
    【从零学习python 】66.深入了解正则表达式:模式匹配与文本处理的利器
    2022杭电多校6(总结+补题)
    iOS基础 自定义转场控制器上的动画 UIPresentationController
    超详细讲解H5移动端适配
    给大家分享一下短视频创业要注意的三个关键问题,准备入行的速速收藏
  • 原文地址:https://blog.csdn.net/qq_35713752/article/details/125484670