微信开发之带参二维码的使用

使用Java生成微信带参二维码
本文详细介绍了如何使用Java创建微信临时和永久二维码,并通过示例代码展示了生成二维码的过程。主要内容包括二维码分类、创建二维码票证、换取二维码以及生成二维码的Java代码实现。

就在今年春节期间,有个我不愿提及的人说要做个使用微信扫描二维码的方式实现会议签到的功能,当时还没接触任何的微信开发,也就只说自己不会微信开发。直到今天才直到应该怎么实现。现在很多东西都用php来开发微信,我就用java做了几个项目居然被php的鄙视,二话没说直接把这种好友拉入黑名单。语言本身无优劣之分,没有糟糕的语言只有糟糕的不想学习的懒惰程序员。好了废话不多说进入今天的主题-----------微信带参二维码的使用


一 为什么会有这样的要求

前些年二维码主要是为了扫描之后出现链接,点击之后进行下载各类APP的场合。二维码也就这样流行起来,微信也不甘落后,扫一扫的这种功能就来了。


二  微信带参二维码的分类

微信带参二维码主要分临时二维码、永久二维码两种,下面是微信开发文档的解释:

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

看过之后对带参二维码应该有了比较全面的认识了,接下来就是重头戏---Java代码


三  使用程序生成并换取二维码

要获取到最终的二维码只需要简单的两步分别是创建二维码ticket、通过ticket换取二维码,接下来就是贴代码了:


1  创建二维码ticket

public static WeixinQRCode createTemporaryQRCode(String token,int expireSeconds,int sceneId){
		
		
		String requestUrl="https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=TOKEN";
		requestUrl=requestUrl.replace("TOKEN", token);
		String jsonMsg="{\"expire_seconds\": %d, \"action_name\": \"QR_SCENE\", \"action_info\": {\"scene\": {\"scene_id\": %d}}}";
		JSONObject json=CommonUtil.httpsRequest(requestUrl, "POST", String.format(jsonMsg, expireSeconds,sceneId));
		
		WeixinQRCode w=null;
		if(json!=null){
			try{
				w=new WeixinQRCode();
				w.setExpire_seconds(json.getInt("expire_seconds"));
				w.setTicket(json.getString("ticket"));
				w.setUrl(json.getString("url"));
			}catch(Exception e){
				//e.printStackTrace();
				int errorCode=json.getInt("errorcode");
				String errorMsg=json.getString("errmsg");
				System.out.println(errorCode+":"+errorMsg);
			}
			
		}
		return w;
		
}
上面的代码是用于临时二维码,下面在贴上永久二维码的代码:

public static WeixinQRCode createPermanentQRCode(String token,int sceneId){
		
		
		String requestUrl="https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=TOKEN";
		requestUrl=requestUrl.replace("TOKEN", token);
		String jsonMsg="{\"action_name\": \"QR_LIMIT_SCENE\", \"action_info\": {\"scene\": {\"scene_id\": %d}}}";
		JSONObject json=CommonUtil.httpsRequest(requestUrl, "POST", String.format(jsonMsg, sceneId));
		
		WeixinQRCode w=null;
		if(json!=null){
			try{
				w=new WeixinQRCode();
				//w.setExpire_seconds(json.getInt("expire_seconds"));
				w.setTicket(json.getString("ticket"));
				w.setUrl(json.getString("url"));
			}catch(Exception e){
				//e.printStackTrace();
				int errorCode=json.getInt("errorcode");
				String errorMsg=json.getString("errmsg");
				System.out.println(errorCode+":"+errorMsg);
			}
			
		}
		return w;
		
}

2  通过ticket换取二维码

public static void  getImageQRCode(String ticket,String savePath) throws Exception{
		String requestUrl="https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=TICKET";
		requestUrl=requestUrl.replace("TICKET", URLEncoder.encode(ticket, "UTF-8"));
		try{
		    URL url = new URL(requestUrl);  
            HttpURLConnection httpUrlConn = (HttpURLConnection) url.openConnection();  
           
  
            httpUrlConn.setDoOutput(true);  
            httpUrlConn.setDoInput(true);  
            httpUrlConn.setUseCaches(false);  
            // 设置请求方式(GET/POST)  
            httpUrlConn.setRequestMethod("GET");  
            httpUrlConn.connect();  
       
            // 将返回的输入流转换成字符串  
            InputStream inputStream = httpUrlConn.getInputStream();  
            BufferedInputStream bis=new BufferedInputStream(inputStream);
            FileOutputStream bos=new FileOutputStream(new File(savePath));
            int temp=0;
            while ((temp=bis.read())!=-1) {  
            	bos.write(temp);
            }  
            bos.close();  
            bis.close();  
            // 释放资源  
            inputStream.close();  
            inputStream = null;  
            httpUrlConn.disconnect();  
	}catch(Exception e){
	   e.printStackTrace();
	}
}

下面是WeixinQRCode,直接上代码:

package com.debug.weixin.pojo;

public class WeixinQRCode {
	private String ticket;
	private int expire_seconds;
	private String url;

	public String getTicket() {
		return ticket;
	}

	public void setTicket(String ticket) {
		this.ticket = ticket;
	}

	public int getExpire_seconds() {
		return expire_seconds;
	}

	public void setExpire_seconds(int expireSeconds) {
		expire_seconds = expireSeconds;
	}

	public String getUrl() {
		return url;
	}

	public void setUrl(String url) {
		this.url = url;
	}
}

下面是运行效果图:



### 微信小程序云开发生成二维码微信小程序中,通过云开发可以方便地创建有自定义数的小程序。这允许不同的推广渠道拥有独立的二维码,并能追踪到具体的访问来源。 #### 创建云函数用于获取小程序 为了实现这一目标,首先需要编写一个云函数来调用微信接口以获得指定路径和查询字符串的小程序: ```javascript // cloudfunctions/getQrcode/index.js const cloud = require('wx-server-sdk') cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV }) exports.main = async (event, context) => { try { const result = await wx.cloud.callFunction({ name: 'getWxacode', data: { path: event.path, query: JSON.stringify(event.query), width: 430 } }) return { code: 200, message: "success", buffer: result.buffer } } catch (err) { console.error(err) throw new Error(`Failed to get qrcode ${JSON.stringify(err)}`) } } ``` 此代片段展示了如何设置并执行异步请求至`callFunction` API 来取得所需的小程序图像数据[^1]。 #### 调用云函数生成特定于渠道的二维码 当有新的合作伙伴加入时,在服务器端可以通过调用上述云函数传入对应的数(例如机构ID),从而为每个伙伴定制唯一的入口链接。下面是一个简单的例子说明怎样构建这样的请求: ```javascript async function createChannelCode(channelId){ let res = await uniCloud.callFunction({ name:'getQrcode',// 这里填写上面部署成功的云函数名称 data:{ path:"pages/index/index", query:{channel: channelId}// 将 channel ID 添加到查询数中 } }); if(res.code === 200){ // 成功返回base64编后的图片流或者其他处理逻辑... }else{ console.log("Error:",res.message); } } ``` 这段 JavaScript 函数接受 `channelId` 数作为输入,并将其嵌入到要传递给云函数的数据对象内。成功响应后会得到一张代表该渠道专属的小程序图片。 #### 实现免费下载功能 对于来自特定渠道的新用户首次打开应用时提供限时免收费服务,则可以在前端页面加载完成后立即读取启动场景中的query字段判断是否有合法有效的渠道标识符存在;如果有则给予一定时间内的优惠权限。 ```javascript onLoad(options) { if (options && options.scene) { var sceneStr = decodeURIComponent(options.scene); // 解析携的信息 this.checkChannel(sceneStr).then((valid)=>{ if(valid){ // 开启临时特权模式 } }).catch(console.warn); } }, methods: { checkChannel(sceneString){ return new Promise((resolve,reject)=>{ // 对sceneString解析验证合法性以及对应关系等操作.. resolve(true || false);// 返回true表示有效渠道,false反之 }); } } ``` 以上方法确保只有那些由特殊二维码引导而来的访客能够在限定条件下享受特别待遇。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值