章节小结:

1.学会了微信授权的步骤,学会了微信授权的文档

2.学会了使用natapp内网穿透工具

3.加深了虚拟机的网络配置以及基本使用

4.学会了抓包购票工具fiddler的使用

5.微信授权步骤

分析微信登录跳转的几个路径

1)sell.com 这是我本地在电脑端口微信界面点击的时候的的入口,这里是可以调到我的本地的虚拟机中的项目192.168.1.105中去

2)sell.com /sell/buyer/product/list获取商品list。这是在nginx中配置的。Nginx中/sell/这个路径设置之后寻找192.168.1.102:8080,这就是我的本地项目的路径,sell.com /sell/buyer/product/list

3)http://192.168.1.102:8080/sell/wechat/authorize?returnUrl=http%3A%2F%2Fsell.com%2F%23%2F 这个是我在虚拟机项目中设置的寻找openid的路径http://192.168.1.102:8080/sell/wechat/authorize参数是虚拟机项目自己上,这是本地项目中查找openid的第一步找到code

4)http://xys.natapp1.cc/sell/wechat/userInfo?code=011XT9ko0SA33l1TbWjo00O6ko0XT9kq&state=http%3A%2F%2Fsell.com%2F%23%2F 这是我本地项目中查找openid的第二步,找出openid

5)http://sell.com/sell/buyer/product/list,再查一次商品

微信授权获取openid:

根据微信给的接口说明,这是文档:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_3我们可以分为以下几步:

设置域名:

1.在natapp上面买一个域名,我的是http://xys.natapp1.cc

2.本地设置服务器穿透,开启natapp.exe,开启命令:natapp -authtoken=e922eb840cb4b7df

3.微信公众号我这边弄得是接口测试号

4.外网访问验证

手动获取获取用户OpenID:

OpenId是一个用户的唯一标示,通过微信提供的接口我们可以获取这个唯一标示

上面图中第一步:设置域名已经完成,接下来就是第二步获取OpenID,细分为几步

1.用户同意授权,获得code

这是微信提供的模仿路径

https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect

然后进行修改

设置权限

appid=wxdf2b09f280e6e6e2

redirect_uri=http://xys.natapp1.cc/sell/weixin/auth

scope=snsapi_base

https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxdf2b09f280e6e6e2&redirect_uri=http://xys.natapp1.cc/sell/weixin/auth&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect
当该路径成功之后,微信方面就会跳转成这样
http://xys.natapp1.cc/sell/weixin/auth?code=adfsdfsdfs&state=STATE

补充上方法路径:sell/weixin/auth所以我们可以获取code,而这个state想写就写不写算哒,这是给我们自定义的参数

@RestController
@RequestMapping("/weixin")
@Slf4j
public class WinxinController {
@GetMapping("/auth")
public void auth(@RequestParam("code") String code) {
log.info("进入auth方法。。。");
log.info("code={}", code);
}
}

已获得code

2.通过code换取网页授权access_token

微信提供的模仿接口

appid=wxdf2b09f280e6e6e2

secret=f924b2e9f140ac98f9cb5317a8951c71

https://api.weixin.qq.com/sns/oauth2/access_token?appid=wxdf2b09f280e6e6e2&secret=f924b2e9f140ac98f9cb5317a8951c71&code=CODE&grant_type=authorization_code

然后我们在auth方法中请求这个链接获取回调参数

下图是我们auto定义的返回的参数

3.拉取用户信息(需scope为 snsapi_userinfo)

与scope=snsapi_base不同的是,用户需要授权而不是直接进入

appid=wxdf2b09f280e6e6e2

redirect_uri=http://xys.natapp1.cc/sell/weixin/auth

scope=snsapi_base

https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxdf2b09f280e6e6e2&redirect_uri=http://xys.natapp1.cc/sell/weixin/auth&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect

获取的参数更多一些

https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN

SDK获取OpenID(这才是项目中使用的):

Github:https://github.com/Wechat-Group/WxJava,里面也有写好的怎么使用的文档

这里我们使用了别人写好的SDK工具,我们直接拿来就可以用,导入maven

<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-mp</artifactId>
<version>3.3.0</version>
</dependency>

Github:Wechat-Group/WxJava文档

API文档

获取openid

重定向到 /sell/wechat/authorize

参数

returnUrl: http://xxx.com/abc  //【必填】

返回

http://xxx.com/abc?openid=oZxSYw5ldcxv6H0EU67GgSXOUrVg

此时我们创建一个WechatAccountConfig放在config下,这是全文配置,获取配置文件信息@Component@ConfigurationProperties(prefix = "wechat")

package com.xiong.sell.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component; @Data
@Component
@ConfigurationProperties(prefix = "wechat")
public class WechatAccountConfig {
private String mpAppId;
private String mpAppSecret;
}

配置文件中

wechat:
mpAppId: wxdf2b09f280e6e6e2
mpAppSecret: f924b2e9f140ac98f9cb5317a8951c71

然后配置WechatMpConfig配置文件中

package com.xiong.sell.config;

import me.chanjar.weixin.mp.api.WxMpConfigStorage;
import me.chanjar.weixin.mp.api.WxMpInMemoryConfigStorage;
import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component; @Component
public class WechatMpConfig {
@Autowired
private WechatAccountConfig accountConfig;
@Bean
public WxMpService wxMpService() {
WxMpService wxMpService = new WxMpServiceImpl();
wxMpService.setWxMpConfigStorage(wxMpConfigStorage());
return wxMpService;
}
@Bean
public WxMpConfigStorage wxMpConfigStorage() {
WxMpInMemoryConfigStorage wxMpConfigStorage = new WxMpInMemoryConfigStorage();
wxMpConfigStorage.setAppId(accountConfig.getMpAppId());
wxMpConfigStorage.setSecret(accountConfig.getMpAppSecret());
return wxMpConfigStorage;
}
}

@Bean告诉项目,我这里是一个bean

@Component告诉项目我这里是一个组件,可以扫描我

@Autowired
private WechatAccountConfig accountConfig;

这个时候就会调用相同返回参数的配置bean

创建WechatController类,生成aothorize方法

package com.xiong.sell.controller;

import com.xiong.sell.enums.ResultEnum;
import com.xiong.sell.exception.SellException;
import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.common.api.WxConsts;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.bean.result.WxMpOAuth2AccessToken;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; import java.net.URLEncoder; /**
* @author Xiong YuSong
* 2019/1/24 11:41
*/
@Controller
@RequestMapping("wechat")
@Slf4j
public class WechatController { @Autowired
private WxMpService wxMpService; /**
* 获取code
* @param returnUrl
* @return
*/
@GetMapping("/authorize")
public String authorize(@RequestParam("returnUrl") String returnUrl) {
//1. 配置
//2. 调用方法
String url = "http://xys.natapp1.cc/sell/wechat/userInfo";
String redirectUrl = wxMpService.oauth2buildAuthorizationUrl(url, WxConsts.OAuth2Scope.SNSAPI_USERINFO, URLEncoder.encode(returnUrl));
return "redirect:" + redirectUrl;
} /**
* 通过code获得user信息,然后再回调
* @param code
* @param returnUrl
* @return
*/
@GetMapping("/userInfo")
public String userInfo(@RequestParam("code") String code,
@RequestParam("state") String returnUrl) {
WxMpOAuth2AccessToken wxMpOAuth2AccessToken = new WxMpOAuth2AccessToken();
try {
wxMpOAuth2AccessToken = wxMpService.oauth2getAccessToken(code);
} catch (WxErrorException e) {
log.error("【微信网页授权】{}", e);
throw new SellException(ResultEnum.WECHAT_MP_ERROR.getCode(), e.getError().getErrorMsg());
}
String openId = wxMpOAuth2AccessToken.getOpenId();
return "redirect:" + returnUrl + "?openid=" + openId;
}
}

成功返回一个url:"redirect:" + returnUrl + "?openid=" + openId;

前端验证:

补充一个买家信息,和图片路径显示

如果无法加载则:Ctrl+F9进行静态文件加载,页面刷新Ctrl+Shift+R

前端项目配置获取后端项目路径以及openid获取路径

路径以及修改地方

重新部署

将重新打包好的项目放到网站的根目录下去

抓包工具fiddler

通过抓包工具我们可以看出,虚拟机项目中寻找微信身份验证的路径是错误的

找了半天是路径打错了

最后我把虚拟机中项目中查找openid的路径直接写为我的本机Ip+端口地址,然后成功了,这说明内网穿透并没有什么用

微信点餐系统(七)-微信授权获取openid:的更多相关文章

  1. JAVA微信公众号网页开发 —— 用户授权获取openid

    官方文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842 HttpClientUtil.java packa ...

  2. Spring Boot_打造企业级微信点餐系统_汇总贴

    2019更新版 Spring Boot双版本(1.5/2.1) 打造企业级微信点餐系统 H:\BaiDu\微服务0830\2019微服务时代Spring Boot双版本(1.5-2.1)  打造企业级 ...

  3. paip.微信菜单直接跳转url和获取openid流程总结

    paip.微信菜单直接跳转url和获取openid流程总结   #------不能直接跳转,贝儿提示不安全的链接.. #-------使用auth跳转. //todox 直接转到..  direct ...

  4. 微信h5静默和非静默授权获取用户openId和用户信息的方法和步骤:

    原文链接:https://blog.csdn.net/qq_35430000/article/details/79299529 一.openId是什么?openId是用户在当前公众号下的唯一标识('身 ...

  5. Spring Boot企业微信点餐系统

    第1章 课程介绍 包括项演示.课程概述.课程安排.学习前提等的介绍, 让同学们了解这课程 1-1 课程介绍 第2章 项目设计 包括需求分析,项?目设计,项?目架构,数据库设计等等. 2-1 项目设计 ...

  6. node 微信授权 获取openid

    node获取微信授权拿到openid 需要了解的网站   1.微信授权. 先说一下流程(一张图代替所有): 流程步骤: 1.用户同意,获取code. 2.通过code获取网页授权access_toke ...

  7. MVC 微信网页授权 获取 OpenId

    最近开发微信公众平台,做下记录,以前也开发过,这次开发又给忘了,搞了半天,还是做个笔记为好. 注意框架为MVC 开发微信公众平台.场景为,在模板页中获取用户openid,想要进行验证的页面,集成模板页 ...

  8. 微信公众平台开发(99) 自定义菜单获取OpenID

    关键字 微信公众平台 自定义菜单 OpenID作者:方倍工作室原文:http://www.cnblogs.com/txw1958/p/weixin-menu-get-openid.html 在这篇微信 ...

  9. 微信小程序中使用云开发获取openid

    微信小程序获取openid 新建一个微信小程序项目 注意要注册一个自己的小程序账号,并有属于自己的appid 点击云开发按钮,自行填入开发环境名称 打开app.js,找到依赖环境 修改为刚才设置的环境 ...

随机推荐

  1. (转)Jenkins2.0 Pipeline 插件执行持续集成发布流程 - git -资料 - 不错的文档

    1.Jenkins 2.0 的精髓是 Pipeline as Code Jenkins 2.0 的精髓是 Pipeline as Code,是帮助 Jenkins 实现 CI 到 CD 转变的重要角色 ...

  2. session 的理解

  3. Redis 3主-3从集群的搭建(CentOS 7)

    注意ip地址为: 虚拟机ip设置 TYPE="Ethernet"BOOTPROTO="static"NAME="enp0s3"DEVICE= ...

  4. redis内存满了怎么办?

    redis最为缓存数据库,一般用于存储缓存数据,用于缓解数据库压力,但是缓存太多,内存满了怎么办呢.一般有以下几种方法 一.增加内存 redis存储于内存中,数据太多,占用太多内存,那么增加内存就是最 ...

  5. Luogu P4823 [TJOI2013]拯救小矮人

    题目 \(n^2\)的dp已经成为辣鸡做法了,%%%wch. 首先一个结论:\(a+b\)小的人在上. 这个东西我们有三种方法解决证明: 1.感性理解,\(a+b\)越大的人逃生能力越强,放在下面就越 ...

  6. springboot2.0结合fastdfs实现文件分布式上传

    1. 引入依赖 在父工程中,我们已经管理了依赖,版本为: <fastDFS.client.version>1.26.7</fastDFS.client.version> 因此, ...

  7. 解决移动端浏览器 HTML 音频不能自动播放的三种方法

    https://blog.csdn.net/PY0312/article/details/90349386 由于Android,IOS移动端的浏览器以及微信自带的浏览器为了用户更好的体验,规定不自动播 ...

  8. flask中使用jsonify和json.dumps的区别

    一.实验 python的flask框架为用户提供了直接返回包含json格式数据响应的方法,即jsonify,在开发中会经常用到.如下一段简单的flask后端代码,服务端视图函数根据请求参数返回json ...

  9. poj2186--tarjan+缩点(有向图的强连通分量中点的个数)

    题目大意:       每一头牛的愿望就是变成一头最受欢迎的牛.现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎. 这 种关系是具有传递性的,如果A认为B受欢迎,B认为C受欢迎,那么牛A也 ...

  10. vue与react对比

    相同点 1.都使用 virtual DOM 2.都是组件化开发 or 都提供了组件化的视图组件 3.数据的改变会引起视图的二次渲染 4.都只有骨架,其他的功能如路由.状态管理等是框架分离的组件. 5. ...