精华内容
下载资源
问答
  • 为了满足用户渠道推广分析和用户帐号绑定等场景的需要,也就是推广和微商城分销的一个知识点,当你需要知道你的这个客户是谁推广的时候,当你为你的商城设计了分销的模式的时候,你就会发现这个知识点很好用
  • 微信公众号利用asp生成带参数二维码,别人扫了后如果已经关注过该公众号的,则直接进入公众号里,如果没关注则提示关注,关注后自动把该微信用户资料获取到并且保存入库,然后回复他的上级是谁,我觉得有可能对...
  • 微信公众号推广二维码源码 博文连接:https://blog.csdn.net/slx3320612540/article/details/88375918
  • 需要从某个页面生成二维码,用户扫描二维码,如果已关注公众号,跳到公众号页面,推送小程序链接 如果还未关注公众号,跳转到关注页面,关注公众号后推送小程序链接。 当然从公众号跳转到小程序,多多少少是需要...

    首先说下业务场景
    需要从某个页面生成二维码,用户扫描二维码,如果已关注公众号,跳到公众号页面,推送小程序链接
    如果还未关注公众号,跳转到关注页面,关注公众号后推送小程序链接。
    当然从公众号跳转到小程序,多多少少是需要带一点业务相关参数的。
    本篇主要将二维码生成,以及事件推送

    一、二维码生成

    根据官方文档介绍,目前公众号二维码主要有永久和临时两种,但是永久二维码是有数量限制的,临时二维码携带参数又有限制。
    所以我们一般都使用临时二维码
    官方介绍
    生成二维码的动作主要有两步,第一步根据参数拿到二维码ticket,第二步根据ticket换取二维码

    首先看获取二维码的参数
    二维码参数
    拼接结构如下:{“action_name”: “QR_LIMIT_SCENE”, “action_info”: {“scene”: {“scene_id”: 123}}}
    注意scene是在action_info 里面的
    请求URL为 :https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=TOKEN 类型为POST
    返回数据是这样的
    {“ticket”:“gQH47joAAAAAAAAAASxodHRwOi8vd2VpeGluLnFxLmNvbS9xL2taZ2Z3TVRtNzJXV1Brb3ZhYmJJAAIEZ23sUwMEmm
    3sUw==”,“expire_seconds”:60,“url”:“http://weixin.qq.com/q/kZgfwMTm72WWPkovabbI”}
    下面上具体代码

    /**
         * 创建临时带参二维码
         *
         * @param accessToken   接口访问凭证
         * @param expireSeconds 二维码有效时间,单位为秒,最大不超过1800
         * @param sceneId       场景ID
         * @return WeixinQRCode
         */
        public WeixinQRCode createTemporaryQRCode(String accessToken, int expireSeconds, String sceneStr) {
            QRCodeParMapping byMappingValue = qrCodeParamMappingUtil.getQrcodeParMappingByMappingValue(sceneStr);
            Integer mappingID = null;
            if (byMappingValue == null) {
                byMappingValue = new QRCodeParMapping();
                byMappingValue.setMappingValue(sceneStr);
                qrCodeParamMappingUtil.save(byMappingValue);
            }
            mappingID = byMappingValue.getMappingID();
            sceneStr = mappingID.toString();
            System.out.println("二维码携带参数为" + sceneStr);
            WeixinQRCode weixinQRCode = null;
            // 拼接请求地址
            String requestUrl = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=ACCESS_TOKEN";
            requestUrl = requestUrl.replace("ACCESS_TOKEN", accessToken);
            // 需要提交的json数据
            String jsonMsg = "{\"expire_seconds\": %d, \"action_name\": \"QR_SCENE\", \"action_info\": {\"scene\": {\"scene_id\": %s}}}";
            // 创建临时带参二维码
            JSONObject jsonObject = WechatUtil.httpsRequest(requestUrl, "POST",
                    String.format(jsonMsg, expireSeconds, sceneStr));
    
            if (null != jsonObject) {
                try {
                    weixinQRCode = new WeixinQRCode();
                    weixinQRCode.setTicket(jsonObject.getString("ticket"));
                    weixinQRCode.setExpireSeconds(jsonObject.getInt("expire_seconds"));
                    logger.info("创建临时带参二维码成功 ticket:{} expire_seconds:{}", weixinQRCode.getTicket(),
                            weixinQRCode.getExpireSeconds());
                } catch (Exception e) {
                    weixinQRCode = null;
                    int errorCode = jsonObject.getInt("errcode");
                    String errorMsg = jsonObject.getString("errmsg");
                    logger.error("创建临时带参二维码失败 errcode:{} errmsg:{}", errorCode, errorMsg);
                }
            }
            return weixinQRCode;
        }
    
    	/**
         * 发起https请求并获取结果
         *
         * @param requestUrl    请求地址
         * @param requestMethod 请求方式(GET、POST)
         * @param outputStr     提交的数据
         * @return JSONObject(通过JSONObject.get ( key)的方式获取json对象的属性值)
         */
        public static JSONObject httpsRequest(String requestUrl, String requestMethod, String outputStr) {
            JSONObject jsonObject = null;
            StringBuffer buffer = new StringBuffer();
            try {
                // 创建SSLContext对象,并使用我们指定的信任管理器初始化
                TrustManager[] tm = {new MyX509TrustManager()};
                SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
                sslContext.init(null, tm, new java.security.SecureRandom());
                // 从上述SSLContext对象中得到SSLSocketFactory对象
                SSLSocketFactory ssf = sslContext.getSocketFactory();
    
                URL url = new URL(requestUrl);
                HttpsURLConnection httpUrlConn = (HttpsURLConnection) url.openConnection();
                httpUrlConn.setSSLSocketFactory(ssf);
    
                httpUrlConn.setDoOutput(true);
                httpUrlConn.setDoInput(true);
                httpUrlConn.setUseCaches(false);
                // 设置请求方式(GET/POST)
                httpUrlConn.setRequestMethod(requestMethod);
    
                if ("GET".equalsIgnoreCase(requestMethod))
                    httpUrlConn.connect();
    
                // 当有数据需要提交时
                if (null != outputStr) {
                    OutputStream outputStream = httpUrlConn.getOutputStream();
                    // 注意编码格式,防止中文乱码
                    outputStream.write(outputStr.getBytes("UTF-8"));
                    outputStream.close();
                }
    
                // 将返回的输入流转换成字符串
                InputStream inputStream = httpUrlConn.getInputStream();
                InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
                BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
    
                String str = null;
                while ((str = bufferedReader.readLine()) != null) {
                    buffer.append(str);
                }
                bufferedReader.close();
                inputStreamReader.close();
                // 释放资源
                inputStream.close();
                inputStream = null;
                httpUrlConn.disconnect();
                jsonObject = JSONObject.fromObject(buffer.toString());
            } catch (ConnectException ce) {
                log.error("Weixin server connection timed out.");
            } catch (Exception e) {
                log.error("https request error:{}", e);
            }
            return jsonObject;
        }
    /**
     * 临时二维码信息
     * 
     * @author liufeng
     * @date 2013-11-10
     */
    public class WeixinQRCode {
    	// 获取的二维码ticket
    	private String ticket;
    	// 二维码的有效时间,单位为秒,最大不超过1800
    	private int expireSeconds;
    
    	public String getTicket() {
    		return ticket;
    	}
    
    	public void setTicket(String ticket) {
    		this.ticket = ticket;
    	}
    
    	public int getExpireSeconds() {
    		return expireSeconds;
    	}
    
    	public void setExpireSeconds(int expireSeconds) {
    		this.expireSeconds = expireSeconds;
    	}
    }
    
    一共两个方法  一个类
    第一个方法是生成二维码的步骤,三个参数:1、accessToken 请自备2、过期时间 3、二维码携带参数
    第二个方法是访问微信的GET请求
    第三个二维码实体类
    
    这里要额外说一个事情,
    第一个查询映射的方法,是干什么的
    首先上面参数有说过,二维码可携带参数有scene_id 和scene_str  但是临时二维码 只能用ID(关乎于后面的事件推送) 并且是32位非零整型,长度有限制,所以个人做了个参数映射,生成二维码码的参数在数据库关联一个ID,每次ID自增,每次传参要查询是否有对应的ID,没有就生成一个新的
    这部分逻辑很简单先不上代码了,如不需要,可自行注释代码,有需要可能后面会补。
    

    这样我们就拿到了二维码的ticket
    获取二维码就很简单了
    通过访问链接就可以直接拿到二维码
    官方是这么写的:
    HTTP GET请求(请使用https协议)https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=TICKET
    提醒:TICKET记得进行UrlEncode
    ticket正确的情况下,状态码200,是一张图片可以下载。错误的话可能是404

    这里额外再说一句,那个携带参数,即使是它不支持或者超出限制了,二维码仍然会正常返回,但是参数不会正常携带到后面的事件里面

    二、事件接收以及消息推送

    首先说事件接收,这个事件接收是一个很广的概念,可以接收很多类型的事件,官方是这么写的
    事件
    事件推送的URL需要在公众号后台自行配置,是一个URL哦~不同的事件按照分类进行区别开发
    二维码的推送参数如下:
    事件参数
    这是我代码中打印的 已关注用户推送的
    在这里插入图片描述
    根据这个我们能拿到二维码携带过来的参数 就是Eventkey。
    未关注用户推送的:
    在这里插入图片描述
    注意未关注用户的参数前面带一个qrscene_ 获取时自行截取

    事件到了 我们需要做处理
    这里返回的不是模版消息,是客服消息
    看官方文档
    在这里插入图片描述
    消息类型是这样,我的需求是要跳转到小程序 并没有链接类型
    所以就使用文本类型,里面自己嵌入链接,官方给出了方法

    发送文本消息时,支持插入跳小程序的文字链
    
    文本内容<a href="http://www.qq.com" data-miniprogram-appid="appid" data-miniprogram-path="pages/index/index">点击跳小程序</a>
    说明: 1.data-miniprogram-appid 项,填写小程序appid,则表示该链接跳小程序; 2.data-miniprogram-path项,填写小程序路径,路径与app.json中保持一致,可带参数; 3.对于不支持data-miniprogram-appid 项的客户端版本,如果有herf项,则仍然保持跳href中的网页链接; 4.data-miniprogram-appid对应的小程序必须与公众号有绑定关系。
    

    下一篇详细介绍怎么回消息以及代码~

    展开全文
  • 主要介绍了Java实现微信公众号获取临时二维码功能,结合实例形式分析了java调用微信公众号接口实现临时二维码生成功能相关操作技巧,需要的朋友可以参考下
  • 主要给大家介绍了关于利用C#如何生成带二维码的专属微信公众号推广海报的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们一起来看看吧
  • 微信公众号生成带参数二维码一学就会Java版 大学计算机专业毕业,从业IT四...

    扫码下载「CSDN程序员学院APP」,1000+技术好课免费看

    APP订阅课程,领取优惠,最少立减5元 ↓↓↓

    订阅后:请点击此处观看视频课程

     

    视频教程-微信公众号生成带参数二维码一学就会Java版-微信开发

    学习有效期:永久观看

    学习时长:108分钟

    学习计划:2天

    难度:

     

    口碑讲师带队学习,让你的问题不过夜」

    讲师姓名:朱祚华

    CTO/CIO/技术副总裁/总工程师

    讲师介绍:大学计算机专业毕业,从业IT四年,擅长java,html,微信公众号,小程序,安卓的开发,采用ssh框架比较多一些,经验丰富。

    ☛点击立即跟老师学习☚

     

    「你将学到什么?」

    为了满足用户渠道推广分析和用户帐号绑定等场景的需要,也就是推广和微商城分销的一个知识点,当你需要知道你的这个客户是谁推广的时候,当你为你的商城设计了分销的模式的时候,你就会发现这个知识点很好用

     

    「课程学习目录」

    1.公众号推广和微商城分销的秘密
    2.聊聊开发文档的坑
    3.Json如是说
    4.搞定请求Json
    5.发射HTTPS请求
    6.拦截access_token
    7.得到入场券
    8.翻滚吧,二维码
    9.课程最后以及福利

     

    7项超值权益,保障学习质量」

    • 大咖讲解

    技术专家系统讲解传授编程思路与实战。

    • 答疑服务

    专属社群随时沟通与讲师答疑,扫清学习障碍,自学编程不再难。

    • 课程资料+课件

    超实用资料,覆盖核心知识,关键编程技能,方便练习巩固。(部分讲师考虑到版权问题,暂未上传附件,敬请谅解)

    • 常用开发实战

    企业常见开发实战案例,带你掌握Python在工作中的不同运用场景。

    • 大牛技术大会视频

    2019Python开发者大会视频免费观看,送你一个近距离感受互联网大佬的机会。

    • APP+PC随时随地学习

    满足不同场景,开发编程语言系统学习需求,不受空间、地域限制。

     

    「什么样的技术人适合学习?」

    • 想进入互联网技术行业,但是面对多门编程语言不知如何选择,0基础的你
    • 掌握开发、编程技术单一、冷门,迫切希望能够转型的你
    • 想进入大厂,但是编程经验不够丰富,没有竞争力,程序员找工作难。

     

    「悉心打造精品好课,2天学到大牛3年项目经验」

    【完善的技术体系】

    技术成长循序渐进,帮助用户轻松掌握

    掌握微信开发知识,扎实编码能力

    【清晰的课程脉络】

    浓缩大牛多年经验,全方位构建出系统化的技术知识脉络,同时注重实战操作。

    【仿佛在大厂实习般的课程设计】

    课程内容全面提升技术能力,系统学习大厂技术方法论,可复用在日后工作中。

     

    「你可以收获什么?」

    通过本课程的学习,你将会学到如何生成一个带参数的二维码,以及这个带参数的二维码应该怎么运用,应该如何嵌入到三级分销里面以及微信公众号的付费推广里面去

     

    展开全文
  • 微信公众号平台开发者那里,在“账号管理”那里,有一项功能是“生成带参数二维码”,通过这儿生成二维码,只要通过微信扫一扫之后,会把事件自动推送到微信公众号上 用微信扫一扫推送到开发者网址那儿的数据...
  • 微信公众号生成带参数二维码

    千次阅读 2019-06-03 15:40:39
    官网功能介绍:...id=mp1443433542 1、获取access_token:根据公众号的appid和appsecket得到access_token https://mp.weixin.qq.com/debug?token=1795470382&lang=zh_CN 2、获取ti...

    官网功能介绍:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1443433542

    1、获取access_token:根据公众号的appid和appsecket得到access_token
    https://mp.weixin.qq.com/debug?token=1795470382&lang=zh_CN
    在这里插入图片描述
    2、获取ticket
    access_token:通过第一步获取到的access_token
    body:根据官网介绍填写相关参数,其中scene_id为开发者自行设定的参数
    在这里插入图片描述
    3、获取二维码:根据第三步获取到的ticket得到二维码的请求地址

    在这里插入图片描述
    4、根据第三步返回的请求地址就能得到带相关参数的二维码

    展开全文
  • 1.实现带参数二维码功能 public class QrTest { private static Logger logger = LogManager.getLogger(QrTest.class); private final static String subPlatform = "prod1"; private final static String...

    公司新需求实现生成微信公众号带参数二维码和对应扫码后回复相应信息的功能。

    1.实现带参数二维码功能

    public class QrTest {
    	private static Logger logger = LogManager.getLogger(QrTest.class);
    	
    	private final static String subPlatform  			= "prod1";
    	private final static String appid 				= "111111111111111111111";
    	private final static String secret 				= "";
    	//access_token 获取接口
    	private final static String WECHAT_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+appid+"&secret="+secret;
    	public static void main(String[] args) {
    		try {
    			String access_token = QrTest.getAccessToken(subPlatform);
    			String url = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token="+access_token;
    			JsonObject data = new JsonObject();
    	        //data.addProperty("action_name", "QR_LIMIT_STR_SCENE");
    	        data.addProperty("action_name", "QR_SCENE");
    	        data.addProperty("expire_seconds", "604800");
    	        JsonObject scene = new JsonObject();
    	        //scene.addProperty("scene_str", "123&&456");
    	        scene.addProperty("scene_id", "123&&456");
    	        JsonObject actionInfo = new JsonObject();
    	        actionInfo.add("scene", scene);
    	        data.add("action_info", actionInfo);
    			logger.error(data.toString());
    			String result = HttpConnectionUtil.AccessUrl(url,data.toString());
    			QrCodeReceiveData jsonToJavaBean = JsonUtil.jsonToJavaBean(result, QrCodeReceiveData.class);
    			if(jsonToJavaBean != null) {
    				logger.error(jsonToJavaBean.getUrl());
    			}
    			logger.error(result);
    		/*} catch (OAuthException e) {
    			logger.debug(e.getMessage());*/
    		}catch (Exception e) {
    			
    		}
    	}
    	
    	/**
    	 * 获取access_token
    	 * @return
    	 * @throws OAuthException
    	 */
    	private static String getAccessToken(String subPlatform) throws OAuthException{
    		String access_token = null;
    		if(subPlatform != null && !subPlatform.equals("")){
    			String tokenUrl = "http://www.baidu.com";
    			logger.debug("getAccess_token tokenUrl:" + tokenUrl);
    			access_token = HttpConnectionUtil.AccessUrlGet(tokenUrl);
    			logger.debug("getAccess_token access_token:" + access_token);
    		}else{
    			access_token = QrTest.getAccessToken();
    		}
    		return access_token;
    	}
    	
    	private static String getAccessToken() {
    		String access_token = null;
    		try{
    			logger.debug("getAccessToken i(ss):" );
    			//获取access_token
    			String accessTokenURL = HttpConnectionUtil.AccessUrlGet(WECHAT_URL);
    			logger.debug("new accessTokenResult URL :"+accessTokenURL);
    			if(accessTokenURL != null && !accessTokenURL.equals("")){
    				AccessToken accessToken = (AccessToken) JsonUtil.JsonToObject(accessTokenURL, AccessToken.class);
    				if(accessToken != null){
    					access_token = accessToken.getAccess_token();;
    					logger.debug("new_access_token============:"+access_token);
    				}else{
    					logger.error("accessTokenResult error:"+accessToken);
    				}
    			}
    		}catch(Exception e){
    			logger.error("getAccessToken Exception:" + e);
    		}
    		return access_token;
    	}
    }
    

    接收参数实体类

    public class QrCodeReceiveData {
    	
    	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 expire_seconds) {
    		this.expire_seconds = expire_seconds;
    	}
    
    	public String getUrl() {
    		return url;
    	}
    
    	public void setUrl(String url) {
    		this.url = url;
    	}
    	
    	
    }
    

    说明:以上代码可以实现带参数二维码url获取,这里我只需要url链接,我们的项目会保存该链接,根据链接生成对应的二维码,方便重复使用。该段代码是获取临时二维码,若要获取永久二维码,更改相应参数即可,但需要控制生成数量目前为最多10万个。

    2.被动回复消息

    被动回复消息需要开通开发者模式

    首先需要完善以上信息,同时需要开发接口进行验证

    	@RequestMapping("/testServlet")
    	public String verifyWXToken(HttpServletRequest request) throws AesException {
    		logger.error("进入验证servlet!!!!!");
    	    String msgSignature = request.getParameter("signature");
    	    String msgTimestamp = request.getParameter("timestamp");
    	    String msgNonce = request.getParameter("nonce");
    	    String echostr = request.getParameter("echostr");
    	    if (WXPublicUtils.verifyUrl(msgSignature, msgTimestamp, msgNonce)) {
    	           return echostr;
    	    }
    	    return null;
    	  }

    以上代码即可完成验证。

    验证通过后,将代码中的内容注释掉即可。节逻辑改为下面的逻辑

    @RequestMapping("/testServlet")
        @ResponseBody
        public String handlePublicMsg(HttpServletRequest request) throws Exception {
    		logger.error("进入推送消息方法");
            // 获得微信端返回的xml数据
            InputStream is = null;
            InputStreamReader isr = null;
            BufferedReader br = null;
            try {
                is = request.getInputStream();
                isr = new InputStreamReader(is, "utf-8");
                br = new BufferedReader(isr);
                String str = null;
                StringBuffer returnXml= new StringBuffer();
                while ((str = br.readLine()) != null) {
                    //返回的是xml数据
                    returnXml.append(str);
                }
                Map<String, String> encryptMap = VatifyToken.xmlToMap(returnXml.toString());
                logger.error(encryptMap.toString());
                // 得到公众号传来的加密信息并解密,得到的是明文xml数据
                //String decryptXml = WXPublicUtils.decrypt(encryptMap.get("Encrypt"));
                // 将xml数据转换为map
                /*logger.error(decryptXml.toString());
                Map<String, String> decryptMap = VatifyToken.xmlToMap(decryptXml.toString());*/
                Map<String, String> decryptMap = encryptMap;
                // 区分消息类型
                String msgType = decryptMap.get("MsgType");
                //场景信息
                String eventKey = decryptMap.get("EventKey");
                // 普通消息
                if ("text".equals(msgType)) { // 文本消息
                    // todo 处理文本消息
                } else if ("image".equals(msgType)) { // 图片消息
                    // todo 处理图片消息
                } else if ("voice".equals(msgType)) { //语音消息
                    // todo 处理语音消息
                } else if ("video".equals(msgType)) { // 视频消息
                    // todo 处理视频消息
                } else if ("shortvideo".equals(msgType)) { // 小视频消息
                    // todo 处理小视频消息
                } else if ("location".equals(msgType)) { // 地理位置消息
                    // todo 处理地理位置消息
                } else if ("link".equals(msgType)) { // 链接消息
                    // todo 处理链接消息
                }
                // 事件推送
                else if ("event".equals(msgType)) { // 事件消息
                    // 区分事件推送
                    String event = decryptMap.get("Event");
                    logger.error("区分事件推送:"+event);
                    if ("subscribe".equals(event)) { // 订阅事件 或 未关注扫描二维码事件
                    	String mapToXml = getReturnMessage2(decryptMap,eventKey);
                        logger.error("发送数据:"+mapToXml);
                        return mapToXml;
                    }  else if ("unsubscribe".equals(event)) { // 取消订阅事件
                        // todo 处理取消订阅事件
                    } else if ("SCAN".equals(event)) { // 已关注扫描二维码事件
                    	String mapToXml = getReturnMessage1(decryptMap,eventKey);
                        logger.error("发送数据:"+mapToXml);
                        return mapToXml;
                    } else if ("LOCATION".equals(event)) { // 上报地理位置事件
                        // todo 处理上报地理位置事件
                    } else if ("CLICK".equals(event)) { // 点击菜单拉取消息时的事件推送事件
                        // todo 处理点击菜单拉取消息时的事件推送事件
                    } else if ("VIEW".equals(event)) { // 点击菜单跳转链接时的事件推送
                        // todo 处理点击菜单跳转链接时的事件推送
                    }
                }
            } catch (Exception e) {
                logger.error("处理微信公众号请求信息,失败", e);
            } finally {
                if (null != is) {
                   is.close();
                }
                if (null != isr) {
                    isr.close();
                }
                if (null != br) {
                    br.close();
                }   
            }
            return null;
        }
    public String getReturnMessage1(Map<String, String> decryptMap,String eventKey) throws Exception {
    		logger.error("decryptMap:"+decryptMap.toString());
    		logger.error("eventKey:"+eventKey);
    		if(eventKey!= null && !"".equals(eventKey)) {
    			if("123".equals(eventKey)) {
    				TextMessage textMessage = new TextMessage();
                    textMessage.setToUserName(decryptMap.get("FromUserName"));
                    textMessage.setFromUserName(decryptMap.get("ToUserName"));
                    textMessage.setCreateTime(new Date().getTime());
                    textMessage.setMsgType("text");
                    textMessage.setContent("http://xxx/wechat/homePage");
                    logger.error(textMessage.toString());
                    String returnMap = getXmlString1(textMessage);
                    logger.error(returnMap);
                    return returnMap;
    			} else if("456".equals(eventKey)) {
    				Article article1 = new Article(); 
    				article1.setDescription("试卷描述1");
    				article1.setPicUrl("http://xxx//res//prod//SSEP/uploadfiles/knowledgeCourseImage/2020729407976775.png");
    				article1.setTitle("图文标题1");
    				article1.setUrl("http://xxx/wechat/paperInfo?id=1904201517405234&productId=1904201517405234");
    				
    				Article article2 = new Article(); 
    				article2.setDescription("试卷描述2");
    				article2.setPicUrl("http://xxx//res//prod//SSEP/uploadfiles/knowledgeCourseImage/2020347456563018.png");
    				article2.setTitle("图文标题2");
    				article2.setUrl("http://xxx/wechat/paperInfo?id=1901141911032222&productId=1901141911032222");
    				
    
    				
    				List<Article> list = new ArrayList<>();
    				list.add(article1);
    				list.add(article2);
    				NewsMessage newMessage =  new NewsMessage();
    				newMessage.setArticleCount(4);
    				
    				newMessage.setCreateTime(new Date().getTime());
    				newMessage.setFromUserName(decryptMap.get("ToUserName"));
    				newMessage.setToUserName(decryptMap.get("FromUserName"));
    				newMessage.setMsgType("news");
    				newMessage.setArticles(list);
    				newMessage.setFuncFlag(1);
    				String returnMap = getXmlString2(newMessage);
                    logger.error(returnMap);
                    return returnMap;
    			} else {
    				
    			}
    		}
    		return null;
    	}

    说明:

    public String getXmlString2(NewsMessage newMessage) {
    		String xml = "";
    		if(newMessage != null) {
    			List<Article> articles = newMessage.getArticles();
    			xml = "<xml>";
    			xml += "<ToUserName><![CDATA[";
    			xml += newMessage.getToUserName();
    			xml += "]]></ToUserName>";
    			xml += "<FromUserName><![CDATA[";
    			xml += newMessage.getFromUserName();
    			xml += "]]></FromUserName>";
    			xml += "<CreateTime>";
    			xml += newMessage.getCreateTime();
    			xml += "</CreateTime>";
    			xml += "<MsgType><![CDATA[";
    			xml += newMessage.getMsgType();
    			xml += "]]></MsgType>";
    			xml += "<ArticleCount>";
    			xml += newMessage.getArticleCount();
    			xml += "</ArticleCount>";
    			xml += "<Articles>";
    			for (Article article : articles) {
    				xml += "<item>";
    				xml += "<Title><![CDATA[";
    				xml += article.getTitle();
    				xml += "]]></Title>";
    				xml +=  "<Description><![CDATA[";
    				xml += article.getDescription();
    				xml += "]]></Description>";
    				xml +=  "<PicUrl><![CDATA[";
    				xml += article.getPicUrl();
    				xml += "]]></PicUrl>";
    				xml +=   "<Url><![CDATA[";
    				xml += article.getUrl();
    				xml += "]]></Url>";
    				xml += "</item>";
    			}
    			xml += "</Articles>";
    			xml += "</xml>";
    		}
    		return xml;
    	}

    说明:以上缺少类型自己可以进行封装,但注意,发送文本消息和图文消息要特别注意,文本消息不需要更换发送者和接受者的信息,但图文消息需要调换才可正常发送,同事关注和未关注的decryptMap.get(“EventKey”)的值是有区别的,要注意改地方。同时,若有多个公众调用同一接口,可根据接收到的ToUserName进行区分。

    结果:

    该文章是在参考Gene Xu博主的两篇文章后进行的一次功能开发,和总结。

    特别感谢Gene Xu博主:https://blog.csdn.net/Goodbye_Youth

    参考链接:https://blog.csdn.net/Goodbye_Youth/article/details/80653132

     

    展开全文
  • 微信公众号生成带参数二维码,当其他人非微信扫描二维码的时候,可以看到一个自定义的链接而不是生成ticket的时候返回的URL,如何做!
  • 结合了express+request+config+wechat等模块,实现了获取微信二维码url地址和ticket,事件推送服务
  • 一、用户扫描场景值二维码时,可能推送以下两种事件: 如果用户还未关注公众号,则...获取带参数二维码的过程包括两步,首先创建二维码ticket,然后凭借ticket到指定URL换取二维码。 二、创建二维码t
  • 为了实现微信公众号生成专属二维码推广来源统计功能,第三方平台微号帮提供了渠道二维码生成功能实现,可以给微信公众号在线生成专属推广二维码,统计公众号各个渠道来源的粉丝,一个渠道对应一个推广二维码,可以...
  • 生成带参数二维码 为了满足用户渠道推广分析和用户帐号绑定等场景的需要,公众平台提供了生成带参数二维码的接口。使用该接口可以获得多个不同场景值的二维码,用户扫描后,公众号可以接收到事件推送。 目前有2...
  • 公众号快速涨粉,增加粉丝裂变海报,由公众号开发接口生成带参数二维码演变而来,懂代码编程的朋友直接通过接口逻辑实现,也可以直接用微号帮平台生成海报二维码,实现粉丝裂变,粉丝自动生成海报分享,粉丝自动打...
  • 一、生成带参数二维码 官方文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1443433542 1.请求地址 /// /// 创建二维码--Post /// /// public string GetQrCode() { string url = string....
  • 生成带参数二维码,所需代码封装在类里,demo.php里填上自己的access_token即可运行。
  • 微信公众号生成带参数二维码

    千次阅读 2018-10-31 19:35:29
    最近做公众号开发,不同小程序绑定一个公众号完成企业打款,需要识别不同场景,也就是识别二维码来自哪个渠道,需要在用户扫描二维码时识别携带的参数 上网查到了解决办法 如下(永久二维码) 获取二维码的ticket ...
  • 资源为微信公众号/H5/二维码支付的源代码,若代码有疑问,可以咨询博主,看到消息一定会回~
  • 为了满足用户渠道推广分析和用户帐号绑定等场景的需要,公众平台提供了生成带参数二维码的接口。使用该接口可以获得多个不同场景值的二维码,用户扫描后,公众号可以接收到事件推送。 目前有2种类型的二维码: 1、...
  • 之前的几个老客户找到我最近要做一个微信公众号生成带参数海报二维码的统计功能,即每个公众号的粉丝会有一个自己的专属二维码,好友或者其他人通过优惠券扫描此带参数二维码之后就会,扫描者会获得一个66元的大礼包...
  • 最近做微信PC端网页微信相关功能的开发,从一个新手的角度来说,微信公众号的文档还是不好理解的,网上找的帖子大都也都基本上是复制微信公众平台上给的文档,开发微信带参数二维码过程中还是遇到不少坑的,在此把我...
  • 1.服务器地址(URL):这里要填写你的后台能够接收到用户事件消息的地址,以后会在这里处理扫描带参数二维码的事件 2.令牌(Token):这里用于验证我们的服务器 3.EncodingAESKey:消息加密密钥 4.消息加密...
  • 微信公众号生成带参数二维码一学就会Java版—3192人已学习 课程介绍    为了满足用户渠道推广分析和用户帐号绑定等场景的需要,也就是推广和微商城分销的一个知识点,当你需要知道你的这个客户是谁推广的时候,...
  • 为了满足用户渠道推广分析的需要,公众平台提供了生成带参数二维码的接口。使用该接口可以获得多个不同场景值的二维码,用户扫描后,公众号可以接收到事件推送。 用户扫描场景值二维码时,可能推送以下两种事件...
  • 微信公众号扫描带参数二维码实现自动分组,实现不同渠道进入用户数量统计,为地推用户进行绩效统计。
  • .net core实现微信公众号中点击事件 文本消息 自定义菜单 查了一些资料简单的实现了一下 供初学者学习

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 19,895
精华内容 7,958
关键字:

微信公众号生成带参数的二维码