微信公众号API的Service.用来请求微信服务器。
interface: WxMpService。
实现类:BaseWxMpServiceImpl
1.对应请求地址url-------主动请求
/**
*1. 获取access_token.
*/
String GET_ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s";
/**
*2. 获得各种类型的ticket.
*/
String GET_TICKET_URL = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=";
/**
*3. 长链接转短链接接口.
*/
String SHORTURL_API_URL = "https://api.weixin.qq.com/cgi-bin/shorturl";
/**
*4. 语义查询接口.
*/
String SEMANTIC_SEMPROXY_SEARCH_URL = "https://api.weixin.qq.com/semantic/semproxy/search";
/**
*5. 用code换取oauth2的access token.
*/
String OAUTH2_ACCESS_TOKEN_URL = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=authorization_code";
/**
*6. 刷新oauth2的access token.
*/
String OAUTH2_REFRESH_TOKEN_URL = "https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=%s&grant_type=refresh_token&refresh_token=%s";
/**
*7. 用oauth2获取用户信息.
*/
String OAUTH2_USERINFO_URL = "https://api.weixin.qq.com/sns/userinfo?access_token=%s&openid=%s&lang=%s";
/**
*8. 验证oauth2的access token是否有效.
*/
String OAUTH2_VALIDATE_TOKEN_URL = "https://api.weixin.qq.com/sns/auth?access_token=%s&openid=%s";
/**
*9. 获取微信服务器IP地址.
*/
String GET_CALLBACK_IP_URL = "https://api.weixin.qq.com/cgi-bin/getcallbackip";
/**
*10. 第三方使用网站应用授权登录的url.
*/
String QRCONNECT_URL = "https://open.weixin.qq.com/connect/qrconnect?appid=%s&redirect_uri=%s&response_type=code&scope=%s&state=%s#wechat_redirect";
/**
*11. oauth2授权的url连接.
*/
String CONNECT_OAUTH2_AUTHORIZE_URL = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=code&scope=%s&state=%s&connect_redirect=1#wechat_redirect";
/**
*12. 获取公众号的自动回复规则.
*/
String GET_CURRENT_AUTOREPLY_INFO_URL = "https://api.weixin.qq.com/cgi-bin/get_current_autoreply_info";
/**
* 13.公众号调用或第三方平台帮公众号调用对公众号的所有api调用(包括第三方帮其调用)次数进行清零.
*/
String CLEAR_QUOTA_URL = "https://api.weixin.qq.com/cgi-bin/clear_quota";
2. 服务端提供验证 ------- 验证消息的确来自微信服务器
3.针对该接口中的方法梳理和分析
3.1 微信验证签名信息---GET
开发者校验signature(下面有校验方式,确认此次GET请求来自微信服务器)。若,请原样返回echostr参数内容,则接入生效,成为开发者成功(返回微信服务器echostr),否则接入失败。加密/校验流程如下:1)将token、timestamp、nonce三个参数进行字典序排序 2)将三个参数字符串拼接成一个字符串进行sha1加密 3)开发者获得加密后的字符串可与signature对比。
参数 | 描述 |
---|---|
signature | 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。 |
timestamp | 时间戳 |
nonce | 随机数 |
echostr | 随机字符串 |
//验证消息的确来自微信服务器.
boolean checkSignature(String timestamp, String nonce, String signature);
3.2 获取access_token---GET
access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。
https请求方式: GET
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
//强制刷新从微信服务器获取,false则从内存中获取
String getAccessToken(boolean forceRefresh) throws WxErrorException;
3.3 获取微信服务器IP地址---GET
如果公众号基于安全等考虑,需要获知微信服务器的IP地址列表,以便进行相关限制,可以通过该接口获得微信服务器IP地址列表或者IP网段信息。
http请求方式: GET
https://api.weixin.qq.com/cgi-bin/getcallbackip?access_token=ACCESS_TOKEN
String[] getCallbackIP() throws WxErrorException;
4.微信网页授权
用户在微信客户端中访问第三方网页,授权获取用户基本信息。
scope=snsapi_base 获取进入页面的用户的openid的。静默授权。
scope=snsapi_userinfo 是用来获取用户的基本信息的。用户手动同意。
具体而言,网页授权流程分为四步:
1、引导用户进入授权页面同意授权,获取code
//一般挂载到菜单按钮上
String CONNECT_OAUTH2_AUTHORIZE_URL = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=code&scope=%s&state=%s&connect_redirect=1#wechat_redirect";
2、通过code换取网页授权access_token(与基础支持中的access_token不同)
String OAUTH2_ACCESS_TOKEN_URL = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=authorization_code";
3、如果需要,开发者可以刷新网页授权access_token,避免过期
4、通过网页授权access_token和openid获取用户基本信息(支持UnionID机制)
String OAUTH2_USERINFO_URL = "https://api.weixin.qq.com/sns/userinfo?access_token=%s&openid=%s&lang=%s";
授权方法作为wxService的接口方法
//构造oauth2授权的url连接
//一般挂载到菜单按钮上,用户进行点击确定,设置回调页面 ip:应用/greet
String oauth2buildAuthorizationUrl(String redirectURI, String scope, String state);
//用code换取oauth2的access token.
WxMpOAuth2AccessToken oauth2getAccessToken(String code) throws WxErrorException;
//刷新oauth2的access token.
WxMpOAuth2AccessToken oauth2refreshAccessToken(String refreshToken) throws WxErrorException;
//用oauth2获取用户信息, 当前面引导授权时的scope是snsapi_userinfo的时候才可以.
WxMpUser oauth2getUserInfo(WxMpOAuth2AccessToken oAuth2AccessToken, String lang) throws WxErrorException;
//验证oauth2的access token是否有效.
boolean oauth2validateAccessToken(WxMpOAuth2AccessToken oAuth2AccessToken);
5.微信客服
5.1普通微信用户向公众号发消息时,微信服务器会先将消息POST到开发者填写的url上, 如果希望将消息转发到客服系统,开发者在响应包中返回MsgType为transfer_customer_service的消息,微信服务器收到响应后会把当次发送的消息转发至客服系统。
//当用户输入关键词如“你好”,“客服”等,并且有客服在线时,把消息转发给在线客服
if (StringUtils.startsWithAny(wxMessage.getContent(), "你好", "客服")
&& weixinService.getKefuService().kfOnlineList()
.getKfOnlineList().size() > 0) {
return WxMpXmlOutMessage.TRANSFER_CUSTOMER_SERVICE()
.fromUser(wxMessage.getToUser())
.toUser(wxMessage.getFromUser()).build();
}
//获取在线客服接待信息
WxMpKfOnlineList kfOnlineList() throws WxErrorException;
//接口:
String GET_ONLINE_KF_LIST = "https://api.weixin.qq.com/cgi-bin/customservice/getonlinekflist"
5.2用户被客服接入以后,客服关闭会话以前,处于会话过程中时,用户发送的消息均会被直接转发至客服系统。当会话超过30分钟客服没有关闭时,微信服务器会自动停止转发至客服,而将消息恢复发送至开发者填写的url上。
5.3用户在等待队列中时,用户发送的消息仍然会被推送至开发者填写的url上。