<!--
-->
管理提醒: <!--
-->
本帖被 gaolei2016 执行取消精华操作(2009-12-18) <!--
-->
<!--
-->
做TOP开发的人肯定会碰到需要SessionKey才能访问数据的情况,手工去取太麻烦了,回调又需要部署到服务器上,杯具啊!为了解决这些麻烦,我特意写了一个通过程序获取SessionKey的方法,代码如下:
说明:本程序只是方便ISV调试使用,集成二次登录是无法通过审核的,用户不会在你的网站里面输入淘宝的用户名和密码的,就好比你不会在一个山寨网站输入你的银行卡号和密码一样。
package com.carver.tool;
import java.net.URLEncoder;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
import com.gargoylesoftware.htmlunit.Page;
import com.gargoylesoftware.htmlunit.TextPage;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlButton;
import com.gargoylesoftware.htmlunit.html.HtmlCheckBoxInput;
import com.gargoylesoftware.htmlunit.html.HtmlElement;
import com.gargoylesoftware.htmlunit.html.HtmlForm;
import com.gargoylesoftware.htmlunit.html.HtmlImageInput;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.html.HtmlPasswordInput;
import com.gargoylesoftware.htmlunit.html.HtmlTextInput;
/**
* 登录淘宝网获取授权。
*
* @author carver.gu
* @since 1.0, Nov 11, 2009
*/
public class LoginUtil {
private static final String ONLINE_CONTAINER = "http://container.open.taobao.com/container?appkey=";
private static final Pattern P_SESSION = Pattern.compile("top\\_session=(\\w+?)&");
static {
Logger.getLogger("com.gargoylesoftware.htmlunit").setLevel(Level.SEVERE);
Logger.getLogger("org.apache.commons.httpclient.HttpMethodBase").setLevel(Level.SEVERE);
}
public static void main(String[] args) throws Exception {
String session = getOnlineSession("app_key", "username", "password");
System.out.println("session_key: " + session);
}
public static String getOnlineSession(String appkey, String uid, String pwd) throws Exception {
String url = "http://member1.taobao.com/member/mini_login.htm?login_type=3&redirect_url=";
return getSession(url, ONLINE_CONTAINER, appkey, uid, pwd);
}
private static String getSession(String loginUrl, String topUrl, String appkey, String uid,
String pwd) throws Exception {
WebClient webClient = new WebClient(BrowserVersion.FIREFOX_3);
String fullUrl = loginUrl + URLEncoder.encode(topUrl + appkey, "utf-8");
HtmlPage loginPage = webClient.getPage(fullUrl);
HtmlForm loginForm = loginPage.getForms().get(0);
HtmlTextInput uidInput = loginForm.getInputByName("TPL_username");
uidInput.setValueAttribute(uid);
HtmlPasswordInput pwdInput = loginForm.getInputByName("TPL_password");
pwdInput.setValueAttribute(pwd);
HtmlButton loginButton = loginForm.getButtonByName("");
HtmlPage loginRsp = null;
try {
Page rsp = loginButton.click();
if (rsp instanceof HtmlPage) {
loginRsp = (HtmlPage) rsp;
} else if (rsp instanceof TextPage) {
TextPage textRsp = (TextPage) rsp;
return extractSession(textRsp.getContent());
} else {
return null;
}
} catch (FailingHttpStatusCodeException e) {
if (e.getStatusCode() == 404) {
return extractSession(e.getMessage());
}
} catch (Exception e) {
}
HtmlCheckBoxInput agreeCheck = (HtmlCheckBoxInput) loginRsp.getElementById("agreement");
if (agreeCheck == null) {
return extractSession(loginRsp.getWebResponse().getRequestSettings().getUrl().toString());
} else {
agreeCheck.click();
}
HtmlForm agreeForm = loginRsp.getForms().get(1);
List<HtmlElement> inputElements = agreeForm.getHtmlElementsByTagName("input");
HtmlImageInput agreeButton = null;
for (HtmlElement inputElement : inputElements) {
if (inputElement instanceof HtmlImageInput) {
agreeButton = (HtmlImageInput) inputElement;
break;
}
}
Page agreeRsp = null;
try {
agreeRsp = agreeButton.click();
} catch (FailingHttpStatusCodeException e) {
if (e.getStatusCode() == 404) {
return extractSession(e.getMessage());
}
} catch (Exception e) {
}
return extractSession(agreeRsp.getWebResponse().getRequestSettings().getUrl().toString());
}
private static String extractSession(String response) {
Matcher matcher = P_SESSION.matcher(response);
if (matcher.find()) {
return matcher.group(1);
} else {
return null;
}
}
}
经测试,上面的程序可以获取任何类型的应用(Web,客户端)的SessionKey,ISV们有福了。
上面的程序依赖于HtmlUnit这个工具的所有Jar包,需要的请到
HtmlUnit的官方网站下载。
分享到:
相关推荐
本项目“淘宝/天猫TOP获取Sessionkey解决方案”提供了一个WinForm应用程序,旨在帮助开发者便捷地获取到用于安全通信的Sessionkey。下面将详细解释这个过程中的关键知识点。 首先,了解Sessionkey的概念。...
在本案例中,"淘宝API获取SessionKey获取订单"涉及到了两个关键概念:SessionKey和订单获取。 1. **SessionKey**: SessionKey是淘宝API中的安全凭证,用于验证调用API的开发者身份。在进行API请求时,需要将...
在获取SessionKey之后,我们就可以进行数据解密了。微信小程序的加密数据采用的是JSON Web Token (JWT) 和非对称加密算法,如RSA。SessionKey是一个32位的字符串,用于对用户数据进行AES-128-CBC加密。加密后的数据...
1. 用户授权:当用户首次打开微信小程序时,系统会提示用户是否允许小程序获取手机号。用户同意后,微信会生成一个加密的手机号码并存储在本地。 2. 后端请求解密:开发者在前端触发一个API,如`wx.login()`,获取...
总结来说,微信小程序登录换取token的过程涉及前端与后端的交互,包括代码的验证、调用微信接口获取用户身份信息,以及服务器生成和管理自己的token。理解并正确实现这个流程对于开发安全的微信小程序至关重要。在...
4、小程序端js代码: wx.login({ success: resp => { // 发送 res.code 到后台换取 openId, sessionKey, unionId console.log(resp); var that = this; // 获取用户信息 wx.getSetting({ success: res => { ...
总结来说,微信小程序获取手机号、头像和昵称需要遵循微信的权限管理规则,通过`wx.getSetting`、`wx.authorize`和`wx.getUserInfo`等API进行操作。同时,获取手机号码需要用户手动确认,并且要在合法的业务场景下...
.NET微信小程序用户数据的签名验证和解密是一个涉及.NET开发、微信小程序和安全性验证的技术过程。...通过上述代码框架的实现,可以完成微信小程序用户数据的接收、验证和解密流程,并确保数据的安全。
总结来说,微信小程序获取用户手机号涉及的关键步骤包括:调用`wx.login`获取`jscode`,服务器通过`jscode`换取`openid`和`sessionkey`,使用`3rdsession`安全存储,用户授权后调用`wx.getUserInfo`获取加密的用户...
微信小程序授权和信息获取 本节课主要讲解如何在 uni-app 框架中获取微信临时授权字符串和微信基本信息,这部分内容非常简单。uni-app 框架中包含了原生微信小程序的 wx 对象,但推荐使用 uni 对象,因为它是跨平台...
淘宝API调用是开发者与淘宝平台进行数据交互的重要方式,它允许第三方应用通过特定的接口获取或修改淘宝上的商品信息、订单数据等。在进行淘宝API调用时,需要掌握以下几个核心概念和技术: 1. **淘宝API**:API是...
1. **用户授权提示**:在调用`wx.login()`或`wx.getUserInfo()`时,微信会弹出授权提示,询问用户是否允许小程序获取个人信息。只有用户同意后,小程序才能获取到相应的数据。 2. **处理授权状态**:对于用户授权的...
1. 用户身份验证:微信小程序提供了获取用户OpenID和SessionKey的能力,通过这些信息可以识别用户,实现签到功能。 2. 数据存储:可以利用微信小程序的本地存储API(wx.setStorageSync, wx.getStorageSync)来保存...
2. 实现步骤:详细介绍了微信小程序授权登录的流程,包括前端获取code、后端调用微信API换取openId和sessionKey、生成自定义登录态等。 3. 代码示例:提供了前后端完整的代码示例,包括若依框架的配置、uniApp的登录...
微信小程序登录通常采用OAuth 2.0授权框架,用户通过微信小程序的`wx.login()`接口获取临时登录凭证(code),然后将code发送到服务器,服务器通过微信API换取用户的OpenID和Session Key,以此来标识用户身份。...
总结,通过结合微信小程序的授权机制、Node.js云函数以及解密库,我们可以实现微信步数的获取。此过程涉及到了前后端交互、数据加密与解密、以及微信小程序的API调用。在实际开发中,需要注意安全性和性能优化,确保...
微信运动是微信内置的一个健康计步功能,用户可以通过授权的方式让第三方应用或小程序获取自己的运动数据。这些数据通常是以加密形式传输的,因此,在客户端接收到加密数据后,需要对其进行解密才能获取具体的信息。...
本文将详细介绍如何实现微信小程序的一键登录功能,并获取`session_key`和`openid`这两个关键参数。 首先,我们需要了解`session_key`和`openid`的作用。`session_key`是微信服务器为每个用户生成的会话密钥,用于...
1. 用户授权:通过微信API获取用户基本信息,如openid,用于识别用户。 2. 数据交互:将用户信息发送到服务器进行验证和注册。 3. 会话管理:使用sessionKey等手段管理用户会话状态,确保安全性。 4. 登录状态持久化...
开发者需要调用微信的登录API,获取到用户的OpenID和SessionKey,然后通过后端服务器进行用户身份验证。 9. 分享与推广: 微信小程序支持分享到聊天、朋友圈等功能,开发者可以通过设置`onShareAppMessage`回调函数...