微信小程序 for key做微信登录,成功获取了Session_key 和 OpenId之后怎么办?

您现在的位置:
微信小程序获得session_key和openId(加解密、签名系列)
来源:微信小程序 编辑: 发布时间: 12:04热度: ℃
1:session_key和openId是什么?session_key
官方说明为:
session_key是微信服务器生成的针对用户数据进行加密签名的密钥
session_key的用途
(1)对wx.getUserInfo()接口得到&用户信息中的密文&进行解密。
(2)对它&稍作处理&,用作维护小程序的登录态。
&稍微处理&大体为:
(1)生成一个随机数(官方把他叫做3rd_session)
(2)把这个随机数当session的key,session_key + openid为value。
即:session[3rd_session]=session_key+openid&&
openIdopenId:用户唯一标识
即:每个微信用户在你的小程序的唯一的标识。
2:如何获得session_key和openId官方提供了HTTP接口:
https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code
获取步骤:
(1)获得appid,secret,js_code&
(2)用appid,secret,js_code分别替换如上接口地址的APPID、SECRET、JSCODE,其他不变,组装成完整的地址。
3:在&浏览器打开此地址&或者&在后台模拟浏览器的GET执行此地址&就可返回如下的JSON数据(包含openid、sessionkey)
总结:从1,2,3步骤可知,只要获得appid,secret,js_code就可得到session_key和openId
4:appid和secret的获得
appid为小程序ID
secret为小程序密钥(AppSecret)
获得方法:小程序后台登录网址:https://mp.weixin.qq.com/
打开小程序后台网址、注册、登录后,按如下图所示就可找到你的AppID和AppSecret。
注意:目前小程序个人不能注册,开放注册范围:企业、政府、媒体、其他组织;
当然用这个办法,个人也能注册了。
传送门:&http://www.wxapp-union.com/forum.php?mod=viewthread&tid=495
5:js_code如何获得调用wx.login()接口就可获取登录凭证(js_code)
6:总结整个session_key获取的流程(1)注册微信小程序、登录后台在设置中获得appId和secret(密钥)
(2)调用wx.login()接口获取登录凭证js_code
(3)调用wx.request()接口把js_code发送到服务器后台
(4)在服务器后台,已知appId、secret、js_code
然后调用如下官方提供的http接口,即可返回获取openId、session_key
官方提供了http接口地址为:
https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code
微信小程序DEMO排行
微信小程序教程排行1494人阅读
微信小程序Mini2 App(88)
思来想去不愿自己的小程序是个单机版本.自己又不会写后台.现在借助leancloud可以实现微信小程序一键登录功能.尝试后,做笔记.
第一步:,放到utils下.
第二步:使用 const AV = require('../../utils/av-weapp.js');路径根据具体情况而定.
第三步:做初始化.
[javascript]
第四步:在微信公众平台获取AppID(小程序ID)
和AppSecret(小程序密钥)
第五步:leancloud控制台配置AppID(小程序ID)
和AppSecret(小程序密钥)
第六步:用户登录
[javascript]
登陆后在平台查看用户信息
获取到: session_key和openid
第七步:获取当前用户信息
[javascript]
wx.request() 需要配置合法域名,否则会报错.
在上一次笔记中已经写明.1. 2.微信小程序每次请求都改变session,这个该如何解决
[问题点数:20分]
微信小程序每次请求都改变session,这个该如何解决
[问题点数:20分]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
匿名用户不能发表回复!|2089人阅读
微信开发(14)
前言:最近自己一直再弄微信小程序,磕磕绊绊中也算把小程序的java接口开发走了一遍,这里总结一下自己学习过的知识,多积累才不容易忘记。这是第一篇的微信小程序java接口开发博客,会按照一个小程序从登录到请求接口返回数据,到最后的微信小程序支付的流程完成总结。
微信官方文档:
一、小程序wx.login(OBJECT)
注:这里很不要脸的直接抄袭微信小程序API接口文档
1 wx.login(OBJECT)
调用接口获取登录凭证(code)进而换取用户登录态信息,包括用户的唯一标识(openid) 及本次登录的 会话密钥(session_key)。用户数据的加解密通讯需要依赖会话密钥完成。
(1)OBJECT参数说明:
接口调用成功的回调函数
接口调用失败的回调函数
接口调用结束的回调函数(调用成功、失败都会执行)
(2)success返回参数说明:
用户允许登录后,回调内容会带上 code(有效期五分钟),开发者需要将 code 发送到开发者服务器后台,使用code 换取 session_key api,将 code 换成 openid 和 session_key
(3)示例代码:
onLaunch: function() {
wx.login({
success: function(res) {
if (res.code) {
wx.request({
url: 'https://test.com/onLogin',
code: res.code
console.log('获取用户登录态失败!' + res.errMsg)
二、java接口
1 code 换取 openid和session_key
这是一个 HTTPS 接口,开发者服务器使用登录凭证 code 获取 session_key 和 openid。其中 session_key 是对用户数据进行加密签名的密钥。
(1)接口地址:
https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code
(2)请求参数:
小程序唯一标识
小程序的 app secret
登录时获取的 code
grant_type
填写为 authorization_code
(3)返回参数:
用户唯一标识
session_key
(4)返回说明:
"openid": "OPENID",
"session_key": "SESSIONKEY"
"errcode": 40029,
"errmsg": "invalid code"
2 java接口
(1)Controller接口类
* 获取openId
* 开发人员:wangql
* 开发时间:
* response
@ResponseBody
@RequestMapping(value="/getOpenId",method = RequestMethod.POST)
public Map&String, Object& getOpenId(HttpServletRequest request,HttpServletResponse response){
Map&String, Object& map = new HashMap&String, Object&();
String status = "1";
String msg = "ok";
String WX_URL = "https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code";
String code = request.getParameter("code");
if(StringUtils.isBlank(code)){
status = "0";
msg = "code为空";
String requestUrl = WX_URL.replace("APPID", WeixinConstants.APPID).
replace("SECRET", WeixinConstants.APP_SECRECT).replace("JSCODE", code).
replace("authorization_code", WeixinConstants.AUTHORIZATION_CODE);
logger.info(requestUrl);
JSONObject jsonObject = CommonUtil.httpsRequest(requestUrl, "GET", null);
if (jsonObject != null) {
map.put("openid", jsonObject.getString("openid"));
map.put("session_key", jsonObject.getString("session_key"));
} catch (JSONException e) {
status = "0";
msg = "code无效";
status = "0";
msg = "code无效";
map.put("status", status);
map.put("msg", msg);
} catch (Exception e) {
logger.error(e.getMessage(),e);
return AnalyzeMoblieData.errorResponse();
(2)http请求工具类
import java.io.BufferedReader
import java.io.IOException
import java.io.InputStream
import java.io.InputStreamReader
import java.io.OutputStream
import java.io.UnsupportedEncodingException
import java.net.ConnectException
import java.net.URL
import java.util.Iterator
import java.util.Map
import javax.net.ssl.HttpsURLConnection
import javax.net.ssl.SSLContext
import javax.net.ssl.SSLSocketFactory
import javax.net.ssl.TrustManager
import org.apache.commons.httpclient.HttpClient
import org.apache.commons.httpclient.HttpMethod
import org.apache.commons.httpclient.NameValuePair
import org.apache.commons.httpclient.methods.PostMethod
import org.apache.commons.httpclient.params.HttpMethodParams
import org.slf4j.Logger
import org.slf4j.LoggerFactory
import net.sf.json.JSONException
import net.sf.json.JSONObject
public class CommonUtil {
private static Logger log = LoggerFactory.getLogger(CommonUtil.class)
public static JSONObject httpsRequest(String requestUrl, String requestMethod, String outputStr) {
JSONObject jsonObject = null
// 创建SSLContext对象,并使用我们指定的信任管理器初始化
TrustManager[] tm = { new MyX509TrustManager() }
SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE")
sslContext.init(null, tm, new java.security.SecureRandom())
// 从上述SSLContext对象中得到SSLSocketFactory对象
SSLSocketFactory ssf = sslContext.getSocketFactory()
URL url = new URL(requestUrl)
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection()
conn.setSSLSocketFactory(ssf)
conn.setDoOutput(true)
conn.setDoInput(true)
conn.setUseCaches(false)
// 设置请求方式(GET/POST)
conn.setRequestMethod(requestMethod)
// 当outputStr不为null时向输出流写数据
if (null != outputStr) {
OutputStream outputStream = conn.getOutputStream()
// 注意编码格式
outputStream.write(outputStr.getBytes("UTF-8"))
outputStream.close()
// 从输入流读取返回内容
InputStream inputStream = conn.getInputStream()
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8")
BufferedReader bufferedReader = new BufferedReader(inputStreamReader)
String str = null
StringBuffer buffer = new StringBuffer()
while ((str = bufferedReader.readLine()) != null) {
buffer.append(str)
// 释放资源
bufferedReader.close()
inputStreamReader.close()
inputStream.close()
inputStream = null
conn.disconnect()
jsonObject = JSONObject.fromObject(buffer.toString())
} catch (ConnectException ce) {
log.error("连接超时:{}", ce)
} catch (Exception e) {
log.error("https请求异常:{}", e)
return jsonObject
(3)信任管理器类
import java.security.cert.CertificateE
import java.security.cert.X509C
import javax.net.ssl.X509TrustM
* 类名: MyX509TrustManager.java&/br&
* 描述: 信任管理器&/br&
* 开发人员:wangql&/br&
* 创建时间: &/br&
public class MyX509TrustManager implements X509TrustManager {
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
public X509Certificate[] getAcceptedIssuers() {
return null;
3 登录态维护
通过 wx.login() 获取到用户登录态之后,需要维护登录态。开发者要注意不应该直接把 session_key、openid 等字段作为用户的标识或者 session 的标识,而应该自己派发一个 session 登录态(请参考登录时序图)。对于开发者自己生成的 session,应该保证其安全性且不应该设置较长的过期时间。session 派发到小程序客户端之后,可将其存储在 storage ,用于后续通信使用。
总结:其实小程序获取openid和session_key原理非常简单,就是按照指定地址指定参数发送http的get请求。我们只要按照接口文档先使用wx.login获取js_code,然后再向地址发送带appid、secret、js_code和grant_type的参数即可。关键是java如何发送安全的http请求,这里是关键的地方。微信小程序 获取openid和session_key
前言:最近自己一直再弄微信小程序,磕磕绊绊中也算把小程序的java接口开发走了一遍,这里总结一下自己学习过的知识,多积累才不容易忘记。这是第一篇的微信小程序java接口开发博客,会按照一个小程序从登录到请求接口返回数据,到最后的微信小程序支付的流程完成总结。
微信官方文档:
一、小程序wx.login(OBJECT)
注:这里很不要脸的直接抄袭微信小程序API接口文档
1 wx.login(OBJECT)
调用接口获取登录凭证(code)进而换取用户登录态信息,包括用户的唯一标识(openid) 及本次登录的 会话密钥(session_key)。用户数据的加解密通讯需要依赖会话密钥完成。
(1)OBJECT参数说明:
接口调用成功的回调函数
接口调用失败的回调函数
接口调用结束的回调函数(调用成功、失败都会执行)
(2)success返回参数说明:
用户允许登录后,回调内容会带上 code(有效期五分钟),开发者需要将 code 发送到开发者服务器后台,使用code 换取 session_key api,将 code 换成 openid 和 session_key
(3)示例代码:
onLaunch: function() {
wx.login({
success: function(res) {
if (res.code) {
wx.request({
url: 'https://test.com/onLogin',
code: res.code
console.log('获取用户登录态失败!' + res.errMsg)
二、java接口
1 code 换取 openid和session_key
这是一个 HTTPS 接口,开发者服务器使用登录凭证 code 获取 session_key 和 openid。其中 session_key 是对用户数据进行加密签名的密钥。
(1)接口地址:
https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code
(2)请求参数:
小程序唯一标识
小程序的 app secret
登录时获取的 code
grant_type
填写为 authorization_code
(3)返回参数:
用户唯一标识
session_key
(4)返回说明:
"openid": "OPENID",
"session_key": "SESSIONKEY"
"errcode": 40029,
"errmsg": "invalid code"
2 java接口
(1)Controller接口类
* 获取openId
* 开发人员:wangql
* 开发时间:
* response
@ResponseBody
@RequestMapping(value="/getOpenId",method = RequestMethod.POST)
public Map&String, Object& getOpenId(HttpServletRequest request,HttpServletResponse response){
Map&String, Object& map = new HashMap&String, Object&();
String status = "1";
String msg = "ok";
String WX_URL = "https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code";
String code = request.getParameter("code");
if(StringUtils.isBlank(code)){
status = "0";
msg = "code为空";
String requestUrl = WX_URL.replace("APPID", WeixinConstants.APPID).
replace("SECRET", WeixinConstants.APP_SECRECT).replace("JSCODE", code).
replace("authorization_code", WeixinConstants.AUTHORIZATION_CODE);
logger.info(requestUrl);
JSONObject jsonObject = CommonUtil.httpsRequest(requestUrl, "GET", null);
if (jsonObject != null) {
map.put("openid", jsonObject.getString("openid"));
map.put("session_key", jsonObject.getString("session_key"));
} catch (JSONException e) {
status = "0";
msg = "code无效";
status = "0";
msg = "code无效";
map.put("status", status);
map.put("msg", msg);
} catch (Exception e) {
logger.error(e.getMessage(),e);
return AnalyzeMoblieData.errorResponse();
(2)http请求工具类
import java.io.BufferedReader
import java.io.IOException
import java.io.InputStream
import java.io.InputStreamReader
import java.io.OutputStream
import java.io.UnsupportedEncodingException
import java.net.ConnectException
import java.net.URL
import java.util.Iterator
import java.util.Map
import javax.net.ssl.HttpsURLConnection
import javax.net.ssl.SSLContext
import javax.net.ssl.SSLSocketFactory
import javax.net.ssl.TrustManager
import org.apache.commons.httpclient.HttpClient
import org.apache.commons.httpclient.HttpMethod
import org.apache.commons.httpclient.NameValuePair
import org.apache.commons.httpclient.methods.PostMethod
import org.apache.commons.httpclient.params.HttpMethodParams
import org.slf4j.Logger
import org.slf4j.LoggerFactory
import net.sf.json.JSONException
import net.sf.json.JSONObject
public class CommonUtil {
private static Logger log = LoggerFactory.getLogger(CommonUtil.class)
public static JSONObject httpsRequest(String requestUrl, String requestMethod, String outputStr) {
JSONObject jsonObject = null
// 创建SSLContext对象,并使用我们指定的信任管理器初始化
TrustManager[] tm = { new MyX509TrustManager() }
SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE")
sslContext.init(null, tm, new java.security.SecureRandom())
// 从上述SSLContext对象中得到SSLSocketFactory对象
SSLSocketFactory ssf = sslContext.getSocketFactory()
URL url = new URL(requestUrl)
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection()
conn.setSSLSocketFactory(ssf)
conn.setDoOutput(true)
conn.setDoInput(true)
conn.setUseCaches(false)
// 设置请求方式(GET/POST)
conn.setRequestMethod(requestMethod)
// 当outputStr不为null时向输出流写数据
if (null != outputStr) {
OutputStream outputStream = conn.getOutputStream()
// 注意编码格式
outputStream.write(outputStr.getBytes("UTF-8"))
outputStream.close()
// 从输入流读取返回内容
InputStream inputStream = conn.getInputStream()
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8")
BufferedReader bufferedReader = new BufferedReader(inputStreamReader)
String str = null
StringBuffer buffer = new StringBuffer()
while ((str = bufferedReader.readLine()) != null) {
buffer.append(str)
// 释放资源
bufferedReader.close()
inputStreamReader.close()
inputStream.close()
inputStream = null
conn.disconnect()
jsonObject = JSONObject.fromObject(buffer.toString())
} catch (ConnectException ce) {
log.error("连接超时:{}", ce)
} catch (Exception e) {
log.error("https请求异常:{}", e)
return jsonObject
(3)信任管理器类
import java.security.cert.CertificateE
import java.security.cert.X509C
import javax.net.ssl.X509TrustM
* 类名: MyX509TrustManager.java&/br&
* 描述: 信任管理器&/br&
* 开发人员:wangql&/br&
* 创建时间: &/br&
public class MyX509TrustManager implements X509TrustManager {
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
public X509Certificate[] getAcceptedIssuers() {
return null;
3 登录态维护
通过 wx.login() 获取到用户登录态之后,需要维护登录态。开发者要注意不应该直接把 session_key、openid 等字段作为用户的标识或者 session 的标识,而应该自己派发一个 session 登录态(请参考登录时序图)。对于开发者自己生成的 session,应该保证其安全性且不应该设置较长的过期时间。session 派发到小程序客户端之后,可将其存储在 storage ,用于后续通信使用。
总结:其实小程序获取openid和session_key原理非常简单,就是按照指定地址指定参数发送http的get请求。我们只要按照接口文档先使用wx.login获取js_code,然后再向地址发送带appid、secret、js_code和grant_type的参数即可。关键是java如何发送安全的http请求,这里是关键的地方。
看过本文的人也看了:
我要留言技术领域:
取消收藏确定要取消收藏吗?
删除图谱提示你保存在该图谱下的知识内容也会被删除,建议你先将内容移到其他图谱中。你确定要删除知识图谱及其内容吗?
删除节点提示无法删除该知识节点,因该节点下仍保存有相关知识内容!
删除节点提示你确定要删除该知识节点吗?

我要回帖

更多关于 微信小程序获取key值 的文章

 

随机推荐