Java微信公众平台开发之生成带参二维码
2016-12-28 17:22
399 查看
微信官方提供的生成二维码接口得到的是当前公众号的二维码,官方文档
目前有2种类型的二维码:
临时二维码,是有过期时间的,最长可以设置为在二维码生成后的30天(即2592000秒)后过期,但能够生成较多数量,主要用于帐号绑定等不要求二维码永久保存的业务场景
永久二维码,是无过期时间的,但数量较少(目前为最多10万个),主要用于适用于帐号绑定、用户来源统计等场景
获取带参数的二维码有两种方法
先获取二维码ticket,然后凭借ticket通过接口换取二维码图片,但是得到ticket之前首先得获取微信全局唯一接口调用凭据
根据微信返回二维码中url参数自行生成二维码
Java微信公众平台开发之AccessToken获取
强烈建议用测试号生成永久的,正式的会占用使用数量
已关注推送XML示例
未关注推送XML示例
目前有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 工具类不再提供相关文章推荐
- Java微信公众平台开发之生成带参二维码
- Java微信公众平台开发之生成带参二维码
- 生成带参二维码--微信公众平台开发(二)
- 微信公众平台开发 批量生成及下载带参二维码图片
- 生成带参二维码--微信公众平台开发(二)
- 微信公众平台开发(83) 生成带参数二维码
- 微信公众平台开发(83) 生成带参数二维码
- JAVA开发--[二维码名片生成系统]
- 微信公众平台开发文档 生成带参数的二维码
- 微信扫码支付第一种场景(先生成产品二维码,用户扫码生成交易)JAVA开发总结
- Java 微信开发(四)生成带参数二维码及分享到朋友圈、好友、QQ
- java开发_生成/解析自己的QRCode二维码
- 毛超帅 使用 jquery.qrcode.js 生成网站地址url二维码图片______软件开发-JAVA
- 微信公众平台开发(83) 生成带参数二维码
- 微信公众平台开发(83) 生成带参数二维码
- 微信公众号开发---生成带参二维码
- java开发_生成/解析自己的QRCode二维码
- 微信公众平台开发文档 生成带参数的二维码
- 微信公众平台开发文档 生成带参数的二维码
- java基于谷歌开发的zxing包开发的二维码生成工具