微信官方提供的生成二维码接口得到的是当前公众号的二维码官方文档(一定要先看)
目前有2种类型的二维码:
获取带参数的二维码有两种方法
调用接口时,请登录“微信公开发-基本配置”提前将服务器IP地址添加到IP白名单中,否则将无法调用成功!!!
Java微信公众平台开发之AccessToken获取
/**
* 创建临时带参数二维码
*
* @param accessToken
* @param sceneId 场景Id
* @return
* @expireSeconds 该二维码有效时间,以秒为单位。 最大不超过2592000(即30天),此字段如果不填,则默认有效期为30秒。
*/
@Override
public String createTempTicket(String accessToken, int sceneId, int expireSeconds) {
TreeMap params = new TreeMap<>();
params.put("access_token", accessToken);
// output data
JsonObject data = new JsonObject();
data.addProperty("action_name", QRCodeConstant.QR_SCENE);
data.addProperty("expire_seconds", expireSeconds);
JsonObject scene = new JsonObject();
scene.addProperty("scene_id", sceneId);
JsonObject actionInfo = new JsonObject();
actionInfo.add("scene", scene);
data.add("action_info", actionInfo);
String result = HttpUtil.doPost(WechatQRCodeConfig.getCreateTicketUrl(), params, data.toString());
WechatQRCode qrcode = JsonUtil.fromJson(result, WechatQRCode.class);
return qrcode == null ? null : qrcode.getTicket();
}
/**
* 创建临时带参数二维码(字符串)
*
* @param accessToken
* @param sceneStr 场景Id
* @return
* @expireSeconds 该二维码有效时间,以秒为单位。 最大不超过2592000(即30天),此字段如果不填,则默认有效期为30秒。
*/
@Override
public String createTempTicket(String accessToken, String sceneStr, int expireSeconds) {
TreeMap params = new TreeMap<>();
params.put("access_token", accessToken);
// output data
JsonObject data = new JsonObject();
data.addProperty("action_name", QRCodeConstant.QR_STR_SCENE);
data.addProperty("expire_seconds", expireSeconds);
JsonObject scene = new JsonObject();
scene.addProperty("scene_str", sceneStr);
JsonObject actionInfo = new JsonObject();
actionInfo.add("scene", scene);
data.add("action_info", actionInfo);
String result = HttpUtil.doPost(WechatQRCodeConfig.getCreateTicketUrl(), params, data.toString());
WechatQRCode qrcode = JsonUtil.fromJson(result, WechatQRCode.class);
return qrcode == null ? null : qrcode.getTicket();
}
/**
* 创建永久二维码(数字)
*
* @param accessToken
* @param sceneId 场景Id
* @return
*/
@Override
public String createForeverTicket(String accessToken, int sceneId) {
TreeMap params = new TreeMap<>();
params.put("access_token", accessToken);
// output data
JsonObject data = new JsonObject();
data.addProperty("action_name", QRCodeConstant.QR_LIMIT_SCENE);
JsonObject scene = new JsonObject();
scene.addProperty("scene_id", sceneId);
JsonObject actionInfo = new JsonObject();
actionInfo.add("scene", scene);
data.add("action_info", actionInfo);
String result = HttpUtil.doPost(WechatQRCodeConfig.getCreateTicketUrl(), params, data.toString());
WechatQRCode qrcode = JsonUtil.fromJson(result, WechatQRCode.class);
return qrcode == null ? null : qrcode.getTicket();
}
/**
* 创建永久二维码(字符串)
*
* @param accessToken
* @param sceneStr 场景str
* @return
*/
@Override
public String createForeverTicket(String accessToken, String sceneStr) {
TreeMap params = new TreeMap<>();
params.put("access_token", accessToken);
// output data
JsonObject data = new JsonObject();
data.addProperty("action_name", "QR_LIMIT_STR_SCENE");
JsonObject actionInfo = new JsonObject();
JsonObject scene = new JsonObject();
scene.addProperty("scene_str", sceneStr);
actionInfo.add("scene", scene);
data.add("action_info", actionInfo);
String result = HttpUtil.doPost(WechatQRCodeConfig.getCreateTicketUrl(), params, data.toString());
WechatQRCode qrcode = JsonUtil.fromJson(result, WechatQRCode.class);
return qrcode == null ? null : qrcode.getTicket();
}
强烈建议用测试号生成永久的,正式的会占用使用数量
/**
* 长链接转短链接
*
* @param accessToken
* @param longUrl 长链接
* @return
*/
private String toShortQRCodeurl(String accessToken, String longUrl) {
TreeMap params = new TreeMap<>();
params.put("access_token", accessToken);
JsonObject data = new JsonObject();
data.addProperty("action", QRCodeConstant.LONG_TO_SHORT);
data.addProperty("long_url", longUrl);
String result = HttpUtil.doPost(WechatQRCodeConfig.getShortQrcodeUrl(),
params, data.toString());
WechatQRCodeShortUrl wechatQRCodeShortUrl = JsonUtil.fromJson(result, WechatQRCodeShortUrl.class);
return wechatQRCodeShortUrl == null ? null : wechatQRCodeShortUrl.getShortUrl();
}
/**
* 获取二维码ticket后,通过ticket换取二维码图片展示
*
* @param accessToken
* @param ticket
* @param isShortUrl 是否需要展示
* @return
*/
@Override
public String showQrCode(String accessToken, String ticket, boolean isShortUrl) {
String url = String.format(WechatQRCodeConfig.getShowQrcodeUrl(), EncodeUtils.urlEncode(ticket));
if (isShortUrl) {
return toShortQRCodeurl(accessToken, url);
}
return url;
}
这个推送的XML信息通过之前开发者中心处设置的服务器地址获得,故得先接入
已关注推送XML示例
123456789
EventKey 事件KEY值,qrscene_为前缀,后面为二维码的参数值
未关注推送XML示例
123456789
EventKey 事件KEY值,是一个32位无符号整数,即创建二维码时的二维码scene_idxml处理方式
配置类
public class QRCodeConstant {
// 临时二维码
public static final String QR_SCENE = "QR_SCENE"; // -1
// 临时二维码(字符串)
public static final String QR_STR_SCENE = "QR_STR_SCENE";
// 永久二维码
public static final String QR_LIMIT_SCENE = "QR_LIMIT_SCENE";// 0
// 永久二维码(字符串)
public static final String QR_LIMIT_STR_SCENE = "QR_LIMIT_STR_SCENE";// 1
public static final String LONG_TO_SHORT = "long2short";
}
@Getter
@Setter
public class WechatQRCode {
// 获取的二维码
private String ticket;
// 二维码的有效时间,单位为秒,最大不超过2592000(即30天)
@SerializedName("expire_seconds")
private int expireSeconds;
// 二维码图片解析后的地址
//由于测试无法访问这个,故直接通过ticket 显示并转换成短链接
private String url;
}
略
具体源码 :https://github.com/philjing/my_wechat/tree/master/src/main/java/com/phil/wechat/qrcode