推广二维码_推广邀请二维码分享 - CSDN
  • 微信推广带id二维码生成详细解读

    千次阅读 2019-06-08 18:54:42
    需求:登录用户产生一个二维码,下一个人扫描这个二维码之后关注公众号,登录之后自动成为第一个用户的粉丝 吐槽一把,这个需求很操蛋。。。。但是,操不操蛋那是你程序猿说的不?微信开发本来就相当操蛋了。。。都...

    欢迎加入ifast 交流群,

    群聊号码:746358408 ,

    关注的朋友请加群,博客留言信息不带回哈

     

    需求:登录用户产生一个二维码,下一个人扫描这个二维码之后关注公众号,登录之后自动成为第一个用户的粉丝

    吐槽一把,这个需求很操蛋。。。。但是,操不操蛋那是你程序猿说的不?微信开发本来就相当操蛋了。。。都懂得,文档又少,限制又多,傻逼的很。。。。 

    首先看下微信官方的文档,我们先了解下需要哪些东西

    当然毫不犹豫的点开。。。 然后发现这个。。 

    却发现,并没有神马卵用 。。。。。。。。  生成二维码需要token ,我们就按照他提供的方法来搞一搞了。。。 就按照他提供的方法搞一搞了。。 

    二维码的几种生成方式,在这里就不解释了。。 

    不够简单粗暴,我直接上java代码了。。。。。 


    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.net.HttpURLConnection;
    import java.net.URL;
     
    import net.sf.json.JSONObject;
     
    public class Test {
     
        static String wechatAppID = "";
        static String wechatAppSecret = "";
        static String wechatAccessTokenUrl = "";
     
        public static String getWechatAccessToken() {
     
            try {
                URL object = new URL(wechatAccessTokenUrl + "&appid=" + wechatAppID + "&secret=" + wechatAppSecret);
                HttpURLConnection con = (HttpURLConnection) object.openConnection();
                con.setDoOutput(true);
                con.setDoInput(true);
                con.setRequestProperty("Content-Type", "application/json");
                con.setRequestProperty("Accept", "application/json");
                con.setRequestMethod("GET");
     
                OutputStreamWriter wr = new OutputStreamWriter(con.getOutputStream(), "utf-8");
                wr.flush();
                // 显示 POST 请求返回的内容
                StringBuilder sb = new StringBuilder();
                int HttpResult = con.getResponseCode();
                if (HttpResult == HttpURLConnection.HTTP_OK) {
                    BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream(), "utf-8"));
                    String line = null;
                    while ((line = br.readLine()) != null) {
                        sb.append(line + "\n");
                    }
                    br.close();
                    System.out.println("" + sb.toString());
                } else {
                    System.out.println(con.getResponseMessage());
                }
     
                return sb.toString();
            } catch (Exception e) {
                e.printStackTrace();
            }
     
            return "";
        }
     
        public static String getUserQRCode(Integer userId) {
            JSONObject jsonObject = JSONObject.fromObject(getWechatAccessToken());
            String access_token = jsonObject.getString("access_token");
            try {
                URL object = new URL("https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=" + access_token);
                HttpURLConnection con = (HttpURLConnection) object.openConnection();
                con.setDoOutput(true);
                con.setDoInput(true);
                con.setRequestProperty("Content-Type", "application/json");
                con.setRequestProperty("Accept", "application/json");
                con.setRequestMethod("POST");
                JSONObject data = new JSONObject();
                data.put("action_name", "QR_LIMIT_SCENE");
                JSONObject dojb = new JSONObject();
                dojb.put("scene_id", userId);
                JSONObject cojb = new JSONObject();
                cojb.put("scene", dojb);
                data.put("action_info", cojb);
                OutputStreamWriter wr = new OutputStreamWriter(con.getOutputStream(), "utf-8");
                wr.write(data.toString());
                wr.flush();
                // 显示 POST 请求返回的内容
                StringBuilder sb = new StringBuilder();
                int HttpResult = con.getResponseCode();
                if (HttpResult == HttpURLConnection.HTTP_OK) {
                    BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream(), "utf-8"));
                    String line = null;
                    while ((line = br.readLine()) != null) {
                        sb.append(line + "\n");
                    }
                    br.close();
     
                    JSONObject jsonObj = JSONObject.fromObject(sb.toString());
                    String ticket = jsonObj.getString("ticket");
                     生成二维码
                    return "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=" + ticket;
     
                } else {
                    System.out.println(con.getResponseMessage());
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
     
            return "";
        }
     
    }


    运行这两段代码之后,我们发现我们的二维码居然生成了 ,第二个方法返回一个字符串就是二维码图片的绝对路径。。。。 生成的二维码我在这里就不解释了 。。 截出来也没有神马卵用。。。  我们回头看看方法。。。

    我们发现我们用的是scene_id ,而没有使用字符串,为啥子????????  这个问题很关键二维码是生成了,但是怎么把二维码里面的id和下一个用户关联起来了?下一个用户关注上一个用户的二维码,我擦,我怎么知道啥时候关注了了 ???? 如果把上下级用户关联起来了 ?  重重问题 。。。 各种蛋疼。。。 

    首先,当用户点击微信公众号关注的时候,后台是如何知道哪个用户点击了关注了 ? 那么就有这么一个问题,那就是通信的问题,当用户点击关注,微信公众号如何跟我们自己的后台通信了 ???? 这个很关键

    你需要在微信公众号的后台做一些配置,打开后台

    IP白名单,就是哪些IP有权限调用这些接口,一般配置你服务器的IP和你开发电脑的公网IP(不是192.168.0.111),好吧,来张图吧。。 

    然后启动这东西 。。。 

    然后填写以下配置。。。 

    URL:其实就是一个外网可以访问的接口,注意:必须是80或443端口,做过后台都懂得。。。 这个接口的作用是,被微信调用,然后产生回调。。。。。也就是微信通过这个接口你的服务器发送消息。这个很重要

    Token:自己定义的一个字符串,加密的要是,你写jinsanpang都可以;可以参考我的另外一篇文章了解token(http://blog.csdn.net/chmod_r_755/article/details/75554735)

    EncodeKey:随机生成,干啥子用的,不知道,问微信

    模式:明文模式,你想怎样? 加密? 搞得跟真的似的 ,有意思吗?金融机构自己看着办 。。。。 

    到这里,我们就明白了,用户关注微信我们的后台是怎么知道的。。。原来是有通信的 。。。这块我们就必须搞一个接口了,让微信回调。。。。。。 

    说太抽象了 。。。。  我们首先来张图 。。 

    当我扫码关注的时候, 微信会回调这个接口,注意我这边日志是json格式的,但是网上有xml版本的

    这种格式的,因为我把xml转json了,xml看着都蛋疼 ,来段代码压压惊


    @RequestMapping(value = "/wx.do")
        public void get(@RequestBody(required = false) String body, HttpServletRequest request,
                HttpServletResponse response) throws Exception {
     
            org.json.JSONObject jsonObject = JSONML.toJSONObject(body);
            logger.info("请求进来了..." + jsonObject);
     
            org.json.JSONArray jsonArray = jsonObject.getJSONArray("childNodes");
     
            org.json.JSONObject fromUser = null;
            org.json.JSONObject event = null;
            org.json.JSONObject eventKey = null;
     
            for (int i = 0; i < jsonArray.length(); i++) {
                org.json.JSONObject obj = jsonArray.getJSONObject(i);
     
                String tagName = obj.getString("tagName");
     
                if ("FromUserName".equals(tagName)) {
                    fromUser = obj;
                } else if ("Event".equals(tagName)) {
                    event = obj;
                } else if ("EventKey".equals(tagName)) {
                    eventKey = obj;
                }
            }
     
            logger.info("请求进来了...fromUser=" + fromUser.toString() + "    event=" + event.toString() + "    eventKey="
                    + eventKey.toString());
     
            if (event != null && eventKey != null && fromUser != null) {
     
                org.json.JSONArray eventArray = event.getJSONArray("childNodes");
                org.json.JSONArray eventKeyArray = eventKey.getJSONArray("childNodes");
                org.json.JSONArray fromUserNameArray = fromUser.getJSONArray("childNodes");
     
                logger.info("请求进来了...eventArray=" + eventArray.toString() + "    eventKeyArray=" + eventKeyArray.toString()
                        + "    fromUserNameArray=" + fromUserNameArray.toString());
                if (eventArray.length() > 0 && fromUserNameArray.length() > 0 && eventKeyArray.length() > 0) {
                    String subscribeString = eventArray.getString(0); // 动作
                    String fromUserString = fromUserNameArray.getString(0); // openId
                    String eventKeyString = eventKeyArray.getString(0); // 带入的信息
     
                    logger.info("请求进来了...subscribeString=" + subscribeString + "    fromUserString=" + fromUserString
                            + "    eventKeyString=" + eventKeyString);
     
                    if ("subscribe".equals(subscribeString)) {
                        // 点击关注, 保存上级的id 且保存openId
                        // 点击取消关注,删除这条记录
                        // 如果 eventKeyString 为空字符串 ,表示关注官方二维码关注的
                        /// 包含上级Id ,则保存到数据库中
                        if (eventKeyString.contains("qrscene_")) {
                            String userIdString = eventKeyString.replaceAll("qrscene_", "");
                            Integer userId = Integer.parseInt(userIdString);
                            WechatKey wechatKey = new WechatKey();
                            wechatKey.setOpenId(fromUserString);
                            wechatKey.setUserId(userId);
                            wechatKeyManager.saveWechatkey(wechatKey);
     
                        }
     
                    } else if ("unsubscribe".equals(subscribeString)) {
                        WechatKey wechatKey = wechatKeyManager.getWechatKeyByOpenId(fromUserString);
                        if (wechatKey != null) {
                            wechatKeyManager.deleteByOpenId(fromUserString);
                        }
                    }
     
                }
     
            }
     
            Enumeration pNames = request.getParameterNames();
            while (pNames.hasMoreElements()) {
                String name = (String) pNames.nextElement();
                String value = request.getParameter(name);
                // out.print(name + "=" + value);
     
                String log = "name =" + name + "     value =" + value;
                logger.error(log);
            }
     
            String signature = request.getParameter("signature");/// 微信加密签名
            String timestamp = request.getParameter("timestamp");/// 时间戳
            String nonce = request.getParameter("nonce"); /// 随机数
            String echostr = request.getParameter("echostr"); // 随机字符串
            PrintWriter out = response.getWriter();
     
            if (CheckUtil.checkSignature(signature, timestamp, nonce)) {
                out.print(echostr);
            }
            out.close();
            out = null;
     
        }


    关注的时候微信会给服务器推送一条消息

    subscribe:表示开始关注

    fromUser:表示哪个用户关注的,这里返回的是当前用户的openId ,唯一的 

    EventKey:qrscene_20 前面的qrscene_是固定的,后面的20 也就是上个用户的id

    那么到了这一步, 上个用户和下一个用户就联系在一起了。。。。。。如果扫的码是系统生成的。。。EventKey:就为空字符串了。。

    扯到这里了 。。。。  其他的不解释,自己理解。。。。 


    --------------------- 
    作者:chmod_R_755 
    来源:CSDN 
    原文:https://blog.csdn.net/chmod_R_755/article/details/76229056 
    版权声明:本文为博主原创文章,转载请附上博文链接!

    来源:https://blog.csdn.net/chmod_R_755/article/details/76229056

    展开全文
  • 微信公众号生成个性化推广二维码

    千次阅读 2019-11-11 09:46:51
    文章目录微信公众号生成个性化推广二维码目标环境要求实现思路获取二维码流程概述获取ticket获取二维码下载地址代码实现核心代码运行结果 微信公众号生成个性化推广二维码 目标 针对不同的推广场景,生成特定的...

    微信公众号生成个性化推广二维码

    目标

    针对不同的推广场景,生成特定的公众号二维码,以便系统统计用户来源,提供个性化服务;

    环境要求

    1. 后台语言:Java
    2. IDE:IDEA
    3. JDK:1.8
    4. 微信服务号

    实现思路

    通过微信公众号提供的生成带参数的二维码来实现用户来源的识别。

    目前有两类带参数的二维码:

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

    当用户扫描带场景的二维码时,微信系统将向响应系统(什么是微信系统和响应系统?点击传送门)推送以下两种事件:

    1. 已关注用户将自动进入会话,微信系统将向响应系统推送带有场景值的扫描事件;
    2. 未关注用户则会先进入关注页面,如果用户选择关注公众号,那么微信系统将先推送关注事件给响应系统,然后再推送带有场景值的扫描事件;

    获取二维码流程

    概述

    获取二维码一共分两步:

    1. 获取ticket:每次创建二维码ticket需要提供一个开发者自行设定的参数(scene_id),也就是场景值,该值即为响应系统接收扫描事件的场景值,该值可以为整型数字,可以为字符串;
    2. 通过ticket换取二维码:通过ticket换取二维码下载地址,该地址任何人都可访问;

    获取ticket

    因为有两种二维码,所以也有两种ticket

    获取临时二维码ticket:

    请求方式: POST
    地址: https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=TOKEN
    数据格式:json
    数据示例:
    	场景值为整型数字:
    	{"expire_seconds": 604800, "action_name": "QR_SCENE", "action_info": {"scene": {"scene_id": 123}}}
    	场景值为字符串:
    	{"expire_seconds": 604800, "action_name": "QR_STR_SCENE", "action_info": {"scene": {"scene_str": "test"}}}
    
    

    获取永久二维码ticket:

    请求方式: POST
    地址: https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=TOKEN
    数据格式:json
    数据示例:
    	场景值为整型数字:
    	{"action_name": "QR_LIMIT_SCENE", "action_info": {"scene": {"scene_id": 123}}}
    
    	场景值为字符串:
    	{"action_name": "QR_LIMIT_STR_SCENE", "action_info": {"scene": {"scene_str": "test"}}}
    

    返回结果说明:

    {"ticket":"gQH47joAAAAAAAAAASxodHRwOi8vd2VpeGluLnFxLmNvbS9xL2taZ2Z3TVRtNzJXV1Brb3ZhYmJJAAIEZ23sUwMEmm
    3sUw==","expire_seconds":60,"url":"http://weixin.qq.com/q/kZgfwMTm72WWPkovabbI"}
    

    首先贴上官方对参数的说明:

    参数 说明
    expire_seconds 该二维码有效时间,以秒为单位。 最大不超过2592000(即30天),此字段如果不填,则默认有效期为30秒。
    action_name 二维码类型,QR_SCENE为临时的整型参数值,QR_STR_SCENE为临时的字符串参数值,QR_LIMIT_SCENE为永久的整型参数值,QR_LIMIT_STR_SCENE为永久的字符串参数值
    action_info 二维码详细信息
    scene_id 场景值ID,临时二维码时为32位非0整型,永久二维码时最大值为100000(目前参数只支持1–100000)
    scene_str 场景值ID(字符串形式的ID),字符串类型,长度限制为1到64

    个人觉得不好理解的是action_name。

    首先我们可以发现获取临时和永久ticket的地址是一样的!这说明我们需要传递一些信息告诉微信系统我们需要的是什么;然后我们可以发现的就是json的属性不一样,于是就产生了这样的疑问:是不是通过expire_seconds这个字段判断的呢?

    接下里看参数说明,action_name的介绍为:“QR_SCENE为临时的整型参数值”。我没明白的是QR_SCENE到底是一个整型参数值,还是一个标记值。因为看到了参数值,所以就理解为“可变”的了,加上我们也的确有判断是否是永久的方法(expire_seconds存在与否),于是似乎理所当然。。。就出错了。

    事实上,它是一个标记值,也就是微信系统应该是通过action_name来判断我们的目的是什么。不过问题也不大,程序跑起来就能明白这个问题到底是什么了,因为随意指定该属性的值会抛错:“invalid action name”;

    获取二维码下载地址

    获得ticket的同时,我们也获得了一个URL,这个URL即为二维码解析后的地址,此时我们就可以自己为该地址生成二维码图片了,比如美化一下什么的。不过我们也可以从微信系统那里获取下载地址。

    GET请求(请使用https协议)https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=TICKET
    提醒:TICKET记得进行UrlEncode
    

    访问该地址即可获得对应场景、对应生命周期的二维码图片下载地址;

    代码实现

    核心代码

    public class Main {
    	public static void main(String[] args){
    		//获取临时推广、场景值为字符串的二维码
    		String temporaryQRCodeUrl= WeChatQRCodeManager.getTemporaryStrQRCodeDownloadUrl("teacher_wang");
    		System.out.println(temporaryQRCodeUrl);
    
    		//获取永久推广、场景值为字符串的二维码
    		String permanentQRCodeUrl= WeChatQRCodeManager.getPermanentStrQRCodeDownloadUrl("teacher_liu");
    		System.out.println(permanentQRCodeUrl);
    
    		//获取临时推广、场景值为整型的二维码
    		temporaryQRCodeUrl= WeChatQRCodeManager.getTemporaryIntQRCodeDownloadUrl(120);
    		System.out.println(temporaryQRCodeUrl);
    
    		//获取永久推广、场景值为整型的二维码
    		permanentQRCodeUrl= WeChatQRCodeManager.getPermanentIntQRCodeDownloadUrl(119);
    		System.out.println(permanentQRCodeUrl);
    	}
    }
    public class WeChatQRCodeManager {
    	/**
    	 * 获取临时特定场景推广二维码下载地址
    	 * @param sceneStr 临时特定场景的字符串标记
    	 * @return 二维码的下载地址
    	 * @see QRCodeInfo
    	 */
    	public static String getTemporaryStrQRCodeDownloadUrl(String sceneStr){
    		QRCodeInfo info=new QRCodeInfo(false);
    		info.setSceneStrId(sceneStr);
    		return getQRCodeDownloadUrl(info);
    	}
    	/**
    	 * 获取永久特定场景推广二维码下载地址
    	 * @param sceneStr 永久特定场景的字符串标记
    	 * @return 二维码的下载地址
    	 * @see QRCodeInfo
    	 */
    	public static String getPermanentStrQRCodeDownloadUrl(String sceneStr){
    		QRCodeInfo info=new QRCodeInfo(true);
    		info.setSceneStrId(sceneStr);
    		return getQRCodeDownloadUrl(info);
    	}
    
    	/**
    	 * 获取临时特定场景推广二维码下载地址
    	 * @param sceneInt 临时特定场景的整型标记
    	 * @return 二维码的下载地址
    	 * @see QRCodeInfo
    	 */
    	public static String getTemporaryIntQRCodeDownloadUrl(int sceneInt){
    		QRCodeInfo info=new QRCodeInfo(false);
    		info.setSceneIntId(sceneInt);
    		return getQRCodeDownloadUrl(info);
    	}
    	/**
    	 * 获取永久特定场景推广二维码下载地址
    	 * @param sceneInt 永久特定场景的整型标记
    	 * @return 二维码的下载地址
    	 * @see QRCodeInfo
    	 */
    	public static String getPermanentIntQRCodeDownloadUrl(int sceneInt){
    		QRCodeInfo info=new QRCodeInfo(true);
    		info.setSceneIntId(sceneInt);
    		return getQRCodeDownloadUrl(info);
    	}
    
    	/**
    	 * 获取二维码下载地址
    	 * @param info 二维码信息载体
    	 * @return 二维码下载地址
    	 * @see QRCodeInfo
    	 */
    	private static String getQRCodeDownloadUrl(QRCodeInfo info) {
    		String responseString= HttpUtils.doPostJson(WeChatUrlManager.getQrCodeTicketUrl(),info.toJsonString());
    		String ticket= JsonUtils.getTargetStringInfo("ticket",responseString);
    
    		return WeChatUrlManager.getQrCodeUrl(ticket);
    	}
    }
    /**
     * @author Shao Lixuan  2019/3/7 16:43
     */
    public class QRCodeInfo {
    	private int expireSeconds;
    	private String sceneStrId;
    	private boolean isTemporary;
    	private int sceneIntId;
    	private boolean sceneIsStr;
    
    	public QRCodeInfo(boolean temporary){
    		isTemporary=temporary;
    		sceneIsStr=true;
    	}
    
    
    	public boolean isTemporary() {
    		return isTemporary;
    	}
    
    	public void setTemporary(boolean temporary) {
    		isTemporary = temporary;
    	}
    
    	public int getExpireSeconds() {
    		return expireSeconds;
    	}
    
    	public void setExpireSeconds(int expireSeconds) {
    		this.expireSeconds = expireSeconds;
    	}
    
    	public String getSceneStrId() {
    		return sceneStrId;
    	}
    
    	public void setSceneStrId(String sceneStrId) {
    		this.sceneStrId = sceneStrId;
    		sceneIsStr=true;
    	}
    
    	public int getSceneIntId() {
    		return sceneIntId;
    	}
    
    	public void setSceneIntId(int sceneIntId) {
    		this.sceneIntId = sceneIntId;
    		sceneIsStr=false;
    	}
    
    	public String toJsonString(){
    		String template;
    		if(isTemporary){
    			if(sceneIsStr) {
    				template = "{\"expire_seconds\": %d, \"action_name\":\"QR_STR_SCENE\", \"action_info\": {\"scene\": {\"scene_str\": \"%s\"}}}";
    				return String.format(template, expireSeconds, sceneStrId);
    			}else{
    				template = "{\"expire_seconds\": %d, \"action_name\":\"QR_SCENE\", \"action_info\": {\"scene\": {\"scene_str\": %d}}}";
    				return String.format(template, expireSeconds, sceneIntId);
    			}
    		}else {
    			if(sceneIsStr) {
    				template = "{\"action_name\": \"QR_LIMIT_STR_SCENE\", \"action_info\": {\"scene\": {\"scene_str\": \"%s\"}}}";
    				return String.format(template, sceneStrId);
    			}else{
    				template = "{\"action_name\": \"QR_LIMIT_SCENE\", \"action_info\": {\"scene\": {\"scene_str\": %d}}}";
    				return String.format(template, sceneStrId);
    			}
    		}
    	}
    }
    

    运行结果

    https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=gQGh8TwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAyQllPSkFXRnVmRUMxMDAwMHcwN0QAAgRA5IBcAwQAAAAA
    https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=gQGG8DwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAyMEtZaEJYRnVmRUMxS3NBMTFzY18AAgRg5IFcAwQ8AAAA
    https://mp.weixin.qq.com/cgi-bin/sho wqrcode?ticket=gQHH8TwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAyaGFiTEFiRnVmRUMxMDAwMGcwM1EAAgTj04FcAwQAAAAA
    https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=gQGK8DwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAyRVZNMUJTRnVmRUMxS3NBMXhzMW4AAgRg5IFcAwQ8AAAA
    

    项目源码CSDN下载

    展开全文
  • 小程序推广二维码生成

    千次阅读 2018-08-27 16:25:28
    小程序推广二维码生成 &lt;?php $appid = '***************'; $secret ='********************************'; $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&...

    小程序推广二维码生成

    <?php
        $appid = '***************';
        $secret ='********************************';
        $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$appid}&secret={$secret}";
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        $token = curl_exec($curl);
        $err = curl_error($curl);
        curl_close($curl);
        header('content-type:image/gif');
        $openid = "*********************";
        $data['scene'] = "uid=" . $a;
        $data['page'] = "pages/index/index";
        $data = json_encode($data);
        $access = json_decode($token,true);
        $access_token= $access['access_token'];
        $url = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" . $access_token;
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);   //没有这个会自动输出,不用print_r();也会在后面多个1
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
        $output = curl_exec($ch);
        curl_close($ch);
        $out = json_decode($output);
        $newFilePath=$openid.'.jpg'; 
        $newFile = fopen($newFilePath,"w");
        fwrite($newFile,$output);
        fclose($newFile);
    ?>

     

    展开全文
  • tp3.2中生成微信推广二维码

    千次阅读 2017-07-07 16:52:40
    第一步:引入phpqrcode.php二维码类到ThinkPHP/Library/Vendor下面.下载地址:... 第二步:控制器里面方法代码为:  //推广二维码  public function extendewm()

    第一步:引入phpqrcode.php二维码类到ThinkPHP/Library/Vendor下面.下载地址:http://sourceforge.net/projects/phpqrcode/files/latest/download 


    第二步:控制器里面方法代码为:

          //推广二维码
            public function extendewm()
            {   
                $user_id=I('get.id');//获取当前登录用户id,后以做二维码参数(scene_id)
                $usermobile=$_SESSION['usermobile'];//当前登录者用户手机号
                //获取access_token
                //请求url地址
                $appId = 'wxc7245e01b2b4b965';
                $appSecret = '5cb65e4111e750497e32fdf44c91a3b9';
                $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$appId."&secret=".$appSecret;
                //初始化curl
                $ch = curl_init($url);
                //3.设置参数
                curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
                curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);//跳过证书验证
                curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);  // 从证书中检查SSL加密算法是否存在
                //4.调用接口
                $res = curl_exec($ch);
                if(curl_errno($ch)){
                    var_dump(curl_error($ch));
                }
                $resArr = json_decode($res,true);
                //5.关闭curl
                curl_close($ch);
                $access_token=$resArr['access_token'];
                //创建二维码ticket,根据当前登陆者角色分别生成不同的ticket,进而生成临时和永久二维码
                $usermobile=$_SESSION['usermobile'];//当前登录者用户手机号
                $user=M('user');
                $userdata=$user->where(array('tellphone'=>$usermobile))->find();
                $user_id=$userdata['id'];
                $role=$userdata['role'];
                //$arrrole=explode(",",$role);
                $url1="https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=".$access_token;
                if($role==2)//商家属性
                {
                    $dataforever = '{"action_name": "QR_LIMIT_SCENE", "action_info": {"scene": {"scene_id": "$user_id"}}}';//永久二维码请求数据(数字形式的场景值ID)

     // $seller="seller".$user_id;//字符串参数
                    // $dataforever='{"action_name": "QR_LIMIT_STR_SCENE", "action_info": {"scene": {"scene_str": "'.$seller.'"}}}';//永久二维码请求数据(字符串形式的场景值ID)
                    $curl = curl_init(); // 启动一个CURL会话
                    curl_setopt($curl, CURLOPT_URL, $url1); // 要访问的地址
                    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); // 对认证证书来源的检查
                    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE); // 从证书中检查SSL加密算法是否存在
                    curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); // 模拟用户使用的浏览器
                    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 0); // 使用自动跳转
                    curl_setopt($curl, CURLOPT_AUTOREFERER, 1); // 自动设置Referer
                    curl_setopt($curl, CURLOPT_POST, 1); // 发送一个常规的Post请求
                    curl_setopt($curl, CURLOPT_POSTFIELDS, $dataforever); // Post提交的数据包
                    curl_setopt($curl, CURLOPT_COOKIEFILE, 'cookie.txt'); // 读取上面所储存的Cookie信息
                    curl_setopt($curl, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循环
                    curl_setopt($curl, CURLOPT_HEADER, 0); // 显示返回的Header区域内容
                    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回
                    $tmpInfo = curl_exec($curl); // 执行操作
                    curl_close($curl);
                    $dataticket=json_decode($tmpInfo,true);
                    $ticket=$dataticket['ticket'];
                    $url=$dataticket['url'];
                    Vendor("phpqrcode");
                    // 把生成二维码图片保存到本地
                    $path = "Public/Uploads/" . $user_id . ".png"; //本地文件存储路径
                    // 纠错级别:L、M、Q、H
                    $level = 'H';
                    // 点的大小:1到10,用于手机端4就可以了
                    $size =5;
                    $object=new \QRcode();
                    $object->png($url,$path,$level,$size);
                    //给生成的二维码图片添加背景图(方法一)
                    // $image=new \Think\Image();
                    // $image->open('./Public/Uploads/back.png')->water($path,array(240,860),100)->save("./Public/Uploads/".$usermobile.".jpg");
                    // //$image->open('./Public/Uploads/back.png')->water($path,array(250,870),100)->text('$usermobile','msyhbd.ttf',20,'#000000')->save("./Public/Uploads/".$usermobile.".jpg");
                    // $this->assign("usermobile",$usermobile);
                    // $this->display();
                    //给生成的二维码添加背景图(方法二)
                    $bigImgPath = 'Public/Uploads/back.png';
                    $qCodePath = $path;
                    $bigImg = imagecreatefromstring(file_get_contents($bigImgPath));
                    $qCodeImg = imagecreatefromstring(file_get_contents($qCodePath));
                    list($qCodeWidth, $qCodeHight, $qCodeType) = getimagesize($qCodePath);
                    // imagecopymerge使用注解
                    imagecopymerge($bigImg, $qCodeImg, 255, 875, 0, 0, $qCodeWidth, $qCodeHight, 100);
                    // list($bigWidth, $bigHight, $bigType) = getimagesize($bigImgPath);
                    list($bigWidth, $bigHight) = getimagesize($bigImgPath);
                    $yourname = $usermobile;
                    $red = imagecolorallocate($bigImg, 241,215, 60);
                    imagefttext($bigImg, 30, 0, 310, 728, $red, 'msyhbd.ttf', $yourname);
                    header('Content-Type:image/png');
                    $savepath="Public/Uploads/".$usermobile.".png"; //推广二维码本地存储路径
                    imagepng($bigImg,$savepath);//推广二维码存到本地
                    $this->assign("usermobile",$usermobile);
                    $this->display();
                    }else{//业务员属性
                    $datalinshi = '{"expire_seconds": 604800, "action_name": "QR_SCENE", "action_info": {"scene": {"scene_id":  "$user_id"}}}';//临时二维码请求数据
                    $curl = curl_init(); // 启动一个CURL会话
                    curl_setopt($curl, CURLOPT_URL, $url1); // 要访问的地址
                    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); // 对认证证书来源的检查
                    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE); // 从证书中检查SSL加密算法是否存在
                    curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); // 模拟用户使用的浏览器
                    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 0); // 使用自动跳转
                    curl_setopt($curl, CURLOPT_AUTOREFERER, 1); // 自动设置Referer
                    curl_setopt($curl, CURLOPT_POST, 1); // 发送一个常规的Post请求
                    curl_setopt($curl, CURLOPT_POSTFIELDS, $datalinshi); // Post提交的数据包
                    curl_setopt($curl, CURLOPT_COOKIEFILE, 'cookie.txt'); // 读取上面所储存的Cookie信息
                    curl_setopt($curl, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循环
                    curl_setopt($curl, CURLOPT_HEADER, 0); // 显示返回的Header区域内容
                    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回
                    $tmpInfo = curl_exec($curl); // 执行操作
                    curl_close($curl);
                    $dataticket=json_decode($tmpInfo,true);
                    $ticket=$dataticket['ticket'];
                    $url=$dataticket['url'];
                    Vendor("phpqrcode");
                    // 把生成二维码图片保存到本地
                    $path = "Public/Uploads/" . $user_id . ".png"; //本地文件存储路径
                    // 纠错级别:L、M、Q、H
                    $level = 'H';
                    // 点的大小:1到10,用于手机端4就可以了
                    $size = 5;
                    $object=new \QRcode();
                    $object->png($url,$path,$level,$size);
                    //给生成的二维码图片添加背景图(方法一)
                    // $image=new \Think\Image();
                    // $image->open('./Public/Uploads/back.png')->water($path,array(250,870),100)->save("./Public/Uploads/".$usermobile.".jpg");
                    // //$image->open('./Public/Uploads/back.png')->water($path,array(250,870),100)->text('$usermobile','msyhbd.ttf',20,'#000000')->save("./Public/Uploads/".$usermobile.".jpg");
                    // $this->assign("usermobile",$usermobile);
                    // $this->display();
                    //给生成的二维码添加背景图(方法二)
                    $bigImgPath = 'Public/Uploads/back.png';
                    $qCodePath = $path;
                    $bigImg = imagecreatefromstring(file_get_contents($bigImgPath));
                    $qCodeImg = imagecreatefromstring(file_get_contents($qCodePath));
                    list($qCodeWidth, $qCodeHight, $qCodeType) = getimagesize($qCodePath);
                    // imagecopymerge使用注解
                    imagecopymerge($bigImg, $qCodeImg, 250, 870, 0, 0, $qCodeWidth, $qCodeHight, 100);
                    // list($bigWidth, $bigHight, $bigType) = getimagesize($bigImgPath);
                    list($bigWidth, $bigHight) = getimagesize($bigImgPath);
                    $yourname = $usermobile;
                    $red = imagecolorallocate($bigImg, 241,215, 60);
                    imagefttext($bigImg, 30, 0, 310, 728, $red, 'msyhbd.ttf', $yourname);
                    header('Content-Type:image/png');
                    imagepng($bigImg);
                    
                    
                    }

                }

               
            }

    第三步视图层为:

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
    <head>
        <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
        <title>我的推广二维码</title>
    </head>
    <body>
    <img src="__ROOT__/Public/Uploads/{$usermobile}.png" alt="" style="width: 264px"/>
    </body>
    </html>





    展开全文
  • 二维码推广网站

    千次阅读 2016-05-27 15:32:42
    (1)适配了微博客户端,微博客户端扫码,提示在浏览器中打开  (2)适配腾讯应用宝,支持安卓和ios为应用宝的下载链接时,直接打开下载...(5)支持二维码logo自动生成(ios下载地址需要为appstore地址)
  • 二维码推广方法20种

    2019-07-28 04:55:17
    二维码推广方法20种 二维码,又称二维条码,最早发明于日本,它是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的。在移动互联 网发展中顺势成长,已成为当前手机端上最...
  • java生成推广二维码

    2020-07-26 23:33:56
    全网唯一全面美化二维码代码源码,自己纯手工制作。 具体功能:图片和图片组合,图片添加推广文字。 成品类似0元购推广二维码。可添加文字,可组合图片。
  • 微信推广二维码接口使用总结

    千次阅读 2016-09-15 17:38:31
    前一段时间小编的公司接手了一个微信分销的项目,该项目中有一个推广二维码的功能:分销商可以生成自己的二维码,当其他用户首次扫描的时候会自动成为该分销商的下级。这个过程中最主要的就是利用微信的生成二维码...
  • 推广用户在生成自己的推广二维码的时候,可以带上用户的身份标识(比如用户id),那么其他人在扫描这个带有UID参数的二维码关注公众号时,公众号可以获取到二维码里边的参数(即UID),那么就很容易判断和追溯用户...
  • 微信公众号推广二维码源码 博文连接:https://blog.csdn.net/slx3320612540/article/details/88375918
  • thinkphp5微信公众号二维码扫码关注推广二维码事件实现, 给出实现的全部方法: 获取二维码,让微信公众号跳转到以下代码的code方法即可,用户点击二维码后,通过二维码获取关注用户信息及二维码推广者信息,以及...
  • //获取用户经销商信息 及生成推广二维码 public function qrcode() { //拿到openid 查找用户表内是否有该用户 没有则拒绝生成二维码 有则查看是否已生成二维码 有生成则发送数据 没有则生成 $openid=input('...
  • 微信服务号开发-推广二维码

    千次阅读 2018-03-05 11:44:02
    扫码加群:微信公众平台技术文档二维码部分如下:生成带参数的二维码为了满足用户渠道推广分析和用户帐号绑定等场景的需要,公众平台提供了生成带参数二维码的接口。使用该接口可以获得多个带不同场景值的二维码,...
  • 二维条码比一维条码记载数据...本文演示使用asp.net生成店铺推广二维码,二维码中间加logo生成效果如图1。该演示程序使用到了文字转成图片,生成缩略图,图片拼接等,在随附的代码下载中提供了完整的源代码。 图1...
  • tp框架 中生成微信推广二维码

    千次阅读 2018-02-02 11:53:57
    1.第一步下载二维码类文件 下载地址链接:https://pan.baidu.com/s/1ramNa2o 密码:8ok8 2.把类文件放到第三方类中: ThinkPHP\Library\Vendor\phpqrcode.php 3.首先微信公众平台账号有这个... ... //推广二维码
  • 如果推广二维码 和 商品 二维码 无法生成 /addons/ewei_shopv2/data/qrcode/ 看看是否有这个目录 没有的话 新建 设置写入权限
  • 最近做微信PC端网页微信相关功能的开发,从一个新手的角度来说,微信公众号的文档还是不好理解的,网上找的帖子大都也都基本上是复制微信公众平台上给的文档,开发微信带参数二维码过程中还是遇到不少坑的,在此把我...
  • 在项目开发过程中,负责的推广二维码模块需要加入openinstall三方框架,该框架可以在推广二维码中搭建一层上下级关系,加上一定的积分奖励,极大地提高了用户的推广热情,并且不同于以往常规的手动填写邀请码,该...
  • php根据图片生成推广图片、推广海报 index.php <?php require_once "Imgcode.php"; $codedata = array( "portrait" => array("thumb" => 'test.jpg', "left" => 40, "top" => 40, "width" => ...
  • 通过上图可以看到,当A君关注B君展示的推广二维码关注微信平台后,可以获取到同样包含B君的A君的一些信息. 假如要做一个功能,将A君的openid绑定到B君的数据下面,即B君邀请了哪些人可以进行查看,则需要...
1 2 3 4 5 ... 20
收藏数 15,025
精华内容 6,010
关键字:

推广二维码