开发者学堂课程【微服务+全栈在线教育实战项目演练(SpringCloud Alibaba+SpringBoot):微信扫描登录(生成二维码)】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/667/detail/11461
微信扫描登录(生成二维码)
内容介绍:
一、添加配置
二、创建常量类
三、生成微信扫描二维码
四、测试
微信操作需要 id 和秘钥和域名地址,这些值都是固定的,把这些固定值写入到配置文件中,创建一个内读取该配置文件值。
一、添加配置
在 service-ucenter 模块配置文件微信 id、秘钥和域名地址,在实际项目中这几个值都是由公司提供的。
#微信开放平台 appid
wx. open. app_id=wxed9954cO1bb89b47
#微信开放平台 appsecret
wx. open. app_secret=a7482517235173ddb4083788de60b90e
#微信开放平台重定向 url
wx. open. redirect_url=http://guli. shop/ api/ucenter/wx/callbac
二、创建常量类
创建 util 包,创建 ConstantPropertiesUtil.java 常量类,创建类读取配置文件内容。
import org. springframework. beans.factory.InitializingBean;
import org.springframework. stereotype.Component ;
@Component
public class ConstantWxUtils implements InitializingBean {
//添加 Value 注解读取内容
//读取微信 id
@Value(""$ fwx. open. app_id}"")private String appId;
//读取微信秘钥
@Value (""$ {wx. open. app_secret}")private String appSecret;
//读取域名地址
@Value(""$ iwx. open.redirect_url}"")private String redirectUrl;
@Override
//写出常量进行赋值操作
public static String WX_OPEN_APP_ID;
public static string WX_OPEN_APP_SECRET;
public static String WX_OPEN_REDIRECT_URL;
public void afterPropertiesSet ( throws Exception {
//给常量依次赋值
wX_OPEN_APP_ID = appId;
wX_OPEN_APP_SECRET = appSecret;
wX_OPEN_REDIRECT_URL = redirectUr1;
}
三、生成微信扫描二维码
直接请求微信提供固定的地址,向地址后面拼接参数,第三方使用网站应用授权登录前请注意已获取相应网页授权作用域
(scope=snsapi_Jogin ),则可以通过在 PC 打开以下链接:
https:/open.weixin.qq.com/connect/qrconnect?(提供固定的地址)
appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat redirect若提示“该链接无法访问”,请检查参数是否填写错误,如redirect_uri的域名与审核时填写的授权域名不一致 e 或scope 不为 snsapi_login.
参数说明
1.Appid:是必须的,应用唯一标识
2.Redirect url是必须的,使用编码对连接处理
3.Response type:是必须的,填 code 是固定的
4.scoppe:是必须的,应用播权作用域,拥有多个作用域用逗号(,)分隔,网页应用目前仅填写 snsapi_login 即可。
5.state:不是必须的,用于保持请求和回调的状志,授权请求后原样带回给第三方。该参数可用于防止 csrf 攻击〈跨站请求伪适攻击〕,建议第三方带上该参数,可设置为简单的随机烧边口 session 进行校验。
具体编码:
@CrossOrigin
@RestController
//只是请求地址,不需要返回地址
@RequestMapping("/api/ucenter/wx")
public class WxApiController {
//生成微信扫描二维码,提交方式为 GetMapping
@GetMapping("login")
//区别于之前的写法,之前每次返回 R 对象,R 对象的目的是有一个统一返回的结果,而现在是需要生成二维码,并不需要返回一串数据,请求地址来得到生成二维码
public String getWxCode( {
//请求微信地址,表示通过 return 重定向到地址
http://localhost :3000
return "redirect:http://localhost :3000”;
(1)方法一,字符串拼接
//固定地址,后面拼接参数,用?&名称值做拼接
String url = "https:// open. weixin. qq. com/"+
"connect/qrconnect?appid="+ ConstantWxUtils.WX_OPEN_APP_ID+"&response_type=code";
//appid 拼接微信 id 值,再加上&符号做 response 拼接,拼接 code 固定值,依次类推。
该方法的缺点是所有内容要依次拼接,很容易写错,多一个或者少一个内容都会报错。实际当中效率也很低,不建议使用该方法。
(2)方法二
定义一个固定的地址,在地址后面将参数位置后面加上%s(占位符,表示里面需要传参数),微信开放平台授权baseUrlss 相当于?代表占位符
//微信开放平台授权baseurl
String baseUrl = "https://open. weixin. qq. com/connect/qrconnect”+
“?appid-%s"+
“&redirect_uri=%s”+
“&response_type=code”+
“&scope=snsapi_login”+
“&state一%s”+
“#wechat _redirect";
//设置%s 里面的值
String atguigu = String.format(
//会产生返回值,返回值中有固定地址和参数
baseUrl,
ConstantWxUtils.WX_OPEN_APP_ID,
ConstantWxUtils.WX_OPEN_REDIRECT_URL,
"atguigu”
);
//请求一个固定地址,并且后面拼接参数,写出地址加上参数,参数位置后面加上%s(占位符,表示里面需要传参数),String.format 使用方法设定值,最终使地址里面包含固定地址和参数
//重定向到请求微信地址里面
return"redirect”+url
}
}
//对 redirect_url 进行 URLEncoder 编码
//通过工具类取到
StringredirectUrl= ConstantWxUtils.WX_OPEN_REDIRECT_URL;
//try catch 捕获异常
try {
//编码方式为"utf-8",编码之后返回 redirecturl
redirectUrl = URLEncoder. encode(redirectUrl,enc: "utf-8");
} catch(Exception e){
)
//设置%s 里面的值
String atguigu = String.format(
//会产生返回值,返回值中有固定地址和参数
baseUrl,
ConstantWxUtils.WX_OPEN_APP_ID,
redirecturl
"atguigu”
);
通过地址向里面传参数,最后请求改地址,就能在网页中生成二维码,地址需要编码URLEncoder,编码的目的是对地址中的特殊符号做处理。
四、测试
1.启动服务器,
访问 http://localhost:8006/api/ucenter/wx/login
出现问题:返回的是一串字符串并没有重定向,正确效果是对该地址做出请求操作。
修改将注解 restcontroller 换成 controller,只是请求地址,不需要返回数据。
2.重新测试
成功生成扫描二维码