Java后台如何实现支付宝第三方登录接口口

没有更多推荐了,
不良信息举报
举报内容:
开放平台-web实现QQ第三方登录
举报原因:
原文地址:
原因补充:
最多只允许输入30个字
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!java后台调用HttpURLConnection类模拟浏览器请求实例(可用于接口调用)
转载 &发布时间:日 11:35:43 & 投稿:shichen2014
这篇文章主要介绍了java后台调用HttpURLConnection类模拟浏览器请求实例,该实例可用于接口调用,具有一定的实用价值,需要的朋友可以参考下
一般在项目开发中难免遇到外部接口的调用,本文实例讲述了java后台调用HttpURLConnection类模拟浏览器请求的方法。可用于接口调用。分享给大家供大家参考。具体实现方法如下:
代码如下:package com.cplatform.movie.back.
import java.io.BufferedR
import java.io.DataOutputS
import java.io.InputStreamR
import java.net.HttpURLC
import java.net.URL;
import java.net.URLE
public class HttpURLConnectionTest {
&&& public static final String GET_URL = "http://112.4.27.9/mall-back/if_user/store_list?storeId=32";
&&& public static final String POST_URL = "http://112.4.27.9/mall-back/if_user/store_list";
&&&& * 接口调用 GET
&&& public static void httpURLConectionGET() {
&&&&&&& try {
&&&&&&&&&&& URL url = new URL(GET_URL);&&& // 把字符串转换为URL请求地址
&&&&&&&&&&& HttpURLConnection connection = (HttpURLConnection) url.openConnection();// 打开连接
&&&&&&&&&&& connection.connect();// 连接会话
&&&&&&&&&&& // 获取输入流
&&&&&&&&&&& BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream()));
&&&&&&&&&&& S
&&&&&&&&&&& StringBuilder sb = new StringBuilder();
&&&&&&&&&&& while ((line = br.readLine()) != null) {// 循环读取流
&&&&&&&&&&&&&&& sb.append(line);
&&&&&&&&&&& }
&&&&&&&&&&& br.close();// 关闭流
&&&&&&&&&&& connection.disconnect();// 断开连接
&&&&&&&&&&& System.out.println(sb.toString());
&&&&&&& } catch (Exception e) {
&&&&&&&&&&& e.printStackTrace();
&&&&&&&&&&& System.out.println("失败!");
&&&& * 接口调用& POST
&&& public static void httpURLConnectionPOST () {
&&&&&&& try {
&&&&&&&&&&& URL url = new URL(POST_URL);
&&&&&&&&&&&
&&&&&&&&&&& // 将url 以 open方法返回的urlConnection& 连接强转为HttpURLConnection连接& (标识一个url所引用的远程对象连接)
&&&&&&&&&&& HttpURLConnection connection = (HttpURLConnection) url.openConnection();// 此时cnnection只是为一个连接对象,待连接中
&&&&&&&&&&&
&&&&&&&&&&& // 设置连接输出流为true,默认false (post 请求是以流的方式隐式的传递参数)
&&&&&&&&&&& connection.setDoOutput(true);
&&&&&&&&&&&
&&&&&&&&&&& // 设置连接输入流为true
&&&&&&&&&&& connection.setDoInput(true);
&&&&&&&&&&&
&&&&&&&&&&& // 设置请求方式为post
&&&&&&&&&&& connection.setRequestMethod("POST");
&&&&&&&&&&&
&&&&&&&&&&& // post请求缓存设为false
&&&&&&&&&&& connection.setUseCaches(false);
&&&&&&&&&&&
&&&&&&&&&&& // 设置该HttpURLConnection实例是否自动执行重定向
&&&&&&&&&&& connection.setInstanceFollowRedirects(true);
&&&&&&&&&&&
&&&&&&&&&&& // 设置请求头里面的各个属性 (以下为设置内容的类型,设置为经过urlEncoded编码过的from参数)
&&&&&&&&&&& // application/x-javascript text/xml-&xml数据 application/x-javascript-&json对象 application/x-www-form-urlencoded-&表单数据
&&&&&&&&&&& connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
&&&&&&&&&&&
&&&&&&&&&&& // 建立连接 (请求未开始,直到connection.getInputStream()方法调用时才发起,以上各个参数设置需在此方法之前进行)
&&&&&&&&&&& connection.connect();
&&&&&&&&&&&
&&&&&&&&&&& // 创建输入输出流,用于往连接里面输出携带的参数,(输出内容为?后面的内容)
&&&&&&&&&&& DataOutputStream dataout = new DataOutputStream(connection.getOutputStream());
&&&&&&&&&&& String parm = "storeId=" + URLEncoder.encode("32", "utf-8"); //URLEncoder.encode()方法& 为字符串进行编码
&&&&&&&&&&&
&&&&&&&&&&& // 将参数输出到连接
&&&&&&&&&&& dataout.writeBytes(parm);
&&&&&&&&&&&
&&&&&&&&&&& // 输出完成后刷新并关闭流
&&&&&&&&&&& dataout.flush();
&&&&&&&&&&& dataout.close(); // 重要且易忽略步骤 (关闭流,切记!)
&&&&&&&&&&&
&&&&&&&&&&& System.out.println(connection.getResponseCode());
&&&&&&&&&&&
&&&&&&&&&&& // 连接发起请求,处理服务器响应& (从连接获取到输入流并包装为bufferedReader)
&&&&&&&&&&& BufferedReader bf = new BufferedReader(new InputStreamReader(connection.getInputStream()));
&&&&&&&&&&& S
&&&&&&&&&&& StringBuilder sb = new StringBuilder(); // 用来存储响应数据
&&&&&&&&&&&
&&&&&&&&&&& // 循环读取流,若不到结尾处
&&&&&&&&&&& while ((line = bf.readLine()) != null) {
&&&&&&&&&&&&&&& sb.append(bf.readLine());
&&&&&&&&&&& }
&&&&&&&&&&& bf.close();&&& // 重要且易忽略步骤 (关闭流,切记!)
&&&&&&&&&&& connection.disconnect(); // 销毁连接
&&&&&&&&&&& System.out.println(sb.toString());
&&&&&&& } catch (Exception e) {
&&&&&&&&&&& e.printStackTrace();
&&& public static void main(String[] args) {
//&&&&&&& httpURLConectionGET();
&&&&&&& httpURLConnectionPOST();
希望本文所述对大家的Java程序设计有所帮助。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具最近增加了,为了方便用户不用注册就可以评论,对接了QQ和微博这2大常用软件的一键登录,总的来说其实都挺简单的,可能会有一点小坑,但不算多,完整记录下来方便后来人快速对接。
在真正开始对接之前,我们先来聊一聊后台的方案设计。既然是对接第三方登录,那就免不了如何将用户信息保存。首先需要明确一点的是,用户在第三方登录成功之后,我们能拿到的仅仅是一个代表用户唯一身份的ID(微博是真实uid,QQ是加密的openId)以及用来识别身份的accessToken,当然还有昵称、头像、性别等有限资料,对接第三方登录的关键就是如何确定用户是合法登录,如果确定这次登录的和上次登录的是同一个人并且不是假冒的。其实这个并不用我们特别操心,就以微博登录为例,用户登录成功之后会回调一个code给我们,然后我们再拿code去微博那换取accessToken,如果这个code是用户乱填的,那这一关肯定过不了,所以,前面的担心有点多余,哈哈。
另外一个问题就是如何和现有用户系统打通,有的网站在用户已经登录成功之后还要用户输入手机号和验证码,或者要用户重新注册账号和密码来绑定第三方账户,感觉这种实现用户体验非常差,碰到这种网站我一般都是直接关掉,都已经登录了还让用户注册,什么鬼!由于我做的是评论功能,我并不希望评论用户和现有用户表打通,所以就不存在这件事了,如果想打通的话,我觉得无非就是登录成功之后默认往老用户表插入一条数据,然后和OpenUser表关联起来,判断用户是否登录时把OpenUser的鉴权也加进去就OK了。
本文的后台以Java为例。
数据库设计
再来说说数据库设计,为了系统的扩展性,我有一个专门的OpenUser表用来存放第三方登录用户,主要字段如下:
第三方类型,比如qq、weibo
代表用户唯一身份的ID
accessToken
调用接口需要用到的token,比如利用accessToken发表微博等,如果只是对接登录的话,这个其实没啥用
expiredTime
授权过期时间,第三方登录授权都是有过期时间的,比如3个月
这样设计理论上就可以无限扩展了。
这里我只是说说我的方案,把accessToken写入cookie肯定是不安全的,因为accessToken相当于是第三方网站的临时密码,被别人窃取了就可以随意拿来干坏事了。可以在用户登录成功之后我们自己生成一个token,这样的token即使泄露了顶多就是被人拿来随意评论,损失不大,但是如果accessToken被泄露了,以微博为例,人家可以利用这个accessToken随意发微博、删微博、加关注等等,很危险。当然,如果不想token泄露的话也可以通过绑定IP等方式来限制。
鉴权的话就是首先判断cookie中是否有我们自己的token,然后判断是否合法,合法再判断第三方授权是否已过期等等。
对接QQ登录
QQ登录我们对接的是QQ互联,地址: ,首先需要注册成为开发者并实名认证,需要手持身份证照片,具体就不讲了。
进入创建应用,根据实际需要是创建网站应用还是移动应用,我这里是网站应用:
提交完之后会自动提交审核,基本上就是审核你的资料和备案的资料是否一致,所有资料必须和备案资料一模一样,否则审核不会通过:
当然,这些资料后面还是可以修改的。申请成功之后你会得到appId和appKey。
引导用户登录
可以下载一些视觉素材,在页面合适位置放一个QQ登录按钮,点击时引导用户进入授权页面:
* 封装一个居中打开新窗口的方法
function openWindow(url, width, height)
width = width || 600;
height = height || 400;
var left = (window.screen.width - width) / 2;
var top = (window.screen.height - height) / 2;
window.open(url, &_blank&, &toolbar=yes, location=yes, directories=no, status=no, menubar=yes, scrollbars=yes, resizable=no, copyhistory=yes, left=&+left+&, top=&+top+&, width=&+width+&, height=&+height);
function qqLogin()
var qqAppId = ''; // 上面申请得到的appid
var qqAuthPath = 'http://www.test.com/auth'; // 前面设置的回调地址
var state = 'fjdslfjsdlkfd'; // 防止CSRF攻击的随机参数,必传,登录成功之后会回传,最好后台自己生成然后校验合法性
openWindow(`https://graph.qq.com/oauth2.0/authorize?response_type=token&client_id=${qqAppId}&redirect_uri=${encodeURIComponent(qqAuthPath)}&state=${state}`);
然后会打开一个授权页面,这个页面大家应该都熟悉:
然后到了这里我就碰到一个问题了,写的是登录成功之后首先会回传一个code,然后再拿code调接口换取accessToken,然后我试了很多次也换过2个账号发现每次都是直接返回了accessToken,帮我省了一步了,不知道是什么情况,郁闷。
拿到accessToken
现在假设我们都是直接拿到accessToken(因为我暂时还没搞明白QQ为啥会直接返回,跟文档说的不一样),但是授权回调时accessToken会被放在#后面,URL地址中的hash值好像不会被传到后台(貌似是这样,如有不正确欢迎评论指正),所以只能写一个下面这样的临时页面:
* @param request
* @param response
* @throws Exception
@RequestMapping(&/authqq&)
public void authQQ(HttpServletRequest request, HttpServletResponse response) throws Exception
// QQ登录有点特殊,参数放在#后面,后台无法获取#后面的参数,只能用JS做中间转换
String html =
&&!DOCTYPE html&& +
&&html lang=\&zh-cn\&&& +
&&head&& +
&title&QQ登录重定向页&/title&& +
&meta charset=\&utf-8\&/&& +
&&/head&& +
&&body&& +
&script type=\&text/javascript\&&& +
location.href = location.href.replace('#', '&').replace('auth_qq', 'auth_qq_redirect');& +
&/script&& +
&&/body&& +
&&/html&&;
response.getWriter().print(html);
获取openId
根据accessToken调接口获取用户的openId,特别注意这个openId是相对于QQ号+appId唯一的,换句话说同一个QQ号登录2个不同appId时获取到的openId是不同的。顺便说一句,QQ登录的相关接口做的还真够“随便”的,全部都是最简单的get请求,所以对接起来非常顺利。
直接看代码:
// 根据accessToken换取openId
// 错误示例:callback( {&error&:100016,&error_description&:&access token check failed&} );
// 正确示例:callback( {&client_id&:&10XXXXX49&,&openid&:&CF2XXXXXXXX9F4C&} );
String result = HttpsUtil.get(&https://graph.qq.com/oauth2.0/me?access_token=& + accessToken);
Map&String, Object& resp = parseQQAuthResponse(result); // 这个方法就是把结果转Map
Integer errorCode = (Integer)resp.get(&error&);
String errorMsg = (String)resp.get(&error_description&);
String openId = (String)resp.get(&openid&);
if(errorCode != null) return new ErrorResult(errorCode, &获取QQ用户openId失败:&+errorMsg);
获取用户头像昵称等信息
// 获取用户昵称、头像等信息,{ret: 0, msg: '', nickname: '', ...} ret不为0表示失败
result = HttpsUtil.get(&https://graph.qq.com/user/get_user_info?access_token=&+accessToken+&&oauth_consumer_key=&+appId+&&openid=&+openId);
resp = JsonUtil.parseJsonToMap(result);
Integer ret = (Integer)resp.get(&ret&);
String msg = (String)resp.get(&msg&);
if(ret != 0) return new ErrorResult(&获取用户QQ信息失败:&+msg);
// 用户昵称可能存在4个字节的utf-8字符,MySQL默认不支持,直接插入会报错,所以过滤掉
String nickname = StringUtil.filterUtf8Mb4((String)resp.get(&nickname&)).trim(); // 这个方法可以自行百度
// figureurl_qq_2=QQ的100*100头像,figureurl_2=QQ 100&100空间头像,QQ头像不一定有,空间头像一定有
String avatar = (String)resp.get(&figureurl_qq_2&);
if(StringUtil.isBlank(avatar)) avatar = (String)resp.get(&figureurl_2&);
String gender = (String)resp.get(&gender&);
到了这一步基本上涉及第三方的就结束了,是不是很简单?后面无非就是如何插入数据库、如何保存token、写入session等。
有几点注意事项:
需要注意数据库中是否已经有改用户,没有的添加,有的修改,不要重复添加了;
QQ昵称昵称有各种奇奇怪怪的字符,包括emoji,MySQL默认没有开启utf8mb4,直接插入会报错,所以需要过滤掉;
需要做好对各种错误的兼容;
接口会同时返回QQ头像和空间头像,QQ头像不一定有,空间头像一定有;
回调地址必须和申请的域名一致,否则会报错。
QQ互联有个特大的bug,有时候显示已登录但是点击授权管理一直报错,此时只需要退出重新登录即可;
授权之后用户可能会在过期之前提前取消授权;
相关文档官网已经写得比较细了,但是比较乱:
对接微博登录
这个我就不具体讲了,登录
很容易找到相关入口,注册成为开发者,实名认证,一模一样的。
创建web应用:
创建成果后完善相关信息,主要是下面这些:
我就不一一介绍了,都看得懂。
微博登录不需要网站一定要备案,但对网站本身有一定要求,不能弄一个空壳网站让人家去审核,肯定审核不通过的。
有关微博的对接可以参考我好几年前写的一篇文章:
引导用户登录
微博在这里,页面合适位置放一个登录按钮:
function weiboLogin()
let weiboAppId = ';;
let weiboAuthPath = 'http://www.test.com/authweibo';
openWindow(`https://api.weibo.com/oauth2/authorize?client_id=${weiboAppId}&response_type=code&redirect_uri=${encodeURIComponent(weiboAuthPath)}`);
微博登录有一个好处,第一次登录需要授权,后面第二次登录时只会一闪而过自动就登录成功了,都不需要点一下,用户体验非常好,看下图:
获取accessToken
登录成功会返回一个code,根据code换取accessToken:
String params = &client_id=& + appId
+ &&client_secret=& + appSecret
+ &&grant_type=authorization_code&
+ &&redirect_uri=& + URLUtil.encode(authPath)
+ &&code=& +
// 用code换取accessToken
String result = HttpsUtil.post(&https://api.weibo.com/oauth2/access_token&, params);
Map&String, Object& resp = JsonUtil.toObject(result, new TypeReference&Map&String, Object&&(){});
Integer errorCode = (Integer)resp.get(&error_code&);
String error = (String)resp.get(&error&);
String errorMsg = (String)resp.get(&error_description&);
if(errorCode != null && errorCode != 0) return new ErrorResult(errorCode, error + (errorMsg==null?&&:errorMsg));
String accessToken = (String)resp.get(&access_token&);
String uid = (String)resp.get(&uid&); // 这个uid就是微博用户的唯一用户ID,可以通过这个id直接访问到用户微博主页
int expires = (Integer)resp.get(&expires_in&); // 有效期,单位秒
获取用户头像等信息
// 用uid和accessToken换取用户信息
String result = HttpsUtil.get(&https://api.weibo.com/2/users/show.json?access_token=&+accessToken+&&uid=&+uid);
Map&String, Object& resp = JsonUtil.toObject(result, new TypeReference&Map&String, Object&&(){});
errorCode = (Integer)resp.get(&error_code&);
error = (String)resp.get(&error&);
errorMsg = (String)resp.get(&error_description&);
if(errorCode != null && errorCode != 0) return new ErrorResult(errorCode, error + (errorMsg==null?&&:errorMsg));
String nickname = (String)resp.get(&screen_name&);
// 微博180*180高清头像
String avatar = (String)resp.get(&avatar_large&);
String gender = (String)resp.get(&gender&);
gender = &m&.equals(gender) ? &男& : (&f&.equals(gender) ? &女& : &&);
至此涉及第三方的东西都完了,剩下的就是用户自己保存到数据库、写入token、保存session、以及鉴权接口开发了。
微博接口都有频率限制,不过一般不会超过;
需做好错误兼容;
微博直接返回的uid,可以根据这个uid直达用户微博主页
,所以可以把用户头像链接到这里;
其实也有现成的js-sdk,可以根据自己实际需要选择是否使用;
嗯,我再想想还有没有,哦,对了,微博的接口是https,并且是post,需要注意;
阅读(...) 评论()没有更多推荐了,
不良信息举报
举报内容:
四种第三方登录(附源码)
举报原因:
原文地址:
原因补充:
最多只允许输入30个字
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!java如何调用http接口? - ITeye问答
第三方厂商提供了http接口,请问我该怎么调用啊?
例如:http://www.baidu.com/query.jsp?param1=value2&param2=value2
这个接口会返回xml格式的输出结果,例如:
&?xml version="1.0" encoding="UTF-8" ?&
&result&
&&& &item id="0"&
&&&&&&&& &id&&/id&
&&&&&&&& &name&张三&/name&
&&&&&&&& &sex&男&/sex&
&&& &/item&
&/result&
我的问题是:
1.如何在java程序中调用这个接口?不是在jsp中调用;
2.如何解析返回的结果。
问题补充:xiaolongfeixiang 写道
1、可以通过以下的方式读取到数据:
import java.net.*;
import java.io.*;
public class URLReader {
public static void main(String[] args) throws Exception {
URL yahoo = new URL("http://www.baidu.com/query.jsp?param1=value2&param2=value2");
BufferedReader in = new BufferedReader(
new InputStreamReader(
yahoo.openStream()));
String inputL
while ((inputLine = in.readLine()) != null)
System.out.println(inputLine);
in.close();
2、然后用DOM4J的工具,来解析读取到的 xml格式的数据
好的,我试试,多谢了
采纳的答案
1、可以通过以下的方式读取到数据:
import java.net.*;
import java.io.*;
public class URLReader {
public static void main(String[] args) throws Exception {
URL yahoo = new URL("http://www.baidu.com/query.jsp?param1=value2&param2=value2");
BufferedReader in = new BufferedReader(
new InputStreamReader(
yahoo.openStream()));
String inputL
while ((inputLine = in.readLine()) != null)
System.out.println(inputLine);
in.close();
2、然后用DOM4J的工具,来解析读取到的 xml格式的数据
对于java如何调用接口问这样的问题其实还不如自己多钻研钻研接口的结构使用方法以及调用规范等,有需要的可以看看这个视频资料,当然需要更多的资料可以跟弹窗的在客服要在线的学习卡
但是为什么用这样的方法有时候可能会被认为是网络爬虫的问题
已解决问题
未解决问题}

我要回帖

更多关于 微博第三方登录接口 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信