2019-12-12 20:18:56 qq_31752115 阅读数 10
  • 微信支付开发-微信公众号开发12-微信开发php

    微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付,微信刷卡支付,异步处理支付结果等等。欢迎反馈,微信/QQ:68183131

    27761 人正在学习 去看看 秦子恒

微信公众号的开发者配置中的微信开发工具中明明已经正确绑定开发者账号,但微信开发者工具还是弹出“未绑定网页开发者”,坑了好久,记录下

原因:

1.微信公众号的开发者配置中的微信开发工具中没有绑定开发者账号;

2.调用支付授权接口所传递的参数中的appid和公众服务号的appid 。

我就是第2个原因,我是查看授权接口的参数才找到appid不对号,坑了好久。找到原因后我就找到ecshop的平台后台管理系统的系统设置中的支付方式的微信支付,编辑配置对应服务号的appid ,解决完毕。

2014-10-24 15:15:48 rzg813 阅读数 7326
  • 微信支付开发-微信公众号开发12-微信开发php

    微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付,微信刷卡支付,异步处理支付结果等等。欢迎反馈,微信/QQ:68183131

    27761 人正在学习 去看看 秦子恒
微信公众号智能绑定功能实现(2014年10月24日 更新)

继微信企业号发布后,腾讯修改了公众号的接入方式,在之前的基础上添加了2个表单,之前版本的智能绑定失效了!

在文章 微信公众号之智能绑定实现初始版本  的基础上修改,新增腾讯这次增加的表单,本次新增的表单有:

encoding_aeskey :EncodingAESKey(消息加解密密钥,长度43位!)

callback_encrypt_mode: 消息加解密方式(0:明文模式、1:兼容模式、3:安全模式(推荐))


operation_seq:此值可以不要,post参数的时候显示这个,是有规律的数字(如:202699977)!

此处附表单截图:


在文章 微信公众号之智能绑定实现初始版本  的基础上修改类 SmartBindUtil.class 的setDevServiceUrl()方法,具体代码如下:

/**
 * 设置开发模式,服务器回调
 * 
 * @param url
 * @param callback_token
 * @return
 */
public Result<Integer> setDevServiceUrl(String url, String callback_token) {
	Result<Integer> result = new Result<Integer>();
	int staus = login();
	if (staus == HttpStatus.SC_OK) {
		isLogin = true;
		PostMethod post = new PostMethod(DEV_SERVICE_URL + token);
		setHeader(post);
		NameValuePair[] params = new NameValuePair[] {
				new NameValuePair("url", "" + url),
				new NameValuePair("callback_token", callback_token),
				new NameValuePair("encoding_aeskey", "aZpGSA7ctX4OfCI7ki8gJRwzw8APJJUu7ro8OHFBTw5"),
				new NameValuePair("callback_encrypt_mode", "0"),
				new NameValuePair("operation_seq", "202699977")};
		post.setRequestBody(params);
		try {
			log.info("正在设置公众平台回调...");
			staus = client.executeMethod(post);
			if (staus == HttpStatus.SC_OK) {
				log.info("服务器连接成功");
				String res = post.getResponseBodyAsString();
				// TODO............
				System.out.println("res========" + res);
				JSONObject retcode = JSON.parseObject(res);
				JSONObject base_resp=retcode.getJSONObject("base_resp");
				staus = Integer.parseInt(base_resp.getString("ret"));
				result.setObject(Integer.parseInt(base_resp.getString("ret")));
				result.setMsg(base_resp.getString("msg"));
			} else {
				result.setObject(staus);
				result.setMsg("网络连接错误,请稍后再试");
			}
		} catch (Exception e) {
			log.info(e.getMessage(), e);
			result.setObject(staus);
			result.setMsg("网络连接错误,请稍后再试");
		} finally {
			post.releaseConnection();
		}
	} else {
		result.setObject(staus);
		result.setMsg("服务器登陆失败,请稍后再试");
	}
	return result;
}



测试结果图:



交流QQ群:89714226 点击链接加入群【微信企业号开发交流】:http://jq.qq.com/?_wv=1027&k=MZRJ0J

转载注明出处,以免惨不忍睹!

说明:如需绑定订阅号修改代码中获取appid 和 appsecret 的代码!


2018-04-25 17:04:06 Sunday2017 阅读数 10908
  • 微信支付开发-微信公众号开发12-微信开发php

    微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付,微信刷卡支付,异步处理支付结果等等。欢迎反馈,微信/QQ:68183131

    27761 人正在学习 去看看 秦子恒

目前有2种类型的二维码:

1、临时二维码,是有过期时间的,最长可以设置为在二维码生成后的30天(即2592000秒)后过期,但能够生成较多数量。临时二维码主要用于帐号绑定等不要求二维码永久保存的业务场景
2、永久二维码,是无过期时间的,但数量较少(目前为最多10万个)。永久二维码主要用于适用于帐号绑定、用户来源统计等场景。

用户扫描带场景值二维码时,可能推送以下两种事件:

如果用户还未关注公众号,则用户可以关注公众号,关注后微信会将带场景值关注事件推送给开发者。

如果用户已经关注公众号,在用户扫描后会自动进入会话,微信也会将带场景值扫描事件推送给开发者。

获取带参数的二维码的过程包括两步,首先创建二维码ticket,然后凭借ticket到指定URL换取二维码。



生成临时二维码

package com.b505.QRcode;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.net.URL;

import javax.net.ssl.HttpsURLConnection;

import com.b505.entity.WechatQRCode;
import com.b505.util.Tool;
import com.b505.util.WeixinConstants;
import com.b505.util.WeixinUtil;

import net.sf.json.JSONObject;

/***
 * 
 * 创建临时二维码
 * 
 * @author 
 *
 */
public class TemporaryQRcode
{
	/**
	 * 
	 * @param accessToken    接口访问凭证 
	 * @param expireSeconds    二维码有效时间   单位为秒   最长 1800秒 (30天)
	 * @param sceneId     场景id   临时二维码场景值Id为32位非0整数      永久二维码的场景值ID取1~10000 
	 *                              也就是说永久二维码一共可以创建10000个    临时的多
	 * @return
	 */
	public static WechatQRCode createForeverTicket(String accessToken, int expireSeconds, int sceneId)
	{
		WechatQRCode wechatQRCode = null;

		// 拼接请求地址
		String requestUrl = " https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=TOKEN";
		requestUrl = requestUrl.replace("TOKEN", accessToken);

		// 需要提交json数据
		String jsonmsg = "{\"expire_seconds\":%d,\"action_name\": \"QR_SCENE\",\"action_info\":{\"scene\":{\"scene_id\":%d}}}";

		// 创建永久带参二维码
		JSONObject jsonObject = WeixinUtil.httpRequest(requestUrl, "POST", String.format(jsonmsg,expireSeconds, sceneId));
		if (null != jsonObject)
		{
			System.out.println(jsonObject);

			try
			{
				wechatQRCode=new WechatQRCode();
				System.out.println(1);
				wechatQRCode.setTicket(jsonObject.getString("ticket"));
				wechatQRCode.setExpire_seconds(jsonObject.getInt("expire_seconds"));
				System.out.println(2);
				System.out.println("永久带参二维码ticket成功=" + wechatQRCode.getTicket()+"Expire_seconds="+wechatQRCode.getExpire_seconds());
			} catch (Exception e)
			{
				wechatQRCode =null;
				int err = jsonObject.getInt("errcode");
				String errormsg = jsonObject.getString("errmsg");
				System.out.println("永久带参二维码ticket失败失败errcode=" + err + "errmsg=" + errormsg);
				}
		}
		return wechatQRCode;
	}
	public static void main(String[] args)
	{       //获得token不再说明
		String assesstoken = WeixinUtil.getAccessToken(WeixinConstants.APPID, WeixinConstants.APPSECRET).getToken();
		WechatQRCode wechatQRCode =createForeverTicket(assesstoken, 900, 111111);
		//临时二维码的  ticket
		System.out.println(wechatQRCode.getTicket());
		//临时二维码有效时间
		System.out.println(wechatQRCode.getExpire_seconds());
		
		String path = "d:/QRcode";
		getRQcode(wechatQRCode.getTicket(), path);
	}
	
	public static String getRQcode(String ticket, String savepath)
	{
		String filepath = null;
		String requestUrl = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=TICKET";
		requestUrl = requestUrl.replace("TICKET", Tool.urlencodeutf8(ticket));

		try
		{
			URL url = new URL(requestUrl);
			HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
			conn.setDoInput(true);
			conn.setRequestMethod("GET");

			if (!savepath.endsWith("/"))
			{
				savepath += "/";
			}
			// 将ticket 作为文件名
			filepath = savepath + ticket + ".jpg";

			// 将微信服务器返回的输入流写入文件

			BufferedInputStream bis = new BufferedInputStream(conn.getInputStream());
			FileOutputStream fos = new FileOutputStream(new File(filepath));

			byte[] buf = new byte[8096];
			int size = 0;
			while ((size = bis.read(buf)) != -1)
				fos.write(buf, 0, size);
			fos.close();
			bis.close();

			System.out.println(conn);
			conn.disconnect();
			System.out.println("根据ticket换取二维码成功");
		} catch (Exception e)
		{
			filepath = null;
			System.out.println("根据ticket换取二维码失败" + e);
		}

		return filepath;

	}
}
附加httpRequest()方法
package com.b505.util;
import java.awt.Menu;
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 javax.net.ssl.HttpsURLConnection;  
import javax.net.ssl.SSLContext;  
import javax.net.ssl.SSLSocketFactory;  
import javax.net.ssl.TrustManager;
import net.sf.json.JSONException;
import net.sf.json.JSONObject;  
import org.slf4j.Logger;  
import org.slf4j.LoggerFactory;
import com.b505.pojo.*;
/**
 * 
 * 公众平台通用接口工具类
 * @author 
 *
 */
public class WeixinUtil
{
	    private static Logger log = LoggerFactory.getLogger(WeixinUtil.class);  
	    /** 
	     * 发起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) {  
	        JSONObject jsonObject = null;  
	        StringBuffer buffer = new StringBuffer();  
	        try {  
	            // 创建SSLContext对象,并使用我们指定的信任管理器初始化  
	            TrustManager[] tm = { new JEEWeiXinX509TrustManager() };  
	            SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");  
	            sslContext.init(null, tm, new java.security.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;  
	    } }

createForeverTicket()方法返回值是WechatQRCode对象,他封装了ticket和expire_seconds参数。WechatQRCode类代码如下:

package com.b505.entity;


public class WechatQRCode
{
	 // 获取的二维码  
    private String ticket;  
    // 二维码的有效时间,单位为秒,最大不超过2592000(即30天)  
    private int expire_seconds;  
    set get ...省}

返回结果   创建成功


永久带参数二维码创建

跟上面大致一样,少的就是没有时间限制,

直接写出代码

package com.b505.QRcode;



import net.sf.json.JSONObject;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileOutputStream;

import com.b505.util.Tool;
import com.b505.util.WeixinConstants;
import com.b505.util.WeixinUtil;
import java.net.URL;
import javax.net.ssl.HttpsURLConnection;


/**
 * 二维码生成和读的工具类
 * 
 */
public class QRcode
{
	/**
	 * 永久二维码
	 * @param accessToken  
	 * @param sceneId场景iD    1~10000
	 * @return
	 */
	public static String createForeverTicket(String accessToken, int sceneId)
	{

		String ticke = null;

		// 拼接请求地址
		String requestUrl = " https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=TOKEN";
		requestUrl = requestUrl.replace("TOKEN", accessToken);
		
		// 需要提交json数据
		String jsonmsg = "{\"action_name\": \"QR_LIMIT_SCENE\",\"action_info\":{\"scene\":{\"scene_id\":%d}}}";

		// 创建永久带参二维码
		JSONObject jsonObject = WeixinUtil.httpRequest(requestUrl, "POST", String.format(jsonmsg, sceneId));
		if (null != jsonObject)
		{
			System.out.println(jsonObject);

			try
			{
				ticke = jsonObject.getString("ticket");
				System.out.println("永久带参二维码ticket成功=" + ticke);
			} catch (Exception e)
			{
				int err = jsonObject.getInt("errcode");
				String errormsg = jsonObject.getString("errmsg");
				System.out.println("永久带参二维码ticket失败失败errcode=" + err + "errmsg=" + errormsg);
			}
		}
		return ticke;
	}

	public static void main(String[] args)
	{
		String assesstoken = WeixinUtil.getAccessToken(WeixinConstants.APPID, WeixinConstants.APPSECRET).getToken();

		String ticket = createForeverTicket(assesstoken, 617);
		String path = "d:/QRcode";
		getRQcode(ticket, path);

	}

	public static String getRQcode(String ticket, String savepath)
	{
		String filepath = null;
		String requestUrl = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=TICKET";
		requestUrl = requestUrl.replace("TICKET", Tool.urlencodeutf8(ticket));

		try
		{
			URL url = new URL(requestUrl);
			HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
			conn.setDoInput(true);
			conn.setRequestMethod("GET");

			if (!savepath.endsWith("/"))
			{
				savepath += "/";
			}
			// 将ticket 作为文件名
			filepath = savepath + ticket + ".jpg";

			// 将微信服务器返回的输入流写入文件

			BufferedInputStream bis = new BufferedInputStream(conn.getInputStream());
			FileOutputStream fos = new FileOutputStream(new File(filepath));

			byte[] buf = new byte[8096];
			int size = 0;
			while ((size = bis.read(buf)) != -1)
				fos.write(buf, 0, size);
			fos.close();
			bis.close();

			System.out.println(conn);
			conn.disconnect();
			System.out.println("根据ticket换取二维码成功");
		} catch (Exception e)
		{
			filepath = null;
			System.out.println("根据ticket换取二维码失败" + e);
		}

		return filepath;

	}

}

运行结果   可见成功


扫描带参数二维码事件

官方文档说过

如果用户还未关注公众号,则用户可以关注公众号,关注后微信会将带场景值关注事件推送给开发者。

如果用户已经关注公众号,在用户扫描后会自动进入会话,微信也会将带场景值扫描事件推送给开发者。

有人可能会问该怎么样才能执行这个时间呢?

用户扫描带场景值二维码时,可能推送以下两种事件:

  1. 如果用户还未关注公众号,则用户可以关注公众号,关注后微信会将带场景值关注事件推送给开发者。
  2. 如果用户已经关注公众号,则微信会将带场景值扫描事件推送给开发者。  


实现代码如下      本人使用的是永久带参数二维码测试的,我设置的场景值ID为617 

 用户未关注时,进行关注后的事件推送    扫二维码,并关注,这个是事件类型是 subscribe ,之后传来的事件key值为"qrscene_617" ,就是 在ID前面加上了前缀   

用户已关注时的事件推送     他发生的事件类型是SCAN  ,之后直接传来事件key值为 "617"  


下面代码看不懂的话那就去柳峰的博客学习学习。

             // 事件推送  
            else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_EVENT)) {  
                // 事件类型  
                String eventType = requestMap.get("Event");  
                // 订阅   当用户未关注该公众号 则先关注
                if (eventType.equals(MessageUtil.EVENT_TYPE_SUBSCRIBE)) {                     
                	//
                	String eventKey = requestMap.get("EventKey");  
                	System.out.println(eventKey);
                     //判断场景ID是否为qrscene_617   
                	if(eventKey.equals("qrscene_617"))
                    {
                        	respContent ="借书请扫书上二维码!!";
                    	textMessage.setContent(respContent);  
                        respMessage = MessageUtil.textMessageToXml(textMessage);  
                        return respMessage;
                    }

                }  
                
                else if (eventType.equals(MessageUtil.EVENT_TYPE_SCAN)) {
                	String eventKey = requestMap.get("EventKey");  
                	System.out.println("AAAAAAAAAA="+eventKey);
                	if(Integer.parseInt(eventKey)==617)
                    {
                    	respContent ="借书请扫书上二维码!!";
                    }
                	textMessage.setContent(respContent);  
                    respMessage = MessageUtil.textMessageToXml(textMessage);  
                	}
				}

刚接触微信开发,欢迎各位前来交流。

本文章是从《微信公众平台应用开发》柳峰老师总结学习学的,老师的博客,书籍对我帮助很大,在此向老师表达谢意,谢谢老师!!!!

2018-05-27 19:35:19 tryandfight 阅读数 2401
  • 微信支付开发-微信公众号开发12-微信开发php

    微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付,微信刷卡支付,异步处理支付结果等等。欢迎反馈,微信/QQ:68183131

    27761 人正在学习 去看看 秦子恒

说在前面

博主最近会有很多项目跟大家一起分享,做完后会上传github上的,希望读友们能给博主提提意见哈哈

这个项目是第三方登录和安全方面的,关于后台与app和网站的登录连接操作的实战项目

github已经上传:https://github.com/13652493839/TiHom-Security

各位如果可以就给我star哈哈谢谢啦


Spring Boot+Spring Security+Spring Social项目开发(九):Spring Security授权表达式、重构配置方面的内容、数据库RBAC数据模型控制权限
Spring Boot+Spring Security+Spring Social项目开发(八):Spring Security 控制授权、源码解析
Spring Boot+Spring Security+Spring Social项目开发(七):使用JWT替换默认Token、JWT实现SSO单点登录
Spring Boot+Spring Security+Spring Social项目开发(六):开发APP认证框架、Spring Security OAuth核心源码、重构三种登录方式、重构社交登录
Spring Boot+Spring Security+Spring Social项目开发(四):使用Spring Social开发第三方登录、QQ登录开发
Spring Boot+Spring Security项目开发(三):实现短信验证码登录
Spring Boot+Spring Security项目开发(二):Spring Security、实现图形验证码功能、实现”记住我”功能
Spring Boot+Spring Security项目开发(一):RESTful API介绍


微信开发

开发流程

第一模块:微信API

1.Weixin接口,与QQ不同加入了一个accessToken参数

2.WeixinImpl接口实现类,继承AbstractOAuth2ApiBinding

  • URL_GET_USER_INFO:获取用户信息的url
  • 实现获取微信用户信息的方法
  • 重写getMessageConverters方法,因为默认注册的StringHttpMessageConverter字符集为ISO-8859-1,而微信返回的是UTF-8的

3.WeixinUserInfo微信用户信息类,上微信开放平台查看属性即可

https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419316518&token=&lang=zh_CN

第二模块:connect

1.微信的access_token信息与标准的OAuth2协议不同,微信在获取access_token时会同时返回openId,并没有单独的通过accessToken换取openId的服务所以这里继承了标准AccessGrant,添加了openId字段,作为对微信access_token信息的封装,所以定义了一个WeixinAccessGrant微信认证权限类

2.写WeixinOAuth2Template微信关于OAuth2协议的模板

这里就不说具体了,我的代码里面都解释的非常清楚

3.开发微信适配器WeixinAdapter实现接口ApiAdapter

4.开发微信的OAuth2流程处理器的提供器,供Spring Social的connect体系调用:WeixinServiceProvider

5.开发WeixinConnectionFactory继承OAuth2ConnectionFactory

第三模块:config

1.WeixinAutoConfiguration继承SocialAutoConfigurerAdapter,加上

@Configuration
@ConditionalOnProperty(prefix = "tihom.security.social.weixin",name = "app-id")

2.WeixinProperties继承Spring的SocialProperties,在浏览器的包下配置

3.application下配置

#wxd99431bbff8305a0
tihom.security.social.weixin.app-id =
#60f78681d063590a469f1b297feff3c4
tihom.security.social.weixin.app-secret =
tihom.security.social.weixin.providerId=weixin

4.去html界面加上跳转即可


绑定与解绑

所谓绑定就是从数据库里面删除数据

1.Spring Social只提供数据没有提供视图

2.绑定时先跳转connect/status,我们要自己写这个视图

3.在social下定义一个TiHomConnectionStatusView类继承AbstractView,类中对视图进行渲染,同时这是个组件,要加上@Component(“connect/status”)

4.扫码绑定时,会跳转到connected视图,但是Spring Social默认没有实现,所以需要我们自己去写一个TiHomConnectView类继承AbstractView

5.开发解除绑定,可以把解绑的视图与绑定的视图写在一起,做个if判断来返回不同的视图信息

Session管理

Session超时处理

  • 如何控制超时时间
    • 设置超时时间
  • 超时了以后如何处理
    • 那就跳转session失效界面

Session并发控制

  • a.新session把旧session踢下去,类似游戏中的挤下线
  • b.新session无法踢下旧session,已经登录了就不能再另外登录了

重构代码,把url做成可配置、把返回做成json和html均兼容

  • 将超时和并发处理各自抽成类进行处理
  • 定义抽象的会话策略AbstractSessionStrategy
  • TiHomExpiredSessionStrategy和TiHomInvalidSessionStrategy继承AbstractSessionStrategy并实现各自的处理接口
  • 把配置都配置到常量接口和自定义session配置类

集群Session管理

  • 引入spring session包,已经帮我们完成了session的问题,我们只需要配置采用的存储是什么和端口即可
  • 使用redis做存储,为什么用redis?
    • session访问频繁,存数据库的话在过滤器链进行过程中读取压力大
    • session有时效性,存数据库还要自己处理清理,redis可以设置超时清理

这里写图片描述

退出处理

  • 如何退出登录
    • 调用/logout服务,跳转到/authentication/require?logout上
  • Spring Security默认的退出处理逻辑
    • 使当前session失效
    • 清除与当前用户相关的remember-me记录
    • 清空当前的SecurityContext
    • 重定向到登录页
  • 与退出登录相关的配置
    • 自定义退出成功处理器TiHomLogoutSuccessHandler实现LogoutSuccessHandler接口,在onLogoutSuccess方法中实现自己的退出逻辑
    • 到BrowserSecurityConfig中的configure中配置

      .logout()
      .logoutUrl("/signOut")
      //.logoutSuccessUrl("/tihom-logout.html") //配了Handler就不能配Url,两者互斥
      .logoutSuccessHandler(logoutSuccessHandler) //退出成功的处理
      .deleteCookies("JSESSIONID") //自定义要删除的cookie
      .and()
    • demo中加demo-logout.html,到appication.properties中配置

      tihom.security.browser.signOutUrl=/demo-logout.html
2018-08-04 08:52:15 qq_41452433 阅读数 260
  • 微信支付开发-微信公众号开发12-微信开发php

    微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付,微信刷卡支付,异步处理支付结果等等。欢迎反馈,微信/QQ:68183131

    27761 人正在学习 去看看 秦子恒

微信小程序开发时 发现  <view>组件绑定事件后, 里面嵌套 的 <view>组件 在绑定事件时不能传参,解决

对用需要传参的绑定事件,我一般不会让他的上级容器 <view>进行绑定事件传参操作,

另一种方法,非不得已,子级直接放弃<view>容器组件,改用<text></text>进行事件绑定传参。

 

没有更多推荐了,返回首页