微信登录接口

登录接口解析与接口测试用例 目录 一、登录接口解析 (1)登录接口文档 (2)登录接口解析 (3)测试用例 二、生成报告 (1)保存json ​​2.生成报告html 一、登录接口解析 (1)登录接口文档 基本信息 Path:/api/sys/login Method:POST 接口描述 请求参数 Headers 参数名称 是否必须 参数值 示例 备注 Content-Type ... 阅读详情

说明

1、接口使用了swagger注解,可以删掉不用;
2、微信登录接口需部署到服务器才能测试访问,成功示例:
在这里插入图片描述

pom.xml

	<!--okhttp3-->
	<dependency>
		<groupId>com.squareup.okhttp3</groupId>
		<artifactId>okhttp</artifactId>
		<version>3.10.0</version>
	</dependency>

application.yml

	wechat:
  		openUrl: https://api.weixin.qq.com/sns/jscode2session
  		appId: ***
  		appSecret: ***
  		grantType: authorization_code

RestWechatController.java

package com.ruoyi.api.wechat;

import com.ruoyi.api.wechat.domain.WechatLoginVo;
import com.ruoyi.api.wechat.service.IWechatLoginService;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * 微信授权登录
 * @author wangjiao
 * @version 1.0
 * @date 2020/4/23
 */
@Api(tags = "微信登录相关接口")
@RestController
@RequestMapping("/rest/wechat")
public class RestWechatController extends BaseController {
    @Autowired
    private IWechatLoginService service;

    @ApiOperation(value = "微信登录", notes = "登录实体Vo部分必填")
    @ApiImplicitParam(name = "wechatLoginVo", value = "登录实体Vo")
    @PostMapping("/login")
    @ResponseBody
    public AjaxResult login(@RequestBody WechatLoginVo entity) {
        return AjaxResult.success(service.login(entity));
    }

}

IWechatLoginService.java

package com.ruoyi.api.wechat.service;

import com.ruoyi.api.wechat.domain.WechatLoginVo;

/**
 * @author wangjiao
 * @version 1.0
 * @date 2020/4/23
 */
public interface IWechatLoginService {
    WechatLoginVo login(WechatLoginVo entity);
}

WechatLoginServiceImpl.java

	package com.ruoyi.api.wechat.service;

import com.alibaba.fastjson.JSONObject;
import com.aliyun.oss.ServiceException;
import com.ruoyi.admin.wechat.service.IEpWechatUserService;
import com.ruoyi.api.wechat.domain.EpWechatUser;
import com.ruoyi.api.wechat.domain.WechatLoginVo;
import com.ruoyi.api.wechat.util.WechatHttpUtils;
import com.ruoyi.api.wechat.util.WechatUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.io.IOException;
import java.util.Map;
import java.util.Objects;

/**
 * @author wangjiao
 * @version 1.0
 * @date 2020/4/23
 */
@Slf4j
@Service
public class WechatLoginServiceImpl implements IWechatLoginService {

    @Autowired
    private IEpWechatUserService service;

    @Value("${wechat.appId}")
    private String appId;

    @Value("${wechat.appSecret}")
    private String secret;

    @Value("${wechat.grantType}")
    private String grantType;

    @Value("${wechat.openUrl}")
    private String wechatOpenUrl;

    @Override
    public WechatLoginVo login(WechatLoginVo wechatLoginVo) {
        try {
            log.info("loginByCode进入=============" + wechatLoginVo.toString());
            WechatLoginVo returnVo = new WechatLoginVo();
            if (StringUtils.isBlank(wechatLoginVo.getCode())) {
                throw new RuntimeException("授权码不能为空");
            }
            Map<String, Object> wxResult = getOpenIdByHttpClient(wechatLoginVo.getCode());
            log.info(wxResult.toString());
            String sessionkey = "";
            if (wxResult.containsKey("session_key")) {
                sessionkey = wxResult.get("session_key").toString();
            }

            String openid = "";
            if (wxResult.containsKey("openid")) {
                openid = wxResult.get("openid").toString();
                log.info(openid);
                /**
                 * 如果已经注册过了 直接返回数据
                 */
                EpWechatUser epWechatUser = service.selectEntityByOpenId(openid);
                if (Objects.nonNull(epWechatUser)) {
                    BeanUtils.copyProperties(epWechatUser, returnVo);
                    return returnVo;
                }
            }
            if (StringUtils.isBlank(wechatLoginVo.getEncryptedData()) || StringUtils.isBlank(wechatLoginVo.getIv())) {
                throw new RuntimeException("加密的数据不能为空");
            }
            if (StringUtils.isBlank(sessionkey)) {
                throw new RuntimeException("授权信息有误");
            }
            JSONObject userInfo = WechatUtil.getUserInfo(wechatLoginVo.getEncryptedData(), sessionkey, wechatLoginVo.getIv());
            log.info(userInfo.toJSONString());
            returnVo = JSONObject.toJavaObject(userInfo, WechatLoginVo.class);
            //注册账号
            int result=insertWechatUser(returnVo);
            if(result>0){
                return returnVo;
            }
            throw new RuntimeException("注册账号失败");
        } catch (IOException e) {
            e.printStackTrace();
        }
        throw new RuntimeException("登录失败,服务器错误");
    }

    public Map<String, Object> getOpenIdByHttpClient(String code) throws IOException {
        WechatHttpUtils httpUtil = new WechatHttpUtils();
        String result = httpUtil.header("X-Requested-With", "XMLHttpRequest")
                .data("appid", appId)
                .data("secret", secret)
                .data("js_code", code)
                .data("grant_type", grantType)
                .url(wechatOpenUrl)
                .get();
        Map<String, Object> map = JSONObject.parseObject(result, Map.class);
        if (!map.containsKey("openid")) {
            throw new ServiceException("错误信息:" + map.get("errmsg"));
        }
        return map;
    }

    private int insertWechatUser(WechatLoginVo wechatLoginVo) {
        EpWechatUser entity = new EpWechatUser();
        BeanUtils.copyProperties(wechatLoginVo, entity);
        return service.insertEntity(entity);
    }
}

WechatUtil.java

	package com.ruoyi.api.wechat.util;

import com.alibaba.fastjson.JSONObject;
import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
import org.bouncycastle.jce.provider.BouncyCastleProvider;

import java.security.Security;
import java.util.Arrays;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.security.AlgorithmParameters;

/**
 * @author wangjiao
 * @version 1.0
 * @date 2020/4/23
 */
public class WechatUtil {
    public static JSONObject getUserInfo(String encryptedData, String sessionKey, String iv) {
        // 被加密的数据
        byte[] dataByte = Base64.decode(encryptedData);
        // 加密秘钥
        byte[] keyByte = Base64.decode(sessionKey);
        // 偏移量
        byte[] ivByte = Base64.decode(iv);

        try {
            // 如果密钥不足16位,那么就补足.  这个if 中的内容很重要
            int base = 16;
            if (keyByte.length % base != 0) {
                int groups = keyByte.length / base + (keyByte.length % base != 0 ? 1 : 0);
                byte[] temp = new byte[groups * base];
                Arrays.fill(temp, (byte) 0);
                System.arraycopy(keyByte, 0, temp, 0, keyByte.length);
                keyByte = temp;
            }
            // 初始化
            Security.addProvider(new BouncyCastleProvider());
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC");
            SecretKeySpec spec = new SecretKeySpec(keyByte, "AES");
            AlgorithmParameters parameters = AlgorithmParameters.getInstance("AES");
            parameters.init(new IvParameterSpec(ivByte));
            cipher.init(Cipher.DECRYPT_MODE, spec, parameters);// 初始化
            byte[] resultByte = cipher.doFinal(dataByte);
            if (null != resultByte && resultByte.length > 0) {
                String result = new String(resultByte, "UTF-8");
                return JSONObject.parseObject(result);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

WechatHttpUtils.java

	package com.ruoyi.api.wechat.util;

import lombok.extern.slf4j.Slf4j;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import org.apache.commons.lang.StringUtils;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.TimeUnit;

/**
 * @author wangjiao
 * @version 1.0
 * @date 2020/4/29
 */
@Slf4j
public class WechatHttpUtils {

    private Map<String, String> headers = new LinkedHashMap<>();
    private Map<String, String> queryParas = new LinkedHashMap<>();
    private String url = "";
    private Request.Builder requestBuilder = new Request.Builder();
    private OkHttpClient.Builder httpClient = new OkHttpClient().newBuilder().connectTimeout(10, TimeUnit.SECONDS).readTimeout(60, TimeUnit.SECONDS).writeTimeout(30, TimeUnit.SECONDS);

    public WechatHttpUtils header(String key, String value) {
        this.headers.put(key, value);
        return this;
    }

    public WechatHttpUtils data(String key, String value) {
        this.queryParas.put(key, value);
        return this;
    }

    public WechatHttpUtils url(String url) {
        this.url = url;
        return this;
    }

    /**
     * Send GET request
     *
     * @throws IOException
     */
    public String get() throws IOException {
        if (StringUtils.isEmpty(url)) {
            log.error("URL为空");
            return "";
        }

        requestBuilder.url(buildUrlWithQueryString(url, queryParas));
        for (Entry<String, String> entry : headers.entrySet()) {
            requestBuilder.addHeader(entry.getKey(), entry.getValue());
        }

        Request request = requestBuilder.build();
        Response response = httpClient.build().newCall(request).execute();

        if (!response.isSuccessful()) {
            throw new IOException("GET请求服务器端错误: " + response);
        }

        return response.body().string();
    }


    /**
     * Build queryString of the url
     */
    private static String buildUrlWithQueryString(String url, Map<String, String> queryParas) {
        if (queryParas == null || queryParas.isEmpty()) {
            return url;
        }

        StringBuffer sb = new StringBuffer(url);
        boolean isFirst;
        if (!url.contains("?")) {
            isFirst = true;
            sb.append("?");
        } else {
            isFirst = false;
        }

        for (Entry<String, String> entry : queryParas.entrySet()) {
            if (isFirst) {
                isFirst = false;
            } else {
                sb.append("&");
            }

            String key = entry.getKey();
            String value = entry.getValue();
            if (StringUtils.isEmpty(value)) {
                try {
                    value = URLEncoder.encode(value, "UTF-8");
                } catch (UnsupportedEncodingException e) {
                    throw new RuntimeException(e);
                }
            }
            sb.append(key).append("=").append(value);
        }
        return sb.toString();
    }

}

实战篇03:登录接口 请求路径:/user/login请求方式:POST接口描述:该接口用于登录。 阅读详情

相关推荐

微信小程序登录接口

在微信小程序的登录流程中,当用户触发登录操作后,小程序端会调用微信的登录接口获取一个临时的登录凭证(code)。微信接口服务的作用就是验证这个code的有效性,并返回相应的用户信息(如openid和会话密钥session_key)给开发者的服务器。它扮演了一个验证和授权的角色,确保只有经过验证的请求才能获得用户的身份信息,从而实现了安全的登录功能。它接收小程序端发送的临时登录凭证(code),然后利用这个code去请求微信接口服务,获取用户的openid和会话密钥(session_key)等信息。

qq_64005599的博客 1649

微信登录的接口

微信登录

weixin_38568503的博客 1万+

微信小程序登录Java后台接口(详解,附示例代码)

首先看一下官方文档地址:微信小程序官方文档API登录接口我们先对官方给的时序图进行简单的分析1.当小程序调用wx.login()时,会获得一个code(临时登录凭证),然后我们需要用wx.request()将code发送到自己的服务器.2.在服务器的接口中,调用登录凭证校检接口,将appid(小程序唯一标识)+appsecret(小程序的app secret)+code发送到微信接口服务.然后微信...

李俊标的博客 5万+

用户登录时需要设计的接口

这些是登录页面常见的接口设计,具体的功能和接口路径可以根据您的系统需求和设计进行调整。请注意,为了确保安全性,应使用适当的身份验证和授权机制,并采取措施来防止潜在的安全漏洞,例如密码加密、防止SQL注入等。

qq_46130027的博客 1418

微信小程序登录Java后台接口

微信小程序登录java后台接口 首先看一下微信小程序的开发文档: 微信小程序开发文档 步骤: 一级标题 二级 三级 表头 表头 表头 内容 内容 内容 内容 内容 内容 ...

shan_kylin的博客 9973

使用若依写微信小程序登录授权认证接口

本文教程,主要介绍一下,如何利用若依框架完成微信小程序的登录授权整个流程。 目录 一、注册微信小程序账号 二、获取AppID和AppSecret 三、微信小程序授权登录流程 四、编写微信小程序登录授权接口 五、编写简单微信小程序登录页面 六、测试微信授权登录接口 一、注册微信小程序账号 微信小程序官方注册地址:https://mp.weixin.qq.com/cgi-bin/registermidpage?action=index&lang=zh_CN&token= ..

猿小白的博客 1万+

对接微信登录接口

​​​​​​​。

三木的博客 1167

通信工程学习:什么是ASK振幅键控、FSK频移键控、PSK相移键控

ASK、FSK和PSK是三种基础数字调制技术。ASK通过改变载波振幅传输信息,实现简单但抗干扰弱;FSK利用频率变化传递信号,抗干扰较强但频谱利用率一般;PSK通过相位变化编码数据,抗干扰和频谱效率最优但同步要求高。三种技术各具特点,分别适用于不同通信场景:ASK用于低速光纤通信,FSK常见于无线广播,PSK则广泛应用于Wi-Fi、蓝牙等现代通信系统。

limengshi138392的博客 8718

微信登录接口调用步骤

WX开放平台申请网站应用,获得APPID和SECRET,第三方应用接入WX登录 APPID:xxxxxxxxxxxxxx SECRET:yyyyyyyyyyyyyyy 第一步:调用微信登录接口,用户扫码登录,生成code https://open.weixin.qq.com/connect/qrconnect?appid=xxxxxxxxxxxxxx&redirect_uri=https%...

weixin_40170892的博客 7325

高效低功耗设计:PMOS电子开关在墨水屏与ADC采样电路中的创新应用

本文深入探讨了PMOS电子开关在低功耗设计中的创新应用,特别是在墨水屏和ADC采样电路中的关键作用。通过详细分析PMOS的导通机制和近乎零静态功耗特性,展示了其在待机低功耗场景下的显著优势,并提供了实用的电路设计技巧和元器件选型建议,帮助工程师实现极致的功耗优化。

weixin_29193359的博客 161

【软件安装系列】Ubuntu+mysql5.7.27+Jira8.3.1+邮箱服务器配置+Confluence6.15.7安装经验和采坑总结

文章目录一、软件准备(百度云易被吞,就不放了)1.1 官网下载的新鲜的Jira和Confluence1.2 linux的jdk一份1.3 Jira和Confluence的破解程序或者破解包一份1.4 java的连接器一份二、安装过程1--java环境配置2.1 将下载下来的jdk包解压在/usr/local/java目录中2.2 写入环境变量三、安装过程2--mysql5.7.27环境配置3.1 ...

xiaosha_的博客 6890

三方接口对接-微信小程序登录

新增类CustomerUserController/*** * 用户管理*/@Slf4j@Api(tags = "客户管理")@Autowired/*** C端用户登录--微信登录* @param userLoginRequestDto 用户登录信息* @return 登录结果*/@ApiOperation("小程序端登录")接收参数类型UserLoginRequestDto/*** C端用户登录*/@Data@ApiModelProperty("昵称")

b1ngbing1的博客 4849

ARC学习(6)arc 编译器overlap 地址重叠方式使用

摘要:本文介绍了ARC编译器中使用overlap地址重叠的方法。

张一西的博客 717

微信登录接口开发

类职责主要实现了与微信服务端的交互功能,包括获取用户的openid、手机号和接口调用凭证。设计特点抽取公共参数封装方法,提高代码复用性。使用cn.hutool工具包简化 HTTP 请求和 JSON 数据解析,提高开发效率。关键点每个微信接口调用均需检查响应中的errcode,确保异常能够及时处理。返回值格式和 JSON 数据解析严格依据微信接口文档。以下是类及相关配置文件的详细解读。该类的主要职责是处理用户的微信登录业务逻辑,包括从微信获取用户信息、数据库的增删改查,以及生成 JWT 令牌。

zzb1580的博客 1845

从零构建知识图谱:本体工程与知识建模实战指南

本文是一份从零构建知识图谱的实战指南,重点阐述了知识建模与本体工程的核心地位。文章详细介绍了如何使用Protégé工具进行本体设计,包括定义领域、复用现有本体、构建类层次与属性约束,并讲解了如何利用D2RQ工具将关系数据库数据转换为RDF三元组,最终通过Apache Jena Fuseki搭建SPARQL端点进行知识查询与推理,让知识图谱真正“活”起来。

weixin_29057695的博客 568

如何在R语言中使用Logistic回归模型

在日常学习或工作中经常会使用线性回归模型对某一事物进行预测,例如预测房价、身高、GDP、学生成绩等,发现这些被预测的变量都属于连续型变量。然而有些情况下,被预测变量可能是二元变量,即成功或失败、流失或不流失、涨或跌等,对于这类问题,线性回归将束手无策。这个时候就需要另一种回归方法进行预测,即Logistic回归。 在实际应用中,Logistic模型主要有三大用途: 1)寻找危险因素,找到某些影响...

weixin_34056162的博客 9552

微信登录接口实现

文章目录微信登录实现 微信登录实现 controller import com.demo.Result; import org.springframework.web.bind.annotation.RequestMethod; @RestController public class LoginController { @ApiOperation(value = "微信登录", notes = "微信登录", response = Result.class) @ApiImplic

David_FY的博客 928

DeepQA: A Unified Transcriptome-Based Aging Clock Using Deep Neural Networks

摘要: 本研究针对转录组衰老时钟存在的关键局限——仅在健康样本训练导致对患病个体预测偏差的问题,提出DeepQA,一种基于专家混合架构与新型Hinge-MAE损失函数的深度学习模型。通过同时利用健康与患病个体的异质数据训练,DeepQA显著提升预测精度:在健康个体上MAE比现有方法低1.5年,且是首个能正确处理五类疾病条件的模型。其创新性体现在: 方法学突破:Hinge-MAE损失函数消除健康/患病样本的训练偏差,专家混合架构高效整合多队列数据; 流程革新:摒弃传统基因预筛选步骤,通过显著图分析直接识别衰老

qq_44050612的博客 124

php微信登录app接口开发文档,微信授权登录并获取用户信息接口

近排在做微信接口开发,所以总结一下微信授权登录并获取用户信息 这个接口的开发流程。一、首先你的微信公众号要获得相应的AppID和AppSecret,申请微信登录且通过审核后,才可开始接入流程。二、授权流程1、流程说明(1). 第三方发起微信授权登录请求,微信用户允许授权第三方应用后,微信会拉起应用或重定向到第三方网站,并且带上授权临时票据code参数;(2). 通过code参数加上AppID和Ap...

weixin_42537831的博客 1619

python实现纵横向拉开档次法 (附完整源码)

python实现纵横向拉开档次法 (附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 778

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

微信php第三方登录接口,ThinkPHP实现微信三方登录

小插曲就是app做微信三方登录是很久之前,后面又添加了PC的微信三方登陆,而文档上说unionid是同一个账号下不同应用统一的,但是app拿的是uid,导致pc拿的unionid始终对不上,导致浪费了一天的时间都在需找资料统一的问题,还有问题是解决了!希望小伙伴们做app的和pc微信三方登陆的时候一定要注意,app和pc都要拿unionid!好了下面就开始教大家怎么整合PC的微信三方登陆了:1、申...

weixin_34856548的博客 699

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

jmeter进行微信小程序登录接口code的获取

jmeter进行微信小程序登录接口code的获取

m0_65856970的博客 6126

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

微信授权登录接口合集

1、获取短信验证码 @PostMapping("/msg") @ApiOperation(value = "发送验证码", httpMethod = "POST") public R getMsg(@RequestBody String phone) { R r = new R(); boolean matches = phone.matches("^[0-9]*$"); ...

ANGEL CITY 3223

关于优快云微信登录接口的研究

代码 import requests import re from threading import Thread import time import requests from io import BytesIO import http.cookiejar as cookielib from PIL import Image import sys import psutil requests...

Hello_wshuo 1万+
上一篇: JXLS模板导出excel--项目版
下一篇: 微信支付接口
夕颜以北
博客等级 码龄9年 30粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值