第三方网站微信登录实现

news/2024/5/9 12:12:20/文章来源:https://blog.csdn.net/Gjc_csdn/article/details/80023286
好记性不如烂笔头!且 coding 且记下^^

  前两个星期在公司中的项目加上了微信登录、绑定的功能,在这里做个记录!

一、开发前知识

  1、微信开放平台与微信公众平台的区别

    1.1 微信公众平台:  

    ① 地址:  https://mp.weixin.qq.com/cgi-bin/loginpage?t=wxm2-login&lang=zh_CN

    ② 微信公众平台面向的是普通的用户,比如自媒体和媒体,企业官方微信公众账号运营人员使用,当然你所在的团队或者公司有实力去开发一些内容,也可以调用公众平台里面的接口,比如自定义菜单,自动回复,查询功能。

    1.2 微信开放平台:  

    ① 地址:  https://open.weixin.qq.com/

    微信开放平台:面向的是开发者和第三方独立软件开发商。开放平台的文档似乎包含了微信开放平台文档里面的接口。

  2、微信公众平台目前只支持80端口,且项目上传到服务器上面不容易debug啊?

    解决方法: ngrok 工具,可以根据本地项目映射成外网可以访问的地址、端口,默认映射为80端口。

      官网:       https://dashboard.ngrok.com

      存在问题: 每次重启,域名会变化,都需要项目中、微信公众平台配置,付费可以固定域名。。。

    使用方法: ① 注册后获得一个授权码,下载 ngrok

          ② 》CMD 进入 ngrok 目录

            》ngrok authtoken 授权码

            》ngrok http 8080

         ③看到这个页面,ngrok就为你分配了临时访问通道成功了^^

二、配置

  (每个微信号可以申请成为开发者测试账号进行微信功能开发的。)

  1、在公众平台中进行配置:

    地址: http://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/index

    ①:配 置 “接口配置信息” (Token 在项目中我是配置为"handsomeKing",没错,我就是King ^^)

url 改为自己映射的域名

好了,可以愉快的 coding 了!!!

三、可以开发啦

    1、上面的 “接口配置信息” 配置得 wechat/ownerCheck 方法是验证 这个url 为我自己的,handsomeKing 就是这个方法中的一个参数。微信这个小朋友会用Get方法带上4个参数给我服务器: signature(签名)、timestamp(时间戳)、nonce(随机数)、echostr(随机字符串),再加上咱们项目中自己配置的 token ,通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败:(talk is cheap, show me the code *&)


 /*** 微信消息接收和token验证* @param model* @param request* @param response* @throws IOException*/@RequestMapping("/ownerCheck")public void ownerCheck(Model model, HttpServletRequest request,HttpServletResponse response) throws IOException {System.out.println(111);boolean isGet = request.getMethod().toLowerCase().equals("get");PrintWriter print;if (isGet) {// 微信加密签名String signature = request.getParameter("signature");// 时间戳String timestamp = request.getParameter("timestamp");// 随机数String nonce = request.getParameter("nonce");// 随机字符串String echostr = request.getParameter("echostr");// 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败if (signature != null && CheckoutUtil.checkSignature(signature, timestamp, nonce)) {try {print = response.getWriter();print.write(echostr);print.flush();} catch (IOException e) {e.printStackTrace();}}}}
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;public class CheckoutUtil {// 与接口配置信息中的Token要一致private static String token = "handsomeKing";/*** 验证签名* * @param signature* @param timestamp* @param nonce* @return*/public static boolean checkSignature(String signature, String timestamp, String nonce) {String[] arr = new String[] { token, timestamp, nonce };// 将token、timestamp、nonce三个参数进行字典序排序// Arrays.sort(arr);sort(arr);StringBuilder content = new StringBuilder();for (int i = 0; i < arr.length; i++) {content.append(arr[i]);}MessageDigest md = null;String tmpStr = null;try {md = MessageDigest.getInstance("SHA-1");// 将三个参数字符串拼接成一个字符串进行sha1加密byte[] digest = md.digest(content.toString().getBytes());tmpStr = byteToStr(digest);} catch (NoSuchAlgorithmException e) {e.printStackTrace();}content = null;// 将sha1加密后的字符串可与signature对比,标识该请求来源于微信return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false;}/*** 将字节数组转换为十六进制字符串* * @param byteArray* @return*/private static String byteToStr(byte[] byteArray) {String strDigest = "";for (int i = 0; i < byteArray.length; i++) {strDigest += byteToHexStr(byteArray[i]);}return strDigest;}/*** 将字节转换为十六进制字符串* * @param mByte* @return*/private static String byteToHexStr(byte mByte) {char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };char[] tempArr = new char[2];tempArr[0] = Digit[(mByte >>> 4) & 0X0F];tempArr[1] = Digit[mByte & 0X0F];String s = new String(tempArr);return s;}public static void sort(String a[]) {for (int i = 0; i < a.length - 1; i++) {for (int j = i + 1; j < a.length; j++) {if (a[j].compareTo(a[i]) < 0) {String temp = a[i];a[i] = a[j];a[j] = temp;}}}}
}

2、用户用户同意授权,获取微信服务器传过来的俩参数: code、state。其中:

APPID: 微信开发者测试账号
REDIRECT_URI: 同意授权后跳转的 URL
/*** 第一步:用户同意授权,获取code(引导关注者打开如下页面:)*  获取 code、state*/public static String getStartURLToGetCode() {String takenUrl = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect";takenUrl= takenUrl.replace("APPID", Param.APPID);takenUrl= takenUrl.replace("REDIRECT_URI", URL.encode(Param.REDIRECT_URI));//FIXME : snsapi_userinfotakenUrl= takenUrl.replace("SCOPE", "snsapi_userinfo");System.out.println(takenUrl);return takenUrl;}

3、获取微信用户的 access_token、openid

APPID: 微信开发者测试账号
secret: 微信开发者测试账号密码
code:  上一步的 code
/*** 获取access_token、openid* 第二步:通过code获取access_token* @param code url = "https://api.weixin.qq.com/sns/oauth2/access_token*                      ?appid=APPID*                      &secret=SECRET*                      &code=CODE*                      &grant_type=authorization_code"* */public static OAuthInfo getAccess_token(String code){String authUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code ";authUrl= authUrl.replace("APPID", Param.APPID);authUrl = authUrl.replace("SECRET", Param.SECRET);authUrl = authUrl.replace("CODE", code);String jsonString = HTTPRequestUtil.sendPost(authUrl,"");System.out.println("jsonString: " + jsonString);OAuthInfo auth = null;try {auth = (OAuthInfo) JacksonUtil.parseJSONToObject(OAuthInfo.class, jsonString);} catch (Exception e) {e.printStackTrace();}return auth;}

4、在数据库中查询 openid

  我是定义了一个对象 OauthInfo,包括 openid(用户的标识)属性。。。

  查询时库中存在就直接登录啦,不存在就先去登录页,将登录账号同 openid 绑定。

/*** 微信引导页进入的方法* @return*/@RequestMapping("/loginByWeiXin")public String loginByWeiXin(HttpServletRequest request, Map<String, Object> map) {// 微信接口自带 2 个参数String code = request.getParameter("code");String state = request.getParameter("state");System.out.println("code = " + code + ", state = " + state);if(code != null && !"".equals(code)) {// 授权成功, 微信获取用户openIDOAuthInfo authInfo = WeiXinUtil.getAccess_token(code);String openid = authInfo.getOpenid();String access_token = authInfo.getAccess_token();if(access_token == null) {// Code 使用过 异常System.out.println("Code 使用过 异常.....");return "redirect:" + WeiXinUtil.getStartURLToGetCode();}// 数据库中查询微信号是否绑定平台账号SysUser sysUser = weiXinService.getUserByWeiXinID(openid);if(sysUser == null) {String randomStr = StringUtil.getRandomString(50);request.getSession().setAttribute(openid, randomStr);// 尚未绑定账号System.out.println("尚未绑定账号.....");return "redirect:/index.jsp?openid=" + openid + "&state=" + randomStr;}userController.doSomeLoginWorkToHomePage(sysUser.getMcid(), map);// 登录成功return "homePage";} // 未授权return "redirect:" + WeiXinUtil.getStartURLToGetCode();}




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

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

相关文章

组策略让恶意网站修改靠边站(转)

组策略让恶意网站修改靠边站(转)[more]有很多个人网站站长&#xff0c;为了片面的追求高页面访问&#xff0c;于是处心积虑的在网页上做了种种手脚&#xff0c;只要访问者去过这样的页面&#xff0c;那么访问者的IE浏览器的默认主页、标题等都可能变成恶意网站指定的内容&#…

蚂蚁变大象:浅谈常规网站是如何从小变大的

2005年&#xff0c;我开始和朋友们开始拉活儿做网站&#xff0c;当时第一个网站是在linux上用jsp搭建的&#xff0c;到后来逐步的引入了多种框架&#xff0c;如webwork、hibernate等。在到后来&#xff0c;进入公司&#xff0c;开始用c/c&#xff0c;做分布式计算和存储。&…

阿里云服务器域名nginx配置ssl证书后无法访问网站

阿里帮助文档 按照阿里云帮助中心的文档所说去部署后&#xff0c;发现网站无法访问了 解决思路 确定还没配置前http的能正常访问配置证书并重启nginx后无法访问了最后确定是端口阿里的安全组那里并没开启443端口允许&#xff0c;导致的无法正常访问去安全组添加一个入方向的4…

网站UI设计小工具

2019独角兽企业重金招聘Python工程师标准>>> balsamiq mockups for desktop 就是这个东西&#xff0c;很好用&#xff01; 转载于:https://my.oschina.net/kevinvane/blog/67879

网站弹出“位于Google Code SubversionRepository 的服务器……”的解决办法

打开网站时出现此"位于Google Code SubversionRepository 的服务器bijioc.googlecode.com要求用户名和密码。警告&#xff1a;此服务器要求以不安全的方式发送您的用户名和密码&#xff08;没有安全链接的基本认证&#xff09;。" 对话框&#xff0c; 这是被恶意灌注…

StartSSL免费SSL证书成功申请-HTTPS让访问网站更安全

http://www.freehao123.com/startssl-ssl/ 昨天写了更换空间后重新安装Godaddy SSL的文章&#xff0c;突然想到了一直有朋友向部落提到的StartSSL免费SSL证书服务&#xff0c;虽然说5.99美元一年SSL证书价格不是很贵&#xff0c;但是应该还是有朋友喜欢用一些免费SSL证书。 St…

Web开发必知必会,如何使用 Letsencrypt 为网站签发 HTTPS 证书提供安全支持

在做 Web 开发中&#xff0c;对网站内容的基本安全加密就是使用 HTTPS&#xff0c;并且在一些重视安全性的软件中&#xff0c;HTTPS 必不可少&#xff0c;微信开发中配置的域名强制使用 HTTPS&#xff0c;parse-dashboard 的配置连接必须使用 HTTPS&#xff0c;等等。 现在可以…

如何为网站应用接入第三方微信登录

Web 网站的用户登录注册方式有用户名密码登录、验证码登录、OAuth 第三方授权登录等。 常用的第三方登录有 QQ、微信、微博、GitHub、知乎等&#xff0c;一般用户常用微信扫码授权的登录方式&#xff0c;今天介绍一下网站接入微信登录的方法。 应用申请 网站应用中接入微信登…

python爬虫: 爬取boss网站数据 保存到mysql

爬取boss数据并保存到mysql boss的反爬虫控制尤其恶心 cookies大概用3次左右就不能用了 所以爬取不了太多东西 只可用来学习 等学习完逆向爬虫课程 再来挑战挑战 example.py import scrapy from bs4 import BeautifulSoup from boos_scrapy.items import BoosScrapyItem from…

程序员接私活的必备10个网站

大家好&#xff0c;我是小铁。一个实力与逗比的结合体。 今天不讲技术了&#xff0c;我来给大家推荐一些程序员接私活的网站。 开发帮 http://www.52solution.com/kb 外包大师http://www.waibaodashi.com/ 猿急送https://www.yuanjisong.com/ 解放号https://www.jfh.com/ …

今天看了下网站:龙悦居社区网,alexa排名了

2019独角兽企业重金招聘Python工程师标准>>> 建站快1个月了&#xff0c;以前一直在alexa没有排名信息&#xff0c;今天一查&#xff0c;有排名了 转载于:https://my.oschina.net/u/257088/blog/140426

java实现电话的呼叫转移_「呼叫转移设置」呼叫转移流程分析(一) - seo实验室...

呼叫转移设置Android5.0之后的版本&#xff0c;手机的CallSetting设置一般在package/APPs/service/Telephony中下面为呼叫转移流程图&#xff0c;包括应用层与RIL的request1.CallFeartureSettingActivity.java为通话设置入口//在谷歌的源码中没有这个类&#xff0c;可以直接看2…

织梦定时更新栏目html,网站栏目添加与维护

1. 网站栏目添加与维护1.1. 网站栏目管理网站栏目管理是网站的核心部分&#xff0c;是网站内容添加的前提条件。网站栏目也是网站首页的导航条&#xff0c;有着引导网站用户的作用。同时他还是网站地图&#xff0c;在后台生成的百度Sitemap中就有相关的栏目内容。网站栏目在网站…

png 微软ppt 透明度_挖到一个宝藏级的PPT素材网站,哭着五星好评,免费又实用...

今天分享一个超级实用的PPT素材网站&#xff0c;有了它&#xff0c;就再也不用去各大图片素材网站上费尽心机的找背景图了。好了&#xff0c;不兜圈子了&#xff01;直接上网址&#xff1a;Undraw网址&#xff1a;https://undraw.co/illustrations网站上都是一些简约风格的插画…

Google Analytics SEO 实时 网站 访问量 统计

说明&#xff1a; 之前一直在想要怎么才能让aplexos.com域名网站能够统计访问量&#xff0c;网站是使用github.io搭建&#xff0c;不好统计静态网站访问量&#xff0c;想借助工具&#xff0c;但是效果不好&#xff0c;不小心看Google Analytics&#xff0c;然后就注册了…

web漏洞扫描工具_ubuntu linux系统下web网站敏感目录漏洞扫描工具

大家好&#xff0c;今天我们来介绍下&#xff1a;web网站敏感目录漏洞扫描工具一、CansionCansina一款用于发现网站的敏感目录和内容的安全测试工具&#xff0c;通过分析服务器的响应进行探测并使用sqlite保证数据持久性特性多线程HTTP/S 代理支持数据持久性 (sqlite3)多后缀支…

python手机端给电脑端发送数据_手机端网站和pc端网站差别大吗

如今是互联网营销的时代&#xff0c;要做好企业的网络营销&#xff0c;那么企业的网站是一个利器&#xff0c;因为网站不仅可以展示企业的文化、产品&#xff0c;还可以通过在搜索引擎的排名给企业带来流量&#xff0c;让企业网站排名和流量都会增加&#xff0c;现在智能手机越…

多网站情况下配置nginx 301 永久重定向

2019独角兽企业重金招聘Python工程师标准>>> 已经配置成功2个网站在lnmp环境下 修改其中一个网站的301重定向 Step 1&#xff1a; 虚拟主机配置文件 xxx.com.conf 修改成&#xff1a; server_name xxx.com; index index.html index.htm index.php defau…

中关村网站产品参数页的参数纠错的制作

今天突然想在正在做的网站中加上个像中关村一样的参数纠错的功能&#xff0c;效果如下图&#xff1a; 虽然看起来好像蛮简单&#xff0c;但是自己还是想了一下午加上晚上的2个小时&#xff0c;不过等到自己做出来的时候好像也感觉到蛮简单的&#xff0c;其实这种web页面的小特效…

电子商务网站IDC网络拓扑设计

这个拓扑是我为之前公司设计的线上环境的拓扑看着很简单&#xff0c;可是这是我为了让别人看懂而一再精简的&#xff0c;里面把很多实施细节忽略掉了说下要想完成这个拓扑需要的知识储备&#xff1a;至少需要CCNP相当的水平这里面用到了动态路由协议&#xff0c;VLAN划分&#…