就在今年春節期間,有個我不願提及的人說要做個使用微信掃描二維碼的方式實現會議簽到的功能,當時還沒接觸任何的微信開發,也就只說自己不會微信開發。直到今天才直到應該怎麼實現。現在很多東西都用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 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;
- }
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();
- }
- }
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;
- }
- }
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;
}
}
下面是運行效果圖: