微信扫二维码跳转小程序绑定手机号进行登录

微信小程序实现的网页扫码授权登录(完全免费) 现如今,扫码登录已经在网站普遍应用,其中微信扫码登录极其普遍。但是微信扫码登录的实现方法有多种,大多数都是具有一些门槛的。例如企业、需要服务号、需要认证等,这些都是个人开发者,个人创作者无法使用的。 但其实,微信小程序也可以作为一个授权登录的“中介”,因为微信小程序有一个 wx.login 的API可以轻松实现获取openid来作为微信用户的鉴权。 阅读详情


一、角色及流程

1.1 角色

角色作用
web后端提供生成二维码,校验二维码登录接口
web前端调用生成二维码接口 ,轮训检查登录状态
小程序后端提供小程序登录,小程序绑定手机号接口
小程序前端调用小程序后端接口

1.2 流程

详细步骤及交互

	网页端 ->> 后端服务: 生成带scene的二维码
    后端服务 ->> 微信服务器: 调用getwxacodeunlimited接口
    微信服务器 -->> 后端服务: 返回二维码图片
    网页端	 ->> 网页端: 展示二维码
    小程序端 ->> 微信服务器: 扫码获取临时code
    微信服务器 -->> 小程序端: 返回code和encryptedData
    小程序端 ->> 后端服务: 提交code和scene
    后端服务 ->> 微信服务器: 通过code获取openid
    微信服务器 -->> 后端服务: 返回openid和session_key
    小程序端 ->> 后端服务: 提交手机号授权数据
    后端服务 ->> 数据库: 查询/创建用户记录
    数据库 -->> 后端服务: 返回用户状态
    后端服务 ->> 网页端: 轮训或WebSocket通知登录结果

1.2.1. 生成小程序二维码

1.2.2. 用户扫码进入小程序

1.2.3. 用户登录授权

1.2.4. 获取手机号授权

1.2.5. 解密并绑定手机号

1.2.6. 登录完成

二、准备工作

微信开放平台,微信小程序注册认证,获取appid和secretkey、配置微信二维码访问规则(文件校验等问题)、微信开发者工具等

二、实现代码

1.1 web后端

1.1.1 引入依赖

		<dependency>
            <groupId>com.github.binarywang</groupId>
            <artifactId>weixin-java-miniapp</artifactId>
            <version>4.6.0</version>
        </dependency>

1.1.2 后端代码


import cn.binarywang.wx.miniapp.api.WxMaQrcodeService;
import cn.binarywang.wx.miniapp.api.WxMaService;
import cn.binarywang.wx.miniapp.util.WxMaConfigHolder;
import com.base.api.BaseStaffService;
import com.base.api.LoginService;
import com.base.constant.BaseConstant;
import com.common.core.exception.CheckedException;
import com.domain.base.entity.BaseStaff;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.common.error.WxErrorException;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
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.util.Collections;
import java.util.UUID;
import java.util.concurrent.TimeUnit;

/**
 * 后台登录控制器
 */
@RestController
@RequestMapping("/api/login")
@RequiredArgsConstructor
@Slf4j
public class WxLoginController {

    private final WxMaService wxMaService;

    private final BaseStaffService baseStaffService;

    private final LoginService loginService;

    private final RedisTemplate<String, String> redisTemplate;

    @Value("${spring.profiles.active}")
    private String activeProfile;

    @GetMapping("/qrcode")
    @ApiOperation(value = "生成微信二维码")
    public ResponseEntity<byte[]> generateQrCode() {

        try {
            String scene = UUID.randomUUID().toString().substring(0, 8);
            System.out.println("scene=" + scene);

            // 保存token到Redis,设置5分钟过期
            redisTemplate.opsForValue().set(BaseConstant.WX_CACHE + scene, BaseConstant.UN_SCANNED, 5, TimeUnit.MINUTES);

            WxMaQrcodeService codeService = wxMaService.getQrcodeService();
            String envVersion = BaseConstant.SYS_ENV_MAPPER_WX_ENV.getOrDefault(activeProfile,
                    BaseConstant.SYS_ENV_MAPPER_WX_ENV_DEFAULT);

            // 生成小程序码
            byte[] qrCodeBytes = codeService.createWxaCodeUnlimitBytes(scene, BaseConstant.WX_SCAN_TO_PAGE, false, envVersion, 430, false, null, false);

            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.IMAGE_JPEG);

            log.info("生成微信二维码,scene:{}", scene);

            return new ResponseEntity<>(qrCodeBytes, headers, HttpStatus.OK);
        } catch (WxErrorException e) {
            throw new CheckedException("生成微信二维码失败");
        } catch (Exception e) {
            throw new CheckedException(e);
        } finally {
            WxMaConfigHolder.remove();//清理ThreadLocal
        }
    }

    @GetMapping("/check")
    @ApiOperation(value = "检查登录状态:检查成功后返回token")
    public ResponseEntity<?> checkLoginStatus(@RequestParam String scene) {
        try {
            log.info("检查登录状态,scene:{}", scene);
            String status = redisTemplate.opsForValue().get(BaseConstant.WX_CACHE + scene);
            if (status == null) {
                return ResponseEntity.status(404).body("二维码已过期");
            } else if (status.equals(BaseConstant.UN_SCANNED)) {
                return ResponseEntity.ok().body(Collections.singletonMap("status", "等待扫码"));
            } else {
                // 已确认,返回用户ID
                String userId = status;
                BaseStaff baseStaff = baseStaffService.getById(Long.valueOf(userId));
                if (baseStaff == null) {
                    return ResponseEntity.status(404).body("用户不存在");
                }
                String token = loginService.createToken(baseStaff);

                redisTemplate.delete(BaseConstant.WX_CACHE + scene);
                log.info("用户小程序登录成功,token:{},用户ID:{},用户名称:{}", token, baseStaff.getId(), baseStaff.getUserName());
                return ResponseEntity.ok().body(token);
            }
        } catch (Exception e) {
            throw new CheckedException(e);
        }

    }
}

常量类

public interface BaseConstant {

    /**
     * 微信小程序登录二维码跳转页面
     */
    String WX_SCAN_TO_PAGE = "pages/index/index";

    /**
     * 系统环境对应微信环境
     * release:正式
     * trial:体验
     * develop:开发
     */
    Map<String, String> SYS_ENV_MAPPER_WX_ENV = Map.of(
            "prod", "release",//正式
            "uat", BaseConstant.SYS_ENV_MAPPER_WX_ENV_DEFAULT,//体验
            "dev", "trial"          //开发
    );

    String SYS_ENV_MAPPER_WX_ENV_DEFAULT = "trial"; //默认体验环境

    String UN_SCANNED = "UN_SCANNED";

    String WX_SESSION_KEY_CACHE_PREFIX = "session:WX_SESSION_KEY_";

    String WX_CACHE = "wx:";
}

1.1.3 其他

1.白名单配置
2.微信校验文件访问等

1.2 web前端

略:展示二维码和轮训

1.3 小程序后端


import cn.binarywang.wx.miniapp.api.WxMaService;
import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
import cn.binarywang.wx.miniapp.util.WxMaConfigHolder;
import com.base.api.BaseStaffService;
import com.base.constant.BaseConstant;
import com.base.controller.wx.ao.LoginBindPhoneRequestAo;
import com.base.controller.wx.ao.LoginRequestAo;
import com.common.core.exception.CheckedException;
import com.common.core.utils.ArgumentAssert;
import com.common.core.utils.StrPool;
import com.domain.base.entity.BaseStaff;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.common.error.WxErrorException;
import org.apache.commons.lang3.StringUtils;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Collections;
import java.util.concurrent.TimeUnit;

/**

 * @description: 小程序登录控制器
 * @author: biejiahao

 * @create: 2025-04-07 19:25
 */
@RestController
@RequestMapping("/api/miniapp")
@RequiredArgsConstructor
@Slf4j
public class MiniAppController {

    private final WxMaService wxMaService;

    private final BaseStaffService baseStaffService;

    private final RedisTemplate<String, String> redisTemplate;

    @PostMapping("/login")
    @ApiOperation(value = "小程序登录:如果用户已经绑定了手机号和openId,则直接调用check方法返回token,否则再调用bind-phone方法")
    public ResponseEntity<?> miniAppLogin(@RequestBody @Validated LoginRequestAo loginRequest) {
        String code = loginRequest.getCode();
        String scene = loginRequest.getScene();
        log.info("小程序登录,scene:{},code:{}", scene, code);
        try {
            String sceneCache = redisTemplate.opsForValue().get(BaseConstant.WX_CACHE + scene);
            if (sceneCache == null) {
                throw new CheckedException("二维码已过期");
            }

            WxMaJscode2SessionResult session = wxMaService.getUserService().getSessionInfo(code);
            String sessionKey = session.getSessionKey();
            String openid = session.getOpenid();

            // 检查用户是否已存在openid
            BaseStaff baseStaff = baseStaffService.getByOpenId(openid).orElse(null);
            if (baseStaff != null) {
                // 直接关联token和用户,无需手机号授权
                Long baseStaffId = baseStaff.getId();
                redisTemplate.opsForValue().set(BaseConstant.WX_CACHE + scene, baseStaffId.toString(), 5, TimeUnit.MINUTES);

                log.info("小程序登录:已绑定openid{},scene:{},code:{},staffId:{}", openid, scene, code, baseStaffId);

                return ResponseEntity.ok().body(Collections.singletonMap("action", "LOGIN_SUCCESS"));
            }
            redisTemplate.delete(BaseConstant.WX_CACHE + scene);
            // 将sessionKey与token关联,存储到Redis
            redisTemplate.opsForValue().set(BaseConstant.WX_SESSION_KEY_CACHE_PREFIX + scene, sessionKey + StrPool.AMPERSAND + openid, 5, TimeUnit.MINUTES);

            return ResponseEntity.ok().build();
        } catch (WxErrorException e) {
            return ResponseEntity.status(500).body("登录失败");
        } catch (Exception e) {
            throw new CheckedException(e);
        } finally {
            WxMaConfigHolder.remove();//清理ThreadLocal
        }
    }

    @PostMapping("/bind-phone")
    @ApiOperation(value = "绑定手机号:根据手机号绑定用户openid")
    public ResponseEntity<?> bindPhone(@RequestBody @Validated LoginBindPhoneRequestAo bindPhoneRequest) {
        String scene = bindPhoneRequest.getScene();
        String encryptedData = bindPhoneRequest.getEncryptedData();
        String iv = bindPhoneRequest.getIv();
        log.info("绑定手机号入参,scene:{},encryptedData:{},iv:{}", scene, encryptedData, iv);

        // 从Redis获取sessionKey
        String sessionKeyAndOpenId = redisTemplate.opsForValue().get(BaseConstant.WX_SESSION_KEY_CACHE_PREFIX + scene);
        if (sessionKeyAndOpenId == null) {
            throw new CheckedException("Session已过期");
        }

        try {
            String[] split = sessionKeyAndOpenId.split(StrPool.AMPERSAND);
            String sessionKey = split[0];
            String openId = split[1];

            // 解密手机号
            WxMaPhoneNumberInfo phoneInfo = wxMaService.getUserService().getPhoneNoInfo(sessionKey, encryptedData, iv);
            if (phoneInfo == null || StringUtils.isBlank(phoneInfo.getPurePhoneNumber())) {
                throw new CheckedException("获取手机号失败");
            }

            BaseStaff staff = baseStaffService.getStaffByTelephone(phoneInfo.getPurePhoneNumber());
            ArgumentAssert.notNull(staff, "用户尚未录入,手机号:{}", phoneInfo.getPurePhoneNumber());
            ArgumentAssert.isTrue(StringUtils.isBlank(staff.getOpenId()), "手机号已绑定其他微信账号");

            BaseStaff baseStaff = new BaseStaff();
            baseStaff.setId(staff.getId());
            baseStaff.setOpenId(openId);
            baseStaffService.updateById(baseStaff);

            log.info("用户名已绑定openid:staffName:{},用户ID:{},openid:{}", staff.getStaffName(), staff.getId(), openId);

            redisTemplate.delete(BaseConstant.WX_SESSION_KEY_CACHE_PREFIX + scene);
            // 更新token状态为已确认,并关联用户ID
            redisTemplate.opsForValue().set(BaseConstant.WX_CACHE + scene, baseStaff.getId().toString(), 5, TimeUnit.MINUTES);

            return ResponseEntity.ok().body(Collections.singletonMap("success", true));
        } catch (Exception e) {
            throw new CheckedException(e);
        } finally {
            WxMaConfigHolder.remove();//清理ThreadLocal
        }
    }
}

1.4 小程序前端

1.4.1 页面:pages/index/index.wxml

<!--pages/index/index.wxml-->
<view wx:if="{{showAuthButton}}">
  <button 
    open-type="getPhoneNumber" 
    bindgetphonenumber="handleGetPhoneNumber"
  >授权手机号登录</button>
</view>

1.4.1 js文件

Page({
  data: { 
    showAuthButton: true, // 初始隐藏按钮
    scene: '' 
  },

  onLoad(options) {
    const scene = decodeURIComponent(options.scene);
    this.setData({ scene });
    this.loginAndSendCode(scene);
  },

  // 获取code并发送到后端
  loginAndSendCode(scene) {
    wx.login({
            success: function(res) {
              if (res.code) {
                // 发送 res.code 到后台换取 openId, sessionKey, unionId
                console.log('获取到code:', res.code);
                // 这里可以将code发送到你的服务器进行后续操作
                wx.request({
                  url: 'http://192.168.101.153:8100/base/api/miniapp/login',
                  method: 'post',
                  data: {
                    scene: scene,
                    code:res.code
                  },
                  success: function(res) {
                    console.log(res.data);
                  },
                  fail: function(res) {
                    console.log('请求失败', res);
                  }
                })
      
              } else {
                console.log('登录失败!' + res.errMsg);
              }
            },
            fail: function(err) {
              console.log('登录失败', err);
            }
          });
  },
  // 用户点击授权按钮
  handleGetPhoneNumber(e) {
    const { encryptedData, iv } = e.detail;
    console.log("this.data.scene=",this.data.scene)
    wx.request({
      url: 'http://192.168.101.153:8100/base/api/miniapp/bind-phone',
      method: 'POST',
      data: {
        "encryptedData": encryptedData,
        "iv":iv,
        scene: this.data.scene
      },
      success: (res) => {
        if (res.data.success) {
          wx.showToast({ title: '登录成功' });
        } else {
          wx.showToast({ title: '登录失败,请重试' });
        }
      }
    });
  }
});


微信扫一扫登录(使用小程序实现) 个人网站是无法接入微信扫一扫登录的,只能使用曲线救国的方式,采用小程序了,小程序是可以获取到微信用户的 UnionID 的。 首先第一步要注册一个小程序应用,很简单的,用邮箱申请即可,点击注册 注册完成之后就可以进行开发了,我后台服务使用的是node来写的 生成小程序二维码 要做扫一扫登录,二维码是不可少的,官方也提供了几种生成二维码的方式。查看生成方式 我使用的是A接口,详细信息可查看官方文档。 POST https://api.weixin.qq.com/wxa/getwxacode?access_t 阅读详情

相关推荐

小程序扫码登录pc后台

目录一、效果图二、前置条件三、实现逻辑四、PC后台页面代码1、后台登录页面2、扫码登录页面 3、请求到后端的接口qrcode.js五、微信小程序页面代码1、扫码登录按钮 2、确认授权页面AuthToPC3、请求到后端的接口qrcode.js 六、后端java处理代码1、定义扫码状态常量类 2、ScanController类(对应后台接口)3、WxScanController类(对应微信小程序接口)4、IScanService类 5、ScanService类基于uniapp小程序+若依后台微信用户登录后必须绑

无 981

用小程序来实现扫码登录

本文介绍了基于自有小程序实现扫码登录的技术方案,详细阐述了其核心原理与实现流程。相比传统微信开放平台方案,该方案具有自主可控、用户身份强关联、低成本等优势。文章从状态流转、轮询机制、技术栈选型、数据库设计等维度展开说明,并提供了Node.js+Redis的代码示例。同时深入探讨了安全机制、异常处理、性能优化等关键点,包括CSRF防护、防重放攻击、二维码过期策略等。最后针对部署架构、日志监控、测试方案等生产环境要素给出了具体建议。该方案适用于需要自主可控扫码登录功能的企业,尤其适合已有小程序的开发团队。

油墨香^-^的博客 5281

2021年最全教程!微信小程序开发详解

一、前期准备工作 1、注册微信小程序开发者账号 在官网注册页选择小程序注册即可,账号分为个人版和企业版: 个人版相对于企业版注册流程更为简单和宽松。 企业版注册需要支付认证费用,一般为300元,个人版不需要,企业版经过微信官方认证,更具有信誉度。 个人版更多只是一个展示的平台,企业版可以作为一个完整的平台,个人版不可以做商业性质的小程序,但是企业版可以,个人版不可以开通微信支付。 附近的小程序不显示个人版,只能通过搜索,扫码方式找到。 个人版不支持快速获取微信用户的手机号。 2、下载微信开发者工具 微信平

ETH 拯救世界 11万+

通过小程序实现微信扫码授权登录,网站接入微信扫码登录功能(免费)

网站如果想要实现微信扫码登录其实有很多种方案,常见的方案就是微信开放平台和微信公众号服务号。前者是目前大部分网站并且是微信认可的一种方式,后者是开发者发现服务号具备扫码关注后即可获取用户基本信息的能力后而开发的一种方式。

TANKING,开源开发者! 1万+

从零到一:个人开发者如何利用YunGouOS实现微信扫码登录的实战指南

本文为个人开发者提供了一份详细的实战指南,介绍如何利用YunGouOS快速、低成本地实现微信扫码登录功能。文章从原理剖析、服务开通、后端集成(Spring Boot示例)到前端实现(Vue示例),完整覆盖了从零到一的开发流程,并重点解决了个人开发者无需企业资质、低成本的痛点,帮助开发者高效构建安全的用户登录体系。

x2y3z4a5b的博客 761

PHP实现微信小程序扫码登录网页:5分钟部署的轻量级OAuth2方案

OAuth2.0是一种广泛应用的开放授权标准,它允许用户授权第三方应用访问其存储在服务提供者上的资源,而无需共享用户名和密码。其核心原理是通过颁发访问令牌(Access Token)来实现安全的授权流程,避免了凭证的直接暴露。在Web开发领域,OAuth2.0极大地简化了用户认证流程,提升了安全性和用户体验。微信小程序扫码登录正是OAuth2.0授权流程的一种创新实践,它将小程序的用户身份安全地授权给网页端。这种技术方案为开发者提供了一种便捷、安全的用户体系复用方式,尤其适用于后台管理工具、内部系统等需要快

weixin_34185512的博客 481

微信扫码登录asp php版,不用开放平台认证

现在好多网站都实现了微信扫码登录,或者扫码后绑定网站会员进行登录,本以为公众号平台就会提供代码,但经过无数遍认证的阅读公众平台文档和无数遍百度后,才知道要注册微信开放平台才可以,并且要每年300元认证费,好多小网站或者非盈利网站仅为这个功能花每年300的开放平台认证费也确实是浪费,于是我就琢磨可不可以绕开开发平台呢?百度上有人说可以通过小程序实现,但再去申请小程序也是麻烦,既然公众号能获取到会员的很多信息,并且能实现自动登录,我何不在公众平台下功夫?弄了半个多月总是写了出来,心路历程我附在最下面,有兴趣的朋

ccmap的博客 1515

WiFi大师小程序独立版源码部署:二维码连WiFi与微信手机号登录实战

实体店的WiFi连接是高频场景,但传统密码张贴方式体验差、也难留住顾客。二维码连接WiFi的背后是统一的WIFI: URI格式,将SSID、加密类型和密码编码为特定字符串,扫码后系统即可自动发起连接。围绕这一原理,小程序端负责展示WiFi列表并生成二维码,后端通过PHP和MySQL管理WiFi账号、扫码记录与手机号绑定关系。微信手机号登录则把一次性连接行为转化为可触达的会员资产,适合实体店搭建私域会员触点。WiFi大师小程序4.1.9独立版源码提供了一整套可独立部署的前后端工程,覆盖扫码连网、后台管理、手机

weixin_33834137的博客 151

vue-pc 微信网页授权-扫码登录授权

vue-pc 微信网页授权-扫码登录授权

郝峰vip的博客 8566

MEG预处理-Brainstorm

Brainstorm下载和安装 去Brainstorm官网进行下载:打开网页后,点击左侧Download;在跳出来的界面中进行简单的注册,注册完成后可以进行下载 解压后得到“brainstorm3”的文件夹,里面包含Brainstorm工具包的所有文件,把这个文件夹放在某个路径如"E:\matlab_tools\brainstorm3"即可 同样在某个路径建立空的文件夹命名为:brainstorm_db用于工具包运行过程中自动存储生成的文件,所以这个文件中生成的数据不要手动移动删除 在Matlab中,把.

AxeChen的博客 6124

PDF.js实现分片加载问题

PDF.js实现分片加载问题。

qq_32822693的博客 4977

uniapp微信多端登录的解读

小程序:利用微信提供的原生能力 (uni.login),体验最流畅。H5 网页:遵循标准的 OAuth 2.0 网页授权协议,根据是否在微信环境内,使用不同的授权入口 (vsqrconnect原生 App:依赖微信官方 SDK,并需要进行严格的平台相关配置(安卓的 AppID 签名,iOS 的 Universal Links)。

chaoxxggg的博客 1303

适合初学者的ROS机器人教程(1): Ubuntu下ROS创建自己的包和使用github下载的包

ROS如何创建自己的包 1. 首先创建catkin工作空间(如果你以及有了请忽略) $ mkdir catkin_ws # 创建一个文件夹里面计划放我们的项目,ws是workspace的缩写 $ cd catkin_ws # 将当前工作文件夹切换到catkin_ws这个文件夹 ~/catkin_ws$ catkin_make # 执行catkin_make创建一ROS项目 此时你的catkin_...

@司南牧|知乎|博客|易懂教程|李韬 3244

JAVA开发(java后端微信小程序接口总结)

在做小程序中,有时候需要前端调用后端的接口,后端调用微信的API。以达到微信认证,授权,获取用户的信息等。 现在对java后端微信小程序接口做一下总结。加深记忆,大家一起参考学习。

JAVA领域优质创作者,基于分片网络查询方法专利发明者。 4603

ICCV 2025 | 哈工大、清华等提出首个双曲学习框架:HLFormer,革新局部相关视频检索

离原点越远,代表的语义越具体(部分)。现有方法大多在传统的欧几里得空间中对视频和文本进行建模,但这往往会导致对视频内在层次结构的错误表示,从而影响检索的准确性。通过UMAP对学习到的帧嵌入进行可视化(如下图),可以观察到,来自同一时刻的视频帧在嵌入空间中聚集在一起,清晰地展示了模型对时序关系的捕捉能力。下图的双曲空间可视化进一步证实了模型的层次建模能力:离原点越近的点,代表的语义层级越高、粒度越粗糙,反之亦然。:既然文本查询描述的是视频的一部分,那么在几何表示上,文本的嵌入向量应该从属于视频的嵌入向量。

我爱计算机视觉 1080

日前日内多阶段多时间尺度源荷储协调调度(matlab代码)

多阶段多时间尺度的协调调度的优势是考虑新能源出力的波 动性与随机性,需求响应负荷的不确定性会对电网制定的日前调度计划准确性造成影响,也就是能够更加精准的进行调度和分析,优化结果的可用性更强。在这方面论文里面,金力的《考虑特性分布的储能电站接入的电网多时间尺度源储荷协调调度策略》就考虑了日前日内实时三个阶段调度,每个阶段考虑了不同负荷需求响应策略,同时考虑了负荷波动性的影响,具有很强的参考意义。 目录 一、模型 二、程序运行 三、程序链接 一、模型 负荷需求响应考虑电价型和激励型两种,电.

zhangxd212489的博客 7915

微信扫码登录背后的安全机制:如何正确处理用户绑定与openid管理

本文深入解析了微信扫码登录背后的安全机制,重点探讨了在高安全要求场景下如何正确处理用户绑定与openid管理。文章详细阐述了基于OAuth 2.0的授权流程、用户身份绑定的多种模式(如强制绑定手机号)、openid的安全存储策略(推荐加密存储),以及防御重放攻击、CSRF等常见安全威胁的实战方案,旨在帮助企业构建健壮、可扩展的第三方登录体系。

corn8的博客 545

通信算法之281:大疆DJI无人机ID-DJI DroneID开源工程-相关问题-协议信息问题

ZC序列的参数未知。但是,使用第一个或第二个零相关序列对每个OFDM符号进行相位调整,对于直接相邻于使用过的零相关序列的时间上的OFDM符号工作得很好,但对其它符号效果不佳。由于符号的顺序没有改变,而9 OFDM符号情况下的第一个OFDM符号没有用处,因此本存储库中的脚本对待所有突发都是有9个OFDM符号的,并且不对第一个OFDM符号做任何处理。棘手的地方在于需要生成比数据载波数量(始终为600)多1个的零相关序列,零化中间元素,将生成的样本映射到FFT的中心(采样率决定bin的数量),然后计算IFFT。

leegang12的专栏 1620

402-基本控制篇(阿里云物联网平台)-微信小程序扫码绑定EC800K并通过阿里云物联网平台实现远程通信控制

说明 这一节实现微信小程序扫码绑定模组并通过阿里云物联网平台实现远程通信控制. 概要: 微信小程序和单片机设备分别作为设备以动态注册方式连接阿里云物联网平台,然后通过规则引擎实现微信小程序和设备之间通信. 此节教程是前面所有知识点的整合,希望用户按部就班的学习了前面的内容,然后再学习此节. 微信小程序准备工作 1.在微信小程序平台上设置域名白名单(推荐) 域名为自己设备连接的MQTT服务器的IP地址: wss://{productKey} .iot-as-mqtt.

杨奉武的博客 1833

Winform从入门到精通(2)——Button(史上最全)

本文介绍winform中Button控件的详细用法,包括所有属性和事件

qq_34059233的博客 1万+

API深度集成——OpenClaw与第三方服务无缝对接(2026实战版)

本文介绍了OpenClaw系统与第三方服务的API深度集成技术,重点阐述了RESTful API的实现方案。通过一个功能完善的REST客户端类(RestClient)展示了核心功能:支持请求重试、拦截器机制、错误处理和认证管理等;同时提供了API资源管理器(ApiResourceManager)简化资源操作。这些技术实现了OpenClaw与外部系统的稳定可靠对接,为开发者构建API集成方案提供了2026年的最佳实践。

博客 1215

微信助手插件功能八十四:启用摄像头识别二维码

微信助手插件推出第84项功能:启用摄像头自动识别二维码。该功能可在开启摄像头时自动扫描识别二维码,无需手动对准或点击"扫一扫",适用于加好友、登录、支付等多种场景。使用方法简单,只需在插件中开启功能并重启微信即可。插件强调仅供学习研究,使用可能导致封号风险,需自行承担后果。该功能提升了二维码识别效率,但需注意摄像头权限和兼容性问题,不涉及自动跳转等操作。

分享 Windows 系统部署、镜像封装、终端管理、故障排查与运维自动化实践,涵盖 Sysinternals、PowerShell 和 AI 工具应用。以真实案例梳理排查思路与解决步骤,让运维经验清晰、可复用。 2万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

全平台登录实现指南:账号密码、验证码、微信支付宝、OAuth与扫码登录

本篇详细讲解前后端登录系统的完整实现方案,涵盖账号密码登录、图形验证码、短信验证码、微信登录、支付宝登录、第三方 OAuth 授权登录、自有扫码登录等常见业务场景。从登录流程、接口设计、数据库表结构、Token 鉴权、账号绑定、安全风控到 Vue3 + Spring Boot 代码实现,帮助开发者快速搭建一套安全、可扩展、适合真实项目的统一登录体系。

zzwokstyle的博客 298

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

别再只做微信登录了!聊聊支付宝扫码登录在特定场景下的优势与接入避坑指南

本文探讨了支付宝扫码登录在电商、政务等特定场景下的独特优势,包括高转化率、无缝支付衔接和实名信任体系。通过对比主流登录方案的数据表现,提供了接入支付宝扫码登录的技术实现细节和避坑指南,帮助开发者优化用户认证流程并提升商业价值。

weixin_30700099的博客 511

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

微信公众号扫码登录

大家生活上都离不开微信,微信支付,扫码登录,扫码识物等等,今天我来讲讲我是怎么做微信的扫码登录之一 --- 微信公众号的扫码登录,如果对公众号的扫码登录不太了解的话,可以先去看看蓝湖的扫码登录,本篇文章的登录跟蓝狐的扫码登录大致上是相同的(因为老板让我就按照蓝湖的扫码登录做,如果这里可以放表情包,我会放一个抖音的那种尴尬笑,哈哈哈),废话不多说,先来简单了解我的登录流程。这是我第一次写文章,内容可能很潦草,希望大家能沟多多包涵哈!

weixin_58075527的博客 1115

完整教程:十分钟学会如何发布微信小程序

完整教程:十分钟学会如何发布微信小程序

weixin_54164898的博客 8729
上一篇: 阿里云短信发送(工厂模式+模板方法+策略模式实现)
下一篇: bash脚本手动清空mysql表数据
seeyoutlb
博客等级 码龄9年 123粉丝 79原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值