我的微信扫描二维码实现登录のJava

java开发Demo~微信扫码登录demo 首先声明,此demo不是直接可以跑通的,请把代码放到自己项目里,然后服务器端部署启动。 这一切的前提,请将微信公众平台 全部配好。(这个公众平台配明白,不容易的) 开发所需15个工具类 可以在我的资源中下载 详细代码不写 说明下WeiXinUtil.java中的参数 Ip白名单页数需要设置的,否则会连接失败。 https://api.weixin.qq.com/cgi-... 阅读详情

微信登录开发参考网址

我的微信登录开发流程

配置一些基本数据
/**
* 配置好一些需要用到的数据
*/
public class WechatConfig {
    //第三方用户唯一凭证,即appid
    public static final String APPID = "wxee746fb0e8f48f44";
    //第三方用户唯一凭证密钥,即appsecret
    public static final String SECRET = "bed208cba5e32cf8e92bbc2c96bd16da";
    //获取access_token
    public static final String ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=SECRET";
    // 临时二维码
    public static final String QR_SCENE = "QR_SCENE";
    // 临时的字符串参数值
    public static final String QR_STR_SCENE = "QR_STR_SCENE";
    // 永久二维码
    public static final String QR_LIMIT_SCENE = "QR_LIMIT_SCENE";
    // 永久二维码(字符串)
    public static final String QR_LIMIT_STR_SCENE = "QR_LIMIT_STR_SCENE";
    // 通过accessToken 以及json 创建二维码  获取ticket
    public static final String CREATE_TICKET_PATH = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=ACCESS_TOKEN";
    // 通过ticket换取二维码
    public static final String SHOWQR_CODE_PATH = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=TICKET";
    //此接口用于获取用户个人信息 UnionID机制
    public static final String GET_UNIONID_URL = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID";

}

生成二维码
  • 获取access_token,access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。
  • 根据access_token 以及生成二维码需要的参数,生成带参数的二维码的ticket
  • 获取二维码ticket后,通过ticket换取二维码图片url展示到前端
    /**
     * 生成带参数的二维码,扫描关注微信公众号,自动登录网站
     * @param modelMap
     * @return
     * @throws Exception
     */
    @RequestMapping(value = "/wechat/login")
    @ResponseBody
    public Result wechatMpLogin(ModelMap modelMap) throws Exception {
//        String accessToken = wechatService.getAccessToken();
        String scene_str = "perFei." + new Date().getTime();
        String ticket = wechatService.createTempStrTicket("600", scene_str);
        if(ticket != null){
            String qrcodeUrl = wechatService.showqrcode(ticket);
            modelMap.put("qrcodeUrl", qrcodeUrl); //二维码的图片路径
        }
        modelMap.put("scene_str", scene_str);
        return Result.ok(null, modelMap);
    }


    /**
     * 生成带参数的二维码的ticket
     * @param expire_seconds
     * @param scene_str
     * @return
     * @throws Exception
     */
    @Override
    public String createTempStrTicket(String expire_seconds,String scene_str) throws Exception {
        String access_token = this.getAccessToken();
        String url = WechatConfig.CREATE_TICKET_PATH;
        url = url.replaceAll("ACCESS_TOKEN",access_token);

        Map<String,String> strMap = new HashMap<String,String>();
        strMap.put("scene_str",scene_str);

        Map<String,Map<String,String>> mapMap = new HashMap<String,Map<String,String>>();
        mapMap.put("scene", strMap);

        Map<String,Object> paramsMap = new HashMap<String,Object>();
        paramsMap.put("expire_seconds", expire_seconds);
        paramsMap.put("action_name", WechatConfig.QR_STR_SCENE);
        paramsMap.put("action_info", mapMap);
        String data = new Gson().toJson(paramsMap);
        // 发送请求
        Map<String, Object> map = HttpClient.httpClientPost(url, data);
        String ticket = (String) map.get("ticket");

        return ticket==null?null:ticket;
    }


    /**
     * 获取access_tocken GET方法
     * @return
     * @throws Exception
     */
    @Override
    public String getAccessToken() throws Exception {
        String url = WechatConfig.ACCESS_TOKEN_URL;
        url = url.replaceAll("APPID", WechatConfig.APPID);
        url = url.replaceAll("SECRET", WechatConfig.SECRET);
        // 发送请求
        HttpClient client = new HttpClient(url);
        // 发送get请求
        client.get();
        // 获取到请求的结果  json格式的字符串,把json格式的字符串转换成对象或者Map集合
        String token_content = client.getContent();
        Map<String, Object> map = JSON.parseObject(token_content, Map.class);
        return map.get("access_token").toString();
    }

    /**
     * 获取二维码ticket后,通过ticket换取二维码图片展示
     * @param ticket
     * @return
     */
    @Override
    public String showqrcode(String ticket) {
        String qrcodeUrl = WechatConfig.SHOWQR_CODE_PATH;
        try {
            String encode = URLEncoder.encode(ticket, "utf-8");
            qrcodeUrl = qrcodeUrl.replaceAll("TICKET",encode);
        }catch (UnsupportedEncodingException e){
            e.printStackTrace();
        }
        return qrcodeUrl;
    }

验证检测是否扫描了二维码
  • 主要是通过生成的二维码的参数进行判断用户是否有过扫描
    /**
     * 检测登录
     * @param scene_str
     * @return
     */
    @RequestMapping("/wechat/checkLogin")
    @ResponseBody
    public  Map<String, Object> wechatMpCheckLogin(String scene_str) {
        // 根据scene_str查询数据库,获取对应记录
        WechatUser wechat = wechatService.getWechatUser(scene_str);
        Map<String, Object> returnMap = new HashMap<String, Object>();
        if (wechat != null ) {
            returnMap.put("openid", wechat.getOpenid());
            returnMap.put("result", "true");//登录成功
        } else {
            returnMap.put("result", "false");//登录失败
        }
        return returnMap;
    }

    @Override
    public WechatUser getWechatUser(String scene_str) {
        WechatUser wechatUser = wechatMapper.selectBySceneStr(scene_str);
        if(wechatUser != null){
            return wechatUser;
        }
        return wechatUser;
    }
微信验证签名信息和接收、处理、响应由微信服务器转发的用户发送给公众帐号的消息
    /**
     * 自定义token, 用作生成签名,从而验证安全性
     */
    private static final String TOKEN = "perFei";

    /**
     * 回调函数 post请求 接受、处理、响应微信信息
     * @param request
     * @param response
     * @throws Exception
     */
    @PostMapping(value = "/wechat/callback")
    public void callbackPost(HttpServletRequest request, HttpServletResponse response) throws Exception{
        // TODO 接收、处理、响应由微信服务器转发的用户发送给公众帐号的消息
        // 将请求、响应的编码均设置为UTF-8(防止中文乱码)
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        System.out.println("请求进入");
        String result = "";
        try {
            //获得解析微信发来的请求
            Map<String,String> map = MessageUtil.parseXml(request);
            if (map != null && map.get("FromUserName").toString() != null){
                // 通过openid获取用户信息
                Map<String, Object> wechatUserMap = wechatService.getUserInfoByOpenid(map.get("FromUserName"));
                // 将数据写入到数据库中
                String event = map.get("EventKey");
                wechatService.insertWechatUser(wechatUserMap,event);
            }
            System.out.println("开始构造消息");
            //根据消息类型 构造返回消息
            result = MessageUtil.buildXml(map);
            System.out.println(result);
            if(result.equals("")){
                result = "未正确响应";
            }
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("发生异常:"+ e.getMessage());
        }
        response.getWriter().println(result);
    }

    /**
     * 回调函数 get请求 验证签名信息
     * @param request
     * @throws Exception
     */
    @GetMapping(value = "/wechat/callback")
    public void callbackGet(HttpServletRequest request, HttpServletResponse response) throws Exception{
        // TODO 验证接口配置信息
        System.out.println("-----开始校验签名-----");
        // 接收微信服务器发送请求时传递过来的参数

        //微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
        String signature = request.getParameter("signature");
        String timestamp = request.getParameter("timestamp"); //时间戳
        String nonce = request.getParameter("nonce"); //随机数
        String echostr = request.getParameter("echostr");//随机字符串

        //将token、timestamp、nonce三个参数进行字典序排序
        //并拼接为一个字符串
        String sortStr = sort(TOKEN,timestamp,nonce);
        //字符串进行shal加密
        String mySignature = shal(sortStr);
        // 校验微信服务器传递过来的签名 和  加密后的字符串是否一致, 若一致则签名通过
        if(!"".equals(signature) && !"".equals(mySignature) && signature.equals(mySignature)){
            System.out.println("-----签名校验通过-----");
            response.getWriter().write(echostr);
            response.getWriter().flush();
        }else {
            System.out.println("-----校验签名失败-----");
        }
    }

    /**
     * 参数排序
     * @param token
     * @param timestamp
     * @param nonce
     * @return
     */
    public String sort(String token, String timestamp, String nonce) {
        String[] strArray = {token, timestamp, nonce};
        Arrays.sort(strArray);
        StringBuilder sb = new StringBuilder();
        for (String str : strArray) {
            sb.append(str);
        }
        return sb.toString();
    }

    /**
     * 字符串进行shal加密
     * @param str
     * @return
     */
    public String shal(String str){
        try {
            MessageDigest digest = MessageDigest.getInstance("SHA-1");
            digest.update(str.getBytes());
            byte messageDigest[] = digest.digest();

            StringBuffer hexString = new StringBuffer();
            // 字节数组转换为 十六进制 数
            for (int i = 0; i < messageDigest.length; i++) {
                String shaHex = Integer.toHexString(messageDigest[i] & 0xFF);
                if (shaHex.length() < 2) {
                    hexString.append(0);
                }
                hexString.append(shaHex);
            }
            return hexString.toString();

        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return "";
    }

工具类
package com.zcf.utils;

import com.google.gson.Gson;
import org.apache.commons.httpclient.methods.ByteArrayRequestEntity;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.RequestEntity;
import org.apache.http.Consts;
import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.*;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLContextBuilder;
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.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;

import javax.net.ssl.SSLContext;
import java.io.IOException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.text.ParseException;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

/**
 * 可以发送Http请求的工具类(可以发送Https请求)
 */
public class HttpClient {

	// 请求的地址
	private String url;
	// 请求的参数
	private Map<String, String> param;
	private int statusCode;
	// 请求后,获取到的响应内容
	private String content;
	private String xmlParam;
	private boolean isHttps;

	public boolean isHttps() {
		return isHttps;
	}

	public void setHttps(boolean isHttps) {
		this.isHttps = isHttps;
	}

	public String getXmlParam() {
		return xmlParam;
	}

	public void setXmlParam(String xmlParam) {
		this.xmlParam = xmlParam;
	}

	public HttpClient(String url, Map<String, String> param) {
		this.url = url;
		this.param = param;
	}

	public HttpClient(String url) {
		this.url = url;
	}

	public void setParameter(Map<String, String> map) {
		param = map;
	}

	public void addParameter(String key, String value) {
		if (param == null)
			param = new HashMap<String, String>();
		param.put(key, value);
	}

	/**
	 * 发送post请求
	 * @throws ClientProtocolException
	 * @throws IOException
	 */
	public void post() throws ClientProtocolException, IOException {
		HttpPost http = new HttpPost(url);
		setEntity(http);
		execute(http);
	}

	/**
	 * 发送put请求
	 * @throws ClientProtocolException
	 * @throws IOException
	 */
	public void put() throws ClientProtocolException, IOException {
		HttpPut http = new HttpPut(url);
		setEntity(http);
		execute(http);
	}

	/**
	 * 发送get请求
	 * @throws ClientProtocolException
	 * @throws IOException
	 */
	public void get() throws ClientProtocolException, IOException {
		if (param != null) {
			StringBuilder url = new StringBuilder(this.url);
			boolean isFirst = true;
			for (String key : param.keySet()) {
				if (isFirst)
					url.append("?");
				else
					url.append("&");
				url.append(key).append("=").append(param.get(key));
			}
			this.url = url.toString();
		}
		HttpGet http = new HttpGet(url);
		execute(http);
	}

	/**
	 * set http post,put param
	 */
	private void setEntity(HttpEntityEnclosingRequestBase http) {
		if (param != null) {
			List<NameValuePair> nvps = new LinkedList<NameValuePair>();
			for (String key : param.keySet())
				nvps.add(new BasicNameValuePair(key, param.get(key))); // 参数
			http.setEntity(new UrlEncodedFormEntity(nvps, Consts.UTF_8)); // 设置参数
		}
		if (xmlParam != null) {
			http.setEntity(new StringEntity(xmlParam, Consts.UTF_8));
		}
	}

	/**
	 * 真正发送请求的方法
	 * @param http
	 * @throws ClientProtocolException
	 * @throws IOException
	 */
	private void execute(HttpUriRequest http) throws ClientProtocolException,
			IOException {
		CloseableHttpClient httpClient = null;
		try {
			if (isHttps) {
				SSLContext sslContext = new SSLContextBuilder()
						.loadTrustMaterial(null, new TrustStrategy() {
							// 信任所有
							public boolean isTrusted(X509Certificate[] chain,
									String authType)
									throws CertificateException {
								return true;
							}
						}).build();
				SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
						sslContext);
				httpClient = HttpClients.custom().setSSLSocketFactory(sslsf)
						.build();
			} else {
				httpClient = HttpClients.createDefault();
			}
			CloseableHttpResponse response = httpClient.execute(http);
			try {
				if (response != null) {
					if (response.getStatusLine() != null)
						statusCode = response.getStatusLine().getStatusCode();
					HttpEntity entity = response.getEntity();
					// 响应内容
					content = EntityUtils.toString(entity, Consts.UTF_8);
				}
			} finally {
				response.close();
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			httpClient.close();
		}
	}

	public int getStatusCode() {
		return statusCode;
	}

	public String getContent() throws ParseException, IOException {
		return content;
	}

	/**
	 * httpClient-Post请求
	 * @param url 请求地址
	 * @param params post参数
	 * @return
	 * @throws Exception
	 */
	public static Map<String, Object> httpClientPost(String url, String params) throws Exception {
		org.apache.commons.httpclient.HttpClient client = new org.apache.commons.httpclient.HttpClient();
		client.getParams().setContentCharset("UTF-8");
		PostMethod httpPost = new PostMethod(url);
		try {
			RequestEntity requestEntity = new ByteArrayRequestEntity(params.getBytes("utf-8"));
			httpPost.setRequestEntity(requestEntity);
			client.executeMethod(httpPost);
			String response = httpPost.getResponseBodyAsString();
			Map<String, Object> map = new Gson().fromJson(response, Map.class);
			return map;
		} catch (Exception e) {
			throw new RuntimeException(e);
		} finally {
			httpPost.releaseConnection();
		}
	}

	/**
	 * httpClient-Get请求
	 * @param url 请求地址
	 * @return
	 * @throws Exception
	 */
	public static Map<String, Object> httpClientGet(String url) throws Exception {
		org.apache.commons.httpclient.HttpClient client = new org.apache.commons.httpclient.HttpClient();
		client.getParams().setContentCharset("UTF-8");
		GetMethod httpGet = new GetMethod(url);
		try {
			client.executeMethod(httpGet);
			String response = httpGet.getResponseBodyAsString();
			Map<String, Object> map = new Gson().fromJson(response, Map.class);
			return map;
		} catch (Exception e) {
			throw e;
		} finally {
			httpGet.releaseConnection();
		}
	}
}

package com.zcf.utils;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import javax.servlet.http.HttpServletRequest;
import java.io.InputStream;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author zhangchuanfei
 * @create 2020-04-12-23:46
 */
public class MessageUtil {

    /**
     * 解析微信发来的请求(XML)
     * @param request
     * @return map
     * @throws Exception
     */
    public static  Map<String,String> parseXml(HttpServletRequest request) throws Exception {
        // 将解析结果存储在HashMap中
        Map<String,String> map = new HashMap<String,String>();
        // 从request中取得输入流
        InputStream inputStream = request.getInputStream();
        //System.out.println("获取输入流");
        // 读取输入流
        SAXReader reader = new SAXReader();
        Document document = reader.read(inputStream);
        // 得到xml根元素
        Element root = document.getRootElement();
        // 得到根元素的所有子节点
        List<Element> elementList = root.elements();

        // 遍历所有子节点
        for (Element e : elementList) {
            System.out.println(e.getName() + "|" + e.getText());
            map.put(e.getName(), e.getText());
        }

        // 释放资源
        inputStream.close();
        inputStream = null;
        return map;
    }

    /**
     * 根据消息类型 构造返回消息
     */
    public static String buildXml(Map<String,String> map) {
        String result;
        String msgType = map.get("MsgType").toString();
        //System.out.println("MsgType:" + msgType);
        if(msgType.toUpperCase().equals("TEXT")){
            result = buildTextMessage(map, "亲,有什么可以帮到您的?");
        }else{
            String fromUserName = map.get("FromUserName");
            // 开发者微信号
            String toUserName = map.get("ToUserName");
            result = String
                    .format(
                            "<xml>" +
                                    "<ToUserName><![CDATA[%s]]></ToUserName>" +
                                    "<FromUserName><![CDATA[%s]]></FromUserName>" +
                                    "<CreateTime>%s</CreateTime>" +
                                    "<MsgType><![CDATA[text]]></MsgType>" +
                                    "<Content><![CDATA[%s]]></Content>" +
                                    "</xml>",
                            fromUserName, toUserName, getUtcTime(),
                            "登录成功");
//        "请回复如下关键词:\n文本\n图片\n语音\n视频\n音乐\n图文");
        }
        return result;
    }

    /**
     * 构造文本消息
     *
     * @param map
     * @param content
     * @return
     */
    private static String buildTextMessage(Map<String,String> map, String content) {
        //发送方帐号
        String fromUserName = map.get("FromUserName");
        // 开发者微信号
        String toUserName = map.get("ToUserName");
        /**
         * 文本消息XML数据格式
         */
        return String.format(
                "<xml>" +
                        "<ToUserName><![CDATA[%s]]></ToUserName>" +
                        "<FromUserName><![CDATA[%s]]></FromUserName>" +
                        "<CreateTime>%s</CreateTime>" +
                        "<MsgType><![CDATA[text]]></MsgType>" +
                        "<Content><![CDATA[%s]]></Content>" + "</xml>",
                fromUserName, toUserName, getUtcTime(), content);
    }

    private static String getUtcTime() {
        Date dt = new Date();// 如果不需要格式,可直接用dt,dt就是当前系统时间
        DateFormat df = new SimpleDateFormat("yyyyMMddhhmm");// 设置显示格式
        String nowTime = df.format(dt);
        long dd = (long) 0;
        try {
            dd = df.parse(nowTime).getTime();
        } catch (Exception e) {

        }
        return String.valueOf(dd);
    }


}

package com.zcf.utils;

import lombok.AllArgsConstructor;
import lombok.Data;

import java.io.Serializable;

/**
 * @author zhangchuanfei
 * @create 2020-04-19-10:25
 */
@Data
@AllArgsConstructor
public class Result implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 状态码
     */
    private Integer code;

    /**
     * 信息
     */
    private String info;

    /**
     * 数据
     */
    private Object data;

    public static Result ok(String info, Object data) {
        return new Result(ResultEnum.OK.getCode(), info, data);
    }

    public static Result ok() {
        return ok(null,null);
    }

    public static Result error(Integer code, String info) {
        return error(code, info,null);
    }

    public static Result error(Integer code, String info, Object data) {
        return new Result(code, info, data);
    }

    public static Result error(ResultEnum resultEnum) {
        return error(resultEnum,null);
    }

    public static Result error(ResultEnum resultEnum, Object data) {
        return error(resultEnum.getCode(), resultEnum.getInfo(),data);
    }

}

开发中需要有自己的服务器资源,我使用的是NATAPP内网穿透,使用的教程很简单,百度一下就可以了。

到这里基本上就完成了,不用多说了,登录成功之后根据个人的需要返回页面。

微信扫码支付模式二功能实现完整Javaweb项目 本例子实现微信扫码支付模式二的支付功能,应用场景为web网站微信扫码支付。实现从点击付费按钮、到弹出二维码、到用户用手机微信扫码支付、到手机上用户付费成功、web网页再自动调整到支付成功后的页面,这一个过程。代码为完整的web项目,用开发工具eclipse,myeclipse,idea打开即可跑 立即下载

相关推荐

Java实现微信扫码登入的实例代码

主要介绍了java实现微信扫码登入功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

微信二维码扫一扫

前台 http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> http://www.w3.org/1999/xhtml">     微信扫一扫        http://res.wx.qq.com/open/js/jweixin-1.0.0.js">>         /

wendykui的博客 941

基于FastLIO2与TEB算法的机器狗自主导航系统实战

本文详细介绍了如何为机器狗构建一套基于FastLIO2与TEB算法的自主导航系统。通过整合FastLIO2激光惯性里程计实现精准定位,并采用TEB局部规划器进行灵活路径规划与动态避障,解决了传统方案在复杂地形下反应慢、易碰撞的问题。文章提供了从环境搭建、算法部署、地图转换到系统调试的完整实战指南,帮助开发者实现机器狗的稳健自主行走。

beer8的博客 324

java获取微信小程序码和小程序二维码

java获取微信小程序码的两种方式和小程序二维码 一、小程序码和小程序二维码简介 首先,奉上微信官方文档:获取小程序码 - https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/qr-code.html 其实文档已经描述的很清楚,微信官方提供两种生成小程序码和一种生成小程序二维码的方式(三种方式对应的是三个不...

- 只为伊人 博客 2989

CentOS7 安装天气分型软件cost733过程详解

cost733是一款天气分型软件,其内置的一些算法可以帮助气象工作者进行天气类型划分等(我也是初学者,仅仅知道一些皮毛),但是网上找到的安装办法比较少,并且总会出现一些报错,试了一晚上,终于将安装办法调通了,希望可以帮助到大家

weixin_62573024的博客 3563

C++碰撞检测库FCL安装(MinGW,CMake)

FCL碰撞检测库、libccd\Eigen库编译配置,全流程问题记录

weixin_45650767的博客 4677

微信生成二维码

微信生成二维码

qq767357802的博客 375

SAP Group Reporting入门指南(8)--业务操作

关于资产负债表类的匹配,系统预设了SGR01和SGR02两个方法,主要区别在于数据的来源范围,SGR01取自ACDOCA和ACDOCU,如果是0F类型的就会直接显示日记账分录(期间是000的除外,这类凭证是年结结转的,系统不再跨年追溯),如果是其他类型就显示合并分录。这里是我觉得SAP还需要优化的地方。基于ICMR的抵消任务中通常将抵销差异细分为交易差异、货币换算差异和其他差异,这在基于重分类抵消任务是无法实现的,基于重分类抵消只知道一个差异总额,很难从合并抵消凭证看出差异的来源,也没有审计线索可言。

bflyfish的博客 277

生成微信二维码

经常看到一些二维码,感到好奇,自己也就学习写了个生成二维码的程序玩玩。 主要用到Qrcode_swetake.jar这个jar包来实现把传进来的String类型数据转换为byte[][]的二位数组类型。最后生成二维码图片。import java.awt.Color; import java.awt.Graphics2D; import java.awt.image.BufferedImage;

库库林-白夜的博客 1876

使用Verilog实现QR分解——嵌入式 [设计与代码]

通过Verilog的硬件描述语言,我们可以将QR分解算法实现为硬件电路,并在嵌入式系统中高效地运行。本文将介绍如何使用Verilog设计并实现QR分解算法,该算法用于将一个矩阵分解为正交矩阵Q和上三角矩阵R。具体而言,QR分解通过对矩阵的列进行正交化处理,得到正交矩阵Q,并将对应的正交化结果存储在上三角矩阵R中。该算法通过将矩阵分解为两个部分,正交矩阵Q和上三角矩阵R,实现了对矩阵的分解和变换。模块,该模块接收待分解矩阵A,并输出正交矩阵Q和上三角矩阵R。下面给出了使用Verilog实现QR分解的源代码。

CodeMaven的博客 621

硬核干货|C#+EtherCAT协议:高精度多轴伺服运动控制通信实战

本文摘要: 文章聚焦工业自动化领域多轴伺服运动控制的高精度与实时性需求,基于C#与EtherCAT协议实现完整解决方案。EtherCAT凭借微秒级同步、分布式架构等优势成为首选,而C#通过优化GC策略和实时线程可满足工业控制要求。文章从工程落地角度,详细拆解EtherCAT的PDO/SDO通信机制与多轴同步控制逻辑,提供完整的C#代码实现(主站初始化、伺服配置、运动控制等),所有代码均通过汇川/松下伺服实测验证。核心亮点包括:纯C#原生开发、工业现场高频问题解决方案、硬件适配指南,帮助开发者快速掌握高精度多

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 585

开放平台–扫描微信二维码登录

准备 如不了解第三方登录流程,建议先大概了解一下,在来看看代码。 说明: 由于开放平台无测试号测试,所以只能上开放平台进行配置信息。公众平台的测试号并不能给开放平台使用。 微信开放平台地址:https://open.weixin.qq.com/cgi-bin/index?t=home/index&lang=zh_CN 配置步骤如下: 1、创建web应用 当创建成功的时候会有appid和appsecret,下面代码需要用到。 创建好之后需要设置回调域 ,就是当扫码通过之后会调用该域内的地址,地址在下

静心123的博客 5809

当AI写小说——一个被严重低估的工程化战场

摘要 AI小说创作远非简单的prompt生成,而是一项需要系统化工程管理的复杂任务。本文通过真实案例分析,揭示了当前AI写小说存在的五大核心难题:设定一致性难以维持、文风控制缺乏个性、爽感节奏难以把握、长篇记忆能力有限以及平台规则适配困难。研究显示,90%的失败案例源于错误的创作方法,主要表现为对话框式随机生成和模板式同质化创作。要实现高质量的AI小说创作,必须建立包括设定治理、记忆管理、文风校准等在内的全链路工程化体系,而非依赖单一prompt指令。只有采用系统化的人机协同方法,才能突破当前AI创作的质量

sellyogurt的博客 684

记录:Java实现微信扫码登录

微信开放平台进行开发者资质认证(只有企业才能认证),然后得到appid和app_secret,然后配置’redirect_url’也就是扫码成功后跳转的地址。

weixin_45947759的博客 2572

使用MATLAB和Simulink来设计并仿真一个智能家居火灾报警系统

智能家居火灾报警系统旨在通过烟雾传感器、温度传感器等设备监测家庭环境,一旦检测到异常情况(如烟雾或温度骤升),立即触发警报并采取相应措施。在这个教程中,我们将使用MATLAB和Simulink来设计并仿真一个智能家居火灾报警系统,包括数据采集、处理以及响应机制。

amy_mhd的博客 162

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Java实现扫码微信登陆(获取登陆成功的用户信息 + 包含使用vue怎么显示登陆二维码)

Java实现扫码微信登陆

GSZTK的博客 4430

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Java二维码登录流程实现(包含短地址生成,含部分代码)

近年来,二维码的使用越来越风生水起,笔者最近手头也遇到了一个需要使用二维码扫码登录网站的活,所以研究了一下这一套机制,并用代码实现了整个流程,接下来就和大家聊聊二维码登录及的那些事儿。 二维码原理 二维码是微信搞起来的,当年微信扫码二维码登录网页微信的时候,感觉很神奇,然而,我们了解了它的原理,也就没那么神奇了。二维码实际上就是通过黑白的点阵包含了一个url请求信息。端上扫码,请求url,做对...

weixin_30457881的博客 569

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Java后台实现网站微信扫码登录功能,获取用户openid,及微信用户信息(小程序码方案),关联微信小程序(个人主体小程序也可以)

扫描小程序码,实现微信扫码登录信息,使用 SpringBoot 封装接口,填入基本信息,可以直接使用。

programming132的博客 1万+

微信公众号开发—扫描二维码实现登录方案

微信公众号开发—扫描二维码实现登录方案

一恍过去 2万+

扫码登录的实现原理

原理解释:    接下来就是对于这个服务的详细实现。首先,大概说一下原理:用户打开网站的登录页面的时候,向浏览器的服务器发送获取登录二维码的请求。服务器收到请求后,随机生成一个uuid,将这个id作为key值存入redis服务器,同时设置一个过期时间,再过期后,用户登录二维码需要进行刷新重新获取。同时,将这个key值和本公司的验证字符串合在一起,通过二维码生成接口,生成一个二维码的图片(二维码...

weixin_30241919的博客 5712

微信第三方扫描登录 java源代码_微信开放平台基于网站应用授权登录源码(java)...

1. 第三方发起微信授权登录请求,微信用户允许授权第三方应用后,微信会拉起应用或重定向到第三方网站,并且带上授权临时票据code参数;2. 通过code参数加上AppID和AppSecret等,通过API换取access_token;3. 通过access_token进行接口调用,获取用户基本数据资源或帮助用户实现基本操作。获取access_token时序图:微信网站应用授权登录接口对接代码实现:...

weixin_42138703的博客 873

java实现简单扫码登录功能(模仿微信网页版扫码)

#java实现简单扫码登录功能jsp+spring+struts2+mybatis:- **模仿微信pc网页版扫码登录** - **使用js代码生成*qrcode*二维码减轻服务器压力** - **js循环请求服务端,判断是否qrcode被扫** - **二维码超时失效功能** - **二维码被扫成功登录,服务端产生sessionId,传到页面使用js保存cookie** - **多线程**本文借鉴

gentlu的博客 5万+

java实现手机扫描二维码进行登录

转自:http://www.daxueit.com/article/2581.html 项目结构: 实现流程: pc端: 1:打开二维码登录网页index.html 2:index.html调用GetQrCodeServlet 3:GetQrCodeServlet干2件事   a:生成随机的uuid,是一个唯一标识,该标识贯穿整个流程   b:生成二维码图片,二维码信息:...

weixin_30624825的博客 3729

微信扫码登录的一种开发思路

微信扫码授权登录流程: 用户在显示二维码的页面用手机扫码授权 页面跳转到指定地址,URL上带有参数code 前端通过code向服务端请求用于权限认证的token 前端后续请求在请求头带上token作为身份标识 需要解决的问题 按照上述的流程,前端最简单的做法就是扫完码重新跳转回系统后,从URL获取code进行后续的操作。 然而因为公司的实际情况,整个扫码登录的流程并没有这么简单。 扫码后只能跳转到固定域名 首先,微信扫码后跳转的域名是固定的,但是一般公司的项目在不同的开发(或生产)环境的域名是不一样的,

m0_37937502的博客 1842

微信扫码登录详细操作流程(微信公众平台开发)

在平常的业务开发中,经常会涉及到扫码登录的案例。下面我将对扫码登录流程做简要概述。 1、概念 首先需要清楚的是扫码登录大体上有两种实现方式。(重点) 一种是基于微信公众平台的扫码登录,另一种是基于微信开放平台的扫码登录。注意这两个平台一定要区分开。在这里做简要解释: 微信开放平台就是为了让第三方应用投入微信的怀抱而设计的,这第三方应用指的是比如android、ios、网站、系统等;微信公众平台就是为了让程序员小伙伴利用微信自家技术(公众号、小程序)开发公众号、小程序而准备的。 微信开放平台入口

海阔天空的博客 4万+

InnoDB 内存结构总览:Change Buffer、AHI 与 Log Buffer

本文系统梳理InnoDB内存结构中的ChangeBuffer、Adaptive Hash Index(AHI)与LogBuffer。ChangeBuffer缓存二级索引页不在内存时的变更,减少随机IO,仅在页加载时合并;聚簇索引修改立即执行,因数据本身不可延后。AHI基于高频等值查询自动构建哈希索引,加速定位,仅支持等值操作。LogBuffer为redo log内存缓冲,配合磁盘日志实现崩溃恢复。三者均服务于性能优化,其中ChangeBuffer与AHI共享BufferPool空间,而LogBuffer独立

bksczm的博客 295
上一篇: SpringBoot2.0整合Redis
下一篇: 一个会发邮件的Java
perfei焓
博客等级 码龄8年 32粉丝 28原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值