精华内容
下载资源
问答
  • 为了满足用户渠道推广分析和用户帐号绑定等场景的需要,也就是推广和微商城分销的一个知识点,当你需要知道你的这个客户是谁推广的时候,当你为你的商城设计了分销的模式的时候,你就会发现这个知识点很好用
  • 当然从公众号跳转到小程序,多多少少是需要一点业务相关参数的。 本篇主要将二维码生成,以及事件推送 一、二维码生成 根据官方文档介绍,目前公众号二维码主要有永久和临时两种,但是永久二维码是有数量限制的,...

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

    一、二维码生成

    根据官方文档介绍,目前公众号二维码主要有永久和临时两种,但是永久二维码是有数量限制的,临时二维码携带参数又有限制。
    所以我们一般都使用临时二维码
    官方介绍
    生成二维码的动作主要有两步,第一步根据参数拿到二维码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对应的小程序必须与公众号有绑定关系。
    

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

    展开全文
  • /** * 生成推广二维码 */ public function create_qrcode() { $res = Db::name("user")->field("reffer_code,openid")->where("id", $this->auth->id)->find(); ...
    /**
         * 生成推广二维码
         */
        public function create_qrcode() {
            
            $res = Db::name("user")->field("reffer_code,openid")->where("id", $this->auth->id)->find();
            
            $arr = [
                'action_name' => 'QR_STR_SCENE',
                'action_info' => [
                    'scene' => [
                        'scene_str' => $res['reffer_code']
                    ]
                ]
            ];
            $data = json_encode($arr);
    
            $url = 'https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=' . $this->getAccessToken();
            $result = $this->CURLSend($url, 'post', $data);
            $results = json_decode($result, true);
    //        echo "<pre>";var_dump(  $url , $results  );die;
            $qecodeUrl = 'https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=' . UrlEncode($results['ticket']);
            $this->success('ok', [
                'reffer_code' => $res['reffer_code'],
                'qrcode_src' => $qecodeUrl,
            ]);
            
        }
    
        //获取access_token,微信调用接口凭据(使用接口需要用到)
        public function getAccessToken() {
            
            $config = Db::name('app_public')->where('id', 1)->find();
            if( $config['wx_expires_in']< time() ){
                $appid = $this->appid;
                $appsecret = $this->appsecret;
                $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" . $appid . "&secret=" . $appsecret;
                $tmp = $this->CURLSend($url, 'get');
                $obj = json_decode($tmp);
                $dty = (time() + $obj->expires_in);
                $data['wx_access_token'] = $obj->access_token;
                $data['wx_expires_in'] = $dty;
                Db::name('app_public')->where('id', 1)->update( $data );
                return $obj->access_token;
            }else{
                return  $config['wx_access_token'];
            }
            
        }
    
        /**
         * 模拟浏览器发送
         */
        public function CURLSend($url, $method = 'get', $data = '') {
            $ch = curl_init(); //初始化
            $headers = array('Accept-Charset: utf-8');
            curl_setopt($ch, CURLOPT_URL, $url); //指定请求的URL
            curl_setopt($ch, CURLOPT_CUSTOMREQUEST, strtoupper($method)); //提交方式
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); //不验证SSL
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); //不验证SSL
            curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); //设置HTTP头字段的数组
            curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible;MSIE5.01;Windows NT 5.0)'); //头的字符串
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
            curl_setopt($ch, CURLOPT_AUTOREFERER, 1); //自动设置header中的Referer:信息
            curl_setopt($ch, CURLOPT_POSTFIELDS, $data); //提交数值
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); //是否输出到屏幕上,true不直接输出
            $temp = curl_exec($ch); //执行并获取结果
            curl_close($ch);
            return $temp; //return 返回值
        }

    然后根据openid获取本人信息

    $url = 'https://api.weixin.qq.com/cgi-bin/user/info?access_token='.$this->getAccessToken().'&openid=ocGkcxIF9cdyQdDVt5luGuARboHs&lang=zh_CN';
            $data_all = $this->CURLSend($url, 'get');
    
    
    
    object(stdClass)#52 (17) {
      ["subscribe"]=>
      int(1)
      ["openid"]=>
      string(28) "1111"
      ["nickname"]=>
      string(3) "111"
      ["sex"]=>
      int(1)
      ["language"]=>
      string(5) "zh_CN"
      ["city"]=>
      string(6) "111"
      ["province"]=>
      string(6) "111"
      ["country"]=>
      string(6) "中国"
      ["headimgurl"]=>
      string(143) "111"
      ["subscribe_time"]=>
      int(1579074211)
      ["unionid"]=>
      string(28) "1111"
      ["remark"]=>
      string(0) ""
      ["groupid"]=>
      int(0)
      ["tagid_list"]=>
      array(0) {
      }
      ["subscribe_scene"]=>
      string(17) "ADD_SCENE_QR_CODE"
      ["qr_scene"]=>
      int(0)
      ["qr_scene_str"]=>
      string(6) "413911"
    }

     

    展开全文
  • 微信公众号利用asp生成带参数二维码,别人扫了后如果已经关注过该公众号的,则直接进入公众号里,如果没关注则提示关注,关注后自动把该微信用户资料获取到并且保存入库,然后回复他的上级是谁,我觉得有可能对...
  • 公众号实现生成二维码扫描进行微信与数据库信息绑定 解决方案 思路:token 解决方案:复写框架底层实现方法,增加token参数(详情参考总纲) 复写目标,底层源码QrcodeApi.java,复写后代码如下: // // Source ...

    需求

    多公众号实现生成二维码扫描进行微信与数据库信息绑定

    解决方案

    思路:token
    解决方案:复写框架底层实现方法,增加token参数(详情参考总纲
    复写目标,底层源码QrcodeApi.java,复写后代码如下:

    //
    // Source code recreated from a .class file by IntelliJ IDEA
    // (powered by Fernflower decompiler)
    //
    
    package cn.kudesoft.duo.util;
    
    import com.jfinal.weixin.sdk.api.AccessTokenApi;
    import com.jfinal.weixin.sdk.api.ApiResult;
    import com.jfinal.weixin.sdk.utils.HttpUtils;
    import com.jfinal.weixin.sdk.utils.JsonUtils;
    import java.util.HashMap;
    import java.util.Map;
    
    public class QrcodeApi {
        private static String apiUrl = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=";
        private static String showQrcodeUrl = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=";
    
        public QrcodeApi() {
        }
    
        public static ApiResult create(String jsonStr,String token) {
            String jsonResult = HttpUtils.post(apiUrl + token, jsonStr);
            return new ApiResult(jsonResult);
        }
        public static ApiResult createTemporary(int expireSeconds, String sceneId,String token) {
            Map<String, Object> params = new HashMap();
            params.put("expire_seconds", expireSeconds);
            params.put("action_name", "QR_STR_SCENE");
            Map<String, Object> actionInfo = new HashMap();
            Map<String, Object> scene = new HashMap();
            scene.put("scene_str", sceneId);
            actionInfo.put("scene", scene);
            params.put("action_info", actionInfo);
            return create(JsonUtils.toJson(params),token);
        }
        public static ApiResult createTemporary(int expireSeconds, int sceneId,String token) {
            Map<String, Object> params = new HashMap();
            params.put("expire_seconds", expireSeconds);
            params.put("action_name", "QR_SCENE");
            Map<String, Object> actionInfo = new HashMap();
            Map<String, Object> scene = new HashMap();
            scene.put("scene_id", sceneId);
            actionInfo.put("scene", scene);
            params.put("action_info", actionInfo);
            return create(JsonUtils.toJson(params),token);
        }
    
        public static ApiResult createPermanent(int sceneId,String token) {
            Map<String, Object> params = new HashMap();
            params.put("action_name", "QR_LIMIT_SCENE");
            Map<String, Object> actionInfo = new HashMap();
            Map<String, Object> scene = new HashMap();
            scene.put("scene_id", sceneId);
            actionInfo.put("scene", scene);
            params.put("action_info", actionInfo);
            return create(JsonUtils.toJson(params),token);
        }
    
        public static ApiResult createPermanent(String sceneStr,String token) {
            Map<String, Object> params = new HashMap();
            params.put("action_name", "QR_LIMIT_STR_SCENE");
            Map<String, Object> actionInfo = new HashMap();
            Map<String, Object> scene = new HashMap();
            scene.put("scene_str", sceneStr);
            actionInfo.put("scene", scene);
            params.put("action_info", actionInfo);
            return create(JsonUtils.toJson(params),token);
        }
    
        public static String getShowQrcodeUrl(String ticket) {
            return showQrcodeUrl + ticket;
        }
    }
    
    

    增加JsonUtil工具类进行对象与字符串之间互相转换

    package cn.kudesoft.duo.util;
    
    
    
    
    import com.jfinal.weixin.sdk.api.MenuApi;
    import lombok.extern.slf4j.Slf4j;
    import org.apache.commons.lang.StringUtils;
    import org.codehaus.jackson.map.DeserializationConfig;
    import org.codehaus.jackson.map.ObjectMapper;
    import org.codehaus.jackson.map.SerializationConfig;
    import org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion;
    import org.codehaus.jackson.type.JavaType;
    import org.codehaus.jackson.type.TypeReference;
    
    import java.io.*;
    import java.net.URL;
    import java.text.SimpleDateFormat;
    
    
    @Slf4j
    public class JsonUtil {
    
        private static ObjectMapper objectMapper = new ObjectMapper();
        static{
            //对象的所有字段全部列入
            objectMapper.setSerializationInclusion(Inclusion.ALWAYS);
    
            //取消默认转换timestamps形式
            objectMapper.configure(SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS,false);
    
            //忽略空Bean转json的错误
            objectMapper.configure(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS,false);
    
            //所有的日期格式都统一为以下的样式,即yyyy-MM-dd HH:mm:ss
            objectMapper.setDateFormat(new SimpleDateFormat(DateTimeUtil.STANDARD_FORMAT));
    
            //忽略 在json字符串中存在,但是在java对象中不存在对应属性的情况。防止错误
            objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES,false);
        }
    
    
        public static String file2String(String filepath) throws IOException {
            URL url = JsonUtil.class.getClassLoader().getResource(filepath);
            System.out.println(url);
            File file = new File(url.getPath());
            InputStream in=new FileInputStream(file);//实例化FileInputStream
            int fileLength=(int)file.length();
            byte b[]=new byte[fileLength];
            int length=in.read(b);
            in.close();
            String s = new String(b);
            return s;
        }
        /**
         * 对json字符串进行格式化
         * "{\"name\": \"张 三 \", \"remark\": \",: {}[]啦啦啦\", \"data\": [\"1\", \"2\"]}"
         * @param content 要格式化的json字符串
         * @param indent 是否进行缩进(false时压缩为一行)
         * @param colonWithSpace key冒号后是否加入空格
         * @return
         */
        public static String toFormat(String content, boolean indent, boolean colonWithSpace) {
            if (content == null) return null;
            StringBuilder sb = new StringBuilder();
            int count = 0;
            boolean inString = false;
            String tab = "\t";
            for (int i = 0; i < content.length(); i ++) {
                char ch = content.charAt(i);
                switch (ch) {
                    case '{':
                    case '[':
                        sb.append(ch);
                        if (!inString) {
                            if (indent) {
                                sb.append("\n");
                                count ++;
                                for (int j = 0; j < count; j ++) {
                                    sb.append(tab);
                                }
                            }
    
                        }
                        break;
                    case '\uFEFF': //非法字符
                        if (inString) sb.append(ch);
                        break;
                    case '}':
                    case ']':
                        if (!inString) {
                            if (indent) {
                                count --;
                                sb.append("\n");
                                for (int j = 0; j < count; j ++) {
                                    sb.append(tab);
                                }
                            }
    
                            sb.append(ch);
                        } else {
                            sb.append(ch);
                        }
                        break;
                    case ',':
                        sb.append(ch);
                        if (!inString) {
                            if (indent) {
                                sb.append("\n");
                                for (int j = 0; j < count; j ++) {
                                    sb.append(tab);
                                }
                            } else {
                                if (colonWithSpace) {
                                    sb.append(' ');
                                }
                            }
                        }
                        break;
                    case ':':
                        sb.append(ch);
    
                        if (!inString) {
                            if (colonWithSpace) {  //key名称冒号后加空格
                                sb.append(' ');
                            }
                        }
                        break;
                    case ' ':
                    case '\n':
                    case '\t':
                        if (inString) {
                            sb.append(ch);
                        }
                        break;
                    case '"':
                        if (i > 0 && content.charAt(i - 1) != '\\') {
                            inString = !inString;
                        }
                        sb.append(ch);
                        break;
                    default:
                        sb.append(ch);
                        break;
                }
            }
            return sb.toString();
        }
        public static <T> String obj2String(T obj){
            if(obj == null){
                return null;
            }
            try {
                return obj instanceof String ? (String)obj :  objectMapper.writeValueAsString(obj);
            } catch (Exception e) {
                log.warn("Parse Object to String error",e);
                return null;
            }
        }
    
        public static <T> String obj2StringPretty(T obj){
            if(obj == null){
                return null;
            }
            try {
                return obj instanceof String ? (String)obj :  objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(obj);
            } catch (Exception e) {
                log.warn("Parse Object to String error",e);
                return null;
            }
        }
    
    
    
    
    
        public static <T> T string2Obj(String str,Class<T> clazz){
            if(StringUtils.isEmpty(str) || clazz == null){
                return null;
            }
    
            try {
                return clazz.equals(String.class)? (T)str : objectMapper.readValue(str,clazz);
            } catch (Exception e) {
                log.warn("Parse String to Object error",e);
                return null;
            }
        }
    
    
    
        public static <T> T string2Obj(String str, TypeReference<T> typeReference){
            if(StringUtils.isEmpty(str) || typeReference == null){
                return null;
            }
            try {
                return (T)(typeReference.getType().equals(String.class)? str : objectMapper.readValue(str,typeReference));
            } catch (Exception e) {
                log.warn("Parse String to Object error",e);
                return null;
            }
        }
    
    
        public static <T> T string2Obj(String str,Class<?> collectionClass,Class<?>... elementClasses){
            JavaType javaType = objectMapper.getTypeFactory().constructParametricType(collectionClass,elementClasses);
            try {
                return objectMapper.readValue(str,javaType);
            } catch (Exception e) {
                log.warn("Parse String to Object error",e);
                return null;
            }
        }
    
    }
    
    

    增加实体WXTicket方便获取ticket(根据项目需要自行设计)

    package cn.kudesoft.duo.wx;
    
    import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
    import lombok.AllArgsConstructor;
    import lombok.Getter;
    import lombok.NoArgsConstructor;
    import lombok.Setter;
    
    import java.util.Map;
    
    
    @Getter
    @Setter
    @NoArgsConstructor
    @AllArgsConstructor
    @JsonIgnoreProperties(value = { "hibernateLazyInitializer", "handler" })
    public class WXTicket {
    
        private Integer expire_seconds = 2592000;
        private String action_name = "QR_STR_SCENE";
        private Map<String,Map<String,String>> action_info;
    
    }
    
    

    WXUtil工具类增加方法从微信换取ticket

    public static String getTicket(String id,String token){
            WXTicket wxTicket = new WXTicket();
            Map<String, Map<String,String>> info = new HashMap<>();
            Map<String,String> scene = new HashMap<>();
            info.put("scene",scene);
            scene.put("scene_str",id);
            wxTicket.setAction_info(info);
            String sendEntity = JsonUtil.obj2String(wxTicket);
            RestTemplate restTemplate = new RestTemplate();
            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
            HttpEntity<String> entity = new HttpEntity<String>(sendEntity,headers);
            String url = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token="+token;
            GetTicket getTicket = restTemplate.exchange(url, HttpMethod.POST, entity,GetTicket.class).getBody();
            return getTicket.getTicket();
        }
    

    复写前调用方法参考框架文档:https://gitee.com/jfinal/jfinal-weixin/wikis/pages?title=Home
    复写后调用方法(根据实际需要自行调整带参二维码传递参数,因需要扫描二维码绑定信息,故多公众号下最好以临时二维码传递id为字符串,因为微信加密后openid不一致,详情请查看微信官方文档):

     @Test
        public void sdf(){
            WXConfig wxConfig = wxConfigDao.getOne(3);
            String token = WXUtil.getAccessToken(wxConfig);
            ApiResult apiResult = QrcodeApi.createTemporary(60*100,"adw23_451854",token);
            GetWxCode getWxCode = JsonUtil.string2Obj(apiResult.getJson(), GetWxCode.class);
            //微信二维码地址,可浏览器地址栏直接打开
            String string = QrcodeApi.getShowQrcodeUrl(getWxCode.getTicket());
            System.out.println(string);
        }
    
    展开全文
  • 微信公众号生成带参数二维码一学就会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年项目经验」

    【完善的技术体系】

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

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

    【清晰的课程脉络】

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

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

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

     

    「你可以收获什么?」

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

     

    展开全文
  • 有过期时间,最长可以设置为在二维码生成后的30天(即2592000秒)后过期 数量不限制 临时二维码主要用于帐号绑定等不要求二维码永久保存的业务场景 永久二维码 无过期时间 数量较少(目前为最多10万个) 主要...
  • 微信公众号生成带参数二维码

    千次阅读 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...
  • 微信公众号扫描带参数二维码实现自动分组,实现不同渠道进入用户数量统计,为地推用户进行绩效统计。
  • 微信公众号生成带参数二维码一学就会Java版—3192人已学习 课程介绍    为了满足用户渠道推广分析和用户帐号绑定等场景的需要,也就是推广和微商城分销的一个知识点,当你需要知道你的这个客户是谁推广的时候,...
  • 1.实现带参数二维码功能 public class QrTest { private static Logger logger = LogManager.getLogger(QrTest.class); private final static String subPlatform = "prod1"; private final static String...
  • 如何生成公众号带参数二维码

    千次阅读 2019-10-08 15:30:40
    公众号带参数二维码,自动统计关注粉丝渠道来源、自动打标签分组,通过公众号开发平台接口实现。不会开发的人员,可以使用微号帮平台的功能实现这效果,渠道二维码生成统计。 1、带参数二维码 公众号后台只有普通...
  • 微信公众号生成带参数二维码,当其他人非微信扫描二维码的时候,可以看到一个自定义的链接而不是生成ticket的时候返回的URL,如何做!
  • TP5公众号带参数二维码生成 php代码示例(已测试): //二维码type public function qrcode($id,$type='1'){ if($type == 1){ $para='uid,'.$id; }else{ $para='container,'.$i...
  • 一、用户扫描场景值二维码时,可能推送以下两种事件: 如果用户还未关注公众号,则...获取带参数二维码的过程包括两步,首先创建二维码ticket,然后凭借ticket到指定URL换取二维码。 二、创建二维码t
  • 在微信公众号平台开发者那里,在“账号管理”那里,有一项功能是“生成带参数二维码”,通过这儿生成二维码,只要通过微信扫一扫之后,会把事件自动推送到微信公众号上 用微信扫一扫推送到开发者网址那儿的数据...
  •  掌握扫描带参数二维码事件  掌握SVN管理新浪SAE云端代码的方式; 实验准备: 请登录微信官网:http://mp.weixin.qq.com 进入后台-开发者工具-公众平台测试账号-进入。进入已经接入的测试号开发模式。 通过公众...
  • 为了满足用户渠道推广分析和用户帐号绑定等场景的需要,公众平台提供了生成带参数二维码的接口。使用该接口可以获得多个不同场景值的二维码,用户扫描后,公众号可以接收到事件推送。 目前有2种类型的二维码: 1...
  • 一、生成带参数二维码 官方文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1443433542 1.请求地址 /// /// 创建二维码--Post /// /// public string GetQrCode() { string url = string....
  • Java微信公众号扫描带参数二维码事件(消息加密)

    千次阅读 热门讨论 2018-06-11 17:22:58
    最近又开始了微信二维码的开发,开个帖子记录一下 一、获取access_token 首先我们需要获取access_token,有效期7200s,一天获取上限为2000次 public static String getWXAccessToken() { String ...
  • 生成带参数二维码,所需代码封装在类里,demo.php里填上自己的access_token即可运行。
  • 公众平台提供了生成带参数二维码的接口。使用该接口可以获得多个不同场景值的二维码,用户扫描后,公众号可以接收到事件推送。 目前有2种类型的二维码: 1、临时二维码,是有过期时间的,最长可以设置为在...
  • 关于带参数二维码生成,请参考:https://blog.csdn.net/gymaisyl/article/details/109451498 自己的服务器搭建 想要获取二维码中的参数,首先需要一个可以和外网交互的服务器。 服务器准备好后,可以简单部署一个...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 15,179
精华内容 6,071
关键字:

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