你所误解的微信公众号开发、以及微信公众号开发遇到的问题及详解

前言:有一星期没跟新博客了,最近太忙、项目赶进度就没把时间花在博客上;今天来说说所谓的微信公众号开发和填坑记录;

微信公众号:运行在微信终端的应用 (对于开发者来说比较爽的你只需考虑兼容微信浏览器,因为它是在微信浏览器环境下运行的)

微信公众号开发分为两部分:

  一、传统开发(前后端分离) 推荐  页面量大的时候优点就尤其突出了

  1. 微信首页 (即首页菜单、跳转链接、扫二维码、消息推送回复等功能) 不要慌  这些百分之90%都是后天来配置的,他们调用下微信公众平台提供的接口就ok了;为什么是后台配置呢因为交互方式是 web用户 --> 微信服务器 --> 后台服务器;

  2. H5部分  就是通过菜单跳转其他的页面皆为H5的  (说白了 开发微信公众号前端主要负责的就是H5部分(就是和平常时开发移动端一模一样没区别))

  二、node.js/H5  或者  php/h5 的话  那就不好意思了  以上全部都是自己搞

这里介绍的是第一种开发模式: 所谓的微信公众号开发前端就是负责移动端而已  没什么不同的

  个人觉得新项目开发选好技术栈(框架、ui框架、适配、css预编译等)重中之重,能节省很多的开发时间,

  小提示:个人觉得移动端适配来说选用 px2rem 是最爽的适配,没有之一; 对于传统适配  怎么转换之类统统说白白, 插件自己会帮你转换,那叫一个爽;不懂得小伙伴可以去百度百度或者留言

  遇到的坑如下:  (主要说和微信相关的,移动端常见的坑这里就不多说了;若开发中遇到了可以留言)

  坑1、获取用户信息(openid、UnionID、昵称、头像、性别、所在城市、语言和关注时间等等)

    其中除UnionID外  其他的主要通过网页授权均可获取 (网页授权具体操作将由下面的坑解释)

    开发的时候获取用户信息什么都获取到了,但就差一个UnionID 怎么试都获取不了,原因在于微信公众号一定要到微信公众开发平台绑定开放才能获取到UnionID  这个坑因为没想到这个方向所以坑了蛮久的时间

  坑2、通过网页授权获取 code  再通过 code 获取用户openid、UnionID

    web网页端要获取这两个信息只能通过 code 获取,后台获取的话就不同

    获取code 就要通过web网页授权了 : 具体流程是  在web页面通过调用 微信提供的接口 发起授权;微信在把code已回调链接的形式返回给你,这时你解析url的参数就能拿到code 再传给后台

    部分代码如下:

    1、不携带参数的情况

mounted () {
    // 获取路劲参数  静默授权不提示用户 scope=snsapi_base  非静默scope=snsapi_userinfo 询问操作  http 即官方提供的回调链接
    // AppId 为微信公众号的 id   httpUrl 为微信所配置的网页授权回调   网页授权回调域名即发布服务器后的项目  配置/查看步骤  最下面的接触权限 --> 网页授权获取用户信息 -->  点击修改  跳转到页面最下面即可看到网页授权域名设置
   let http = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${window.AppID}&redirect_uri=${httpUrl}&response_type=code&scope=snsapi_userinfo&state=123#wechat_redirect`
   window.location.href = http
  },

2、携带参数即从别的地方跳转要携带参数在页面显示 (主要思路是解析出要的参数在网页授权时传给微信,微信会和code一起在传回给你)

mounted () {
    // 获取路劲参数  静默授权不提示用户 scope=snsapi_base   询问操作 scope=snsapi_userinfo
    this.getUrlParams(decodeURI(window.location.href))
  },
  methods: {
    // 切割处理参数
    getUrlParams (url) {
      let webpageUrl = window.webpageUrl
      let params = {}
      let arr = {}
      if (url.split(‘?‘)) {
        arr = url.split(‘?‘)
      }
      if (arr.length <= 1) {
        // 微信公众号首页进入
        let httpUrl = encodeURIComponent(webpageUrl)
        let http = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${window.AppID}&redirect_uri=${httpUrl}&response_type=code&scope=snsapi_userinfo&state=123#wechat_redirect`
        window.location.href = http
      } else {
        // 扫描pc端二维码进入携带参数的情况
        arr = arr[1].split(‘&‘)
        for (let i = 0, l = arr.length; i < l; i++) {
          let a = arr[i].split(‘=‘)
          params[a[0]] = a[1]
        }
        // 有参数
        if (params && params.cityId) {
          webpageUrl += ‘?‘
          Object.keys(params).forEach(function (key) {
            webpageUrl += `${key}=` + `${params[key]}&`
          })
          webpageUrl = webpageUrl.substring(0, webpageUrl.length - 1)
        }
        // 通过PC端扫码跳过来的情况下保存城市和小区信息
        let httpUrl = encodeURIComponent(webpageUrl)
        let http = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${window.AppID}&redirect_uri=${httpUrl}&response_type=code&scope=snsapi_userinfo&state=123#wechat_redirect`
        window.location.href = http
      }
    }
  }

  通过上述回调最终微信端会回调上面httpUrl 页面  code 一参数形式传过来  只需解析出 code 保存下来就行

mounted () {   // 切割 url 封装参数
    let params = {}
      let arr = url.split(‘?‘)
      if (arr.length <= 1) {
        return params
      }
      arr.forEach(ls => {
        ls = ls.split(‘&‘)
        if (ls.length > 1) {
          for (let i = 0, l = ls.length; i < l; i++) {
            let a = ls[i].split(‘=‘)
            params[a[0]] = a[1]
          }
        }
      })
      console.log(params) // 参数对象  params.code 就是该用户的code   在传给后台  获取用户其他信息就行了
}

  坑3、初次静默授权返回的code 去获取用户的 UnionID 会获取不到,  改为非静默授权  即询问用户是否登录    即可获取用户一切信息

结语: 今天就将这几个吧,后面陆续加上,有问题欢迎留言

原文地址:https://www.cnblogs.com/ljx20180807/p/10132760.html

时间: 2024-07-28 19:35:25

你所误解的微信公众号开发、以及微信公众号开发遇到的问题及详解的相关文章

使用ssh开发rest web服务支持http etag header的教程详解

原创整理不易,转载请注明出处:使用ssh开发rest web服务支持http etag header的教程详解 代码下载地址:http://www.zuidaima.com/share/1777391667989504.htm 导言 REST方式的应用程序构架在近日所产生的巨大影响突出了Web应用程序的优雅设计的重要性.现在人们开始理解"WWW架构"内在的可测量性及弹性,并且已经开始探索使用其范例的更好的方式.在本文中,我们将讨论一个Web应用开发工具--"简陋的.卑下的&q

HTML5移动开发之路(35)——jQuery中的过滤器详解

本文为 兄弟连IT教育 机构官方 HTML5培训 教程,主要介绍:HTML5移动开发之路(35)--jQuery中的过滤器详解 1.基本过滤选择器 :first:last:not(selector) :selector匹配的节点之外的节点:even :偶数:odd :奇数:eq(index):gt(index) :比他大的 :lt(index) :比他小的 [html] view plain copy print? <html> <head> <script src=&quo

【React Native开发】React Native控件之Touchable*系列组件详解(18)

转载请标明出处: http://blog.csdn.net/developer_jiangqq/article/details/50630984 本文出自:[江清清的博客] (一)前言 [好消息]个人网站已经上线运行,后面博客以及技术干货等精彩文章会同步更新,请大家关注收藏:http://www.lcode.org 今天我们一起来看一下Touchable*系列组件的使用详解,该系列组件包括四种分别为:TouchableHighlight,TouchableNativeFeedback,Touch

Python Web开发中,WSGI协议的作用和实现原理详解

首先理解下面三个概念: WSGI:全称是Web Server Gateway Interface,WSGI不是服务器,python模块,框架,API或者任何软件,只是一种规范,描述web server如何与web application通信的规范. uwsgi:与WSGI一样是一种协议,是uWSGI服务器的独占协议,用于定义传输信息的类型(type of information),每一个uwsgi packet前4byte为传输信息类型的描述,与WSGI协议是两种东西,据说该协议是fcgi协议的

【Android应用开发】 推送原理解析 极光推送使用详解 (零基础精通推送)

作者 : octopus_truth 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/45046283 推送技术产生场景 : -- 服务器端主动性 : 客户端与服务器交互都是客户端主动的, 服务器一般不能主动与客户端进行数据交互, 因为服务器端无法得知客户端的 IP 地址 及 状态; -- 数据实时性 : 如果服务器端有紧急数据要传递给客户端, 就必须主动向客户端发送数据; -- 基本原理 : 使客户端实时获取服务器端消息,

惠益商盟开发app惠益商盟源码模式系统详解

惠益商盟系统开发(廖嘉.188.1414.7927)惠益商盟模式开发,惠益商盟app开发,惠益商盟源码,惠益商盟平台,惠益商盟商业模式,在目前的商业场景中,我们可以看出移动设备在组织的应用早已经不是一个选择题,而是一个问答题了.譬如在金融行业,利用银行柜员手机.平板电脑来开户和签名已经成为一种业务常态:在数据统计工作中,统计员会直接将通过手机.平板电脑来将统计数据上传到指定的服务器:在餐饮行业,利用平板电脑来点餐更是成为一种流行的趋势--在可预计的未来,移动设备将有望与PC并列,成为主要的生产力

iOS开发之再探多线程编程:Grand Central Dispatch详解

之前关于iOS开发多线程的内容发布过一篇博客,其中介绍了NSThread.操作队列以及GCD,介绍的不够深入.今天就以GCD为主题来全面的总结一下GCD的使用方式.GCD的历史以及好处在此就不做过多的赘述了.本篇博客会通过一系列的实例来好好的总结一下GCD.GCD在iOS开发中还是比较重要的,使用场景也是非常多的,处理一些比较耗时的任务时基本上都会使用到GCD, 在使用是我们也要主要一些线程安全也死锁的东西. 本篇博客中对iOS中的GCD技术进行了较为全面的总结,下方模拟器的截图就是我们今天要介

iOS开发UI篇—屏幕适配autoResizing autoLayout和sizeClass图文详解

1. autoResizing autoresizing是苹果早期的ui布局适配的解决办法,iOS6之前完全可以胜任了,因为苹果手机只有3.5寸的屏幕,在加上手机app很少支持横屏,所以iOS开发者基本不用怎么适配布局,所有的ui控件只要相对父控件布局就可以了,没错autoResizing就是一个相对于父控件的布局解决方法:注意:它只能相对父控件布局:***在xcode中可以通过可视化的界面调整也可以通过代码去控制 在用autoResizing的时候需要关闭autoLayout和sizeclas

iOS开发中常见的语句@synthesize obj = _obj 的意义详解

我们在进行iOS开发时,经常会在类的声明部分看见类似于@synthesize window=_window; 的语句,那么,这个window是什么,_ window又是什么,两个东西分别怎么用,这是一个比较基本的问题,也关乎我们理解Objective-C中对类.类的属性.类的存取器.类的局部变量的统一理解. 在32位系统中,如果类的 @interface 部分没有进行 ivar 声明,但有 @property 声明,在类的 @implementation 部分有响应的 @synthesize,则

《Java开发手册》学习进程之第3章运算符详解

运算符重载是指同一个运算符在不同的情况下执行不同的操作. 例如,"+"运算符在Java中就有不同的功能: 加法运算 数值正号 字符串连接 特别要注意要在字符串连接的表达式中字符串与其他基本数据类型的变量的连接问题. 例如: (1)System.out.println(a + m + n)中,a为一String对象,m和n为int型变量(也可以是byte,short,float等其他基本数据类型).根据此表达式中的运算符优先级可知,a先与m相连接,其合并为一个字符串,然后再与n连接并以字