您的位置:首页 > 移动开发 > 微信开发

Java微信公众平台开发之生成带参二维码

2016-12-28 17:22 399 查看
微信官方提供的生成二维码接口得到的是当前公众号的二维码,官方文档

目前有2种类型的二维码:
临时二维码,是有过期时间的,最长可以设置为在二维码生成后的30天(即2592000秒)后过期,但能够生成较多数量,主要用于帐号绑定等不要求二维码永久保存的业务场景
永久二维码,是无过期时间的,但数量较少(目前为最多10万个),主要用于适用于帐号绑定、用户来源统计等场景
获取带参数的二维码有两种方法

先获取二维码ticket,然后凭借ticket通过接口换取二维码图片,但是得到ticket之前首先得获取微信全局唯一接口调用凭据
根据微信返回二维码中url参数自行生成二维码

一、获取微信全局接口调用凭证

调用接口时,请登录“微信公众平台-开发-基本配置”提前将服务器IP地址添加到IP白名单中,否则将无法调用成功

Java微信公众平台开发之AccessToken获取

二、获取二维码的Ticket

/**
* 创建临时带参数二维码
*
* @param accessToken
* @expireSeconds 该二维码有效时间,以秒为单位。 最大不超过2592000(即30天),此字段如果不填,则默认有效期为30秒。
* @param sceneId 场景Id
* @return
*/
public String createTempTicket(String accessToken, String expireSeconds, int sceneId) {
WechatQRCode wechatQRCode = null;
TreeMap<String, String> params = new TreeMap<String, String>();
params.put("access_token", accessToken);
Map<String, Integer> intMap = new HashMap<String, Integer>();
intMap.put("scene_id", sceneId);
Map<String, Map<String, Integer>> mapMap = new HashMap<String, Map<String, Integer>>();
mapMap.put("scene", intMap);
//
Map<String, Object> paramsMap = new HashMap<String, Object>();
paramsMap.put("expire_seconds", expireSeconds);
paramsMap.put("action_name", WeChatConfig.QR_SCENE);
paramsMap.put("action_info", mapMap);
Gson gson = new Gson();
String data = gson.toJson(paramsMap);
data = HttpReqUtil.HttpsDefaultExecute(HttpReqUtil.POST_METHOD, WeChatConfig.CREATE_TICKET_PATH, params, data);
try {
wechatQRCode = gson.fromJson(data, WechatQRCode.class);
gson = null;
} catch (JsonSyntaxException e) {
e.printStackTrace();
}
return wechatQRCode == null ? null : wechatQRCode.getTicket();

}

/**
* 创建永久二维码(数字)
*
* @param accessToken
* @param sceneId 场景Id
* @return
*/
public String createForeverTicket(String accessToken, int sceneId) {
TreeMap<String, String> params = new TreeMap<String, String>();
params.put("access_token", accessToken);
// output data
Map<String, Integer> intMap = new HashMap<String, Integer>();
intMap.put("scene_id", sceneId);
Map<String, Map<String, Integer>> mapMap = new HashMap<String, Map<String, Integer>>();
mapMap.put("scene", intMap);
//
Map<String, Object> paramsMap = new HashMap<String, Object>();
paramsMap.put("action_name", WeChatConfig.QR_LIMIT_SCENE);
paramsMap.put("action_info", mapMap);
Gson gson = new Gson();
String data = gson.toJson(paramsMap);
data = HttpReqUtil.HttpsDefaultExecute(HttpReqUtil.POST_METHOD, WeChatConfig.CREATE_TICKET_PATH, params, data);
WechatQRCode wechatQRCode = null;
try {
wechatQRCode = gson.fromJson(data, WechatQRCode.class);
gson = null;
} catch (JsonSyntaxException e) {
e.printStackTrace();
}
return wechatQRCode == null ? null : wechatQRCode.getTicket();
}

/**
* 创建永久二维码(字符串)
*
* @param accessToken
* @param sceneStr 场景str
* @return
*/
public String createForeverStrTicket(String accessToken, String sceneStr) {
TreeMap<String, String> params = new TreeMap<String, String>();
params.put("access_token", accessToken);
// output data
Map<String, String> intMap = new HashMap<String, String>();
intMap.put("scene_str", sceneStr);
Map<String, Map<String, String>> mapMap = new HashMap<String, Map<String, String>>();
mapMap.put("scene", intMap);
Map<String, Object> paramsMap = new HashMap<String, Object>();
paramsMap.put("action_name", WeChatConfig.QR_LIMIT_STR_SCENE);
paramsMap.put("action_info", mapMap);
Gson gson = new Gson();
String data = gson.toJson(paramsMap);
data = HttpReqUtil.HttpsDefaultExecute(HttpReqUtil.POST_METHOD, WeChatConfig.CREATE_TICKET_PATH, params, data);
WechatQRCode wechatQRCode = null;
try {
wechatQRCode = gson.fromJson(data, WechatQRCode.class);
gson = null;
} catch (JsonSyntaxException e) {
e.printStackTrace();
}
return wechatQRCode == null ? null : wechatQRCode.getTicket();
}


强烈建议用测试号生成永久的,正式的会占用使用数量

三、二维码长链接转成短链接

微信返回正确的二维码的结果,参数有个url,即二维码图片解析后的地址,也可以根据此URL生成需要的二维码图片,而不需要通过ticket去换取图片了
/**
* 长链接转短链接
* @param accessToken
* @param longUrl 长链接
* @return
*/
public String shortQRCodeurl(String accessToken, String longUrl){
TreeMap<String, String> params = new TreeMap<String, String>();
params.put("access_token", accessToken);
Map<String, Object> paramsMap = new HashMap<String, Object>();
paramsMap.put("action", "long2short");
paramsMap.put("long_url", longUrl);
Gson gson = new Gson();
String data = gson.toJson(paramsMap);
String result = HttpReqUtil.HttpsDefaultExecute(HttpReqUtil.POST_METHOD, WeChatConfig.WECHAT_SHORT_QRCODE_URL, params, data);
WechatQRCodeShortUrl wechatQRCodeShortUrl = gson.fromJson(result, WechatQRCodeShortUrl.class);
gson = null;
return wechatQRCodeShortUrl.getShort_url();
}

四、通过ticket凭证直接获取二维码

/**
* 获取二维码ticket后,通过ticket换取二维码图片展示
* @param ticket
* @return 二维码图片地址
* @throws Exception
*/
public String showQrcode(String ticket) throws Exception {
return HttpReqUtil.setParmas(params(ticket), WeChatConfig.SHOW_QRCODE_PATH, null);
}

/**
* 下载二维码
*
* @param ticket
* @param savePath 保存的路径,例如 F:\\phil\phil.jpg
* @return Result.success = true 表示下载图片下载成功
*/
public WechatResult showQrcode(String ticket, String savePath) throws Exception {
return HttpReqUtil.downMeaterMetod(params(ticket), HttpReqUtil.GET_METHOD, WeChatConfig.SHOW_QRCODE_PATH, savePath);
}

private TreeMap<String, String> params(String ticket) {
TreeMap<String, String> params = new TreeMap<String, String>();
params.put("ticket", HttpReqUtil.urlEncode(ticket, SystemConfig.CHARACTER_ENCODING));
return params;
}

五、扫描带参数二维码事件推送

这个推送的XML信息通过之前开发者中心处设置的服务器地址获得,故得先接入

已关注推送XML示例

<xml><ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[FromUser]]></FromUserName>
<CreateTime>123456789</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[subscribe]]></Event>
<EventKey><![CDATA[qrscene_123123]]></EventKey>
<Ticket><![CDATA[TICKET]]></Ticket>
</xml>
EventKey 事件KEY值,qrscene_为前缀,后面为二维码的参数值
未关注推送XML示例

<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[FromUser]]></FromUserName>
<CreateTime>123456789</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[SCAN]]></Event>
<EventKey><![CDATA[SCENE_VALUE]]></EventKey>
<Ticket><![CDATA[TICKET]]></Ticket>
</xml>
EventKey 事件KEY值,是一个32位无符号整数,即创建二维码时的二维码scene_idxml处理方式

六、附

2017.9.19 工具类不再提供
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: