每位运营过微信公众平台的野生小编都知道,微信提供给开发者的文档是很高深的,最近为了弄个带参数的二维码,同样技术小白的小编也死了不少脑细胞了,然而我终于知道官方生成带参数的二维码的方法了。
1、注意事项我知道你们是没有心情看注意事项的,但是很重要,所以我先摆上来。用户扫描带参数的二维码,可能推送以下两种事件:
1)如果用户还未关注公众号,则用户可以关注公众号,关注后微信会将带场景值关注事件推送给开发者。
2)如果用户已经关注公众号,在用户扫描后会自动进入会话,微信也会将带场景值扫描事件推送给开发者。是的,是把参数返回给开发者,也就是你自己,不是给用户推送特定信息或跳转到页面。(我也想要那种用户扫描关注后跳到指定页面的高级功能,也有一些微信号实现了,但是穷人家没有技术人员没有第三方平台的,我暂时不知道怎么做。憋问,让我研究了以后再分享给大家!)
2、找入口
好了现在正式来制作我们带参数的二维码吧。首先登录你的微信公众号,点击左下角【接口权限】,然后找到“生成带参数的二维码”,点击进入,这样我们就到了微信开发者文档的相关地方了。
兑换二维码
如果上面的步骤都没有错误,这个时候以后就会返回一段ticket代码。复制“ticket”:后面双引号的那段代码,重新回到微信开发者文档,见下图红框内的链接点击进去,然后就会打开一个空白网页,然后把你复制的代码替代打开的网址链接后面的TICKET就可以了,见下图2的网址后面红色遮挡部分。这时就获得一个带参数的二维码图片啦,可以自行下载。
https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=
拿到token后根据官方文档选择所需要的二维码,是否是永久,来传入需要的参数
获取到ticket后直接在任意浏览器请求
附java代码实现获取ticket
package cn.xxs.wexingongzhonghao;
import com.alibaba.fastjson.JSONObject;
import com.google.gson.Gson;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;
public class CreateQRcode {
private final static Logger log = LoggerFactory.getLogger(CreateQRcode.class);
// 临时二维码
private final static String QRSCENE = "QR_SCENE";
// 临时二维码
private final static String QRSCENESTR = "QR_STR_SCENE";
// 永久二维码
private final static String QR_LIMIT_SCENE = "QR_LIMIT_SCENE";
// 永久二维码(字符串)
private final static String QR_LIMIT_STR_SCENE = "QR_LIMIT_STR_SCENE";
// 创建二维码
private String create_ticket_path = "https://api.weixin.qq.com/cgi-bin/qrcode/create";
// 通过ticket换取二维码
private String showqrcode_path = "https://mp.weixin.qq.com/cgi-bin/showqrcode";
/**
* 创建临时带参数二维码 -- 数字
* 获取临时带参二维码ticket
*
* @param accessToken
* @expireSeconds 该二维码有效时间,以秒为单位。 最大不超过2592000(即30天),此字段如果不填,则默认有效期为30秒。
* @param sceneId 场景Id
* @return
*/
public String createTempTicket(String accessToken, String expireSeconds, int sceneId) {
Map<String, Integer> intMap = new HashMap<>();
intMap.put("scene_id", sceneId);
Map<String, Map<String, Integer>> mapMap = new HashMap<>();
mapMap.put("scene", intMap);
Map<String, Object> paramsMap = new HashMap<>();
paramsMap.put("expire_seconds", expireSeconds);
paramsMap.put("action_name", QRSCENE);
paramsMap.put("action_info", mapMap);
String jsonObject = JSONObject.toJSONString(paramsMap);
String requestUrl = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token="+accessToken;
net.sf.json.JSONObject result = WeiXinUtil.doPostStr(requestUrl, jsonObject);
log.info(result.get("ticket").toString());
return result.get("ticket").toString();
}
/**
* 创建临时带参数二维码 -- String
* 获取临时带参二维码ticket
*
* @param accessToken
* @expireSeconds 该二维码有效时间,以秒为单位。 最大不超过2592000(即30天),此字段如果不填,则默认有效期为30秒。
* @param str 场景string
* @return
*/
public String createTempStrTicket(String accessToken, String expireSeconds, String str) {
Map<String, String> intMap = new HashMap<>();
intMap.put("scene_str", str);
Map<String, Map<String, String>> mapMap = new HashMap<>();
mapMap.put("scene", intMap);
Map<String, Object> paramsMap = new HashMap<>();
paramsMap.put("expire_seconds", expireSeconds);
paramsMap.put("action_name", QRSCENESTR);
paramsMap.put("action_info", mapMap);
String jsonObject = JSONObject.toJSONString(paramsMap);
String requestUrl = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token="+accessToken;
net.sf.json.JSONObject result = WeiXinUtil.doPostStr(requestUrl, jsonObject);
log.info(result.get("ticket").toString());
return result.get("ticket").toString();
}
@Test //测试方法
public void test(){
createTempTicket("23_ASxxxxxxxxxxxxxxxxxxxxdmzSwAp2JHc59OIpYjuumDasBmTTAKQjxgtrouLTnTuoiryTmrXXxQLJt90cp5NoyfqjFQGYHEc_kmxATHM-wX4AYYgbz_0wHlFGt8JolC93ROZNeAJAITH","604800",100);
createTempStrTicket("23_ASVQxxxxxxxxxxxxxxxxxxxxjgZveNdmzSwAp2JHc59OIpYjuumDasBmTTAKQjxgtrouLTnTuoiryTmrXXxQLJt90cp5NoyfqjFQGYHEc_kmxATHM-wX4AYYgbz_0wHlFGt8JolC93ROZNeAJAITH","604800","李四王五");
createForeverTicket("23_ASVQdixxxxxxxxxxxxxxxxxxxxveNdmzSwAp2JHc59OIpYjuumDasBmTTAKQjxgtrouLTnTuoiryTmrXXxQLJt90cp5NoyfqjFQGYHEc_kmxATHM-wX4AYYgbz_0wHlFGt8JolC93ROZNeAJAITH",100);
String ticket= createForeverStrTicket("23_ASVQxxxxxxxxxxxxxxxxxxxxjgZveNdmzSwAp2JHc59OIpYjuumDasBmTTAKQjxgtrouLTnTuoiryTmrXXxQLJt90cp5NoyfqjFQGYHEc_kmxATHM-wX4AYYgbz_0wHlFGt8JolC93ROZNeAJAITH","张三");
getRQcode(ticket,"D:/QR_code");//将二维码生成在D:/QR_code目录下
}
/**
* 创建永久二维码(数字)
*
* @param accessToken
* @param sceneId
* 场景Id
* @return
*/
public String createForeverTicket(String accessToken, int sceneId) {
Map<String, Integer> intMap = new HashMap<>();
intMap.put("scene_id", sceneId);
Map<String, Map<String, Integer>> mapMap = new HashMap<>();
mapMap.put("scene", intMap);
Map<String, Object> paramsMap = new HashMap<>();
paramsMap.put("action_name", QR_LIMIT_SCENE);
paramsMap.put("action_info", mapMap);
String jsonObject = JSONObject.toJSONString(paramsMap);
String requestUrl = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token="+accessToken;
net.sf.json.JSONObject result = WeiXinUtil.doPostStr(requestUrl, jsonObject);
log.info(result.get("ticket").toString());
return result.get("ticket").toString();
}
/**
* 创建永久二维码(字符串)
*
* @param accessToken
* @param sceneStr
* 场景str
* @return
*/
public String createForeverStrTicket(String accessToken, String sceneStr) {
Map<String, String> intMap = new HashMap<>();
intMap.put("scene_str", sceneStr);
Map<String, Map<String, String>> mapMap = new HashMap<>();
mapMap.put("scene", intMap);
Map<String, Object> paramsMap = new HashMap<>();
paramsMap.put("action_name", QR_LIMIT_STR_SCENE);
paramsMap.put("action_info", mapMap);
String jsonObject = JSONObject.toJSONString(paramsMap);
String requestUrl = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token="+accessToken;
net.sf.json.JSONObject result = WeiXinUtil.doPostStr(requestUrl, jsonObject);
log.info(result.get("ticket").toString());
return result.get("ticket").toString();
}
/**
* 二维码ticket,然后凭借ticket到指定URL换取二维码 -----创建带参数的二维码
* @param ticket 二维码ticket
* @param savepath 二维码保存路径
* @return
*/
public static String getRQcode(String ticket, String savepath)
{
String filepath = null;
String requestUrl = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=TICKET";
try {
requestUrl = requestUrl.replace("TICKET", URLDecoder.decode(ticket,"UTF-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
try
{
URL url = new URL(requestUrl);
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.setDoInput(true);
conn.setRequestMethod("GET");
if (!savepath.endsWith("/"))
{
savepath += "/";
}
// 将ticket 作为文件名
filepath = savepath + ticket + ".jpg";
// 将微信服务器返回的输入流写入文件
BufferedInputStream bis = new BufferedInputStream(conn.getInputStream());
FileOutputStream fos = new FileOutputStream(new File(filepath));
byte[] buf = new byte[8096];
int size = 0;
while ((size = bis.read(buf)) != -1)
fos.write(buf, 0, size);
fos.close();
bis.close();
System.out.println(conn);
conn.disconnect();
System.out.println("根据ticket换取二维码成功");
} catch (Exception e)
{
filepath = null;
System.out.println("根据ticket换取二维码失败" + e);
}
return filepath;
}
}
WeiXinUtil消息请求发送工具类
import net.sf.json.JSONObject;
import org.apache.http.HttpEntity;
import org.apache.http.HttpRequest;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class WeiXinUtil {
/**
* get请求
* @param url
* @return
*/
public static JSONObject doGetStr(String url){
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(url);
JSONObject jsonObject = null;
try {
HttpResponse response =httpClient.execute(httpGet);
HttpEntity entity =response.getEntity();
if(entity != null){
String result = EntityUtils.toString(entity,"UTF-8");
jsonObject = JSONObject.fromObject(result);
}
} catch (IOException e) {
e.printStackTrace();
}
return jsonObject;
}
/**
* post请求
* @param url
* @param outUrl
* @return
*/
public static JSONObject doPostStr(String url,String outUrl){
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);
JSONObject jsonObject = null;
try {
httpPost.setEntity(new StringEntity(outUrl,"UTF-8"));
HttpResponse response = httpClient.execute(httpPost);
String result = EntityUtils.toString(response.getEntity(),"UTF-8");
jsonObject = JSONObject.fromObject(result);
} catch (IOException e) {
e.printStackTrace();
}
return jsonObject;
}
}