WeChatパブリックアカウントの開発用のパラメーターを使用してQRコードを生成およびスキャンします(変更する必要はありません)

まず、参照用にブログ投稿をリストします。

1. WeChat公式アカウントの開発用のパラメーターを使用してQRコードを生成し、スキャンします。

https://blog.csdn.net/qq_23543983/article/details/80228558

2.複数のパラメータを組み合わせて、シーン値を生成します。

https://www.qinziheng.com/xiaochengxudev/7203.htm

3.パラメータ付きのQRコードの生成の詳細については、公式Webサイトのドキュメントを参照してください。

https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Receiving_event_pushes.html

4.特定の手順:WeChatテストプラットフォームhttps://mp.weixin.qq.com/debugで生成できます

手順:access_tokenを生成する---->チケットを取得する------> QRコードを取得する

コードをすぐ下に貼り付けます。

1つ:メインコード

/**
 * Copyright (C), 2018-2020, XXX有限公司
 * FileName: WeixinController
 * Author:   zhanglei
 * Date:     2020/8/11 10:28
 * Description:
 * History:
 * <author>          <time>          <version>          <desc>
 * 作者姓名           修改时间           版本号              描述
 */
package com.asyware.game.controller;

import com.asyware.game.utils.AccessTokenCache;
import com.asyware.game.utils.MyX509TrustManager;
import com.asyware.game.vo.AccessToken;
import io.swagger.annotations.*;
import lombok.extern.slf4j.Slf4j;
import net.sf.json.JSONException;
import net.sf.json.JSONObject;
import org.springframework.web.bind.annotation.*;

import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ConnectException;
import java.net.URL;
import java.security.SecureRandom;
import java.util.Map;

import static com.asyware.game.utils.WeiXinUtil.httpRequest;

/**
 * 〈一句话功能简述〉<br> 
 * 〈〉
 *
 * @author zhanglei
 * @create 2020/8/11
 * @since 1.0.0
 */
@RestController
@RequestMapping("/weixin")
@CrossOrigin
@Api(tags = "二维码")
@Slf4j
public class WeixinController {

    // 获取Ticket
    public final static String ticket_url = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=";
    //获取二维码
    public final static String erweima="https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=";

    /**
     * 通过商户id获取ticket,返回二维码url
     * @param type 1_1 [第一个1:商户id  第二个1:代表关注二维码,2:代表核销二维码]
     * @return
     */

    @ApiImplicitParams({
            @ApiImplicitParam(name="type",value = "1_1 [第一个1:商户id  第二个1:代表关注二维码,2:代表核销二维码]",required = false,dataType = "String",paramType = "path",example = "blues")
    })
    @ApiResponses({
            @ApiResponse(code = 200,message = "接口返回成功状态"),
            @ApiResponse(code = -1,message = "接口返回失败状态")
    })
    @ApiOperation(value = "通过商户id获取ticket,返回二维码url",notes = "")
    @PostMapping("/getTicket")
    public String getTicket(
            @RequestParam(name="type",required = true) String type){
        Map<String,Object> map = AccessTokenCache.getInstance().getAcessTokenAndExpiresIn("自己的appid","自己的appsecret");
        String accessToken = (String)map.get("access_token");
        //body
        String uu="{\"action_name\": \"QR_LIMIT_STR_SCENE\", \"action_info\": {\"scene\": {\"scene_str\":"+type+"}}}";
        System.out.println(uu);
        JSONObject jsonObject = httpRequest(ticket_url+accessToken,"POST", uu);
        String ticket = jsonObject.getString("ticket");
        //二维码
        String ss=erweima+ticket;
        return ss;
    }




}

このステップで返されるチケットはチケットです。QRコードを取得する場合は、取得インターフェイスであるため、ブラウザに上記で返されるチケットを入力するだけです。

2:AccessTokenCacheクラス

/**
 * Copyright (C), 2018-2020, XXX有限公司
 * FileName: AccessTokenCache
 * Author:   zhanglei
 * Date:     2020/8/11 9:30
 * Description:
 * History:
 * <author>          <time>          <version>          <desc>
 * 作者姓名           修改时间           版本号              描述
 */
package com.asyware.game.utils;

/**
 * 〈一句话功能简述〉<br> 
 * 〈〉
 *
 * @author zhanglei
 * @create 2020/8/11
 * @since 1.0.0
 */

import com.asyware.game.vo.AccessToken;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * 单例设计模式 缓存 accessToken expires_in
 */
public class AccessTokenCache {
    //缓存accessToken的Map,map中包含accessToken,expiresIn和缓存的时间戳time
    private Map<String, String> map = new HashMap<String,String>();
    private static AccessTokenCache accessTokenCache = null;

    private AccessTokenCache() { }
    // 静态工厂方法
    public static AccessTokenCache getInstance() {
        if (accessTokenCache == null) {
            accessTokenCache = new AccessTokenCache();
        }
        return accessTokenCache;
    }

    public Map<String, String> getMap() {
        return map;
    }

    public void setMap(Map<String, String> map) {
        this.map = map;
    }

    /**
     * 获取 accessToken expires_in
     * @param appid 第三方用户唯一凭证
     * @param appsecret 第三方用户唯一凭证密钥
     * @return
     */
    public Map<String,Object> getAcessTokenAndExpiresIn(String appid, String appsecret) {
        Map<String,Object> result = new HashMap<String,Object>();
        AccessTokenCache accessTokenCache = AccessTokenCache.getInstance();
        Map<String, String> map = accessTokenCache.getMap();
        String time = map.get("time");
        String accessToken = map.get("access_token");
        String expiresIn = map.get("expires_in");
        Long nowDate = new Date().getTime();
        if (accessToken != null && time != null && expiresIn!=null) {
            //这里设置过期时间为微信规定的过期时间减去5分钟
            int outTime = (Integer.parseInt(expiresIn)-300) * 1000;
            if (nowDate - Long.parseLong(time) < outTime) {
                System.out.println("-----从缓存读取access_token:" + accessToken);
                //从缓存中拿数据为返回结果赋值
                result.put("access_token", accessToken);
                result.put("expires_in", expiresIn);
            }
        } else {
            AccessToken info = WeiXinUtil.getAccessToken(appid, appsecret);//实际中这里要改为你自己调用微信接口去获取accessToken和expires_in
            System.out.println("-----通过调用微信接口获取access_token:" + info.getAccessToken());
            //将信息放置缓存中
            map.put("time", nowDate + "");
            map.put("access_token", info.getAccessToken());
            map.put("expires_in", info.getExpiresIn()+"");
            //为返回结果赋值
            result.put("access_token", info.getAccessToken());
            result.put("expires_in", info.getExpiresIn());
        }
        return result;
    }
}

3:WeiXinUtilクラス

/**
 * Copyright (C), 2018-2020, XXX有限公司
 * FileName: WeiXinUtil
 * Author:   zhanglei
 * Date:     2020/8/11 9:31
 * Description:
 * History:
 * <author>          <time>          <version>          <desc>
 * 作者姓名           修改时间           版本号              描述
 */
package com.asyware.game.utils;

import com.asyware.game.vo.AccessToken;
import net.sf.json.JSONException;
import net.sf.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ConnectException;
import java.net.URL;
import java.security.SecureRandom;

/**
 * 〈一句话功能简述〉<br> 
 * 〈〉
 *
 * @author zhanglei
 * @create 2020/8/11
 * @since 1.0.0
 */
public class WeiXinUtil {
    private static Logger log = LoggerFactory.getLogger(WeiXinUtil.class);

    // 获取access_token的接口地址(GET) 限2000(次/天)
    public final static String access_token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
    /**
     * 获取access_token
     * @param appid 凭证
     * @param appsecret 密钥
     * @return
     */
    public static AccessToken getAccessToken(String appid, String appsecret) {
        AccessToken accessToken = null;
        String requestUrl = access_token_url.replace("APPID", appid).replace("APPSECRET", appsecret);
        JSONObject jsonObject = httpRequest(requestUrl, "GET", null);
        // 如果请求成功
        if (null != jsonObject) {
            try {
                accessToken = new AccessToken();
                accessToken.setAccessToken(jsonObject.getString("access_token"));
                accessToken.setExpiresIn(jsonObject.getInt("expires_in"));
            } catch (JSONException e) {
                accessToken = null;
                // 获取token失败
                try {
                    log.error("获取token失败 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg"));
                } catch (JSONException e1) {
                    e1.printStackTrace();
                }
            }
        }
        return accessToken;
    }
    /**
     * 描述:  发起https请求并获取结果
     * @param requestUrl 请求地址
     * @param requestMethod 请求方式(GET、POST)
     * @param outputStr 提交的数据
     * @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值)
     */
    public static JSONObject httpRequest(String requestUrl, String requestMethod, String outputStr) {
        System.out.println(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 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;
    }
}

最後に、上記で使用した依存関係を投稿すると、このコードセットを変更せずに直接使用できます。

    <dependency>
            <groupId>commons-beanutils</groupId>
            <artifactId>commons-beanutils</artifactId>
            <version>1.9.3</version>
        </dependency>
        <dependency>
            <groupId>commons-collections</groupId>
            <artifactId>commons-collections</artifactId>
            <version>3.2.1</version>
        </dependency>
        <dependency>
            <groupId>commons-lang</groupId>
            <artifactId>commons-lang</artifactId>
            <version>2.6</version>
        </dependency>
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.1.1</version>
        </dependency>
        <dependency>
            <groupId>net.sf.ezmorph</groupId>
            <artifactId>ezmorph</artifactId>
            <version>1.0.6</version>
        </dependency>
        <dependency>
            <groupId>net.sf.json-lib</groupId>
            <artifactId>json-lib</artifactId>
            <version>2.2.3</version>
            <classifier>jdk15</classifier><!-- jdk版本 -->
        </dependency>

        <dependency>
            <groupId>dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>1.6.1</version>
            <exclusions>
                <exclusion>
                    <groupId>xml-apis</groupId>
                    <artifactId>xml-apis</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>com.thoughtworks.xstream</groupId>
            <artifactId>xstream</artifactId>
            <version>1.4.9</version>
        </dependency>

 

おすすめ

転載: blog.csdn.net/zhangleiyes123/article/details/107962482