当前位置:   article > 正文

PC端扫描小程序二维码登录_pc端小程序二维码可以pc端扫描吗

pc端小程序二维码可以pc端扫描吗

maven pom.xml文件添加依赖

  1. <dependency>
  2. <groupId>com.github.binarywang</groupId>
  3. <artifactId>weixin-java-miniapp</artifactId>
  4. <version>4.4.8.B</version>
  5. </dependency>

微信小程序配置:

  1. #环境配置文件配置小程序APPID和密钥
  2. wx:
  3. app-id: xx
  4. app-secret: xx
  5. #获取配置环境的属性值
  6. package com.xx.framework.config.properties;
  7. import lombok.Data;
  8. import org.springframework.boot.context.properties.ConfigurationProperties;
  9. import org.springframework.context.annotation.Configuration;
  10. /**
  11. * 微信参数
  12. */
  13. @Configuration
  14. @ConfigurationProperties(prefix = "wx")
  15. @Data
  16. public class WxProperties {
  17. private String appId;
  18. private String appSecret;
  19. }
  20. #配置微信小程序类
  21. package com.xx.framework.config;
  22. import cn.binarywang.wx.miniapp.api.WxMaService;
  23. import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl;
  24. import cn.binarywang.wx.miniapp.config.WxMaConfig;
  25. import cn.binarywang.wx.miniapp.config.impl.WxMaDefaultConfigImpl;
  26. import com.xx.framework.config.properties.WxProperties;
  27. import lombok.AllArgsConstructor;
  28. import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
  29. import org.springframework.context.annotation.Bean;
  30. import org.springframework.context.annotation.Configuration;
  31. @AllArgsConstructor
  32. @Configuration
  33. public class WxConfig {
  34. private final WxProperties wxProperties;
  35. /**
  36. * 小程序配置
  37. * @return
  38. */
  39. @Bean
  40. @ConditionalOnMissingBean
  41. public WxMaConfig wxMaConfig() {
  42. WxMaDefaultConfigImpl config = new WxMaDefaultConfigImpl();
  43. config.setAppid(this.wxProperties.getAppId());
  44. config.setSecret(this.wxProperties.getAppSecret());
  45. return config;
  46. }
  47. @Bean
  48. public WxMaService wxMaService(WxMaConfig maConfig) {
  49. WxMaService service = new WxMaServiceImpl();
  50. service.setWxMaConfig(maConfig);
  51. return service;
  52. }
  53. }

1、获取二维码地址,通过请求微信开发者文档中的服务端获取无限制小程序二维码URL

  1. #controller层
  2. import org.apache.commons.codec.binary.Base64;
  3. /**
  4. * 获取小程序二维码
  5. */
  6. @PassToken
  7. @GetMapping("/getQrCode")
  8. public AjaxResult getQrCode(BlogUserDto blogUserDto){
  9. String base64 = blogUserService.getQrCode(blogUserDto);
  10. if (StrUtil.isBlank(base64)){
  11. return AjaxResult.error("获取二维码失败");
  12. }
  13. return AjaxResult.success("data:image/png;base64,"+base64);
  14. }
  15. #service层
  16. /**
  17. * 获取小程序二维码
  18. * @return
  19. */
  20. String getQrCode(BlogUserDto blogUserDto);
  21. #service impl层
  22. @Override
  23. public String getQrCode(BlogUserDto blogUserDto) {
  24. String base64;
  25. try{
  26. //先判断access_token是否存在。不存在则查询
  27. String key = Constants.MINAPP_ACCESS_TOKEN;
  28. String accessToken = null;
  29. if (redisCache.hasKey(key)){
  30. accessToken = redisCache.getCacheObject(key);
  31. }
  32. if (accessToken == null){
  33. accessToken = wxMaService.getAccessToken(true);
  34. redisCache.setCacheObject(key,accessToken,7200, TimeUnit.SECONDS);
  35. }
  36. //传入的参数a=1&b=2
  37. String scene = blogUserDto.getScene();
  38. //扫码后跳转的页面
  39. String page = "pages/index";
  40. boolean checkPath = false;
  41. //版本。正式版为release,体验版trial,开发版develop
  42. String envVersion = "develop";
  43. //二维码的宽度
  44. int width = 280;
  45. boolean autoColor= false;
  46. WxMaCodeLineColor lineColor = null;
  47. boolean isHyaline = false;
  48. //获取无限制二维码
  49. byte[] bytes = wxMaService.getQrcodeService().createWxaCodeUnlimitBytes(scene,page,checkPath,envVersion,width,autoColor,lineColor,
  50. isHyaline);
  51. base64 = new String(Objects.requireNonNull(Base64.encodeBase64(bytes)));
  52. }catch (Exception e){
  53. e.printStackTrace();
  54. return null;
  55. }
  56. return base64;
  57. }
  58. #Constant
  59. /**
  60. * 小程序access_token
  61. */
  62. public static final String MINAPP_ACCESS_TOKEN = "minapp_access_token:";

2、将获取到的base64图片地址显示在PC端

  1. <div style="width: 100%;height: 100%;text-align: center;position:relative">
  2. <img :src="codeUrl" alt="" :loading="loadingCorUrl"
  3. style="">
  4. <div v-if="showexpire" @click="clickScanQR" style="width: 65%;height: 98%;
  5. position:absolute;top:0%;left:50%;
  6. transform:translateX(-50%);opacity: 0.9;font-size:20px;
  7. background-color: darkgray;font-color:black;">
  8. <div style="position:absolute;top:40%;left:40%;">
  9. <i class="el-icon-refresh" style="font-size:60px;color:#ffffff;cursor: pointer;"></i>
  10. </div>
  11. <div style="position:absolute;top:65%;left:25%;font-size:15px;color:#ffffff;">
  12. 二维码失效,点击重试</div>
  13. </div>
  14. </div>
  15. scene:null,
  16. timer:null,
  17. loadingCorUrl:false,
  18. showexpire:false,
  19. //点击重新刷新二维码
  20. clickScanQR(){
  21. this.getQrCode();
  22. },

3、scene的值由PC端生成传给获取二维码的接口。

4、uniapp收到scene的值后,小程序微信登录

  1. onLoad: function(query) {
  2. this.getBanner();
  3. // this.getBlogList();
  4. setTimeout(function () {
  5. console.log('start pulldown');
  6. }, 1000);
  7. uni.startPullDownRefresh();
  8. //获取pc端扫码后传的参数值
  9. const scene = decodeURIComponent(query.scene);
  10. console.log("scene:"+scene);
  11. //如果scene有值,判断用户是否登录
  12. if(scene && scene != undefined && scene != 'undefined'){
  13. console.log("token:"+this.$store.state.user.token)
  14. //如果登录,授权网站。
  15. if(this.$store.state.user.token){
  16. console.log("llll")
  17. updateScene({"scene":scene}).then(res=>{
  18. });
  19. }else{
  20. // 如果没有登录,直接微信登录,授权网站
  21. this.$tab.navigateTo('/pages/mine/wxlogin/index?scene='+scene)
  22. }
  23. }
  24. },

5、pc端具体代码

  1. algorithm(){
  2. let abc=['a','b','c','d','e','f','g','h','i','g','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'];
  3. let [max,min]=[Math.floor(Math.random()*(10-7+1)+1),Math.floor(Math.random()*(17-10+1)+17)];
  4. abc=abc.sort(()=>0.4-Math.random()).slice(max,min).slice(0,8).join("");
  5. var a=new Date().getTime()+abc;
  6. return a
  7. },
  8. getQrCode(){
  9. this.scene = this.algorithm();
  10. this.loadingCorUrl=true;
  11. this.showexpire=false;
  12. getQrCode({"scene":this.scene}).then(res=>{
  13. if(res.code == 200){
  14. this.codeUrl=res.msg;
  15. if(this.codeUrl && this.codeUrl != undefined && this.codeUrl != 'undefined'){
  16. this.loadingCorUrl=false;
  17. //获取后轮询
  18. var _this = this;
  19. var seconds=0,minutes=0;
  20. _this.timer = setInterval(()=>{
  21. seconds=seconds+3;
  22. console.log("seconds:"+seconds);
  23. if(seconds == 60){
  24. minutes = minutes+1;
  25. }
  26. _this.$store.dispatch("BlogLoginByScene", {"scene":_this.scene}).then((res) => {
  27. if(res.code == 200 && res.token && res.token != undefined && res.token != 'undefined'){
  28. clearInterval(_this.timer);
  29. _this.open = false;
  30. _this.getUserInfo();
  31. }
  32. }).catch(() => {
  33. });
  34. console.log("minutes:"+minutes)
  35. if(minutes == 1){
  36. clearInterval(_this.timer);
  37. _this.showexpire=true;
  38. }
  39. },3000)
  40. }
  41. }
  42. })
  43. },

6、第5条里的微信扫码登录是另外的接口,在登录配置里另外配置,设置如下

  1. #store->userBlog.js里设置
  2. import {login, logout, getInfo,loginByScene} from '@/api/loginBlog'
  3. //根据scene查询登录
  4. BlogLoginByScene({commit}, userInfo) {
  5. const scene = userInfo.scene
  6. return new Promise((resolve, reject) => {
  7. loginByScene(scene).then(res => {
  8. if(res.code == 200 && res.token && res.token != undefined && res.token != 'undefined'){
  9. setToken(res.token)
  10. commit('SET_BLOG_TOKEN', res.token)
  11. }
  12. resolve(res)
  13. }).catch(error => {
  14. reject(error)
  15. })
  16. })
  17. },
  18. #api->loginBlog.js
  19. //根据scene查询登录
  20. export function loginByScene(scene) {
  21. const data = {
  22. scene
  23. }
  24. return request({
  25. url: '/reception/blog/user/getUserByScene',
  26. headers: {
  27. isToken: false
  28. },
  29. method: 'get',
  30. params: data
  31. })
  32. }

7、后端接口

  1. #controller层
  2. /**
  3. * 根据scene查询用户
  4. */
  5. @PassToken
  6. @GetMapping("/getUserByScene")
  7. public AjaxResult getUserByScene(BlogUserDto blogUserDto){
  8. if (StrUtil.isBlank(blogUserDto.getScene())){
  9. return AjaxResult.error("参数值错误");
  10. }
  11. BlogUser blogUser = blogUserService.getOne(new LambdaQueryWrapper<BlogUser>()
  12. .select(BlogUser::getId)
  13. .eq(BlogUser::getScene,blogUserDto.getScene()));
  14. if (blogUser != null){
  15. //创建token
  16. Map<String,Object> claims = new HashMap<>();
  17. claims.put("uuid", IdUtils.getLongId());
  18. claims.put(Constants.BLOG_LOGIN_USER_KEY,blogUser.getId());
  19. String token = tokenService.createToken((claims));
  20. redisCache.setCacheObject(CacheConstants.BLOG_LOGIN_TOKEN_KEY + blogUser.getId(),token);
  21. AjaxResult ajax = AjaxResult.success();
  22. ajax.put(Constants.TOKEN, token);
  23. return ajax;
  24. }
  25. return AjaxResult.success();
  26. }
  27. /**
  28. * 更新用户scene值
  29. * @param id
  30. * @param blogUser
  31. * @return
  32. */
  33. @PutMapping("/updateScene")
  34. public AjaxResult updateScene(@CurrentUser Long id,@RequestBody BlogUser blogUser){
  35. blogUser.setId(id);
  36. blogUserService.updateById(blogUser);
  37. return AjaxResult.success();
  38. }

注释:

如果获取accesstoken出现以下错误,请获取稳定版本

{"errcode":40001,"errmsg":"invalid credential, access_token is invalid or not latest, could get access_token by getStableAccessToken, more details at https://mmbizurl.cn/s/JtxxFh33r rid: 65b3294e-6993fa45-745b3def"}
结果:{"errcode":40001,"errmsg":"invalid credential, access_token is invalid or not latest, could get access_token by getStableAccessToken, more details at https://mmbizurl.cn/s/JtxxFh33r rid: 65b3294e-6993fa45-745b3def"}
 

获取稳定版接口调用凭据 | 微信开放文档

POST https://api.weixin.qq.com/cgi-bin/stable_token
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/152176
推荐阅读
相关标签
  

闽ICP备14008679号