主页> 常见问题> Java微信公众平台开发之生成带参二维码

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

阅读: 常见问题

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

目前有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 params = new TreeMap();
		params.put("access_token", accessToken);
		Map intMap = new HashMap();
		intMap.put("scene_id", sceneId);
		Map> mapMap = new HashMap>();
		mapMap.put("scene", intMap);
		//
		Map paramsMap = new HashMap();
		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 params = new TreeMap();
		params.put("access_token", accessToken);
		// output data
		Map intMap = new HashMap();
		intMap.put("scene_id", sceneId);
		Map> mapMap = new HashMap>();
		mapMap.put("scene", intMap);
		//
		Map paramsMap = new HashMap();
		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 params = new TreeMap();
		params.put("access_token", accessToken);
		// output data
		Map intMap = new HashMap();
		intMap.put("scene_str", sceneStr);
		Map> mapMap = new HashMap>();
		mapMap.put("scene", intMap);
		Map paramsMap = new HashMap();
		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 params = new TreeMap();
		params.put("access_token", accessToken);
		Map paramsMap = new HashMap();
		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:philphil.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 params(String ticket) {
		TreeMap params = new TreeMap();
		params.put("ticket", HttpReqUtil.urlEncode(ticket, SystemConfig.CHARACTER_ENCODING));
		return params;
	}
五、扫描带参数二维码事件推送

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

已关注推送XML示例



123456789




EventKey 事件KEY值,qrscene_为前缀,后面为二维码的参数值

未关注推送XML示例




123456789




EventKey 事件KEY值,是一个32位无符号整数,即创建二维码时的二维码scene_idxml处理方式

【温馨提示】倡导尊重与保护知识产权。如发现本站文章存在版权问题,烦请提供版权疑问、身份证明、版权证明、联系方式等发邮件至55506560@qq.com ,我们将及时处理。本站文章仅作分享交流用途,作者观点不等同于本站观点。用户与作者的任何交易与本站无关,请知悉。

客服
套餐咨询,操作答疑等
在线客服