官方文档: https://open.weixin.qq.com/

1.先获取code

1-1 配置项目配置文件

  1. wechat:
  2. mpAppId: wxd898fcb01713c658
  3. mpAppSecret: 47ccc303338cee6e62894fxxxxxxxxxxx
  4. openAppId: wx6ad144e54af67d87/////////
  5. openAppSecret: 91a2ff6d38a2bbccfb7e9f9079108e2e/////////配置密钥

  1-2 配置相应的配置文件

  1. Data
  2. @Component
  3. @ConfigurationProperties(prefix = "wechat")
  4. public class WechatAccountConfig {
  5.  
  6. /**
  7. * 公众平台id
  8. */
  9. private String mpAppId;
  10.  
  11. /**
  12. * 公众平台密钥
  13. */
  14. private String mpAppSecret;
  15.  
  16. /**
  17. * 开放平台id
  18. */
  19. private String openAppId;
  20.  
  21. /**
  22. * 开放平台密钥
  23. */
  24. private String openAppSecret;
  25.  
  26. /**
  27. * 商户号
  28. */
  29. private String mchId;
  30.  
  31. /**
  32. * 商户密钥
  33. */
  34. private String mchKey;
  35.  
  36. /**
  37. * 商户证书路径
  38. */
  39. private String keyPath;
  40.  
  41. /**
  42. * 微信支付异步通知地址
  43. */
  44. private String notifyUrl;
  45.  
  46. /**
  47. * 微信模版id
  48. */
  49. private Map<String, String> templateId;
  50. }

  1-3开放平台文件配置

  1. @Component
  2. public class WechatOpenConfig {
  3.  
  4. @Autowired
  5. private WechatAccountConfig accountConfig;
  6.  
  7. @Bean
  8. public WxMpService wxOpenService() {
  9. WxMpService wxOpenService = new WxMpServiceImpl();
  10. wxOpenService.setWxMpConfigStorage(wxOpenConfigStorage());
  11. return wxOpenService;
  12. }
  13.  
  14. @Bean
  15. public WxMpConfigStorage wxOpenConfigStorage() {
  16. WxMpInMemoryConfigStorage wxMpInMemoryConfigStorage = new WxMpInMemoryConfigStorage();
  17. wxMpInMemoryConfigStorage.setAppId(accountConfig.getOpenAppId());
  18. wxMpInMemoryConfigStorage.setSecret(accountConfig.getOpenAppSecret());
  19. return wxMpInMemoryConfigStorage;
  20. }
  21. }

  1-4 controller,并配置同意的Url配置文件

url配置文件

  1. @Data
  2. @ConfigurationProperties(prefix = "projectUrl")
  3. @Component
  4. public class ProjectUrlConfig {
  5.  
  6. /**
  7. * 微信公众平台授权url
  8. */
  9. public String wechatMpAuthorize;
  10.  
  11. /**
  12. * 微信开放平台授权url
  13. */
  14. public String wechatOpenAuthorize;
  15.  
  16. /**
  17. * 点餐系统
  18. */
  19. public String sell;
  20. }

  项目配置文件

  1. projectUrl:
  2. wechatMpAuthorize: http://sell.natapp4.cc
  3. wechatOpenAuthorize: http://sell.natapp4.cc
  4. sell: http://sell.natapp4.cc

  

  1. @Controller
  2. @RequestMapping("/wechat")
  3. @Slf4j
  4. public class WechatController {
  5.  
  6. @Autowired
  7. private WxMpService wxMpService;
  8.  
  9. @Autowired
  10. private WxMpService wxOpenService;
  11. @Autowired
  12. private ProjectUrlConfig projectUrlConfig;
  13. @GetMapping("/qrAuthorize")
  14. public String qrAuthorize(@RequestParam("returnUrl") String returnUrl) {
  15. String url = projectUrlConfig.getWechatOpenAuthorize() + "/sell/wechat/qrUserInfo";
  16. String redirectUrl = wxOpenService.buildQrConnectUrl(url, WxConsts.QRCONNECT_SCOPE_SNSAPI_LOGIN, URLEncoder.encode(returnUrl));
  17. return "redirect:" + redirectUrl;
  18. }
  19. @GetMapping("/qrUserInfo")
  20. public String qrUserInfo(@RequestParam("code") String code,
  21. @RequestParam("state") String returnUrl) {
  22. WxMpOAuth2AccessToken wxMpOAuth2AccessToken = new WxMpOAuth2AccessToken();
  23. try {
  24. wxMpOAuth2AccessToken = wxOpenService.oauth2getAccessToken(code);
  25. } catch (WxErrorException e) {
  26. log.error("【微信网页授权】{}", e);
  27. throw new SellException(ResultEnum.WECHAT_MP_ERROR.getCode(), e.getError().getErrorMsg());
  28. }
  29. log.info("wxMpOAuth2AccessToken={}", wxMpOAuth2AccessToken);
  30. String openId = wxMpOAuth2AccessToken.getOpenId();
  31.  
  32. return "redirect:" + returnUrl + "?openid=" + openId;
  33. }
  34. }

  2.登陆

2-1controller创建登陆方法

  步骤://1. openid去和数据库里的数据匹配

    2. 设置token至redis:[

使用redis步骤:

1.引入依赖

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-data-redis</artifactId>
  4. </dependency>

  2.在controller里面引入

  1. @Autowired
  2. private StringRedisTemplate redisTemplate;

  3.在方法里

  1. redisTepla.opsForValue().set("abc","1111111");//告诉redic调用并set key-value

  

]

    /3. 设置token至cookie

controller层

注意:uuid过期时间类

  1. /**
  2. * redis常量
  3. * Created by 廖师兄
  4. * 2017-07-30 16:22
  5. */
  6. public interface RedisConstant {
  7.  
  8. String TOKEN_PREFIX = "token_%s";
  9.  
  10. Integer EXPIRE = 7200; //2小时
  11. }

  cookie常量类

  1. public interface CookieConstant {
  2.  
  3. String TOKEN = "token";
  4.  
  5. Integer EXPIRE = 7200;
  6. }

  

所需

  1. public class CookieUtil {
  2.  
  3. /**
  4. * 设置
  5. * @param response
  6. * @param name
  7. * @param value
  8. * @param maxAge
  9. */
  10. public static void set(HttpServletResponse response,
  11. String name,
  12. String value,
  13. int maxAge) {
  14. Cookie cookie = new Cookie(name, value);
  15. cookie.setPath("/");
  16. cookie.setMaxAge(maxAge);
  17. response.addCookie(cookie);
  18. }

  

  1. @Controller
  2. @RequestMapping("/seller")
  3. public class SellerUserController {
  4.  
  5. @Autowired
  6. private SellerService sellerService;
  7.  
  8. @Autowired
  9. private StringRedisTemplate redisTemplate;
  10.  
  11. @Autowired
  12. private ProjectUrlConfig projectUrlConfig;
  13.  
  14. @GetMapping("/login")
  15. public ModelAndView login(@RequestParam("openid") String openid,
  16. HttpServletResponse response,
  17. Map<String, Object> map) {
  18.  
  19. //1. openid去和数据库里的数据匹配
  20. SellerInfo sellerInfo = sellerService.findSellerInfoByOpenid(openid);
  21. if (sellerInfo == null) {
  22. map.put("msg", ResultEnum.LOGIN_FAIL.getMessage());
  23. map.put("url", "/sell/seller/order/list");
  24. return new ModelAndView("common/error");
  25. }
  26.  
  27. //2. 设置token至redis
  28. String token = UUID.randomUUID().toString();//uuid通用唯一识别码
  29. Integer expire = RedisConstant.EXPIRE;//uuid过期时间
  30.  
  31. redisTemplate.opsForValue().set(String.format(RedisConstant.TOKEN_PREFIX, token), openid, expire, TimeUnit.SECONDS);
  32.  
  33. //3. 设置token至cookie
  34. CookieUtil.set(response, CookieConstant.TOKEN, token, expire);
  35.  
  36. return new ModelAndView("redirect:" + projectUrlConfig.getSell() + "/sell/seller/order/list");
  37.  
  38. }
  39. }

 3.退出登陆

思路:清楚redis存值和cookie  步骤:1)从cookie里面查询 2).清除redis 3).清除cookie

查询cookie

  1. public class CookieUtil {
  2. /**
  3. * 获取cookie
  4. * @param request
  5. * @param name
  6. * @return
  7. */
  8. public static Cookie get(HttpServletRequest request,
  9. String name) {
  10. Map<String, Cookie> cookieMap = readCookieMap(request);
  11. if (cookieMap.containsKey(name)) {
  12. return cookieMap.get(name);
  13. }else {
  14. return null;
  15. }
  16. }
  17.  
  18. /**
  19. * 将cookie封装成Map
  20. * @param request
  21. * @return
  22. */
  23. private static Map<String, Cookie> readCookieMap(HttpServletRequest request) {
  24. Map<String, Cookie> cookieMap = new HashMap<>();
  25. Cookie[] cookies = request.getCookies();
  26. if (cookies != null) {
  27. for (Cookie cookie: cookies) {
  28. cookieMap.put(cookie.getName(), cookie);
  29. }
  30. }
  31. return cookieMap;
  32. }
  33. }

  controller层方法

  1. @GetMapping("/logout")
  2. public ModelAndView logout(HttpServletRequest request,
  3. HttpServletResponse response,
  4. Map<String, Object> map) {
  5. //1. 从cookie里查询
  6. Cookie cookie = CookieUtil.get(request, CookieConstant.TOKEN);
  7. if (cookie != null) {
  8. //2. 清除redis
  9. redisTemplate.opsForValue().getOperations().delete(String.format(RedisConstant.TOKEN_PREFIX, cookie.getValue()));
  10.  
  11. //3. 清除cookie
  12. CookieUtil.set(response, CookieConstant.TOKEN, null, 0);
  13. }
  14.  
  15. map.put("msg", ResultEnum.LOGOUT_SUCCESS.getMessage());
  16. map.put("url", "/sell/seller/order/list");
  17. return new ModelAndView("common/success", map);
  18. }

  

 

  

12.18 微信扫码获取openid与登陆的更多相关文章

  1. php实现微信扫码自动登陆与注册功能

    本文实例讲述了php实现微信扫码自动登陆与注册功能.分享给大家供大家参考,具体如下: 微信开发已经是现在程序员必须要掌握的一项基本的技术了,其实做过微信开发的都知道微信接口非常的强大做起来也非常的简单 ...

  2. PHP实现微信扫码自动登陆与注册,参考实例

    微信开发已经是现在phper必须要掌握的一项基本的技术了,其实做过微信开发的都知道微信接口非常的强大做起来也非常的简单,这里我们一起来看一个微信自动登陆注册的例子. php 微信扫码 pc端自动登陆注 ...

  3. Android (微信扫码登录) 获取微信二维码+扫码登录

    话不多说  直接上菜! 一.因为是微信扫码登录,所有要在微信开放平台  微信开放平台 (qq.com) 进行注册----- 如下 1.资源中心 里面也有详细的官方讲解,里面也有demo  可以下载 2 ...

  4. php微信开放平台--第三方网页微信扫码登录(OAuth2.0)

    第一.OAuth2.0 OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用. 允许用户提 ...

  5. ASP.NET Core Web 支付功能接入 微信-扫码支付篇(转)

    原文 https://www.cnblogs.com/essenroc/p/8630730.html // 随着版本更迭,新版本可能无法完全适用,请参考仓库内的示例. 这篇文章将介绍ASP.NET C ...

  6. Web应用多账号系统设计及微信扫码登录实现

    Web应用多账号系统设计及微信扫码登录实现 1   前言概述 公司对功能测试,性能测试,安全测试等等都做了比较好的自动化后,急需要一个MIS系统来统一管理这些结果及报表. 此MIS系统特点如下: 仅内 ...

  7. 微信开放平台开发——网页微信扫码登录(OAuth2.0)

    1.OAuth2.0 OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用. 允许用户提供 ...

  8. PC 端微信扫码注册和登录

    一.前言 先声明一下,本文所注重点为实现思路,代码及数据库设计主要为了展现思路,如果对代码效率有着苛刻要求的项目切勿照搬. 相信做过微信开发的人授权这块都没少做过,但是一般来说我们更多的是为移动端的网 ...

  9. 微信公众号支付|微信H5支付|微信扫码支付|小程序支付|APP微信支付解决方案总结

    最近负责的一些项目开发,都用到了微信支付(微信公众号支付.微信H5支付.微信扫码支付.APP微信支付).在开发的过程中,在调试支付的过程中,或多或少都遇到了一些问题,今天总结下,分享,留存. 先说注意 ...

随机推荐

  1. springbcloud5----高可用

    package com.itmuch.cloud; import org.springframework.boot.SpringApplication; import org.springframew ...

  2. sqlite常用的命令-增删改查

    一.查看版本信息: #sqlite3 -version 二.sqlite3常用命令 1.当前目录下建立或打开test.db数据库文件,并进入sqlite命令终端,以sqlite>前缀标识: 2. ...

  3. context.Request方法总结

    Request.Params为获取的包含上述两种集合外,还包括当前运行环境变量,COOKIES等的集合.Request.QueryString["param"] getReques ...

  4. 【c++ primer, 5e】函数匹配

    练习 6.49 候选函数:与所调用的函数的名字相同的函数的集合. 可行函数:给候选函数加上参数数量.参数类型的约束所得到的函数的集合. 6.50 a 3.4可行,二义匹配 b 2.4可行,2是最佳匹配 ...

  5. Eclipse配置多个jdk

    Eclipse配置多个jdk 步骤: 1,打开windows > Preferences: 2,点击“Add”,新增jdk,选择“Standard VM”: 3,下一步,选择对应版本的jer: ...

  6. RocEDU.阅读.写作《霍乱时期的爱情》书摘(三)

    暮年的岁月不是奔涌向前的激流,而是一个无底的地下水池,记忆从这里慢慢流走. 那是对人生,爱情,老年和死亡的思考:这些想法曾无数次像夜间的鸟儿一般扑扇着翅膀掠过她的头顶,可每当她想抓住它们时,它们就惊飞 ...

  7. 20145329 《JAVA程序设计》实验三总结

    实验日期:2016.4.12 实验时间:15:30~17:30 实验序号:实验三 实验名称: 敏捷开发与XP实践 实验目的与要求: XP基础 XP核心实践 相关工具 实验内容 1.使用git托管代码 ...

  8. mysql的一些基本知识

    一.数据类型: 字符型 整型 浮点型 日期时间型 二.数据表操作: 插入记录:INSERT  表名(···,···,···) VALUES('···','···',···): 查找记录:SELECT ...

  9. Mysql批量更新速度慢的解决方案

    批量更新的时候不能用子查询 where shop_orderform_id in( select shop_orderform_id from `shop_orderform` where user_ ...

  10. 【cs231n】线性分类笔记

    前言 首先声明,以下内容绝大部分转自知乎智能单元,他们将官方学习笔记进行了很专业的翻译,在此我会直接copy他们翻译的笔记,有些地方会用红字写自己的笔记,本文只是作为自己的学习笔记.本文内容官网链接: ...