A. UniApp开发H5接入微信登录的全过程
在最近的uniapp开发过程中,遇到了H5调微信授权登录的需求,这里记录一下具体的实现过程。微信授权主要分为两种类型:静默授权和非静默授权。其中,静默授权仅能获取用户的openid,而非静默授权则需要用户手动点击同意授权,可获取用户的openid、昵称、头像、性别等信息。
网页授权的两种scope的区别在于:使用snsapi_base发起的网页授权主要用于获取用户openid,这种授权方式是静默授权,用户感知的是直接进入了回调页。而使用snsapi_userinfo发起的网页授权则是获取用户基本信息,这种授权需要用户手动同意,无需关注即可获取用户信息。用户管理类接口中的获取用户基本信息接口则需用户关注公众号后才能调用。
微信授权的流程包括:通过正则匹配请求地址中的参数获取code,若没有code则请求微信官方接口获取包含code的回调链接,然后使用code换取openid及access_token等参数。最后,若scope为snsapi_userinfo,则可以通过access_token和openid拉取用户信息。
具体实现中,前端通过正则匹配获取code,若没有code则跳转到授权页面,携带code的请求用于获取openid和access_token。后端使用java实现,通过HTTP GET请求获取access_token和openid。请求成功返回类似如下参数:access_token、expires_in、refresh_token、openid和scope。请求错误时返回错误码和错误信息。
当网页授权作用域为snsapi_userinfo时,可以通过access_token和openid拉取用户信息,请求方法为http:GET(请使用https协议)。返回的JSON数据包包含用户基本信息,如openid、nickname、sex、province、city、country等。错误时微信会返回错误码和错误信息。
通过以上步骤,微信登录的业务实现完毕。更多相关接口请参考微信开放文档。
B. 使用Java开发微信公众平台(二)——消息的接收与响应
本篇文章旨在深入讲解如何使用Java语言开发微信公众平台,特别是消息的接收与响应。在上一篇文章中,我们已学习了环境搭建与开发接入的基础知识。那么,本文将带您深入了解如何接收和响应消息。
在微信的开发者文档中,可以找到关于消息接收与响应的具体信息。点击“消息管理”下的“接受普通消息”,您将学习到普通文本消息的接收与响应方法。微信会以XML格式发送消息,并在接收到消息后向开发者服务器发送Post请求。
值得注意的是,微信服务器在五秒内收不到响应会断开连接,并尝试重试三次,因此在开发过程中要确保服务器能够及时处理并回复请求。如果无法保证五秒内处理并回复,可以简单回复空字符串,微信服务器对此不做任何处理,并不会发起重试。
接下来,我们将通过创建文本消息的实例,来展示如何实现消息接收与响应。首先,打开上次编写的Servlet,即处理微信请求的Servlet。在Post方法中,接收微信发送的XML内容。为了方便数据处理,可以新建两个方法,将XML数据类型转化为集合类型(如Map),反之,将对象类型转化为XML字符串。
在这一部分,我们将使用dom4j和xstream库来完成XML转换。首先,需要在Util包下创建一个Message工具类。这里,我们将创建一个方法,将接收到的XML格式转化为Map格式,借助dom4j库来实现此功能。随后,创建另一个方法,将消息对象转换为XML字符串,利用xstream库来实现。
完成XML转换方法后,回到Servlet中,实现消息接收与响应的功能。通过doPost方法,处理接收到的XML请求,并将请求内容转换为Map对象。从Map中获取相关参数,如接收用户、发送用户、消息类型、内容等。对于文本消息,可以创建一个TestMessage实体类,封装消息信息,并编写方法将其转换为XML格式返回给微信公众平台。
至此,您已成功实现文本消息的接收与响应。运行效果如下:用户发送任意内容,将收到各种回复信息。
为了方便读者参考,以下是相关代码片段。请确保将相关库正确导入,并根据需求调整代码以适应您的项目。
Servlet中的doPost方法
java
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();
String str = null;
try {
Map map = MessageUtil.xmlToMap(request);
String ToUserName = map.get("ToUserName");
String FromUserName = map.get("FromUserName");
String CreateTime = map.get("CreateTime");
String MsgType = map.get("MsgType");
String Content = map.get("Content");
String MsgId = map.get("MsgId");
if (MsgType.equals("text")) {
TestMessage message = new TestMessage();
message.setToUserName(FromUserName);
message.setFromUserName(ToUserName);
message.setMsgType("text");
message.setCreateTime(new Date().getTime());
message.setContent("您好," + FromUserName + "\n我是:" + ToUserName + "\n您发送的消息类型为:" + MsgType + "\n您发送的时间为:" + CreateTime + "\n我回复的时间为:" + message.getCreateTime() + "\n您发送的内容是:" + Content);
str = MessageUtil.objectToXml(message);
}
out.println(str);
} catch (Exception e) {
e.printStackTrace();
}
}
Message处理工具类
java
public class MessageUtil {
public static Map xmlToMap(HttpServletRequest request) throws IOException, DocumentException {
Map map = new HashMap>();
SAXReader reader = new SAXReader();
InputStream is = request.getInputStream();
Document doc = reader.read(is);
Element root = doc.getRootElement();
List list = root.elements();
for (Element e : list) {
map.put(e.getName(), e.getText());
}
is.close();
return map;
}
public static String objectToXml(TestMessage message) {
XStream xs = new XStream();
xs.alias("xml", message.getClass());
return xs.toXML(message);
}
}
TestMessage实体类
java
public class TestMessage {
private String ToUserName;
private String FromUserName;
private Long CreateTime;
private String MsgType;
private String Content;
private String MsgId;
// Getters and Setters
}
请确保在实际应用中调整代码以适应您的项目需求,并参考微信开发者文档获取更多详细信息。如有任何疑问或需要帮助,请随时联系我们。