package com.xueyu.service.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xueyu.constant.WxLoginContant;
import com.xueyu.dao.LoginMapper;
import com.xueyu.pojo.dto.Login;
import com.xueyu.service.LoginService;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicHeader;
import org.apache.http.protocol.HTTP;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import java.io.*;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
/**
* @author durance
*/
@Service
public class LoginServiceImpl extends ServiceImpl<LoginMapper, Login> implements LoginService {
@Value("${buta.qrcode}")
private String filepath;
@Override
public String createAndGetQrcodeFile() {
// 1、创建文件名及scene值
String scene = UUID.randomUUID().toString().substring(0,8);
// 2、获取token
String accessToken = getAccessToken();
System.out.println("accessToken = " + accessToken);
// 3、请求图片流
InputStream inputStream = getwxacode(accessToken, scene);
System.out.println("input"+inputStream);
// 4、保存图标文件
saveToImgByInputStream(inputStream,scene);
// 5、数据库增加该项数据
Login login = new Login();
login.setScene(scene);
save(login);
return scene;
}
/**
* 获取access_token
* @return access_token
*/
private String getAccessToken(){
RestTemplate restTemplate = new RestTemplate();
Map<String, String> params = new HashMap<>();
params.put("APPID", WxLoginContant.APPID);
params.put("APPSECRET", WxLoginContant.SECRET);
ResponseEntity<String> responseEntity = restTemplate.getForEntity(
"https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={APPID}&secret={APPSECRET}",
String.class, params);
String body = responseEntity.getBody();
JSONObject object = JSON.parseObject(body);
return object.getString("access_token");
}
/**
1. 带参数有限个数小程序码接口
2. @param url
3. @param access_token
4. @param path
5. @param width
6. @return
*/
private static InputStream getwxacode(String accessToken, String scene){
String url = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + accessToken;
JSONObject jsonParam = new JSONObject();
// 封装请求对象
// scene值
jsonParam.put("scene", scene);
// 跳往的小程序页面,一般为认证界面
jsonParam.put("page","pages/oauth/oauth");
// 图片宽度,默认为 430
jsonParam.put("width","430");
// 检测页面是否存在,默认为 true
jsonParam.put("check_path",true);
// 返回请求结果
return doWxPost(url, jsonParam);
}
/**
* @param instreams 二进制流
* @param fileName 图片的名称
* @return str 图片保存地址
*/
private void saveToImgByInputStream(InputStream instreams, String fileName){
if(instreams != null){
boolean b =uploadImages(instreams, filepath, fileName+".jpg");
}
}
/**
* IO流保存图片
* @param instreams 需要保存的流
* @param imagePath 保存的图片路径
* @param fileName 文件名
* @return 保存状态
*/
private static boolean uploadImages( InputStream instreams,String imagePath,String fileName) {
File f = new File(imagePath);
f.setWritable(true, false);
boolean flag = false;
try {
// 1K的数据缓冲
byte[] bs = new byte[1024];
// 读取到的数据长度
int len;
// 输出的文件流
File file = new File(imagePath,fileName);
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
try {
// 创建新文件
file.createNewFile();
} catch (IOException e) {
System.out.println("创建新文件时出现了错误。。。");
e.printStackTrace();
}
}
OutputStream os = new FileOutputStream(imagePath+File.separator+fileName);
// 开始读取
while ((len = instreams.read(bs)) != -1) {
os.write(bs, 0, len);
}
// 完毕,关闭所有链接
os.close();
instreams.close();
flag = true;
} catch (IOException e) {
e.printStackTrace();
}
return flag;
}
/**
* 请求
* @param url 请求地址
* @param jsonParam 请求参数
* @return 响应流
*/
private static InputStream doWxPost(String url, JSONObject jsonParam) {
InputStream instreams = null;
// 创建HttpPost对象
HttpPost httpRequst = new HttpPost(url);
try {
StringEntity se = new StringEntity(jsonParam.toString(),"utf-8");
se.setContentType("application/json");
se.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE,"UTF-8"));
httpRequst.setEntity(se);
HttpResponse httpResponse = new DefaultHttpClient().execute(httpRequst);
if (httpResponse.getStatusLine().getStatusCode() == 200) {
HttpEntity httpEntity = httpResponse.getEntity();
if (httpEntity != null) {
instreams = httpEntity.getContent();
}
}
} catch (IOException e) {
e.printStackTrace();
}
return instreams;
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
基于 springboot 实现微信扫描小程序码登录.zip (22个子文件)
wx-login-based-on-miniapp-master
pom.xml 2KB
src
main
resources
application.yml 132B
static
oauth.js 3KB
java
com
xueyu
dao
UserMapper.java 197B
LoginMapper.java 201B
constant
WxLoginContant.java 636B
pojo
dto
User.java 540B
Login.java 521B
controller
LoginController.java 3KB
service
LoginService.java 359B
UserService.java 205B
impl
UserServiceImpl.java 382B
LoginServiceImpl.java 5KB
utils
FileManage.java 1KB
LoginApplication.java 321B
.idea
uiDesigner.xml 9KB
misc.xml 513B
encodings.xml 186B
compiler.xml 696B
workspace.xml 4KB
inspectionProfiles
Project_Default.xml 1KB
Wx-login.iml 80B
共 22 条
- 1
资源评论
「已注销」
- 粉丝: 810
- 资源: 3610
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功