官方三种方式,当前我们用第二种
微信二维码官方文档: 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");
}
}