微信二维码生成是指后端发送请求向微信服务器申请公众号的二维码,用户如果未关注,进行扫描改二维码后即跳转道公众号的关注页面;如果已经关注,扫描二维码后直接进入该微信公众号。当用户扫码时,微信服务器会向后端发送不同类型的扫描事件类型回调,后端可以通过不同情况分别作出响应的处理。
获取微信二维码的流程是:
- 使用官方接口携带AccessToken获取临时二维码的ticket
- 使用官方接口携带ticket传入不同的参数换取不同类型的二维码,可以是二维码图片流,也可以是二维码图片链接
其中需要注意的是:
在获取二维码的ticket的时候,需要携带场景值参数来作为本次二维码场景的标识,比如用户的ID,或者其他唯一码,该场景之在用户扫描该二维码是会进行回调返回携带回来,这样做的目的是,可以分辨出是哪个用户或者哪个场景进行扫描了二维码的操作,最后将用户或者场景的唯一值和返回的openid进行绑定,以便于后续给已关注用户提供服务。
创建微信二维码
获取ticket请求说明
http请求方式: POST URL: https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=TOKEN POST
参数数据:
第一种:临时二维码,场景值ID为整型
{
"expire_seconds": 604800,
"action_name": "QR_SCENE",
"action_info": {
"scene": {
"scene_id": 123
}
}
}
第二种:临时二维码,场景值ID为字符串
{
"expire_seconds": 604800,
"action_name": "QR_STR_SCENE",
"action_info": {
"scene": {
"scene_str": "test"
}
}
}
第三种:永久二维码,场景值ID为整型
{
"action_name": "QR_LIMIT_SCENE",
"action_info": {
"scene": {
"scene_id": 123
}
}
}
第四种:永久二维码,场景值ID为字符串
{
"action_name": "QR_LIMIT_STR_SCENE",
"action_info": {
"scene": {
"scene_str": "test"
}
}
}
参数说明:
返回结果:
正确的Json返回结果:
{
"ticket": "gQE48DwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAyZVpRRnhiRDVkb0gxNGp6eWhBY2QAAgSTKBlkAwSAOgkA",
"expire_seconds": 604800,
"url": "http:\/\/weixin.qq.com\/q\/02eZQFxbD5doH14jzyhAcd"
}
ticket换取微信二维码
获取二维码ticket后,开发者可用ticket换取二维码图片。请注意,本接口无须登录态即可调用。
请求说明:
HTTP GET请求(请使用https协议)https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=TICKET 提醒:TICKET记得进行UrlEncode
返回说明:
ticket正确情况下,http 返回码是200,是一张图片,可以直接展示或者下载。
代码示例
package cn.kt.mywxdemo.message;
import cn.kt.mywxdemo.token.TokenUtil;
import cn.kt.mywxdemo.utils.HttpUtil;
import org.junit.Test;
/**
* Created by tao.
* Date: 2023/3/7 19:56
* 描述:生成二维码
*/
public class TestTicket {
@Test
public void testCreateTicket() {
String url = String.format("https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=%s",
TokenUtil.getAccessToken());
//生成临时二维码
String data = "{\"expire_seconds\": 604800, \"action_name\": \"QR_STR_SCENE\", \"action_info\": {\"scene\": {\"scene_str\": \"test_scene_str\"}}}";
//发送post请求
String result = HttpUtil.doPost(url, data);
System.out.println(result);
/* 【重要注意】:二维码携带值场景值ID
* scene_str:场景值ID(字符串形式的ID),字符串类型,长度限制为1到64
* scene_id:场景值ID,临时二维码时为32位非0整型,永久二维码时最大值为100000(目前参数只支持1--100000)
*/
// 二维码:https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=gQGE8DwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAyam80X3dYRDVkb0gxNjZxaDFBYzYAAgQGIAhkAwSAOgkA
}
}
用户扫码关注回调
用户扫码关注是一个消息事件,需要在上述消息回复中进行处理,处理方法是用户扫描了我们生成的微信二维码,微信服务器回向我们的服务器发送一个扫描事件的消息,我们在后台需要判断捕捉,并进行相应的处理。
微信的扫描带参数二维码事件官方文档详情:
https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Receiving_event_pushes.html#%E6%89%AB%E6%8F%8F%E5%B8%A6%E5%8F%82%E6%95%B0%E4%BA%8C%E7%BB%B4%E7%A0%81%E4%BA%8B%E4%BB%B6
在后台进行捕捉:
需要在接收用户消息的方法里面进行接收消息:
处理关注和取消关注事件:
至此就完成了微信二维码生成与扫码关注的逻辑处理
源码下载