微信官方提供的生成二维码接口得到的是当前公众号的二维码

转自:http://blog.youkuaiyun.com/phil_jing/article/details/53910083

微信官方提供的生成二维码接口得到的是当前公众号的二维码,官方文档

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

获取带参数的二维码有两种方法

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

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

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

二、获取二维码的Ticket

  1. /** 
  2.  * 创建临时带参数二维码 
  3.  *  
  4.  * @param accessToken 
  5.  * @expireSeconds 该二维码有效时间,以秒为单位。 最大不超过2592000(即30天),此字段如果不填,则默认有效期为30秒。 
  6.  * @param sceneId 场景Id 
  7.  * @return 
  8.  */  
  9. public String createTempTicket(String accessToken, String expireSeconds, int sceneId) {  
  10.     WechatQRCode wechatQRCode = null;  
  11.     TreeMap<String, String> params = new TreeMap<String, String>();  
  12.     params.put("access_token", accessToken);  
  13.     Map<String, Integer> intMap = new HashMap<String, Integer>();  
  14.     intMap.put("scene_id", sceneId);  
  15.     Map<String, Map<String, Integer>> mapMap = new HashMap<String, Map<String, Integer>>();  
  16.     mapMap.put("scene", intMap);  
  17.     //  
  18.     Map<String, Object> paramsMap = new HashMap<String, Object>();  
  19.     paramsMap.put("expire_seconds", expireSeconds);  
  20.     paramsMap.put("action_name", WeChatConfig.QR_SCENE);  
  21.     paramsMap.put("action_info", mapMap);  
  22.     Gson gson = new Gson();  
  23.     String data = gson.toJson(paramsMap);  
  24.     data = HttpReqUtil.HttpsDefaultExecute(HttpReqUtil.POST_METHOD, WeChatConfig.CREATE_TICKET_PATH, params, data);  
  25.     try {  
  26.         wechatQRCode = gson.fromJson(data, WechatQRCode.class);  
  27.         gson = null;  
  28.     } catch (JsonSyntaxException e) {  
  29.         e.printStackTrace();  
  30.     }  
  31.     return wechatQRCode == null ? null : wechatQRCode.getTicket();  
  32.   
  33. }  
  34.   
  35. /** 
  36.  * 创建永久二维码(数字) 
  37.  *  
  38.  * @param accessToken 
  39.  * @param sceneId 场景Id 
  40.  * @return 
  41.  */  
  42. public String createForeverTicket(String accessToken, int sceneId) {  
  43.     TreeMap<String, String> params = new TreeMap<String, String>();  
  44.     params.put("access_token", accessToken);  
  45.     // output data  
  46.     Map<String, Integer> intMap = new HashMap<String, Integer>();  
  47.     intMap.put("scene_id", sceneId);  
  48.     Map<String, Map<String, Integer>> mapMap = new HashMap<String, Map<String, Integer>>();  
  49.     mapMap.put("scene", intMap);  
  50.     //  
  51.     Map<String, Object> paramsMap = new HashMap<String, Object>();  
  52.     paramsMap.put("action_name", WeChatConfig.QR_LIMIT_SCENE);  
  53.     paramsMap.put("action_info", mapMap);  
  54.     Gson gson = new Gson();  
  55.     String data = gson.toJson(paramsMap);  
  56.     data = HttpReqUtil.HttpsDefaultExecute(HttpReqUtil.POST_METHOD, WeChatConfig.CREATE_TICKET_PATH, params, data);  
  57.     WechatQRCode wechatQRCode = null;  
  58.     try {  
  59.         wechatQRCode = gson.fromJson(data, WechatQRCode.class);  
  60.         gson = null;  
  61.     } catch (JsonSyntaxException e) {  
  62.         e.printStackTrace();  
  63.     }  
  64.     return wechatQRCode == null ? null : wechatQRCode.getTicket();  
  65. }  
  66.   
  67. /** 
  68.  * 创建永久二维码(字符串) 
  69.  *  
  70.  * @param accessToken 
  71.  * @param sceneStr 场景str 
  72.  * @return 
  73.  */  
  74. public String createForeverStrTicket(String accessToken, String sceneStr) {  
  75.     TreeMap<String, String> params = new TreeMap<String, String>();  
  76.     params.put("access_token", accessToken);  
  77.     // output data  
  78.     Map<String, String> intMap = new HashMap<String, String>();  
  79.     intMap.put("scene_str", sceneStr);  
  80.     Map<String, Map<String, String>> mapMap = new HashMap<String, Map<String, String>>();  
  81.     mapMap.put("scene", intMap);  
  82.     Map<String, Object> paramsMap = new HashMap<String, Object>();  
  83.     paramsMap.put("action_name", WeChatConfig.QR_LIMIT_STR_SCENE);  
  84.     paramsMap.put("action_info", mapMap);  
  85.     Gson gson = new Gson();  
  86.     String data = gson.toJson(paramsMap);  
  87.     data = HttpReqUtil.HttpsDefaultExecute(HttpReqUtil.POST_METHOD, WeChatConfig.CREATE_TICKET_PATH, params, data);  
  88.     WechatQRCode wechatQRCode = null;  
  89.     try {  
  90.         wechatQRCode = gson.fromJson(data, WechatQRCode.class);  
  91.         gson = null;  
  92.     } catch (JsonSyntaxException e) {  
  93.         e.printStackTrace();  
  94.     }  
  95.     return wechatQRCode == null ? null : wechatQRCode.getTicket();  
  96. }  
强烈建议用测试号生成永久的,正式的会占用使用数量
三、二维码长链接转成短链接
微信返回正确的二维码的结果,参数有个url,即二维码图片解析后的地址,也可以根据此URL生成需要的二维码图片,而不需要通过ticket去换取图片了
  1. /** 
  2.  * 长链接转短链接 
  3.  * @param accessToken  
  4.  * @param longUrl 长链接 
  5.  * @return 
  6.  */  
  7. public String shortQRCodeurl(String accessToken, String longUrl){  
  8.     TreeMap<String, String> params = new TreeMap<String, String>();  
  9.     params.put("access_token", accessToken);  
  10.     Map<String, Object> paramsMap = new HashMap<String, Object>();  
  11.     paramsMap.put("action""long2short");  
  12.     paramsMap.put("long_url", longUrl);  
  13.     Gson gson = new Gson();  
  14.     String data = gson.toJson(paramsMap);  
  15.     String result = HttpReqUtil.HttpsDefaultExecute(HttpReqUtil.POST_METHOD, WeChatConfig.WECHAT_SHORT_QRCODE_URL, params, data);  
  16.     WechatQRCodeShortUrl wechatQRCodeShortUrl = gson.fromJson(result, WechatQRCodeShortUrl.class);  
  17.     gson = null;  
  18.     return wechatQRCodeShortUrl.getShort_url();  
  19. }  
四、通过ticket凭证直接获取二维码
  1. /** 
  2.  * 获取二维码ticket后,通过ticket换取二维码图片展示 
  3.  * @param ticket 
  4.  * @return 二维码图片地址 
  5.  * @throws Exception 
  6.  */  
  7. public String showQrcode(String ticket) throws Exception {  
  8.     return HttpReqUtil.setParmas(params(ticket), WeChatConfig.SHOW_QRCODE_PATH, null);  
  9. }  
  10.   
  11. /** 
  12.  * 下载二维码 
  13.  *  
  14.  * @param ticket 
  15.  * @param savePath 保存的路径,例如 F:\\phil\phil.jpg 
  16.  * @return Result.success = true 表示下载图片下载成功 
  17.  */  
  18. public WechatResult showQrcode(String ticket, String savePath) throws Exception {  
  19.     return HttpReqUtil.downMeaterMetod(params(ticket), HttpReqUtil.GET_METHOD, WeChatConfig.SHOW_QRCODE_PATH, savePath);  
  20. }  
  21.   
  22. private TreeMap<String, String> params(String ticket) {  
  23.     TreeMap<String, String> params = new TreeMap<String, String>();  
  24.     params.put("ticket", HttpReqUtil.urlEncode(ticket, SystemConfig.CHARACTER_ENCODING));  
  25.     return params;  
  26. }  
五、扫描带参数二维码事件推送

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

已关注推送XML示例

  1. <xml><ToUserName><![CDATA[toUser]]></ToUserName>  
  2. <FromUserName><![CDATA[FromUser]]></FromUserName>  
  3. <CreateTime>123456789</CreateTime>  
  4. <MsgType><![CDATA[event]]></MsgType>  
  5. <Event><![CDATA[subscribe]]></Event>  
  6. <EventKey><![CDATA[qrscene_123123]]></EventKey>  
  7. <Ticket><![CDATA[TICKET]]></Ticket>  
  8. </xml>  
EventKey 事件KEY值,qrscene_为前缀,后面为二维码的参数值

未关注推送XML示例

  1. <xml>  
  2. <ToUserName><![CDATA[toUser]]></ToUserName>  
  3. <FromUserName><![CDATA[FromUser]]></FromUserName>  
  4. <CreateTime>123456789</CreateTime>  
  5. <MsgType><![CDATA[event]]></MsgType>  
  6. <Event><![CDATA[SCAN]]></Event>  
  7. <EventKey><![CDATA[SCENE_VALUE]]></EventKey>  
  8. <Ticket><![CDATA[TICKET]]></Ticket>  
  9. </xml>  
EventKey 事件KEY值,是一个32位无符号整数,即创建二维码时的二维码scene_id xml处理方式
六、附
2017.9.19 工具类不再提供
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值