微信公众号开发——微信特性

微信授权

获取openid

手工方式

微信开发文档

https://mp.weixin.qq.com/wiki

普通商户版 和 服务商版:微信代理商

具体而言,网页授权流程分为四步:

0、设置域名(需要二级域名)

需要内网穿透工具,将本地网络映射到公网

http://natapp.cn

设置好域名后,在微信公众号平台配置,测试

1、引导用户进入授权页面统一授权,获取code

 

调用一下地址,引导用户进入授权页面

https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect

当用户同意授权后,页面将跳转至 redirect_uri/?code=CODE&state=STATE

code说明 : code作为换取access_token的票据,每次用户授权带上的code将不一样,code只能使用一次,5分钟未被使用自动过期。

2、通过code换取网页授权access_token(与基础支持中的access_token不同)

首先请注意,这里通过code换取的是一个特殊的网页授权access_token,与基础支持中的access_token(该access_token用于调用其他接口)不同。公众号可通过下述接口来获取网页授权access_token。如果网页授权的作用域为snsapi_base,则本步骤中获取到网页授权access_token的同时,也获取到了openid,snsapi_base式的网页授权流程即到此为止。

尤其注意:由于公众号的secret和获取到的access_token安全级别都非常高,必须只保存在服务器,不允许传给客户端。后续刷新access_token、通过access_token获取用户信息等步骤,也必须从服务器发起。

请求方法

获取code后,请求以下链接获取access_token:  https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code

3、如果需要,开发者可以刷新网页授权access_token,避免过期(目前好像是两小时有效期)

4、通过网页授权access_token和openid获取用户基本信息(支持UnionID机制)

利用第三方SDK

参考:https://github.com/Wechat-Group/WxJava

微信支付

 

微信退款

 

微信扫码登录

通过openid实现

微信开放平台开发文档地址:

https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419316505&token=&lang=

登录成功后,将用户信息保存到redis,设置cookie

登出:将redis和cookie的值删除

 

AOP实现身份验证

使用aspectj,定义切面、切点

首先从request中获取cookie,再根据cookie的值从redis中获取token。如果cookie或者redis没有值,抛出异常,通过异常拦截器拦截统一处理。

 

微信模板消息

限制:每个账号只能使用25个模板,每个账号模板消息的日调用量上限为10万次,粉丝超过10W/100W/100W时,日调用上限会提升

参数:openid,模板ID,data,color等

公众号平台中可以选择模板消息,可以编辑自己的模板消息进行提交,需要微信团队审核

 

websocket消息推送

onopen

onclose

sendMessage

 

ab压力测试

 

秒杀系统高并发会产生超卖问题

redis缓存和redis分布式锁

redis命令:

SETNX key value

将key设置为value,如果key不存在,这种情况下等同set命令。当key存在时,什么也不做。SETNX是“SET if Not eXists”的简写。

返回值

1 如果key被设置了

0 如果key没有被设置

 

GETSET key value

自动将key对应到value并且返回原来key对应的value,如果key存在但是对应的value不是字符串,就返回错误

设计模式

GETSET可以和INCR一起使用实现支持重置的技术功能,举个例子,每当有事件发生的时候,一段程序都会调用INCR给key mycount加1,但是有时候我们需要获取计数器的值,并且自动将其重置为0,这可以通过GETSET mycount “0”来实现

INCR mycount

GETSET mycount “0”

GET mycount

返回值

返回之前的旧值,如果之前key不存在将返回nil

 

加锁redisLock(key, value);key为productID, value为当前时间+超时时间

加锁时,考虑到系统异常导致死锁的问题,使用redis的GETSET命令+超时时间解决

死锁问题的产生是因为程序可能因为某些原因没有释放锁,

解锁redisUnLock(key,value)

 

redis分布式锁和synchronize比较:

适合秒杀场景

一旦没有拿到锁就失败,不会等待

支持每秒十几万并发

支持分布式,高可用

更细粒度控制代码

多台机器上多个进程对一个数据进行操作的互斥

你可能感兴趣的:(后端)