微信扫码事件 - CSDN
精华内容
参与话题
  • 用户扫描带场景值二维码时,可能推送以下两种事件:如果用户还未关注公众号,则用户可以关注公众号,关注后微信会将带场景值关注事件推送给开发者。如果用户已经关注公众号,则微信会将带场景值扫描事件推送给开发者...

    用户扫描带场景值二维码时,可能推送以下两种事件:

    如果用户还未关注公众号,则用户可以关注公众号,关注后微信会将带场景值关注事件推送给开发者。
    如果用户已经关注公众号,则微信会将带场景值扫描事件推送给开发者。


    1. 用户未关注时,进行关注后的事件推送

    推送XML数据包示例:
    <xml><ToUserName><![CDATA[toUser]></ToUserName>
    <FromUserName><![CDATA[FromUser]></FromUserName>
    <CreateTime>123456789</CreateTime>
    <MsgType><![CDATA[event]></MsgType>
    <Event><![CDATA[subscribe]></Event>
    <EventKey><![CDATA[qrscene_123123]></EventKey>
    <Ticket><![CDATA[TICKET]></Ticket>
    </xml>

    参数描述
    ToUserName 开发者微信号
    FromUserName 发送方帐号(一个OpenID)
    CreateTime 消息创建时间 (整型)
    MsgType 消息类型,event
    Event 事件类型,subscribe
    EventKey 事件KEY值,qrscene_为前缀,后面为二维码的参数值
    Ticket 二维码的ticket,可用来换取二维码图片


    2. 用户已关注时的事件推送

    推送XML数据包示例:
    <xml>
    <ToUserName><![CDATA[toUser]></ToUserName>
    <FromUserName><![CDATA[FromUser]></FromUserName>
    <CreateTime>123456789</CreateTime>
    <MsgType><![CDATA[event]></MsgType>
    <Event><![CDATA[SCAN]></Event>
    <EventKey><![CDATA[SCENE_VALUE]></EventKey>
    <Ticket><![CDATA[TICKET]></Ticket>
    </xml>

    参数描述
    ToUserName 开发者微信号
    FromUserName 发送方帐号(一个OpenID)
    CreateTime 消息创建时间 (整型)
    MsgType 消息类型,event
    Event 事件类型,SCAN
    EventKey 事件KEY值,是一个32位无符号整数,即创建二维码时的二维码scene_id
    Ticket 二维码的ticket,可用来换取二维码图片


    案例:
               // 1、扫码获取微信post过来的xml数据
                $postArr = $GLOBALS['HTTP_RAW_POST_DATA'];
                $postObj = simplexml_load_string( $postArr );

                //未订阅时 ,EventKey为qrscene_1984;订阅后,EventKey为1984
                if( strtolower($postObj->Event) == 'subscribe'){
                        $account_id = substr(trim($postObj->EventKey), 8);//输出1984
                } else {
                        $account_id = trim($postObj->EventKey);
                }

    转载于:https://www.cnblogs.com/fuwentao/p/8706591.html

    展开全文
  • 实现微信扫码登录需要一个认证的服务号,因为实现这个功能需要调用微信提供的接口生成一个带参的公众号二维码,而这个带参二维码生成接口只有认证的服务号才拥有这个接口的使用权,接口说明如图1-...

    前言

          最近因业务需要,需要给网站增加一个扫描公众号二维码登录网站的功能,通过扫码登录,一来用户登录网站不需再输入账号密码,提升了用户体验,二来也可以作为公众号吸粉的一个渠道。

    开发准备

          实现微信扫码登录需要一个认证的服务号,因为实现这个功能需要调用微信提供的接口生成一个带参的公众号二维码,而这个带参二维码生成接口只有认证的服务号才拥有这个接口的使用权,接口说明如图1-1所示。

                                                                                        图1-1 微信接口说明     

    流程说明

          扫码登录的具体过程是这样的:用户打开登录页面时,前端在页面加载完成后随即请求后台生成带参公众号二维码,后台向微信发送请求生成二维码,微信将生成后的二维码、ticket(唯一值)等信息返回给开发者后台,后台再将这些信息返回给前端,前端获取到这些信息后,首先将二维码显示在页面上,然后通过ticket作为id和后台建立websocket连接,并以此websocket连接来接收用户扫码事件的处理结果,当后台处理完成用户扫码事件后,通过websocket将处理结果发送至前端,前端根据处理结果进行相关业务操作,处理流程图如图1-2所示。

    为什么使用websocket?

          首先我们需要了解这样一个事实,用户扫描二维码后,微信会将扫码事件推送到开发者服务器,而前端是无法知道后台对用户扫码的处理结果的,那么我们要怎么将处理结果通知前端呢?一种方式是轮询:前端不断向后台请求处理结果,这种方式明显不是很好,因而使用websocket刚好可以解决这个问题。

     

                                                                                   图1-2 微信扫码处理流程图

          因相关业务代码较多,在此仅展示关键代码。

    1.生成公众号带参二维码代码如代码清单1所示。

                                                                               代码清单1 生成公众号带参二维码

            //此处getToken方法内的参数需换成自己的服务号appid和secret
            Token pubtoken = CommonUtil.getToken(WxConstant.FUWUHAO__APPID, WxConstant.FUWUHAO__SECRET);
            JSONObject params = new JSONObject();
            params.put("action_name", "QR_SCENE");
            params.put("expire_seconds", 30000);
    
            JSONObject action_info = new JSONObject();
            JSONObject action_info_result = new JSONObject();
            action_info_result.put("scene_id", 8);
    
            action_info.put("scene", action_info_result);
            params.put("action_info", action_info);
    
            Map<String,Object> result = new HashMap<>();
            try {
                JSONObject res = JSON.parseObject(MyHttpRequestUtil.sendPost(CommonUtil.CONTAIN_PARAMS_QRCODE + pubtoken.getAccessToken(), params.toString()));
                String ticket = URLEncoder.encode(res.getString("ticket"),"UTF-8");
                String picUrl = CommonUtil.MP_QRCODE_PRE_URL + ticket;
                log.info("二维码地址:picUrl:"+picUrl);
                result.put("qrCodeUrl",picUrl);
                result.put("ticket",ticket);
                return ServerResponse.createBySuccess(result);
            } catch (Exception e) {
                e.printStackTrace();
            }

    2.用户扫码事件回调处理代码如代码清单2所示,需要说明的一点是,此回调函数即公众号配置的URL,如不了解如何配置的可参考我的另一篇文章:Spring Boot微信公众号服务器配置案例

                                                              代码清单2 用户扫描二维码回调事件处理

       @ApiOperation("1.3:用户与公众号交互事件处理")
        @RequestMapping("/getUserFocus")
        public String handlePubFocus(HttpServletRequest request,HttpServletResponse response){
            log.info("1.3:用户与公众号交互事件处理");
            try{
                Map<String ,String > requestMap = WxMessageUtil.parseXml(request);
                Set<String> keys = requestMap.keySet();
                String messageType = requestMap.get("MsgType");
                String eventType = requestMap.get("Event");
                String openid = requestMap.get("FromUserName");
                if(messageType.equals("event")){
                    //判断消息类型是否是事件消息类型
                    log.info("公众号====>事件消息");
                    log.info("openid:" + openid);
                    log.info("Event:" + eventType);
                    if(eventType.equals("subscribe")){
                        log.info("公众号====>新用户关注");
                    }else if(eventType.equals("unsubscribe")){
                        log.info("公众号====>用户取消关注");
                    }else if(eventType.equals("SCAN")){
                        log.info("公众号===>用户扫码动态二维码");
                    }else{
                        log.info("公众号===>其他");
                    }
                }
    
                keys.forEach(item->{
                    String value = requestMap.get(item);
                    log.info(item + "===>" + value);
                    if(item.equals("Ticket")){
                        //当前用户进行了扫描动态二维码登录pc管理端操作
                        log.info("==>开始处理扫码登录");
                        log.info("当前用户openid:" + openid);
                        log.info("当前用户Ticket:" + value);
                        ldkjWxApiService.handleScanQrcode(openid,value);
                    }
                });
    
            }catch (Exception e){
                e.printStackTrace();
            }
            return "";
        }

    运行结果:

    1.登录首页生成二维码如图1-3所示。

    mp

                                                                            图 1-3 登录首页生成公众号二维码

    2.用户扫码后自动登录到系统首页,如图1-4所示。

     

                                                                            图1-4 用户扫码登录到系统首页

    关注公众号,回复093可免费获取源码                                                   

                                               11

     

    展开全文
  • 1, 进入微信公众平台,开启自动回复功能 2,进入基本配置 服务器配置 3, 找到刚设置的服务器地址,写如下内容(我的服务器地址:mp_event): 4, 到weixinPush中写相关逻辑代码 示例如下: //执行检测的...

    1, 进入微信公众平台,开启自动回复功能

    2,进入基本配置
        服务器配置
    3, 找到刚设置的服务器地址,写如下内容(我的服务器地址:mp_event):
        
    4, 到weixinPush中写相关逻辑代码
        示例如下:
       //执行检测的信息

      47     public function weixin_run()

      48     {

      49         $this->responseMsg();

      50     $ids = '';

      51 

      52         switch ($this->MsgType)

      53         {

      54             case 'text':

      55                 $this->fun_xml('text', array($GLOBALS['config_info']['DEFAULT_MSG']));

      56                 break;

      57             case 'voice':

      58                 $this->fun_xml('text', array($GLOBALS['config_info']['DEFAULT_MSG']));

      59                 break;

      60             case 'image':

      61                 $str   = "类型:图片消息\n";

      62                 $str  .= '图片链接:' . $this->PicUrl . "\n";

      63                 $str  .= 'MediaId:' . $this->MediaId . "\n";

      64                 $arr[] = $str;

      65                 $this->fun_xml('text', $arr);

      66                 break;

      67             case 'video':

      68                 $str   = "类型:视频消息\n";

      69                 $str  .= '图片链接:' . $this->PicUrl . "\n";

      70                 $str  .= 'MediaId:' . $this->MediaId . "\n";

      71                 $str  .= 'ThumbMediaId:' . $this->ThumbMediaId ."\n";

      72                 $arr[] = $str;

      73                 $this->fun_xml('text', $arr);

      74                 break;

      75             case 'location':

      76                 $str   = "类型:地理位置消息\n";

      77                 $str  .= '维度:' . $this->Location_X . "\n";

      78                 $str  .= '精度:' . $this->Location_Y . "\n";

      79                 $str  .= '地图缩放大小:' . $this->Scale . "\n";

      80                 $str  .= '地理位置信息:' . $this->Label . "\n";

      81                 $arr[] = $str;

      82                 $this->fun_xml('text', $arr);

      83                 break;

      84             case 'link':

      85                 $str   = "类型:链接消息\n";

      86                 $str  .= '标题:' . $this->Title . "\n";

      87                 $str  .= '描述:' . $this->Description . "\n";

      88                 $str  .= '链接:' . $this->Url . "\n";

      89                 $arr[] = $str;

      90                 $this->fun_xml('text', $arr);

      91                 break;

      92              case 'event':

      93                 if($this->Event == 'subscribe')

      94                 {

                         //关注

                         做相应的处理

                         }

                }

     

    public function responseMsg()

     372     {   

     373         #$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];

     374     $postStr = file_get_contents("php://input");

     375         

     376         if (!empty($postStr))

     377         {

     378             $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);

     379         }

     382         foreach ($postObj AS $k => $v)

     383         {

     384             $str = $k . ' => ' . $v . "\n";

     385             fwrite($file, $str);

     386         }   

     387         fwrite($file, "\n");    

     388         fclose($file);

     389             $this->fromUsername = $postObj->FromUserName;

     390             $this->toUsername   = $postObj->ToUserName;

                  }   

     413         else

     414         {   

     415             echo "this a file for weixin API!";

     416             exit;

     417         }   

     418     }   

     
    至此已完成
    thinkphp 3.1环境

    转载于:https://www.cnblogs.com/qianlizeguo/p/6834525.html

    展开全文
  • 上个帖子已经配置好了微信服务器,下面就是要调微信接口生成带参二维码 具体接口信息请参考微信官方文档:微信官方文档 1、生成带参数的二维码 (1)、调微信接口生成生成二维码前先要获取 access_token,下面是获取...

    上个帖子已经配置好了微信服务器,下面就是要调微信接口生成带参二维码
    具体接口信息请参考微信官方文档:微信官方文档
    1、生成带参数的二维码
    带参永久二维码(1)、调微信接口生成生成二维码前先要获取 access_token,下面是获取access_token的方法。

    public class Util {
    
        // 微信获取accessToken接口
        private static final String ACCESSTOKENURL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={appId}&secret={appSecret}";
        //appid
        private static final String appid = " "; //这里是公众号后台的 appID
        //appSecret
        private static final String appSecret = " "; //这里是公众号后台的 appsecret
    
        /**
         * 获取access_Token
         *
         * @return
         */
        public  String getAccessToken() {
            String url = ACCESSTOKENURL.replace("{appId}", appid).replace("{appSecret}", appSecret);
            String accessTokenJsonStr = HttpRequest.get(url, null, false);
            Map<String, String> accessTokenMap = GsonUtil.fromJson(accessTokenJsonStr, Map.class);
            String accessToken = null;
            if (null != accessTokenMap && !accessTokenMap.isEmpty()) {
                accessToken = accessTokenMap.get("access_token");
                if (!StringUtils.isEmpty(accessToken)) {
                    LogUtil.info("时间:" + DateUtil.getDateStr(new Date()) + ";成功获取accessToken;值为:" + accessToken);
                }
            }
            if (StringUtils.isEmpty(accessToken)) {
                String errCode = null;
                String errMsg = null;
                try {
                    errCode = accessTokenMap.get("errcode");
                    errMsg = accessTokenMap.get("errmsg");
                } catch (Exception e) {
                }
                LogUtil.info("时间:" + DateUtil.getDateStr(new Date()) + ";获取accessToken失败;errCode为:" + errCode + ";errMsg" + errMsg);
            }
            return accessToken;
        }
    }
    

    下面是封装的请求方法,网上很多仅供参考,代码可能会报错,需要导一些架包,这里就不写了,后面把pom文件发出来,根据需要进行导入 ,下面是代码:

    package com.wechat.util;
    
    import org.apache.http.HttpEntity;
    import org.apache.http.HttpHost;
    import org.apache.http.HttpStatus;
    import org.apache.http.client.config.RequestConfig;
    import org.apache.http.client.methods.CloseableHttpResponse;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.client.methods.HttpRequestBase;
    import org.apache.http.config.Registry;
    import org.apache.http.config.RegistryBuilder;
    import org.apache.http.config.SocketConfig;
    import org.apache.http.conn.socket.ConnectionSocketFactory;
    import org.apache.http.conn.ssl.AllowAllHostnameVerifier;
    import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
    import org.apache.http.conn.ssl.SSLContexts;
    import org.apache.http.conn.ssl.TrustStrategy;
    import org.apache.http.entity.StringEntity;
    import org.apache.http.impl.client.CloseableHttpClient;
    import org.apache.http.impl.client.HttpClientBuilder;
    import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
    import org.apache.http.util.EntityUtils;
    
    import javax.net.ssl.SSLContext;
    import java.io.IOException;
    import java.io.InputStream;
    import java.nio.charset.Charset;
    import java.security.KeyManagementException;
    import java.security.KeyStoreException;
    import java.security.NoSuchAlgorithmException;
    import java.security.cert.X509Certificate;
    import java.util.Map;
    
    /**
     * Created by rongyaowen
     * on 2018/10/22.
     */
    public class HttpRequest {
        private static final String PROXY_HOST_NAME = "";
        private static final int PROXY_PORT = 0;
        private static final String PROXY_SCHEME = "http";
        // 需要代理请改为true
        private static final boolean OPEN_PROXY = false;
    
        /**
         * get请求
         *
         * @param url
         * @param ignoreHttps 是否忽略https证书 true 忽略
         * @return
         */
        public static String get(String url, Map<String, String> header, boolean ignoreHttps) {
            StringBuffer logSb = new StringBuffer();
            logSb.append("[GET]-").append("url:[" + url + "]-").append("header:[");
            // 创建httpGet请求,设置httpGet请求的头部信息
            HttpGet httpGet = new HttpGet(url);
            // 设置头信息
            if (null != header && !header.isEmpty()) {
                for (Map.Entry<String, String> entry : header.entrySet()) {
                    httpGet.addHeader(entry.getKey(), entry.getValue());
                    logSb.append(entry.getKey()).append(":").append(entry.getValue()).append(",");
                }
            }
            logSb.append("]-");
            logSb.append(ignoreHttps == true ? "[忽略https证书]-" : "[不忽略https证书]-");
            logSb.append(OPEN_PROXY == true ? ("[开启代理" + PROXY_SCHEME + "://" + PROXY_HOST_NAME + ":" + PROXY_PORT + "]-") : "[未开启代理]");
            LogUtil.info(logSb);
            String resStr = response(httpGet, ignoreHttps);
            LogUtil.info("响应报文:[" + resStr + "]");
            return resStr;
        }
    
        /**
         * post请求
         *
         * @param url
         * @param param       请求体参数
         * @param header      请求头
         * @param cotentType  请求数据类型
         * @param ignoreHttps 是否忽略https证书 true 忽略
         * @return
         */
        public static String post(String url, String param, Map<String, String> header, String cotentType, boolean ignoreHttps) {
            StringBuffer logSb = new StringBuffer();
            logSb.append("[GET]-").append("url:[" + url + "]-").append("param:[" + param + "]-").append("header:[");
    
            HttpPost httpPost = new HttpPost(url);
            // 设置请求数据
            StringEntity stringEntity = new StringEntity(param, Charset.forName("UTF-8"));
            stringEntity.setContentEncoding("UTF-8");
            // 发送Json格式的数据请求
            stringEntity.setContentType(cotentType);
            httpPost.setEntity(stringEntity);
            // 设置头信息
            if (null != header && !header.isEmpty()) {
                for (Map.Entry<String, String> entry : header.entrySet()) {
                    httpPost.addHeader(entry.getKey(), entry.getValue());
                    logSb.append(entry.getKey() + ":" + entry.getValue());
                }
            }
            logSb.append("]-");
            logSb.append("cotentType" + "[" + cotentType + "]-");
            logSb.append(ignoreHttps == true ? "[忽略https证书]-" : "[不忽略https证书]-");
            logSb.append(OPEN_PROXY == true ? ("[开启代理" + PROXY_SCHEME + "://" + PROXY_HOST_NAME + ":" + PROXY_PORT + "]-") : "[未开启代理]");
            LogUtil.info(logSb);
            String resStr = response(httpPost, ignoreHttps);
            LogUtil.info("响应报文:[" + resStr + "]");
            return resStr;
        }
    
        /**
         * post请求获取流对象
         *
         * @param url
         * @param param
         * @param header
         * @param cotentType
         * @param ignoreHttps
         * @return
         */
        public static InputStream postAsStream(String url, String param, Map<String, String> header, String cotentType, boolean ignoreHttps) {
            StringBuffer logSb = new StringBuffer();
            logSb.append("[GET]-").append("url:[" + url + "]-").append("param:[" + param + "]-").append("header:[");
    
            HttpPost httpPost = new HttpPost(url);
            // 设置请求数据
            StringEntity stringEntity = new StringEntity(param, Charset.forName("UTF-8"));
            stringEntity.setContentEncoding("UTF-8");
            // 发送Json格式的数据请求
            stringEntity.setContentType(cotentType);
            httpPost.setEntity(stringEntity);
            // 设置头信息
            if (null != header && !header.isEmpty()) {
                for (Map.Entry<String, String> entry : header.entrySet()) {
                    httpPost.addHeader(entry.getKey(), entry.getValue());
                    logSb.append(entry.getKey() + ":" + entry.getValue());
                }
            }
            logSb.append("]-");
            logSb.append("cotentType" + "[" + cotentType + "]-");
            logSb.append(ignoreHttps == true ? "[忽略https证书]-" : "[不忽略https证书]-");
            logSb.append(OPEN_PROXY == true ? ("[开启代理" + PROXY_SCHEME + "://" + PROXY_HOST_NAME + ":" + PROXY_PORT + "]-") : "[未开启代理]");
            LogUtil.info(logSb);
            return responseAsStream(httpPost, ignoreHttps);
        }
    
        /**
         * 获取请求数据
         *
         * @param httpRequestBase
         * @param ignoreHttps
         * @return
         */
        private static InputStream responseAsStream(HttpRequestBase httpRequestBase, boolean ignoreHttps) {
            CloseableHttpClient closeableHttpClient;
            if (ignoreHttps) {
                closeableHttpClient = getIgnoreHttpsClient();
            } else {
                closeableHttpClient = getClient();
            }
            CloseableHttpResponse closeableHttpResponse = null;
            String res = null;
            InputStream inputStream = null;
            try {
                closeableHttpResponse = closeableHttpClient.execute(httpRequestBase);
                if (closeableHttpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
                    HttpEntity entity = closeableHttpResponse.getEntity();
                    inputStream = entity.getContent();
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    if (null != closeableHttpResponse) {
                        closeableHttpResponse.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            return inputStream;
        }
    
        /**
         * 获取请求数据
         *
         * @param httpRequestBase
         * @param ignoreHttps
         * @return
         */
        private static String response(HttpRequestBase httpRequestBase, boolean ignoreHttps) {
            CloseableHttpClient closeableHttpClient;
            if (ignoreHttps) {
                closeableHttpClient = getIgnoreHttpsClient();
            } else {
                closeableHttpClient = getClient();
            }
            CloseableHttpResponse closeableHttpResponse = null;
            String res = null;
            try {
                closeableHttpResponse = closeableHttpClient.execute(httpRequestBase);
                if (closeableHttpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
                    HttpEntity entity = closeableHttpResponse.getEntity();
                    res = EntityUtils.toString(entity, "utf-8");
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    if (null != closeableHttpResponse) {
                        closeableHttpResponse.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            return res;
        }
    
        /**
         * @return
         */
        private static RequestConfig getRequestConfig() {
            // 依次是代理地址,代理端口号,协议类型
            HttpHost proxy = new HttpHost(PROXY_HOST_NAME, PROXY_PORT, PROXY_SCHEME);
            if (OPEN_PROXY) {
                return RequestConfig.custom().setProxy(proxy).setConnectionRequestTimeout(20000).setConnectTimeout(20000).setSocketTimeout(20000).build();
            } else {
                return RequestConfig.custom().setConnectionRequestTimeout(20000).setConnectTimeout(20000).setSocketTimeout(20000).build();
            }
        }
    
        /**
         * 获取忽略https的client
         *
         * @return
         * @throws Exception
         */
        private static CloseableHttpClient getIgnoreHttpsClient() {
            SSLContext sslContext = null;
            try {
                sslContext = SSLContexts.custom().useTLS().loadTrustMaterial(null, new TrustStrategy() {
                    public boolean isTrusted(X509Certificate[] chain, String authType) {
                        //信任所有
                        return true;
                    }
                }).build();
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            } catch (KeyManagementException e) {
                e.printStackTrace();
            } catch (KeyStoreException e) {
                e.printStackTrace();
            }
            SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(sslContext, new AllowAllHostnameVerifier());
            Registry<ConnectionSocketFactory> r = RegistryBuilder.<ConnectionSocketFactory>create().register("https", sslConnectionSocketFactory).build();
            //设置连接池,配置过期时间为20s。
            PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(r);
            cm.setMaxTotal(500);
            cm.setDefaultMaxPerRoute(350);
            SocketConfig socketConfig = SocketConfig.custom().setSoKeepAlive(true).setTcpNoDelay(true).setSoTimeout(20000).build();
            cm.setDefaultSocketConfig(socketConfig);
            RequestConfig requestConfig = getRequestConfig();
            //创建httpClient
            CloseableHttpClient closeableHttpClient = HttpClientBuilder.create().setConnectionManager(cm).setDefaultRequestConfig(requestConfig).build();
            return closeableHttpClient;
        }
    
    
        /**
         * 获取httpclient
         *
         * @return
         */
        private static CloseableHttpClient getClient() {
            //设置连接池,配置过期时间为20s。
            PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
            cm.setMaxTotal(500);
            cm.setDefaultMaxPerRoute(350);
            SocketConfig socketConfig = SocketConfig.custom().setSoKeepAlive(true).setTcpNoDelay(true).setSoTimeout(20000).build();
            cm.setDefaultSocketConfig(socketConfig);
            RequestConfig requestConfig = getRequestConfig();
            //创建httpClient
            CloseableHttpClient closeableHttpClient = HttpClientBuilder.create().setConnectionManager(cm).setDefaultRequestConfig(requestConfig).build();
            return closeableHttpClient;
        }
    }
    
    

    2、access_token 已经获取到了,下面就可以调接口获取二维码了
    生成的二维码可以根据自己的需求进行生成,这里生成是永久的二维码的,两种入参格式。可以参考下微信的文档:公众号官方文档

    创建字符串形式的二维码参数:
    {"action_name": "QR_LIMIT_STR_SCENE", "action_info": {"scene": {"scene_str": "test"}}}
    创建整型参数值形式的二维码参数:
    {"action_name": "QR_LIMIT_SCENE", "action_info": {"scene": {"scene_id": 123}}}
    
    二维码类型,QR_SCENE为临时的整型参数值,QR_STR_SCENE为临时的字符串参数值,QR_LIMIT_SCENE为永久的整型参数值,QR_LIMIT_STR_SCENE为永久的字符串参数值
    

    接下来返回的是可以直接显示二维码的url:

    // 获取ticket
        private static final String GET_QRCODE_URL = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token={TOKEN}";
        // 换取二维码
        private static final String QR_CODE_URL = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket={TICKET}";
        
    public String getYJQrCode() {
            //获取access_token
            String access_token=util.getAccessToken();
            JSONObject req=new JSONObject();
            JSONObject data=new JSONObject();
            JSONObject datare=new JSONObject();
            req.put("action_name","QR_LIMIT_STR_SCENE");
            datare.put("scene_str","000165");
            data.put("scene",datare);
            req.put("action_info",data);
            System.out.println("获取二维码入参"+req);
            String url = GET_QRCODE_URL.replace("{TOKEN}", access_token);
            JSONObject res= HttpClientUtil.doPost(req,url);
            System.out.println("获取二维码出参"+res);
            String ticket=res.optString("ticket");
            String returnUrl = QR_CODE_URL.replace("{TICKET}", ticket);
            return returnUrl;
        }
    

    把pom文件导出来可以根据需要添加架包:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.wry</groupId>
        <artifactId>wechat</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <packaging>jar</packaging>
    
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>1.3.1.RELEASE</version>
            <relativePath/>
        </parent>
    
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <java.version>1.8</java.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
    
            <dependency>
                <groupId>commons-codec</groupId>
                <artifactId>commons-codec</artifactId>
                <version>1.10</version>
            </dependency>
            <dependency>
                <groupId>org.apache.httpcomponents</groupId>
                <artifactId>httpclient</artifactId>
                <version>4.3</version>
            </dependency>
    
            <dependency>
                <groupId>net.sf.json-lib</groupId>
                <artifactId>json-lib</artifactId>
                <version>2.4</version>
                <classifier>jdk15</classifier>
            </dependency>
    
            <dependency>
                <groupId>org.apache.httpcomponents</groupId>
                <artifactId>httpclient-cache</artifactId>
                <version>4.3</version>
            </dependency>
            <dependency>
                <groupId>org.apache.httpcomponents</groupId>
                <artifactId>httpmime</artifactId>
                <version>4.3</version>
            </dependency>
            <dependency>
                <groupId>com.google.code.gson</groupId>
                <artifactId>gson</artifactId>
                <version>2.8.5</version>
            </dependency>
    
            <dependency>
                <groupId>dom4j</groupId>
                <artifactId>dom4j</artifactId>
                <version>1.6.1</version>
            </dependency>
    
            <dependency>
                <groupId>com.thoughtworks.xstream</groupId>
                <artifactId>xstream</artifactId>
                <version>1.4.10</version>
            </dependency>
    
            <dependency>
                <groupId>com.sun.xml.bind</groupId>
                <artifactId>jaxb-impl</artifactId>
                <version>2.1.12</version>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-configuration-processor</artifactId>
                <optional>true</optional>
            </dependency>
    
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    </project>
    

    下个帖子会讲扫码后的事件推送,也是第一次接触,不懂的大家可以多多交流。

    展开全文
  • 微信扫描二维码后 【未关注】 和 【关注】 之后的扫码事件推送 对应的链接地址 欢迎大家关注我的微信公众号,会分享自己在Web开发领域和生活工作中的一些所思所悟,希望能给你带来帮助! ...
  • 摘要:这篇帖子讲述如何获取带参数的二维码,以及扫码带参数的二维码后的事件接收。 微信开发者文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&amp;id=mp1443433542 1、二维码类型 临时二维码,是...
  • 简介:这个帖子和接下来的主要是为了实现,使用...测试使用的微信测试公众号,官方地址:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login 下图是测试号的部分内容 有了测试号后接下来就可以配置...
  • 微信公众号开发,条码成功后会在回调函数中获取到条码信息,现在想跳转到指定的地址并把用户的openID也传到该方法中,该如何搞,请高人指点,
  • 微信扫码登录asp微信扫码登陆代码

    千次阅读 2019-02-20 11:18:45
    网站接入微信扫码登录并获取用户基本信息(完美绕过微信开放平台) 电脑版网站实现微信扫码登录,注册会员还要设密码太麻烦,会员也记不住密码,采用微信扫码登录网站更方便,会员无需设密码,用他的微信做为系统登录...
  • 下面子恒老师来详细讲讲…一、 申请开通微信扫码支付开通微信扫码支付并不需要单独开通,你只要开通微信微信服务号支付,就可以使用微信扫码支付了。猛击这里,了解《开通微信服务号支付》而微信...
  • 微信扫码支付,网页微信扫码支付demo +js+php+版
  • 微信扫码登录功能实现

    万次阅读 2018-08-30 14:44:43
    原因:很简单,公司的账号登录需要用到微信扫码登录与QQ的登录功能,所以,在做好了微信的扫码登录之后,本人就写这篇微信扫码登录功能实现的教程 教程开始 需要用到的网站: https://open.weixin.qq.com/ 微信...
  • JAVA微信扫码支付模式二功能实现以及回调

    万次阅读 多人点赞 2017-06-08 10:55:22
    一、准备工作首先吐槽一下微信关于支付这块,本身支持的支付模式就好几种,但是官方文档...关于准备工作,就“微信扫码支付模式二”官方文档地址在这 https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_1
  • 微信扫码支付,用户能不能自定义金额?微信扫码输入金额付款解决方案 微信商户平台有个‘微信买单’产品可以帮助商家实现这个问题。 但是这个产品也有局限性,在某些场合也满足不了用户需求。 比如商家有微信...
  • 通过微信或企业微信扫码登录PC管理后台,替代传统的账号、密码登录。...看网站应用模块即可,开发技术跟微信开发差不多,这种方式只能是微信扫码,不支持企业微信扫码。   2.第二种实现方式,...
  • 内嵌式js微信扫码登录及自定义样式

    千次阅读 2018-07-28 22:02:18
    关于微信扫码登录网站的功能介绍,请阅读官方文档【网站应用微信登录开发指南】 根据官方文档我们知道微信扫码登录有两种方式 一种是跳转到一个大黑屏二维码界面进行扫码登录: (参见博客:PHP实现跳转式微信扫...
  • 微信扫码赚钱是什么意思

    千次阅读 2016-04-29 10:09:04
    最近流行微信扫码赚钱,那么,微信扫码是什么意思呢?其实,微信扫码,只要用微信扫二维码就可以赚钱的意思了。下面,具体与大家谈下微信扫描二维码赚钱。  微信扫码赚钱是今年新流行的一个词,具体的微信扫码...
  • Vue 实现企业微信扫码登录

    千次阅读 2020-05-14 18:14:10
    前端 Vue 实现企业微信扫码登录 需求:公司用的企业微信,PC 端的管理后台,想通过企业微信扫码登录。相比传统的账号密码方便很多。 企业微信扫码登录流程文档:(链接) 对于前端来说,重要的是如何构造扫码登录...
  • Android 微信扫码登陆

    千次阅读 2019-09-12 16:25:18
    最近项目需求中有一个微信扫码登陆功能,即用手机微信扫码功能扫描终端二维码实现登陆的功能 随即打开微信开发者文档查看,不亏为官方,简洁明了,看得我是一脸懵逼,踩了N多坑,太不友好了,言归正传,希望对...
  • 微信扫码登陆流程 1.通过调用微信接口生成二维码 2.前端展示这个二维码,并循环请求后端微信是否回调 3.根据回调结果处理扫码后的操作 在这里,生成二维码的接口有2个 一个是基于开发平台的 另一个是基于公众号的 ,...
1 2 3 4 5 ... 20
收藏数 54,290
精华内容 21,716
热门标签
关键字:

微信扫码事件