微信开发文档
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机制)
参考: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比较:
适合秒杀场景
一旦没有拿到锁就失败,不会等待
支持每秒十几万并发
支持分布式,高可用
更细粒度控制代码
多台机器上多个进程对一个数据进行操作的互斥