前言:本文主要内容是微信后端逻辑。
前言:本项目前端用vue,微信后端用ssm,后台用ssm。后端主要处理与微信的交互,转发入参给后台,接收后台给的出参,转发出参给前端。后台是真正涉及业务的。
前言:本文依据的项目,前端后端在本地启动,后台部署在linux服务器上。后端通过拼接接口路径访问后台。部署配置,详情见第一章。
目录
微信公众号开发–第二章 获取用户信息
一、页面操作
1、本地启动前后端后,在微信开发者工具上,输入超链接local.test.com:8989。
2、页面自动进入授权页面
若没有跳到授权链接,报redirect_uri参数错误,返回码是10003,应该是回调地址写错了,参考第一章的配置的授权回调页面域名。
微信授权机制,详情请参考官方文档https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html。
3、点击同意,获取code,进入公众号首页
前端请求头Request Headers会封装进后端入参HttpServletRequest request。客户端浏览器发出的请求被封装成为一个HttpServletRequest对象。对象包含了客户端请求信息包括请求的地址,请求的参数,提交的数据,上传的文件客户端的ip甚至客户端操作系统都包含在其内。
前端请求参数body,对应后端入参UserBean bean,由@RequestBody自动装配。
二、微信后端逻辑
1、获取前端传来的code。请求https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code获取access_token和openid。
2、根据access_token和openid,请求https://api.weixin.qq.com/sns/userinfo?access_token=TOKEN&openid=OPENID&lang=zh_CN拉取用户信息。
3、根据用户信息,判断用户是否关注了公众号。没有关注,则返回error并提示用户关注。若关注了进行第4步。
4、从后台拿到tokenid,tokenid其实就是后台redis的key。
5、根据tokenid,在后端生成redis的key和value,使后端的value和tokenid相同。这样后端就能方便地调用后台接口。
三、微信后端代码
接口定义
/**
* 通过code获取用户信息
* @param request
* @return 返回用户信息
* @throws Exception
*/
@RequestMapping(value = "/getUserInfo", method = RequestMethod.POST)
@ResponseBody
public Result getUserInfo(@RequestBody UserBean bean, HttpServletRequest request)
throws Exception {
}
接口入参
public class UserBean {
private String tokenid;// 权限验证码,对应后台redis的key
private String channelcode;// 渠道
private String accountName;// 用户名
private String accountPwd;// 密码
private String openid;// 微信openid
private String code;// 微信网页授权中获取的code
}
javax.servlet.http.HttpServletRequest
方法:根据code,获取access_token和openid
//网页授权授权地址
private final String oauthApiURL = "https://api.weixin.qq.com/sns";
/**
* 方法:根据code,获取access_token和openid
* @param code
* @return result
* result包括access_token、expires_in、efresh_token、openid和scope
* appid、appSecret 是测试号信息,详见第一章
*/
public JSONObject getUserInfoAuth(String code) {
String apiUrl = oauthApiURL+ "/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
apiUrl = apiUrl.replace("APPID", appid).replace("SECRET", appSecret).replace("CODE", code);
JSONObject result = httpRequest(apiUrl);
if (!result.isNullObject() && result.containsKey("openid"))