转自:http://blog.youkuaiyun.com/phil_jing/article/details/53910083
微信官方提供的生成二维码接口得到的是当前公众号的二维码,官方文档
目前有2种类型的二维码:- 临时二维码,是有过期时间的,最长可以设置为在二维码生成后的30天(即2592000秒)后过期,但能够生成较多数量,主要用于帐号绑定等不要求二维码永久保存的业务场景
- 永久二维码,是无过期时间的,但数量较少(目前为最多10万个),主要用于适用于帐号绑定、用户来源统计等场景
获取带参数的二维码有两种方法
- 先获取二维码ticket,然后凭借ticket通过接口换取二维码图片,但是得到ticket之前首先得获取微信全局唯一接口调用凭据
- 根据微信返回二维码中url参数自行生成二维码
一、获取微信全局接口调用凭证
调用接口时,请登录“微信公众平台-开发-基本配置”提前将服务器IP地址添加到IP白名单中,否则将无法调用成功
二、获取二维码的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>
未关注推送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>
六、附
2017.9.19 工具类不再提供