微信公众号开发点滴

什么是微信网页授权

任何从微信客户端发起对第三方网站访问时,如果希望实现微信第三方登陆,必须使用公众号网页授权这个接口来开发实现。

或者对于PC端的网站使用PC浏览器访问网站时,希望使用微信来作第三方登录,这时也可以说是微信网页授权的一个典型应用场景,但是此时需要用到的是微信开放平台。这种开放平台只适用于PC端网站出码,并且必须使用手机微信扫码实现登录,不适用于手机端的移动浏览器访问pc网站的场景(原因是:因为非微信浏览器访问的情况下手机是无法扫码的也无法识别二维码图片的(更严谨地说,部分手机浏览器虽然能够识别微信服务器返回的二维码,但是辣机微信就是不授权)!而微信浏览器即使可以识别二维码但是微信平台又不支持在微信浏览器发起这种sns_apilogin的scope授权!很是悲催)

从上面的描述中可以总结出:微信网页授权有两种情况:一种是在微信中访问网页可以通过公众号(mp)曲线救国实现微信登录;另一种是借助微信开放平台(open)在PC端网站通过手机微信扫码来实现的微信第三方登陆

 

微信网页授权和网站的业务场景融合描述:

一般地,网页授权的应用可能有以下流程:

0.业务页面的访问,触发jump1的跳转,比如有一个微信登录的按钮,点击后就直接跳转;或者通过一个middleware直接判断是否已经微信登陆过了,没有的话直接jump1跳转

1. jump1 跳转函数: 该页面代码要实现向https://open.weixin.qq.com/connect/oauth2/authorize(公众平台网页授权)或者https://open.weixin.qq.com/connect/qrconnect(开方平台网页授权)的url实现跳转,并且在url中带上redirect_uri_1_callback回调参数,目的是获取到code/state.注意这一步使用base的scope,原因是静默授权能够提高用户体验(而userinfo的scope需要弹出用户授权确认的页面)

2. redirect_uri_1_callback页面代码:经过jump1跳转,用户同意(base 的scope无需用户同意)后,微信将跳转到这个回调页面,逻辑是:从该页面的url query parameter中获取到第一步中微信回调带回来的code值,通过code再次访问微信服务器换取access_token/openid/unionid(注意开放平台授权在这步可以返回unionid,如果在开放平台处将公众号(包括测试号),小程序,网站应用,移动应用,公众号第三方平台都和认证过的开放平台帐号绑定起来的话,在scope_base的情况下也会返回unionid,也就是说使用unionid是一个比较合适靠谱的策略。注意开放平台第三方登录时scope为snsapi_login相当于公众平台下的snsapi_userinfo都能返回access_token访问用户的基本信息.)这时应该判断该openid/unionid是否已经和我们的系统账号有过绑定,如果已经绑定了,则直接让该账号登录即可,结束网页授权流程;如果没有绑定,则应该继续走下面的userinfo作为scope的网页授权,通过修改第1.步中的scope为userinfo,redirect_uri为redirect_uri_2_callback来继续发起跳转,我们暂且称之为jump2跳转,

3. redirect_uri_2_callback页面代码:jump2跳转后,经过用户同意后,微信将跳转到这个回调页面,逻辑是:从url query parameter中获取微信服务器返回的code值,通过code再次访问微信服务器换取access_token/openid/unionid;通过access_token和openid再次向微信服务器发起请求https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN,微信服务器将返回userinfo信息,这时需要弹出本系统账号关联的页面:可以新创账号,或者输入已有的系统账号,从而实现登陆并且绑定微信账号和网站的系统账号,以便下一次再登陆时只需静默方式的base scope授权请求就能直接登陆网站,提升用户体验

发起授权获取code阶段redirect_uri参数错误

解决办法:往往是在开放平台中的授权回调域写错了,只需要域名,而不需要是完全的uri, 比如xx.com而不能是xx.com/redirecturl 

请在微信客户端打开链接

部分接口访问必须是在微信中访问才能允许,比如微信网页授权时,通过公众号获取用户信息,这个api调用就只能通过微信浏览器访问才被允许,而直接使用非微信浏览器就会报出上面的错误

未关注该测试号错误

在微信公众号的网页授权开发中,为了方便我们可能先直接使用测试号来获取除了支付以外的所有接口权限,随后开始测试公众号网页授权功能。但是要注意的是测试号和正式认证过的公众号还是有区别的,测试号要想测试网页授权的功能,必须首先关注该测试号方可进行,但是认证过的公众号不受这个限制,也就是说,任何从微信客户端访问的第三方网站都可以借助公众号来实现微信登陆,而无须关注这个公众号

图文消息在没有给图片url时的效果

一般情况下图文消息回复给用户显示的比较花哨,但是如果不给图片url,显示的效果也还别有一番效果哦

有没有可能直接回复一个包含html代码的文本给到微信能够正常渲染?

公众号被动消息的排重去重问题

微信服务器在将用户的消息发给公众号的开发者服务器地址(开发者中心处配置)后,微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次,如果在调试中,发现用户无法收到响应的消息,可以检查是否消息处理超时。关于重试的消息排重,有msgid的消息推荐使用msgid排重。事件类型消息推荐使用FromUserName + CreateTime 排重。

假如服务器无法保证在五秒内处理并回复,必须做出下述回复,这样微信服务器才不会对此作任何处理,并且不会发起重试(这种情况下,可以使用客服消息接口进行异步回复),否则,将出现严重的错误提示。详见下面说明:

1、直接回复success(推荐方式)

2、直接回复空串(指字节长度为0的空字符串,而不是XML结构体中content字段的内容为空)

一旦遇到以下情况,微信都会在公众号会话中,向用户下发系统提示“该公众号暂时无法提供服务,请稍后再试”:

1、开发者在5秒内未回复任何内容

2、开发者回复了异常数据,比如JSON数据等

另外,请注意,回复图片(不支持gif动图)等多媒体消息时需要预先通过素材管理接口上传临时素材到微信服务器,可以使用素材管理中的临时素材,也可以使用永久素材。

微信web开发者工具

使用微信开发由于无法像PC端开发一样在chrome中打开dev tool就能对网络请求响应过程一览无余,对样式也能随心所欲,腾讯为了帮助web开发者作微信的web开发,特别开发了一套工具:

https://mp.weixin.qq.com/wiki/10/e5f772f4521da17fa0d7304f68b97d7e.html#.E4.B8.8B.E8.BD.BD.E5.9C.B0.E5.9D.80

用了还是不错的!

oauth登录流程图解

注意:由于微信公众号相关的开发正式部署时授权回调域和scope为base,user_info的授权url请求中的redirect_uri必须相同,这一点给我们带来很多不变,我建议即使你的公众号已经认证,所有权限都已有了,也还是要使用测试号(注意你的微信必须关注该测试号哦)外挂一个vpn来方便开发调试,调试完毕再将配置更改为公众号的回调url,这样你在测试的过程中并不会已经ok的已经部署过的公众号功能,这样实现小步快跑

微信JSAPI开发

微信jssdk给网页开发者带来可以借用微信的手机功能来实现很多以前只能通过原生app才能够实现的功能。比如你可以调用图像接口拍照上传,语音接口录音上传,微信分享到朋友圈并且自定义分享的title,image和url等。

其中分享到朋友圈尤其重要。jssdk推出之前网页可以随意分享到任何域名,而jssdk推出后,腾讯公司为了减少营销对微信用户体验的影响,屏蔽了在网页直接程序分享的功能,替代的方案是你只能通过一个回调来设置对应分享内容的title,image和链接,你不能通过js代码直接调起微信分享按钮!

而其他开放的jsapi接口则可以通过自己写的js代码来调用,比如图像接口的调用,你可以创建一个按钮,当用户点击按钮后就调起微信的拍照接口,并且可以上传到微信服务器中。

关于是否必须把你要执行的js功能放到wx.ready回调函数中,请看下图:

历史文章页面模板

https://www.zhihu.com/question/32119362

对原创公众号,微信赋予了新增页面模版功能,开放图文消息正文插入历史图文链接,对于没有被认定为原创的公众号,也可以直接将以下链接作为自定义菜单方式来引导使用

https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=MzI2OTQ0OTM1NA==&scene=110#wechat_redirect

如何在微信公众号开发中使用IDE断点调试

在微信公众号开发中,一个很大的痛点是微信发起的带code的调用很难调试,我们可以结合phpstorm的断点功能以及微信web开发者工具比较完美的解决该问题。

在微信开发者工具的console界面执行以下代码即可在phpstorm中击中断点:

document.cookie='XDEBUG_SESSION='+'PHPSTORM'+';path=/;';

再执行以下代码,取消调试:

document.cookie='XDEBUG_SESSION='+''+';expires=Mon, 05 Jul 2000 00:00:00 GMT;path=/;';

 微信支付后自动关注公众号的场景

微信支付成功后推荐默认自动关注的规则如下:
1. 刷卡支付默认有推荐关注
2. 公众号支付和扫码支付需要5元以上才有推荐关注
3. APP支付默认没有,需要申请配置,需要有一定用户规模才可以申请
4. 已经关注的不展示推荐栏
5. 服务号未设置头像的在IOS不展示推荐关注栏
6. 用户取消过关注的默认不勾选
7. 服务商模式的,需要在特约商户开发配置页设置推荐关注appid(见下面有解释)
8. 订阅号目前是不会有默认推荐关注的
9. 对于粉丝数大于50w的公众号,支付成功后不默认勾选关注(公众平台为了避免形成巨大粉丝公众号带来的风险,2016.03.16增加了该条规则)

服务商模式的,需要在特约商户开发配置页设置推荐关注appid,具体申请的地方在微信公众平台-微信支付-服务商申请

 特别注明,APP支付的默认关注目前只对行业的龙头公司才开放申请. 

微信支付的授权目录填写

授权目录取决于你调用jsapi接口发起支付所在的页面位置:

引用自 http://www.cnblogs.com/zhouXX/p/6892039.html

1、

比如:调用以上JSSDK的页面地址为 http://a.b.com/pay/weixin/c.html,

那么:授权目录配置为 http://a.b.com/pay/weixin/

2、

比如:调用以上JSSDK的页面地址为 http://a.b.com/pay/weixin,

那么:授权目录配置为 http://a.b.com/pay/

3、

比如:调用以上JSSDK的页面地址为 http://a.b.com/pay,

那么:授权目录配置为 http://a.b.com/

4、如果有QueryString,自动忽略

比如:调用以上JSSDK的页面地址为  http://a.b.com/pay/weixin/c.html?name=mango,

那么:授权目录配置为  http://a.b.com/pay/weixin/

对于SPA应用,将支付授权目录配置为域名即可。

比如:调用以上JSSDK的页面地址为  http://a.b.com/#/pay/weixin/c.html?name=mango,

那么:授权目录配置为  http://a.b.com/

什么时候必须更新商户订单号?

只要价格发生了改变,如果还使用老的商户订单号去申请支付时,微信都会返回商户订单号重复的错误。因此只要客户下了订单就不要试图再去修正价格,只能是支付或者取消。如果有新的优惠则可以取消订单,再重新下单

 

转载于:https://www.cnblogs.com/kidsitcn/p/6659188.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值