hello 大家好,最近公司的项目在做微信公众号的二次开发,我也在这里做一个微信公众号的开发整理。
首先微信公众号的开发离不开微信开发文档,虽然有些小坑但是毕竟是官方文档,还是要靠着开发文档进行,下面就是微信开发文档的连接:微信公众平台开发文档
好了,有了开发文档我们就可以进行微信的开发了首先我们进行微信的二次开发就需要进行接入。看一下微信给出的微信公众号的接入提示:
1.文档上描述的是三个步骤:
1、填写服务器配置
2、验证服务器地址的有效性
3、依据接口文档实现业务逻辑
首先是服务器的配置:也就是授权时候的回调地址,微信开发需要授权,授权接口不是一个同步接口,因为是在微信页中打开连接,所以不能使用接口调用同步返回的方式等待授权返回,微信服务器会进行回调来确认完成授权,回调的地址在授权的时候作为一个请求参数,在微信页请求微信服务器。那么微信怎么才能认识你的回调地址呢,需要配置一个服务器的域名,只有配置了域名,微信才能认识你的回调地址。我们进行服务器的配置:
服务器配置只有服务号才能使用,如下图:
大家在权限借口中可以看见这个 网页授权获取用户基本信息 后面的 修改点击进去
4472.tmp.jpg标注的这个页面授权域名就是咱们需要配置的微信授权回调域名地址。。
配置好了之后咱们就可一进行微信授权的开发了。
微信授权有两种方式,但是在进行之前咱们必须知道几个名词
openId:就是用户关注了微信公众号之后用户在微信那边的一个凭证。每个用户只有一个而且是关注的时候就已经分配了,而且这个凭证会一直保留,就算你取消关注了也不会删除,下次关注了还是这个openID。除非你换一个微信账号。
code:这个是进行授权授权code,微信回调的时候会使用这个code。
access_token:这个是获取openID的凭证,微信里有两个access_token,一个是咱们心在说的获取openID的,还有一个是调用每个接口的凭证,这两个是不一样的,大家先了解下。
好了,有了这三个名词的概念咱们就可以先进行微信授权认证了。后面咱们在总结其他接口。
授权页面是这样的:
这里就是微信的授权页,点击这个确认就是可以显示用户的头像,昵称等的一些私人信息。有了这些私人信息咱们就可以做一些事情了,搞起来。
今天咱们就看一下微信授权:
网页授权有两种方式:snsapi_base和snsapi_userinfo。区别就是:
1、以snsapi_base为scope发起的网页授权,是用来获取进入页面的用户的openid的,并且是静默授权并自动跳转到回调页的。用户感知的就是直接进入了回调页(往往是业务页面)
2、以snsapi_userinfo为scope发起的网页授权,是用来获取用户的基本信息的。但这种授权需要用户手动同意,并且由于用户同意过,所以无须关注,就可在授权后获取该用户的基本信息。
3、用户管理类接口中的“获取用户基本信息接口”,是在用户和公众号产生消息交互或关注后事件推送后,才能根据用户OpenID来获取用户基本信息。这个接口,包括其他微信接口,都是需要该用户(即openid)关注了公众号后,才能调用成功的。
通过文档中的描述吗,咱们就可以看出来,snsapi_base方式只能是获取用户的openID,不能获取用户的其他私人信息,今天咋们先试试这种方式。
微信的API:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=${微信公众号的APPID}&redirect_uri=${网页授权的回调地址}&response_type=${回调类型默认就是这个:code}&scope=${微信授权权限:snsapi_bas
e}&state=${重定向后会带上state参数}#wechat_redirect
这个就是咱们需要授权使用的API。参数就是${}中的描述,可以在官方文档上看详细的说明。大家要注意的一点就是上面的链接需要在微信页打开,所以大家必须在前端location。我们后端只是提供这个链接就可以啦。
public Map<String, Object> locationAuthUrl(HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException {
LOGGER.info("用户获取auth_code");
Map<String, Object> codeMap = Maps.newHashMap();
codeMap.put("redirectUrl", weChatService.getAuthorityCode(request));
return codeMap;
}
private static String AUTH_CODE_URL_BASE = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=%s&scope=%s&state=%s%s";
public String getAsuthorityCode(AuthorityCodeRequest request) {
String url = String.format(AUTH_CODE_URL_BASE, request.getAppid(), request.getRedirectUri(),
request.getResponseType(), request.getScope(), request.getState(), request.getWechatRedirect());
LOGGER.info("WeChatManageService get authority Code url :{}", url);
return url;
}
由于公司规范我就不做详细代码的粘贴了,这个方法就是给前端同学返回一个权限认证的连接,这个连接需要前端同学在微信页打开。微信打开只有会回调我们的,配置的回调地址,当然可以是前端地址也可以是后端啦,我这里配置的是后端地址,域名就是咱们微信平台上配置的域名,只有这样微信服务器才认你的域名!!!切记。
request.getRedirectUri()
好了微信服务器回调我们这个地址的连接是这样的:
https://ljweb.hongdianfund.com/statics/wx/login?code=041QJiw52NW5tM0o2Sv52syrw52QJiw2&state=STATE
这个就是微信服务器的回调地址他会带上两个参数:code和state,但是我们现在只关注code,state我们不care。得到了这个code我们可以调用接口查询access_token了。注意这个code是微信当做参数传递过来的。我们直接取来使用就可以啦。
获取access_token的地址是:
https://api.weixin.qq.com/sns/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=%s
这里需要一个appId和secret,这两个参数都在我们的公众平台上可以获取到,这个code就是咱们微信带过来的请求参数。grant_type这个参数是一个默认值:authorization_code.
String url = String.format(USER_BASE_INFO, request.getAppId(), request.getSecret(), request.getCode(),
request.getGrantType());
WeChatUserBaseInfo userBaseInfo = null;
try {
LOGGER.info("getWeChatUserBaseInfo userId:{}, channelId:{}, url:{}", userId, channelId, url);
String result = HttpClientUtils.sendHttpsGet(url);
userBaseInfo = GsonHolder.getGson().fromJson(result, WeChatUserBaseInfo.class);
LOGGER.info("getWeChatUserBaseInfo userId:{}, channelId:{}, response:{}", userId, channelId, userBaseInfo);
} catch (Exception ex) {
LOGGER.error("getWeChatUserBaseInfo error userId:{}, channelId:{}", userId, channelId, ex);
}
public class WeChatUserBaseInfo implements Serializable {
@SerializedName("access_token")
private String accessToken;
@SerializedName("expires_in")
private String expiresIn;
@SerializedName("refresh_token")
private String refreshToken;
@SerializedName("openid")
private String openId;
@SerializedName("scope")
private String scope;
/*
get set 方法。。。。
*/
}
调用返回值中有一个参数是,access_token和openid,openID和access_token这个是咱们调用用户详细信息使用的参数。但是要是只是简单授权的话其实走到这一步就OK了。我们拿到了用户的openId就可以做一些事情了。后面咱们在说snsapi_userinfo方式的授权。欢迎大家指正,学习。后面我附上微信交互图,这样大家更清晰理解授权机制。
下面是直接调用微信的API返回的,说明必须在微信页打开:
泳道流程图(垂直).png
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=0">
</head>
<body>
<script type="text/javascript">
var ua = navigator.userAgent.toLowerCase();
var isWeixin = ua.indexOf('micromessenger') != -1;
var isAndroid = ua.indexOf('android') != -1;
var isIos = (ua.indexOf('iphone') != -1) || (ua.indexOf('ipad') != -1);
if (!isWeixin) {
document.head.innerHTML = '<title>抱歉,出错了</title><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=0"><link rel="stylesheet" type="text/css" href="https://res.wx.qq.com/open/libs/weui/0.4.1/weui.css">';
document.body.innerHTML = '<div class="weui_msg"><div class="weui_icon_area"><i class="weui_icon_info weui_icon_msg"></i></div><div class="weui_text_area"><h4 class="weui_msg_title">请在微信客户端打开链接</h4></div></div>';
}
</script>
</body>
</html>
上面就是关于微信的简洁交互,大家可以互相讨论,学习。
查看我的更多文章:codeinventor
网友评论
作者:星星依偎着阳阳
链接:http://www.jianshu.com/p/f64d5f11f26c
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
这个微信回调会触发两次,有遇到这个问题么