1.生成带参二维码

有两种方式,一是通过微信公众平台来生成,二是通过java代码生成

一:微信平台生成

首先进入公众平台,找到接口权限进入

进入后找到获取access_tocken接口,获取access_tocken,因为获取ticket要有tocken才行

拿到token后根据官方文档选择所需要的二维码,是否是永久,来传入需要的参数

获取到ticket后直接在任意浏览器请求

https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=TICKET
提醒:TICKET记得进行UrlEncode

会得到一个二维码图片,保存后会得到一个showqrcode文件 用图片编辑器打开是一张二维码图

也可以选择直接保存二维码图片

2.Java后台生成

以下是Java生成代码

controller:

package com.szhz.controller;import java.util.HashMap;
import java.util.Map;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;import com.alibaba.fastjson.JSONObject;
import com.szhz.entity.WeiXinTicketEntity;
import com.szhz.framework.base.controller.BaseController;
import com.szhz.framework.util.HttpUtil;
import com.szhz.service.IWeiXinService;
/*** 生成带参二维码的ticket值* @author wyx**/
@SuppressWarnings("rawtypes")
@Controller
@RequestMapping("weixin/ticket")
public class WeiXinTicketController extends BaseController {@Autowiredprivate IWeiXinService service;@Value("${weixin.ticket.action_name.QR_SCENE}")private String  QRSCENE;@Value("${weixin.ticket.action_name.QR_STR_SCENE}")private String    QR_STR_SCENE;@RequestMapping(value = "sendInterviewInvitation",method=RequestMethod.POST)public String sendInterviewInvitation(@RequestBody WeiXinTicketEntity reqDto) throws Exception{try {String accessToken = service.getAccessToken();int sceneId = reqDto.getSceneId();String result = new WeiXinTicketController().createForeverTicket(accessToken, sceneId);JSONObject jsonObject = JSONObject.parseObject(result);String ticket = null ;if(null!=jsonObject){ticket = jsonObject.getString("ticket");  System.out.println("创建永久带参二维码成功,ticket="+ticket);  }    return success(ticket);} catch (Exception e) {throw new Exception(e);}}/*** 创建临时带参数二维码 * 获取灵石带参二维码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;String result = HttpUtil.sendPost(requestUrl, jsonObject);return result;}/*** 创建永久二维码(数字)* * @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_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;String result = HttpUtil.sendPost(requestUrl, jsonObject);return result;}/*** 创建永久二维码(字符串)* * @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_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;String result = HttpUtil.sendPost(requestUrl, jsonObject);return result;}}

entity:

package com.szhz.entity;import lombok.Data;/*** * @author **/
@Data
public class WeiXinTicketEntity {/*场景值ID,临时二维码时为32位非0整型,永久二维码时最大值为100000(目前参数只支持1--100000)*/private int sceneId;/*该二维码有效时间,以秒为单位。 最大不超过2592000(即30天),此字段如果不填,则默认有效期为30秒*/private String expireSeconds;/*场景值ID(字符串形式的ID),字符串类型,长度限制为1到64*/private String sceneStr;
}

yml:

#临时的整型参数值
weixin.ticket.action_name.QR_SCENE=QR_SCENE
#临时的字符串参数值
weixin.ticket.action_name.QR_STR_SCENE=QR_STR_SCENE
#永久的整型参数值
weixin.ticket.action_name.QR_LIMIT_SCENE=QR_LIMIT_SCENE
#永久的字符串参数值
weixin.ticket.action_name.QR_LIMIT_STR_SCENE=QR_LIMIT_STR_SCENE

然后前端调用接口传入参数{ 过期时间,场景值id或者字符串}获取到ticket值,

然后直接请求 window.location.href =" "

https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=TICKET
提醒:TICKET记得进行UrlEncode

同样获取一张二维码图片

2.获取到二维码图片后处理用户关注公众号

一:在用户扫码关注后进入园区时,获取到关注者的个人信息,包括进入公众号的方式,以及扫码时场景值id或者字符串,

package com.szhz.controller;import java.io.IOException;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.szhz.entity.BaseUrl;
import com.szhz.entity.WeiXinNoticerEntity;
import com.szhz.framework.base.controller.BaseController;
import com.szhz.service.IWeiXinNoticerService;
import com.szhz.service.IWeiXinService;
import com.szhz.service.impl.WeiXinServiceImpl;/*** Titile 微信公众号-Controller层* */
@SuppressWarnings("rawtypes")
@Controller
@RequestMapping("/wechat")
public class WeiXinController extends BaseController {// 第三方用户唯一凭证(从配置中心读取)@Value("${weixin.appid}")private String appid;// 注入主业务service@Autowiredprivate IWeiXinService service;// 注入唯一身份service//@Autowired//private IIdentityService iIdentityService;// 注入关注者service@Autowiredprivate IWeiXinNoticerService iWeiXinNoticerService;private String openId = "";// 第三方用户唯一凭证密钥,即appsecret(从配置中心读取)// private static String secret = "";/*** 第一步:微信认证(让微信服务器调用,告诉微信服务器调用我们的服务器是合法的,放心回调)* * @param request* @return*/@RequestMapping(value = "auth", method = RequestMethod.GET)public String auth(HttpServletRequest request) {try {// 与接口配置信息中的Token要一致String token = "123";// 获取微信服务器传递的微信加密签名String signature = request.getParameter("signature");// 获取微信服务器传递的时间戳String timestamp = request.getParameter("timestamp");// 获取微信服务器传递的随机数String nonce = request.getParameter("nonce");// 获取微信服务器传递的随机字符串String echostr = request.getParameter("echostr");// 通过验证,原样返回echostr(微信服务器收到echostr后再次比对,比对一致后建立合作关系)if (signature != null && service.checkSignature(token, signature, timestamp, nonce)) {return echostr;}} catch (Exception e) {// 验证失败,返回空return "";}// 验证失败,返回空return "";}/*** 微信菜单按钮点击时触发身份认证接口 重定向到 wechat/userInfo* * @param returnUrl:认证完成后需要跳转到的前台页面* @return*/@GetMapping("/authorize")public String authorize(@RequestParam("returnUrl") String returnUrl,@RequestParam("returnUrlPage") String returnUrlPage) {String getAuthUrl = "http://www.szhzsoft.com/" + "wechat/userInfo?returnUrlPage=" + returnUrlPage;// 需要跳转到认证的地址String redirectGetUserInfoUrl = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + appid+ "&redirect_uri=" + getAuthUrl + "&response_type=code&scope=snsapi_base&state=" + returnUrl+ "#wechat_redirect";// System.out.println("我是returnUrl:[{}]" + redirectGetUserInfoUrl);return "redirect:" + redirectGetUserInfoUrl;}/*** 微信认证接口回调时调用的接口* * @param code* @param returnUrl* @return* @throws Exception*/@GetMapping("/userInfo")// @Transactionalpublic String userInfo(@RequestParam("code") String code, @RequestParam("state") String returnUrl,@RequestParam("returnUrlPage") String returnUrlPage) throws Exception {String baseReturnUrl = returnUrl + "/#/" + returnUrlPage;System.out.println("我是baseReturnURL:____" + baseReturnUrl);// 获取openidString openId = service.getOpenId(code);// 门户idString identityId = "";// WeiXinNoticerEntity weiXinNoticerSearchEntity = new WeiXinNoticerEntity();weiXinNoticerSearchEntity.setOpenId(openId);WeiXinNoticerEntity weiXinNoticerEntity = (WeiXinNoticerEntity) iWeiXinNoticerService.getNoticerByOpenId(weiXinNoticerSearchEntity);// 通过openid查询用户是否已经关注过公众号,// 如果未关注写入到微信关注者表int qrScene =0;if (null==weiXinNoticerEntity) {String accessToken = service.getAccessToken();String noticerInfo = service.getNoticerInfo(accessToken, openId);// 获取个人信息JSONObject jsonObject = JSON.parseObject(noticerInfo);// 转为json对象String subscribeScene = jsonObject.getString("subscribe_scene");// 获取关注方式if(subscribeScene.equals("ADD_SCENE_QR_CODE")){ //如果用户是扫描二维码关注的拿到二维码场景值qrScene = jsonObject.getInteger("qr_scene");}else{qrScene = 1;}iWeiXinNoticerService.addNoticer(noticerInfo);//identityId = iIdentityService.addOpenId(openId);} else {qrScene=weiXinNoticerEntity.getQrScene();}System.out.println("最终回调rui:" + "redirect:" + baseReturnUrl + "?openid=" + identityId+"&qrScene="+qrScene);return "redirect:" + baseReturnUrl + "?openid=" + identityId+"&qrScene="+qrScene;}/*** 点击页面菜单时,调用前台,前台回来调用此接口** @param response* @throws IOException*/@GetMapping("getBaseOpenid")public BaseUrl getBaseOpenId(HttpServletResponse response) throws IOException {String url = service.getOpenIdUrl();BaseUrl baseUrl = new BaseUrl();baseUrl.setUrl(url);response.sendRedirect(url);baseUrl.setOpenId(openId);System.out.println("返回时的openId" + openId);return baseUrl;}/****************************************测试***************************************************//*** 测试获取TOKEN* * @param reqDto* @return* @throws Exception*/@RequestMapping(value = "getToken", method = RequestMethod.GET)public String getToken() throws Exception {try {return success(service.getAccessToken());} catch (Exception e) {e.printStackTrace();throw new Exception(e);}}/*** 测试获取关注者信息* * @param reqDto* @param pageReqDto* @return* @throws Exception*/@RequestMapping(value = "getNoticerInfo", method = RequestMethod.GET)public String getNoticerInfo() throws Exception {try {String accessToken = service.getAccessToken();String openId = "111";return success(service.getNoticerInfo(accessToken, openId));} catch (Exception e) {e.printStackTrace();throw new Exception(e);}}public static void main(String args[]) {try {String str = new WeiXinServiceImpl().getNoticerInfo("-222","111");System.out.println(str);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

然后前端请求时再进行拦截,根据qrsence去请求不同的接口,获取不同的数据

本文主要就是实现一个公众号给多个企业使用,每个企业通过扫描不同的但是永久的二维码,进入不同的界面,获取到不同信息

微信公众号带参二维码的生成以及后台Java的处理相关推荐

  1. 微信公众号带参数二维码的几个使用场景

    微信公众号官方开放了 "带参数二维码" 的功能,根据官网文档的描述,有如下的特点: 为了满足用户渠道推广分析和用户帐号绑定等场景的需要,公众平台提供了生成带参数二维码的接口. 通过 ...

  2. laravel生成微信公众号带参数二维码并响应扫描带参数二维码

    微信公众号后台ip白名单.网页接口域名之类的配置就不多说了,这里主要配置的是开发->基本配置->服务器配置(注:一旦启用改配置,公众号自动回复就会失效): 1.服务器地址(URL):这里要 ...

  3. 微信公众平台----带参数二维码生成和扫描事件

    原文:微信公众平台----带参数二维码生成和扫描事件 摘要: 账号管理----生成带参数的二维码 消息管理----接收消息----接收事件推送 为了满足用户渠道推广分析和用户帐号绑定等场景的需要,公众 ...

  4. 如何生成公众号带参数二维码

    公众号带参数二维码,自动统计关注粉丝渠道来源.自动打标签分组,通过公众号开发平台接口实现.不会开发的人员,可以使用微号帮平台的功能实现这效果,渠道二维码生成统计. 1.带参数二维码 公众号后台只有普通 ...

  5. 微信渠道推广带参数二维码如何生成和统计呢?

    最近几个朋友,想做微信渠道推广带参数二维码,但是想区分不同渠道的关注来源,以便区分统计和结算粉丝数量.那么,微信渠道推广带参数二维码如何生成和统计呢? 通过微号帮平台实现微信渠道推广带参数二维码,可以 ...

  6. java_微信公众号扫码绑定个人信息(微信公众号场景值二维码的使用)

    看了一下网上关于公众号场景值二维码这方面的教程,基本上是微信官方开发文档的复制,没有具体实例.这里给出实例,并附加二维码url转文件流的方法. 思路: 1.后台传入个人信息保存,以个人信息的" ...

  7. 微信生成公众号带参数二维码用户头像 加上文字生成图片(三)

    // 建立一幅 434X630 的图像 $im = imagecreatetruecolor(434,630);  //设置透明背景图  如果用imagecreate 则图片二维码上的用户头像变灰 $ ...

  8. JAVA微信公众号开发之二维码的创建与获取

    微信文档说明 两种二维码: 1.临时二维码,是有过期时间的,最长可以设置为在二维码生成后的30天(即2592000秒)后过期,但能够生成较多数量.临时二维码主要用于帐号绑定等不要求二维码永久保存的业务 ...

  9. Yii实现微信公众号的场景二维码

    在Yii中实现场景二维码这里我使用的是easywechat插件,安装easywechat插件 composer require jianyan74/yii2-easy-wechat github地址: ...

最新文章

  1. PHP定时执行任务的实现
  2. 评审过程中,A小组发现了5个缺陷,B小组发现了9个缺陷,他们发现的缺陷中有3个是相同的。请问:还有多少个潜在的缺陷没有发现?
  3. 动作识别最新高效利器 ACTION-Net:通用的多路径激活模块 | CVPR 2021
  4. unix网络编程 的环境配置
  5. axure如何导出原件_axure导出_axure怎么导出流程图
  6. 实例29:python
  7. 我的十年创作之路(三)——书稿创作经验谈
  8. WIN2008R2 激活
  9. Selenium:鼠标、键盘事件
  10. Linux驱动开发之触摸驱动
  11. 锐度、对比度、和清晰度的区别
  12. ES7.16.2基础操作之slop查询(三)
  13. mysql中ndb_restore_mysql ndb集群与恢复
  14. php api 接口
  15. 通过RViz中的InteractiveMarkers在ROS中仿真力和力矩(wrench.force和wrench.torque)
  16. 驱动复习(mor8)
  17. License Check
  18. python点餐系统早餐_python 点餐系统(仅函数实现)
  19. @Resource @Autowire 对比
  20. 干货分享:Vova跨境电商平台的问题及优势分析

热门文章

  1. 旺店通与金蝶云星空对接集成采购入库单接口
  2. 2021金三银四,啃完这35个Java技术栈,冲刺年薪百万!
  3. 面试官:说说MySQL用得好好的,为什么要转ES?
  4. Mysql rbo和cbo_CBO和RBO介绍(好)
  5. scanf用法及常见输入错误问题
  6. 强制修改LINUX的root密码
  7. Oracle 数据库利用回收站恢复删除的表实例演示
  8. CF K. City
  9. uva 11178 Morley's Theorem 三角形内角三等分线交点
  10. csdn 请选择文章类型 解决办法