微信小程序生成跳转二维码

官方三种方式,当前我们用第二种 

微信二维码官方文档: wxacode.get | 微信开放文档 (qq.com)

 工具接口代码:

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;

/**
 * @program: lsos
 * @Description 微信三方接口
 */
@Slf4j
@Component
public class WeChatAppletUtil {
    private static final String WXACODE_GET = "https://api.weixin.qq.com/wxa/getwxacode?access_token=";// 生成小程序码地址
    private static final String AUTH_GETACCESSTOKEN = "https://api.weixin.qq.com/cgi-bin/token";//获取access_token地址
    @Value("${wechat.BTBAppid}")
    private String APPID;
    @Value("${wechat.BTBAppSecret}")
    private String APPSECRET;

    /**
     * @Description: 邀请码要求客户
     * @Date: 2022/7/27
     * @Param [dealerId, salesmanId, merchantType, settlementType, dealerName]
     * @Return: java.lang.String
     **/
    public String getWxRegisterQrCode(String dealerId, String salesmanId, String merchantType, String settlementType, String dealerName) {
        String wxStrParam = getWxStrParam(dealerId, salesmanId, merchantType, settlementType, dealerName);
        String path = "pages/register/register";
        return wxQRCode(path, wxStrParam);
    }

    /**
     * @Description: 生成携带微信参数的二维码
     * @Date: 2022/8/24
     * @Param [wxStrParam]
     * @Return: java.lang.String
     **/
    public String wxQRCode(String path, String wxStrParam) {
        String accessToken = null;
        try {
            accessToken = postToken(APPID, APPSECRET);
        } catch (Exception e) {
            e.printStackTrace();
        }
        //图片地址拼接字符串
        String urls = WXACODE_GET + accessToken;
        Map<String, Object> param = new HashMap<>();
        //页面携带的参数
        //扫码进入的小程序页面路径,最大长度 128 字节,不能为空;对于小游戏,可以只传入 query 部分,来实现传参效果,如:传入 "?foo=bar",即可在 wx.getLaunchOptionsSync 接口中的 query 参数获取到 {foo:"bar"}。
        param.put("path", path + wxStrParam);
        param.put("width", 300);
        param.put("auto_color", false);
        Map<String, Object> line_color = new HashMap<>();
        line_color.put("r", 0);
        line_color.put("g", 0);
        line_color.put("b", 0);
        param.put("line_color", line_color);
        String wxQrCodeBase64 = null;
        try {
            URL url = new URL(urls);
            HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
            httpURLConnection.setRequestMethod("POST");// 提交模式
            httpURLConnection.setConnectTimeout(10000);//连接超时 单位毫秒
            httpURLConnection.setReadTimeout(10000);//读取超时 单位毫秒
            // 发送POST请求必须设置如下两行
            httpURLConnection.setDoOutput(true);
            httpURLConnection.setDoInput(true);
            // 获取URLConnection对象对应的输出流
            PrintWriter printWriter = new PrintWriter(httpURLConnection.getOutputStream());
            printWriter.write(JSON.toJSONString(param));
            // flush输出流的缓冲
            printWriter.flush();
            //开始获取数据
            BufferedInputStream bis = new BufferedInputStream(httpURLConnection.getInputStream());
            wxQrCodeBase64 = getQrCodeBase64(bis);
            printWriter.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return wxQrCodeBase64;
    }

    /**
     * @Description: 页面跳转 组装字符串参数 携带参数
     * @Date: 2022/7/27
     * @Param [dealerId:经销商ID, salesmanId:业务员ID, merchantType:商户类型, settlementType:结算类型, dealerName:经销商名称]
     * @Return: java.lang.String
     **/
    private String getWxStrParam(String dI, String sI, String m, String s, String dN) {
        return "?dI=" + dI + "&sI=" + sI + "&m=" + m + "&s=" + s + "&dN=" + dN;
    }

    /**
     * @Description: 图片流 BufferedInputStream转Base64图片
     * @Date: 2022/7/27
     * @Param [qrStream]
     * @Return: java.lang.String
     **/
    public String getQrCodeBase64(BufferedInputStream qrStream) throws IOException {
        String encode = null;
        if (qrStream != null) {
            byte[] buffer = new byte[1024];
            //每次读取的字符串长度,如果为-1,代表全部读取完毕
            int len;
            ByteArrayOutputStream outStream = new ByteArrayOutputStream();
            while ((len = qrStream.read(buffer)) != -1) {
                outStream.write(buffer, 0, len);
            }
            byte[] bytes = outStream.toByteArray();
            //3.将二维码转base64格式
            Base64.Encoder encoder = Base64.getEncoder();
            String base64Img = encoder.encodeToString(bytes);
            encode = "data:image/png;base64," + base64Img.toString();
            qrStream.close();
        }
        return encode;
    }

    /**
     * @Description: 获取access_token
     * @Author: Yph
     * @Date: 2022/7/26
     * @Param [appId, appKey]
     * @Return: java.lang.String
     **/
    public static String postToken(String appId, String appKey) throws Exception {
        String requestUrl = AUTH_GETACCESSTOKEN + "?grant_type=client_credential&appid=" + appId + "&secret=" + appKey;
        URL url = new URL(requestUrl);
        // 打开和URL之间的连接
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setRequestMethod("POST");
        // 设置通用的请求属性
        connection.setRequestProperty("Content-Type", "application/json");
        connection.setRequestProperty("Connection", "Keep-Alive");
        connection.setUseCaches(false);
        connection.setDoOutput(true);
        connection.setDoInput(true);
        // 得到请求的输出流对象
        DataOutputStream out = new DataOutputStream(connection.getOutputStream());
        out.writeBytes("");
        out.flush();
        out.close();
        // 建立实际的连接
        connection.connect();
        // 定义 BufferedReader输入流来读取URL的响应
        BufferedReader in;
        if (requestUrl.contains("nlp")) {
            in = new BufferedReader(new InputStreamReader(connection.getInputStream(), "GBK"));
        } else {
            in = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));
        }
        StringBuilder result = new StringBuilder();
        String getLine;
        while ((getLine = in.readLine()) != null) {
            result.append(getLine);
        }
        in.close();
        JSONObject jsonObject = JSONObject.parseObject(result.toString());
        return jsonObject.getString("access_token");
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值