微信授权登陆-app

app接入第三方微信登陆功能:

移动应用微信登录是基于OAuth2.0协议标准 构建的微信OAuth2.0授权登录系统,前提你需要到微信开放平台注册开发者帐号,并拥有一个已审核通过的移动应用,并获得相应的AppID和AppSecret,申请微信登录且通过审核后,可开始接入流程。

接入微信登陆授权步骤:

1. 第三方发起微信授权登录请求,微信用户允许授权第三方应用后,微信会拉起应用或重定向到第三方网站,并且带上授权临时票据code参数;

2. 通过code参数加上AppID和AppSecret等,通过API换取access_token;

3. 通过access_token进行接口调用,获取用户基本数据资源或帮助用户实现基本操作。

注意:同一个微信开放平台下绑定的用户,在不同的应用下用户的UnionID就是相同的,openId是不相同的。

获取access_token流程:

第一步:请求CODE:

需要app调起微信


第二步:通过code获取access_token:

请求路径:https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code

参数:

appid应用唯一标识,在微信开放平台提交应用审核通过后获得
secret应用密钥AppSecret,在微信开放平台提交应用审核通过后获得
code填写第一步获取的code参数
grant_type填authorization_code

 appid与secret需要通过注册获取。

第三步:通过access_token调用接口

获取access_token后,进行接口调用,有以下前提:

  • access_token有效且未超时;
  • 微信用户已授权给第三方应用帐号相应接口作用域(scope)。

代码:

请求微信工具类:

package com.maobc.util;import com.alibaba.fastjson.JSONObject;
import com.maobc.entity.jar.Member;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.HttpClients;
import org.apache.poi.ss.formula.functions.T;
import springfox.documentation.spring.web.json.Json;import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URI;/*** @program: maobc-small_routine* @description: app用户登陆* @author: z.hw**/
public class WeixinLoginUtils {/*** 微信登陆通过code获取accessToken* @param appId* @param userAppSecret* @param code* @return* @throws Exception*/public StringBuilder getAccessTokenBycode(String appId,String userAppSecret,String code) throws Exception{//查看官方文档 https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419317853&token=&lang=String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="+appId+"&secret="+userAppSecret+"&code="+code+"&grant_type=authorization_code";URI uri = URI.create(url);HttpClient client = HttpClients.createDefault();HttpGet get = new HttpGet(uri);HttpResponse response=client.execute(get);StringBuilder sb = new StringBuilder();if (response.getStatusLine().getStatusCode() == 200) {HttpEntity entity = response.getEntity();BufferedReader reader = new BufferedReader(new InputStreamReader(entity.getContent(), "UTF-8"));for (String temp = reader.readLine(); temp != null; temp = reader.readLine()) {sb.append(temp);}}return sb;}/*** access_token是否有效的验证* @param accessToken* @param openID* @return*/public boolean isAccessTokenIsInvalid(String accessToken,String openID) throws Exception{String url = "https://api.weixin.qq.com/sns/auth?access_token=" + accessToken + "&openid=" + openID;URI uri = URI.create(url);HttpClient client = HttpClients.createDefault();HttpGet get = new HttpGet(uri);HttpResponse response = client.execute(get);if (response.getStatusLine().getStatusCode() == 200) {HttpEntity entity = response.getEntity();BufferedReader reader = new BufferedReader(new InputStreamReader(entity.getContent(), "UTF-8"));StringBuilder sb = new StringBuilder();for (String temp = reader.readLine(); temp != null; temp = reader.readLine()) {sb.append(temp);}JSONObject object = JSONObject.parseObject(sb.toString().trim());int errcode = object.getInteger("errcode");if (errcode == 0) {//未失效return true;}}return false;}/*** access_token       接口调用凭证* expires_in        access_token接口调用凭证超时时间,单位(秒)* refresh_token     用户刷新access_token* openid           授权用户唯一标识* scope          用户授权的作用域,使用逗号(,)分隔* @param APP_ID*/public JSONObject refreshAccessToken(String APP_ID,String refreshToken) throws Exception{/*** access_token是调用授权关系接口的调用凭证,由于access_token有效期(目前为2个小时)较短,当access_token超时后,可以使用refresh_token进行刷新,access_token刷新结果有两种:** 1.若access_token已超时,那么进行refresh_token会获取一个新的access_token,新的超时时间;** 2.若access_token未超时,那么进行refresh_token不会改变access_token,但超时时间会刷新,相当于续期access_token。** refresh_token拥有较长的有效期(30天)且无法续期,当refresh_token失效的后,需要用户重新授权后才可以继续获取用户头像昵称。*/String uri = "https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=" + APP_ID + "&grant_type=refresh_token&refresh_token=" + refreshToken;HttpClient client = HttpClients.createDefault();HttpGet get = new HttpGet(URI.create(uri));HttpResponse response = client.execute(get);JSONObject object =new JSONObject();if (response.getStatusLine().getStatusCode() == 200) {BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "UTF-8"));StringBuilder builder = new StringBuilder();for (String temp = reader.readLine(); temp != null; temp = reader.readLine()) {builder.append(temp);}object = JSONObject.parseObject(builder.toString().trim());}return object;}/*** 得到用户基本信息* @param accessToken* @param openId* @param tClass* @return* @throws Exception*/public <T> T    getAppWeiXinUserInfo(String accessToken, String openId, Class<T> tClass) throws Exception{String uri = "https://api.weixin.qq.com/sns/userinfo?access_token="+accessToken+"&openid="+openId;HttpClient client = HttpClients.createDefault();HttpGet get = new HttpGet(URI.create(uri));HttpResponse response = client.execute(get);if (response.getStatusLine().getStatusCode() == 200) {BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "UTF-8"));StringBuilder builder = new StringBuilder();for (String temp = reader.readLine(); temp != null; temp = reader.readLine()) {System.out.println(temp);builder.append(temp);}return JSONObject.parseObject(builder.toString(), tClass);}return null;}}

controller: 

   /*** @Description:  app微信登陆* @Author: z.hw*/@RequestMapping(value = {"getUserInfoByAppCode"})@ApiOperation(value = "getUserInfoByAppCode", notes = "不分页", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)@ApiResponses(value = {@ApiResponse(code = 404, message = "Not Found"),@ApiResponse(code = 400, message = "No Name Provided"),})publicApiResult getUserInfoByApp(@Validated UserAppAuthority userAppAuthority){return memberService.getUserInfoByApp(userAppAuthority);}

请求体:

/*** @program: maobc-small_routine* @description: app微信授权* @author: z.hw**/
@Data
public class UserAppAuthority {//新旧app 用来备份 自定义数据@NotNull(message = "类型不能为空")@NotEmpty(message = "类型不能为空")private String type;//重点需要 app调起微信获取到的code@NotEmpty(message = "code不能为空")@NotNull(message = "code不能为空")private String code;}
ApiResult:
@Data
@ToString(callSuper = true)
@EqualsAndHashCode
public class ApiResult<T> implements Serializable {/*** 状态码* 0表示成功*/private String  code = "0000";/*** 状态信息*/private String msg = "调用成功";private Object result;。。。。。。。。。。。。。}

 业务层:

/*** @Description: 用户app微信登陆* @Param:* @return:* @Author: z.hw*/public ApiResult getUserInfoByApp(UserAppAuthority userAppAuthority) {try {Member member = new Member();BeanUtils.copyProperties(userAppAuthority, member);//调用微信授权WeixinLoginUtils weixinLoginUtils = new WeixinLoginUtils();StringBuilder stringBuilder = weixinLoginUtils.getAccessTokenBycode(commConfig.userAppID, commConfig.userAppSecret, userAppAuthority.getCode());if (stringBuilder != null) {if (stringBuilder.toString().trim().contains("errcode")) {return ApiResult.Fail();}JSONObject object = JSONObject.parseObject(stringBuilder.toString().trim());String accessToken = object.getString("access_token"); //接口调用凭证String openID = object.getString("openid"); //授权用户唯一标识//获取微信用户基本信息WeiXinParam appWeiXinUserInfo = weixinLoginUtils.getAppWeiXinUserInfo(accessToken, openID, WeiXinParam.class);// TODO 业务逻辑。。。。。。。。。。。。return ApiResult.build(member);}} catch (Exception e) {e.printStackTrace();}return MaobcApiResult.Fail();}
Member:

  


import lombok.*;import javax.persistence.*;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;/*** @author*/
@Entity
@Table(name = "cat_member")
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = false)
@AllArgsConstructor
@NoArgsConstructor
@Data
public class Member implements Serializable {private static final long serialVersionUID = -27353316177184L;@Id@GeneratedValue(strategy = GenerationType.AUTO)@Column(name = "id")private String id;/*** 账号状态:0 正常;1 冻结*/@Column(name = "status")private String status;/*** del_flag*/@Column(name = "del_flag")private String delFlag;/*** 手机*/@Column(name = "mobile_phone")private String mobilePhone;/*** 用户名*/@Column(name = "user_name")private String userName;/*** 邮箱*/@Column(name = "email")private String email;/*** 用户密码*/@Column(name = "password")private String password;/*** 昵称*/@Column(name = "nickname")private String nickname;/*** 性别*/@Column(name = "sex")private String sex;/*** 头像url*/@Column(name = "headimgurl")private String headimgurl;/*** 城市*/@Column(name = "city")private String city;/*** 国家*/@Column(name = "country")private String country;/*** 省份*/@Column(name = "province")private String province;/*** 语言*/@Column(name = "language")private String language;/*** 备注*/@Column(name = "remark")private String remark;/*** 生日*/@Column(name = "birthday")private String birthday;/*** 地址*/@Column(name = "address")private String address;/*** 会员积分*/@Column(name = "accumulate_points")private BigDecimal accumulatePoints;/*** 平台会员等级*/@Column(name = "level")private Integer level;/*** cat_membership会员类型表的ID*/@Column(name = "membership_id")private String membershipId;/*** 创建人*/@Column(name = "create_by")private String createBy;/*** 创建时间*/@Column(name = "create_date")private Date createDate;/*** 修改人*/@Column(name = "update_by")private String updateBy;/*** 修改时间*/@Column(name = "update_date")private Date updateDate;/*** 会员是否同意条款标识(0-未同意 1-同意)*/@Column(name = "item_status")private Integer itemStatus;private String openid;private String unionId;private String type;//是否绑定手机号码private String isBindedPhone;private String oauthId;private String memberId;private String outhId;}

WeiXinParam : 


import lombok.Data;@Data
public class WeiXinParam {String openid = "";String unionId = "";String sex = "1";String nickname = "";String city = "";String province = "";String country = "";String avatarUrl = "";String headimgurl="";}

参考资料:

微信开发平台:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&lang=zh_CN 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/42838.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Polkit授权管理

Polkit的配置&#xff1a; 查看polkit服务&#xff1a; 一个是agent&#xff0c;一个是polkit服务&#xff1b; agent包含监听接口和一个用户界面&#xff08;对话窗口&#xff09;&#xff0c;允许用户输入密码。Authentication Agent API Reference(https://www.freedesktop…

chatgpt赋能python:Python实现人脸识别

Python 实现人脸识别 随着人工智能技术的发展&#xff0c;人脸识别已经成为一个热门话题。Python作为一种流行的编程语言&#xff0c;也可以用来实现人脸识别。在这篇文章中&#xff0c;我们将介绍使用Python实现人脸识别的方法。 人脸识别的原理 人脸识别是通过计算机程序识…

比尔·盖茨到达北京;印度要求中国手机品牌高管应为印籍;Android 14 Beta 3 推出|极客头条...

「极客头条」—— 技术人员的新闻圈&#xff01; CSDN 的读者朋友们早上好哇&#xff0c;「极客头条」来啦&#xff0c;快来看今天都有哪些值得我们技术人关注的重要新闻吧。 整理 | 梦依丹 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 一分钟速览新闻点&#…

亚马逊高调入局ChatGPT大战,发布Titan大模型、AI编程助手全免费,CEO:改变所有体验...

MLNLP社区是国内外知名的机器学习与自然语言处理社区&#xff0c;受众覆盖国内外NLP硕博生、高校老师以及企业研究人员。 社区的愿景是促进国内外自然语言处理&#xff0c;机器学习学术界、产业界和广大爱好者之间的交流和进步&#xff0c;特别是初学者同学们的进步。 转载自 |…

【图像分割】TransUNet学习笔记

论文名称&#xff1a;TransUNet: Transformers Make Strong Encoders for Medical Image Segmentation 论文地址&#xff1a;https://arxiv.org/pdf/2102.04306.pdf 代码地址&#xff1a;https://github.com/Beckschen/TransUNet 前言&#xff1a; TransUNet将Transformer和U-…

什么是分镜?用UniStory管理分镜,制定拍摄计划和讨论故事板

分镜是什么 一部成功的电影、电视剧、广告、Vlog等视觉体验&#xff0c;都离不开分镜创作 分镜又叫做故事版&#xff0c;用于早期电影内容的策划和制作&#xff0c;在电影拍摄之前根据导演的要求&#xff0c;用图表的方式来说明影像的构成。一般120分钟的电影&#xff0c;需要2…

AI打LeetCode周赛进入前10%!秘诀:自然语言编程

张晓雅 投稿自 凹非寺量子位 | 公众号 QbitAI 还在自己吭哧吭哧打算法平台Leetcode的周赛&#xff1f;为什么不试试神奇的ChatGPT类AI呢&#xff01; 用AI助手Claude参加第103场周赛&#xff0c;共四道题&#xff0c;均完成了AC&#xff0c;能达到参与者前10%的成绩。 事情的起…

怎么做好电商运营?40份电商运营表格模板,你离优秀的运营只差了一个表格

怎么做好电商运营&#xff1f;40份电商运营表格模板&#xff0c;你离优秀的运营只差了一个表格 618又来了&#xff01;每年的这个时候&#xff0c;都是电商促销活动的高潮&#xff0c;各种优惠活动层出不穷&#xff0c;不管是对你是做电商运营的还是一个消费者&#xff0c;都很…

【跨境电商】EDM邮件营销完整指南(一):概念,区别与优势

关键词&#xff1a;EDM营销&#xff0c;邮件营销&#xff0c;跨境电商 2020年&#xff0c;全球每天发送和接收3064亿封电子邮件。世界上几乎每个人都有一个电子邮件地址&#xff0c;并且电子邮件营销继续拥有最高的投资回报率&#xff0c;这使得电子邮件营销策略对于企业营销工…

学习WooCommerce跨境电商社交媒体营销

WooCommerce 长期以来一直为电子商务店主提供多样化的服务。大约 500 万家商店啓用安装了免费的 WooCommerce 插件。 官方 WooCommerce 插件从 WordPress.org 下载了161,908,802次&#xff0c;并且还在增加。 超过5,106,506 个网站正在使用 WooCommerce。 本文网址: https…

跨境电商人才投放推特广告文案技巧

推特的用户群体广泛&#xff0c;非常适合跨境卖家作为广告投放的引流平台。那么对于跨境电商运营来说&#xff0c;投放推特广告有哪些文案技巧呢?下面海熹跨境人才网来给大家介绍一下&#xff0c;感兴趣的卖家一定不要错过哦。 首先&#xff0c;Twitter建议卖家采用“三R”法进…

文案把卖点被埋没?如此挖掘电商产品卖点,让你轻松获客

绝大部分电商卖家开店面临的最大问题就是不知道如何写文案&#xff0c;直接复制品牌的文案容易被告Q权&#xff0c;自己写的又不吸引人&#xff0c;复制竞争对手的更是无法脱颖而出。同时你也不知道这个文案到底好不好&#xff0c;在别人那里可行的文案&#xff0c;可能你就完全…

工作三年后的胡思乱想

大家好&#xff0c;我是若川。我持续组织了近一年的源码共读活动&#xff0c;感兴趣的可以 点此扫码加我微信 lxchuan12 参与&#xff0c;每周大家一起学习200行左右的源码&#xff0c;共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。历史面试…

如何通过抖音引流推广自己的产品?如何利用抖音引流营销推广?

自抖音公布迄今&#xff0c;短视频形式抖音一路在再次爆红&#xff0c;到当初为止已有着超出5亿的用户人潮了&#xff0c;咱们都晓得抖音是今日头条发的APP&#xff0c;也归属于字节扑腾的部手机硬件之一。当抖音粉絲量往低落时&#xff0c;其营销推广运用价格也被延续的挖掘进…

抖音网红是如何推广产品的?

在做Socialbook产品之前&#xff0c;咱们家做了相当长一段时间的网红推广&#xff0c;在业务开展期间&#xff0c;接触到了很多客户&#xff0c;涵盖各行各业&#xff0c;比如电商、实体店、游戏、应用、甚至黑五类的也来咨询&#xff0c;怎样让网红推广自家的产品&#xff0c;…

抖音小店推广的收益在哪里看到?抖音小店怎么推广?

流量是网络链路中最有价值的东西。抖音用户需要流量&#xff0c;他需要流量来充分曝光自己的作品;抖音官方需要流量&#xff0c;他需要流量让他的推送机制更加完善;淘宝网 在抖音上有很多人做小店都不是卖的自己的商品&#xff0c;而是只去做推广&#xff0c;然后拿去相应的佣…

抖音推广大师软件

简介&#xff1a; 石青抖音推广大师软件&#xff0c;发送的抖音信息到网站统计系统系统中。海量的站长群体&#xff0c;在维护站点流量时候&#xff0c;可以直接看到软件发送的信息。有相当一部分人会直接点击观看&#xff0c;或进入抖音加关注。 软件特色&#xff1a; 1、本…

GPT-4 用 Laf 三分钟写了个完整的待办事项 App

书接前文&#xff0c;上篇文章我们教大家如何三分钟时间用 Laf 实现一个自己的 ChatGPT。 一觉醒来&#xff0c;GPT-4 已经发布了&#xff01; GPT-4 实现了真正的多模态&#xff0c;可以把纸笔画的原型直接写出网页代码。读论文时还能理解插图含意。 好消息是&#xff0c;Chat…

(二)ChatGLM-6B模型部署以及ptuning微调详细教程

文章目录 介绍什么是ChatGLM-6BTorch安装ChatGLM-6B模型安装过程 Ptuning微调安装过程初始化环境训练准备自己的数据集 推理验证 问题和思考泛化学习simbert&#xff0c;不属于必学 介绍什么是ChatGLM-6B 下面是官方原话, 选择他的原因完全是因为可以消费级电脑上使用&#xff…

llama.cpp一种在本地CPU上部署的量化模型(超低配推理llama)

0x00 背景 前不久&#xff0c;Meta前脚发布完开源大语言模型LLaMA&#xff0c; 随后就被网友“泄漏”&#xff0c;直接放了一个磁力链接下载链接。 然而那些手头没有顶级显卡的朋友们&#xff0c;就只能看看而已了 但是 Georgi Gerganov 开源了一个项目llama.cpp ggergano…