精华内容
下载资源
问答
  • 怎么换取
    千次阅读
    2021-06-14 07:26:16

    alipay.system.oauth.token(换取授权访问令牌)

    [TOC]

    公共参数

    请求地址

    公共请求参数

    参数

    类型

    是否必填

    最大长度

    描述

    示例值

    app_id

    String

    32

    支付宝分配给开发者的应用ID

    2014072300007148

    method

    String

    128

    接口名称

    alipay.system.oauth.token

    format

    String

    40

    仅支持JSON

    JSON

    charset

    String

    10

    请求使用的编码格式,如utf-8,gbk,gb2312等

    utf-8

    sign_type

    String

    10

    商户生成签名字符串所使用的签名算法类型,目前支持RSA2和RSA,推荐使用RSA2

    RSA2

    sign

    String

    344

    商户请求参数的签名串,详见签名

    详见示例

    timestamp

    String

    19

    发送请求的时间,格式"yyyy-MM-dd HH:mm:ss"

    2014-07-24 03:07:50

    version

    String

    3

    调用的接口版本,固定为:1.0

    1.0

    app_auth_token

    String

    40

    详见应用授权概述

    请求参数

    参数

    类型

    是否必填

    最大长度

    描述

    grant_type

    String

    -

    值为authorization_code时,代表用code换取;值为refresh_token时,代表用refresh_token换取

    code

    String

    可选

    -

    授权码,用户对应用授权后得到。

    refresh_token

    String

    可选

    -

    刷刷新令牌,上次换取访问令牌时得到。见出参的refresh_token字段

    响应参数

    参数

    类型

    是否必填

    最大长度

    描述

    示例值

    user_id

    String

    必填

    16

    支付宝用户的唯一userId

    2088102150477652

    access_token

    String

    必填

    40

    访问令牌。通过该令牌调用需要授权类接口

    20120823ac6ffaa4d2d84e7384bf983531473993

    expires_in

    String

    必填

    16

    访问令牌的有效时间,单位是秒。

    3600

    refresh_token

    String

    必填

    40

    刷新令牌。通过该令牌可以刷新access_token

    20120823ac6ffdsdf2d84e7384bf983531473993

    re_expires_in

    String

    必填

    16

    刷新令牌的有效时间,单位是秒。

    3600

    请求示例

    JAVA

    AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do","app_id","your private_key","json","GBK","alipay_public_key","RSA2");

    AlipaySystemOauthTokenRequest request = new AlipaySystemOauthTokenRequest();

    request.setGrantType("authorization_code");

    request.setCode("4b203fe6c11548bcabd8da5bb087a83b");

    request.setRefreshToken("201208134b203fe6c11548bcabd8da5bb087a83b");

    AlipaySystemOauthTokenResponse response = alipayClient.execute(request);

    if(response.isSuccess()){

    System.out.println("调用成功");

    } else {

    System.out.println("调用失败");

    }

    .NET

    IAopClient client = new DefaultAopClient("https://openapi.alipay.com/gateway.do", "app_id", "merchant_private_key", "json", "1.0", "RSA2", "alipay_public_key", "GBK", false);

    AlipaySystemOauthTokenRequest request= new AlipaySystemOauthTokenRequest() ;

    request.GrantType = "authorization_code";

    request.Code = "4b203fe6c11548bcabd8da5bb087a83b";

    request.RefreshToken = "201208134b203fe6c11548bcabd8da5bb087a83b";

    AlipaySystemOauthTokenResponse response=client.execute(request);

    Console.WriteLine(response.Body);

    PHP

    $aop = new AopClient ();

    $aop->gatewayUrl = 'https://openapi.alipay.com/gateway.do';

    $aop->appId = 'your app_id';

    $aop->rsaPrivateKey = '请填写开发者私钥去头去尾去回车,一行字符串';

    $aop->alipayrsaPublicKey='请填写支付宝公钥,一行字符串';

    $aop->apiVersion = '1.0';

    $aop->signType = 'RSA2';

    $aop->postCharset='GBK';

    $aop->format='json';

    $request = new AlipaySystemOauthTokenRequest ();

    $request->setGrantType("authorization_code");

    $request->setCode("4b203fe6c11548bcabd8da5bb087a83b");

    $request->setRefreshToken("201208134b203fe6c11548bcabd8da5bb087a83b");

    $result = $aop->execute ( $request);

    $responseNode = str_replace(".", "_", $request->getApiMethodName()) . "_response";

    $resultCode = $result->$responseNode->code;

    if(!empty($resultCode)&&$resultCode == 10000){

    echo "成功";

    } else {

    echo "失败";

    }

    HTTP请求源码

    https://openapi.alipay.com/gateway.do?timestamp=2013-01-01 08:08:08&method=alipay.system.oauth.token&app_id=4472&sign_type=RSA2&sign=ERITJKEIJKJHKKKKKKKHJEREEEEEEEEEEE&version=1.0&grant_type=

    "authorization_code"

    &code=

    "4b203fe6c11548bcabd8da5bb087a83b"

    &refresh_token=

    "201208134b203fe6c11548bcabd8da5bb087a83b"

    //为确保安全通信,需自行验证响应示例中的sign值是否为蚂蚁金服所提供。

    响应示例

    JSON 示例

    {

    "alipay_system_oauth_token_response": {

    "user_id": "2088102150477652",

    "access_token": "20120823ac6ffaa4d2d84e7384bf983531473993",

    "expires_in": "3600",

    "refresh_token": "20120823ac6ffdsdf2d84e7384bf983531473993",

    "re_expires_in": "3600"

    }

    }

    XML 示例

    10000

    Success 已废弃,请勿使用

    2088102150477652

    20120823ac6ffaa4d2d84e7384bf983531473993

    3600

    20120823ac6ffdsdf2d84e7384bf983531473993

    3600

    permanent

    异常示例

    JSON 示例

    {

    "alipay_system_oauth_token_response": {

    "code": "20000",

    "msg": "Service Currently Unavailable",

    "sub_code": "isp.unknow-error",

    "sub_msg": "系统繁忙"

    },

    "sign": "ERITJKEIJKJHKKKKKKKHJEREEEEEEEEEEE"

    }

    业务错误码

    错误码

    错误描述

    解决方案

    isv.grant-type-invalid

    grant_type参数不正确

    grant_type必须是authorization_code、refresh_token二者之一 若传入authorization_code为code换取令牌,若传入refresh_token为刷新令牌

    isv.code-invalid

    授权码(auth_code)

    错误、状态不对或过期

    使用有效的auth_code重新执行令牌换取,或引导用户重新授权

    isv.refresh-token-invalid

    刷新令牌(refresh_token)错误或状态不对

    使用有效的refresh_token重新执行令牌刷新,或引导用户重新授权

    isv.refresh-token-time-out

    刷新令牌(refresh_token)过期

    使用有效的refresh_token重新执行令牌刷新,或引导用户重新授权

    isv.refreshed-token-invalid

    刷新出来的令牌无效

    使用返回的刷新令牌再次刷新

    isv.invalid-app-id

    调用接口的应用标识(app_id)与令牌授权的应用不相符

    传入正确的app_id和令牌,若开发者支付宝账号名下有多个app_id,或者开发者管理多个归属于不同支付宝账号的app_id,请注意不要混用不同app_id的code

    isp.unknow-error

    未知错误

    重试,或联系支付宝客服

    更多相关内容
  • 微信登录换取token的流程 如何将code变成openid和session_key 抛出错误异常和派发令牌 一:微信登录换取token的流程 多说无益,直接上图 小程序获取token.png 这里介绍的主要是后端开发的流程,前端的不是本文...
  • 微信登录换取token的流程 如何将code变成openid和session_key 抛出错误异常和派发令牌 一:微信登录换取token的流程 多说无益,直接上图 (此图片来源于网络,如有侵权,请联系删除! ) 这里介绍的主要是后端开发的...
  • 20210527-海通证券-腾讯控股-0700.HK-海外报告:各业务稳中有升,持续加大企业服务、游戏、短视频投入换取长期增长.pdf
  • code 换取 session_key 这是一个 HTTP 接口,开发者服务器使用登录凭证 code 获取 session_key 和 openid。其中 session_key 是对用户数据进行加密签名的密钥。为了自身应用安全,session_key 不应该在网络上传输。 ...
  • 餐厅布草换取流程图

    2020-12-20 15:24:22
    酒店管理一直遵循着为客户服务的准则,相信你也需要了解一下餐厅布草换取流程图,赶快来下载餐厅布草换取...该文档为餐厅布草换取流程图,是一份很不错的参考资料,具有较高参考价值,感兴趣的可以下载看看
  • 专业服务以换取慈善捐赠。 就这么简单。 什么意思,捐出我的费用? 每个人都有自己内心深处的原因。 无论是医学研究小组、学校还是慈善机构,我们都在寻找提供帮助的方法。 捐赠金钱和志愿服务时间总是一种选择,但...
  • 2️⃣将code通过微信wx.request()接口传到后台,然后将code、appid、secret拼接之后传给微信服务器,从而换取上述openid及本次会话秘钥session_key等。 上述接口中: 1.url为后台接口地址。 2.data为本次会话要传递...

    目前实现微信授权登陆分以下几个部分:
    1️⃣:调取微信wx.login()接口获取code
    关于code:在这里插入图片描述
    在这里插入图片描述
    2️⃣将code通过微信wx.request()接口传到后台,然后将code、appid、secret拼接之后传给微信服务器,从而换取上述openid及本次会话秘钥session_key等。
    在这里插入图片描述
    上述接口中:
    1.url为后台接口地址。
    2.data为本次会话要传递的数据,例如将code传入后台
    3.header为请求头部行,关于这个,在微信的官方文档中即图片中’application/json’已经不是最新的,目前微信已经更新这个请求头部行,最新的头部行为

     header: {
                'Content-Type': 'application/x-www-form-urlencoded' // 默认值
              }
    

    如果上述请求头部行不正确,在发起网络请求时会报400错误(Bad Request)错误请求!
    上述代码中也要加上请求方式为POST请求
    完整代码如下:

        wx.login({
          success (res) {
            console.log("code"+"==="+res.code)
            wx.request({
              url: 'http://localhost:1314/wx/login', //并非真实的接口地址,此处采用本机作为服务器示例!!!
              method: 'POST',
              data: {
                code:res.code
              },
              header: {
                'Content-Type': 'application/x-www-form-urlencoded' // 默认值
              },
              success (res) {
                console.log(res.data)
              }
            })
          }
        })
    

    前端目前只需要这些内容~
    3️⃣后端接收前端传来的code并请求微信服务器换取openid等。【springboot】
    tips:如果不会spring的请看我的一篇springboot入门案例,授权登陆牵扯到的springboot并不深入,可以简要了解
    此篇文章采取两种方式给大家讲解(主要区别在于发起请求的方式!没必要的话可以只用一种!!!):
    (一):
    包结构如下:
    在这里插入图片描述

    第一种方法请忽略图中config包,采用utils工具类封装好的http请求工具类
    无法导入文件,在此我将两个文件的代码写在下面(太长了,请忽略直接复制粘贴!):
    HttpClientUtil:

    package com.java1234.util;
    
    import org.apache.http.HttpEntity;
    import org.apache.http.HttpResponse;
    import org.apache.http.NameValuePair;
    import org.apache.http.client.ClientProtocolException;
    import org.apache.http.client.HttpClient;
    import org.apache.http.client.config.RequestConfig;
    import org.apache.http.client.entity.UrlEncodedFormEntity;
    import org.apache.http.client.methods.CloseableHttpResponse;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.conn.ssl.DefaultHostnameVerifier;
    import org.apache.http.conn.util.PublicSuffixMatcher;
    import org.apache.http.conn.util.PublicSuffixMatcherLoader;
    import org.apache.http.entity.StringEntity;
    import org.apache.http.impl.client.CloseableHttpClient;
    import org.apache.http.impl.client.HttpClients;
    import org.apache.http.message.BasicNameValuePair;
    import org.apache.http.util.EntityUtils;
    import org.springframework.stereotype.Component;
    
    import java.io.*;
    import java.net.URL;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Map;
    
    
    /**
     * httpClient 工具类
     * @author java1234_小锋
     * @site www.java1234.com
     * @company Java知识分享网
     * @create 2019-02-10 下午 2:49
     */
    @Component
    public class HttpClientUtil {
    	
    	/**
    	 * 默认参数设置
    	 * setConnectTimeout:设置连接超时时间,单位毫秒。
    	 * setConnectionRequestTimeout:设置从connect Manager获取Connection 超时时间,单位毫秒。
    	 * setSocketTimeout:请求获取数据的超时时间,单位毫秒。访问一个接口,多少时间内无法返回数据,就直接放弃此次调用。 暂时定义15分钟
    	 */
    	private RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(600000).setConnectTimeout(600000).setConnectionRequestTimeout(600000).build();
    	
    	/**
    	 * 静态内部类---作用:单例产生类的实例
    	 * @author Administrator
    	 *
    	 */
    	private static class LazyHolder {    
           private static final HttpClientUtil INSTANCE = new HttpClientUtil();    
           
        }  
    	private HttpClientUtil(){}
    	public static HttpClientUtil getInstance(){
    		return LazyHolder.INSTANCE;    
    	}
    	
    	/**
    	 * 发送 post请求
    	 * @param httpUrl 地址
    	 */
    	public String sendHttpPost(String httpUrl) {
    		HttpPost httpPost = new HttpPost(httpUrl);// 创建httpPost  
    		return sendHttpPost(httpPost);
    	}
    	
    	/**
    	 * 发送 post请求
    	 * @param httpUrl 地址
    	 * @param params 参数(格式:key1=value1&key2=value2)
    	 */
    	public String sendHttpPost(String httpUrl, String params) {
    		HttpPost httpPost = new HttpPost(httpUrl);// 创建httpPost  
    		try {
    			//设置参数
    			StringEntity stringEntity = new StringEntity(params, "UTF-8");
    			stringEntity.setContentType("application/x-www-form-urlencoded");
    			httpPost.setEntity(stringEntity);
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		return sendHttpPost(httpPost);
    	}
    	
    	/**
    	 * 发送 post请求
    	 * @param httpUrl 地址
    	 * @param maps 参数
    	 */
    	public String sendHttpPost(String httpUrl, Map<String, String> maps) {
    		HttpPost httpPost = new HttpPost(httpUrl);// 创建httpPost  
    		// 创建参数队列  
    		List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
    		for (String key : maps.keySet()) {
    			nameValuePairs.add(new BasicNameValuePair(key, maps.get(key)));
    		}
    		try {
    			httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs, "UTF-8"));
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		return sendHttpPost(httpPost);
    	}
    	
    	/**
    	 * 发送Post请求
    	 * @param httpPost
    	 * @return
    	 */
    	private String sendHttpPost(HttpPost httpPost) {
    		CloseableHttpClient httpClient = null;
    		CloseableHttpResponse response = null;
    		HttpEntity entity = null;
    		String responseContent = null;
    		try {
    			// 创建默认的httpClient实例
    			httpClient = HttpClients.createDefault();
    			httpPost.setConfig(requestConfig);
    			// 执行请求
    			long execStart = System.currentTimeMillis();
    			response = httpClient.execute(httpPost);
    			long execEnd = System.currentTimeMillis();
    			System.out.println("=================执行post请求耗时:"+(execEnd-execStart)+"ms");
    			long getStart = System.currentTimeMillis();
    			entity = response.getEntity();
    			responseContent = EntityUtils.toString(entity, "UTF-8");
    			long getEnd = System.currentTimeMillis();
    			System.out.println("=================获取响应结果耗时:"+(getEnd-getStart)+"ms");
    		} catch (Exception e) {
    			e.printStackTrace();
    		} finally {
    			try {
    				// 关闭连接,释放资源
    				if (response != null) {
    					response.close();
    				}
    				if (httpClient != null) {
    					httpClient.close();
    				}
    			} catch (IOException e) {
    				e.printStackTrace();
    			}
    		}
    		return responseContent;
    	}
    
    	/**
    	 * 发送 get请求
    	 * @param httpUrl
    	 */
    	public String sendHttpGet(String httpUrl) {
    		HttpGet httpGet = new HttpGet(httpUrl);// 创建get请求
    		return sendHttpGet(httpGet);
    	}
    	
    	/**
    	 * 发送 get请求Https
    	 * @param httpUrl
    	 */
    	public String sendHttpsGet(String httpUrl) {
    		HttpGet httpGet = new HttpGet(httpUrl);// 创建get请求
    		return sendHttpsGet(httpGet);
    	}
    	
    	/**
    	 * 发送Get请求
    	 * @param httpGet
    	 * @return
    	 */
    	private String sendHttpGet(HttpGet httpGet) {
    		CloseableHttpClient httpClient = null;
    		CloseableHttpResponse response = null;
    		HttpEntity entity = null;
    		String responseContent = null;
    		try {
    			// 创建默认的httpClient实例.
    
    			
    			httpClient = HttpClients.createDefault();
    
    			httpGet.setConfig(requestConfig);
    			// 执行请求
    			response = httpClient.execute(httpGet);
    			entity = response.getEntity();
    			responseContent = EntityUtils.toString(entity, "UTF-8");
    		} catch (Exception e) {
    			e.printStackTrace();
    		} finally {
    			try {
    				// 关闭连接,释放资源
    				if (response != null) {
    					response.close();
    				}
    				if (httpClient != null) {
    					httpClient.close();
    				}
    			} catch (IOException e) {
    				e.printStackTrace();
    			}
    		}
    		return responseContent;
    	}
    	
    	/**
    	 * 发送Get请求Https
    	 * @param httpGet
    	 * @return
    	 */
    	private String sendHttpsGet(HttpGet httpGet) {
    		CloseableHttpClient httpClient = null;
    		CloseableHttpResponse response = null;
    		HttpEntity entity = null;
    		String responseContent = null;
    		try {
    			// 创建默认的httpClient实例.
    			PublicSuffixMatcher publicSuffixMatcher = PublicSuffixMatcherLoader.load(new URL(httpGet.getURI().toString()));
    			DefaultHostnameVerifier hostnameVerifier = new DefaultHostnameVerifier(publicSuffixMatcher);
    			httpClient = HttpClients.custom().setSSLHostnameVerifier(hostnameVerifier).build();
    			httpGet.setConfig(requestConfig);
    			// 执行请求
    			response = httpClient.execute(httpGet);
    			entity = response.getEntity();
    			responseContent = EntityUtils.toString(entity, "UTF-8");
    		} catch (Exception e) {
    			e.printStackTrace();
    		} finally {
    			try {
    				// 关闭连接,释放资源
    				if (response != null) {
    					response.close();
    				}
    				if (httpClient != null) {
    					httpClient.close();
    				}
    			} catch (IOException e) {
    				e.printStackTrace();
    			}
    		}
    		return responseContent;
    	}
    
    	/**
    	 * 发送xml数据
    	 * @param url
    	 * @param xmlData
    	 * @return
    	 * @throws ClientProtocolException
    	 * @throws IOException
    	 */
    	public static HttpResponse sendXMLDataByPost(String url, String xmlData)
    			throws ClientProtocolException, IOException {
    		HttpClient httpClient = HttpClients.createDefault();
    		HttpPost httppost = new HttpPost(url);
    		StringEntity entity = new StringEntity(xmlData);
    		httppost.setEntity(entity);
    		httppost.setHeader("Content-Type", "text/xml;charset=UTF-8");
    		HttpResponse response = httpClient.execute(httppost);
    		return response;
    	}
    
    	/**
    	 * 获得响应HTTP实体内容
    	 *
    	 * @param response
    	 * @return
    	 * @throws IOException
    	 * @throws UnsupportedEncodingException
    	 */
    	public static String getHttpEntityContent(HttpResponse response) throws IOException, UnsupportedEncodingException {
    		HttpEntity entity = response.getEntity();
    		if (entity != null) {
    			InputStream is = entity.getContent();
    			BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
    			String line = br.readLine();
    			StringBuilder sb = new StringBuilder();
    			while (line != null) {
    				sb.append(line + "\n");
    				line = br.readLine();
    			}
    			return sb.toString();
    		}
    		return "";
    	}
    
    
    }
    
    

    StringUtil(为字符串处理文件,和授权登陆也没有关系,忘记删除了,分享给大家叭):

    package com.mjc.boot.utils;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Random;
    
    /**
     * 字符串工具类
     * @author
     *
     */
    public class StringUtil {
    
    	/**
    	 * 判断是否是空
    	 * @param str
    	 * @return
    	 */
    	public static boolean isEmpty(String str){
    		if(str==null||"".equals(str.trim())){
    			return true;
    		}else{
    			return false;
    		}
    	}
    
    	/**
    	 * 判断是否不是空
    	 * @param str
    	 * @return
    	 */
    	public static boolean isNotEmpty(String str){
    		if((str!=null)&&!"".equals(str.trim())){
    			return true;
    		}else{
    			return false;
    		}
    	}
    
    	/**
    	 * 格式化模糊查询
    	 * @param str
    	 * @return
    	 */
    	public static String formatLike(String str){
    		if(isNotEmpty(str)){
    			return "%"+str+"%";
    		}else{
    			return null;
    		}
    	}
    
    	/**
    	 * 过滤掉集合里的空格
    	 * @param list
    	 * @return
    	 */
    	public static List<String> filterWhite(List<String> list){
    		List<String> resultList=new ArrayList<String>();
    		for(String l:list){
    			if(isNotEmpty(l)){
    				resultList.add(l);
    			}
    		}
    		return resultList;
    	}
    
    	/**
    	 * 去除html标签
    	 */
    	public static String stripHtml(String content) {
    	    // <p>段落替换为换行
    	    content = content.replaceAll("<p .*?>", "\r\n");
    	    // <br><br/>替换为换行
    	    content = content.replaceAll("<br\\s*/?>", "\r\n");
    	    // 去掉其它的<>之间的东西
    	    content = content.replaceAll("\\<.*?>", "");
    	    // 去掉空格
    	    content = content.replaceAll(" ", "");
    	    return content;
    	}
    
    	/**
    	 * 生成六位随机数
    	 * @return
    	 */
    	public static String genSixRandomNum(){
    		Random random = new Random();
    		String result="";
    		for (int i=0;i<6;i++)
    		{
    			result+=random.nextInt(10);
    		}
    		return result;
    	}
    
    	/**
    	 * 生成由[A-Z,0-9]生成的随机字符串
    	 * @param length  欲生成的字符串长度
    	 * @return
    	 */
    	public static String getRandomString(int length){
    		Random random = new Random();
    
    		StringBuffer sb = new StringBuffer();
    
    		for(int i = 0; i < length; ++i){
    			int number = random.nextInt(2);
    			long result = 0;
    
    			switch(number){
    				case 0:
    					result = Math.round(Math.random() * 25 + 65);
    					sb.append(String.valueOf((char)result));
    					break;
    				case 1:
    
    					sb.append(String.valueOf(new Random().nextInt(10)));
    					break;
    			}
    		}
    		return sb.toString();
    	}
    
    
    }
    
    

    同时pom.xml文件里要导入

    <!-- 添加Httpclient支持 -->
            <dependency>
                <groupId>org.apache.httpcomponents</groupId>
                <artifactId>httpclient</artifactId>
                <version>4.5.2</version>
            </dependency>
    
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>1.2.40</version>
            </dependency>
    

    以此来支持网络请求
    至此准备工作结束:开始编写Controller

    @RestController
    @RequestMapping("/wx")
    public class getopenid{
    
    
        @Autowired
       private HttpClientUtil httpClientUtil;
    
    
        @PostMapping("/login")
        public String  wxLogin(@RequestParam("code")String code){
        	//用自己的小程序信息
            String appid="你的小小程序appid";
            String secret="你的小程序secret";
            //拼接sql
            String loginUrl = "https://api.weixin.qq.com/sns/jscode2session?appid=" + appid +
                    "&secret=" + secret + "&js_code=" + code + "&grant_type=authorization_code";
    
            String result = httpClientUtil.sendHttpGet(loginUrl);
    
            System.out.println(result);
    
            JSONObject jsonObject = JSON.parseObject(result);//将json字符串转化为jsonobject
            String openid = jsonObject.get("openid").toString(); // 获取openId
    
            System.out.println(openid);
    
            return "hello";
    
        }
    }
    

    对上述代码的解释:
    关于几个注解,需要知道的可以去学一下springboot及注解,在这不做赘述
    我们刚才写的HttpClientUtil已经被丢到容器中,然后注入一下,对应下面这步
    在这里插入图片描述
    然后就是编写方法,通过得到code,再加上已知的appid和secret,如果secret忘记可以去微信小程序官网重置!
    然后拼接成sql,对应下面这步
    在这里插入图片描述
    然后向微信服务器发起网络请求
    在这里插入图片描述
    至此,请求成功之后微信会返回给我们一个结果,就是result
    我们打印一下result来看
    在这里插入图片描述
    可见包含session_key和openid,且为json格式
    我们通过对格式进行解析分别获得openid和session_key,采用JSONObject,不懂的话可以自行百度~
    在这里插入图片描述
    之后打印就会分别打印出来,我们将结果进行存储,可以采取map集合存储最后返回给前台map集合即可。由于我并没有做这些步骤,不在演示。
    由于要返回map集合,上述代码有些部分要更改:

       public Map<String, Object>  wxLogin(@RequestParam("code")String code){
            String appid="你的小程序appid";
            String secret="你的小程序secret";
            //拼接sql
            String loginUrl = "https://api.weixin.qq.com/sns/jscode2session?appid=" + appid +
                    "&secret=" + secret + "&js_code=" + code + "&grant_type=authorization_code";
    
            String result = httpClientUtil.sendHttpGet(loginUrl);
    
            System.out.println(result);
    
            JSONObject jsonObject = JSON.parseObject(result);//将json字符串转化为jsonobject
            String openid = jsonObject.get("openid").toString(); // 获取openId
            String session_key = jsonObject.get("session_key").toString();
            System.out.println(openid);
            System.out.println(session_key);
            Map<String,Object> resultMap=new HashMap<>();
            resultMap.put("openid",openid);
            resultMap.put("session_key",session_key);
            return resultMap;
    
        }
    

    至此,我们演示一下
    后台:
    在这里插入图片描述
    可以看到,解析出来openid和session_key并且打印出来

    前台:
    在这里插入图片描述
    后台已经将集合返回给前台,前台也获取到了
    这就是方法(一)实现

    (二):
    方法二和方法一的区别在于实现网络请求的部分不同,如果不必要!可以不用看!
    springboot提供了一个模板:RestTemplate
    还记得我们忽略的config包吗
    在这里插入图片描述

    package com.mjc.boot.config;
    
    
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.client.RestTemplate;
    
    @Configuration
    public class LoginConfig {
    
        @Bean
        public RestTemplate restTemplate(){
            return new RestTemplate();
        }
    }
    

    代码中:
    将该类作为springboot的配置类,采用注解@Configuration
    @Bean将方法丢到容器中

    然后我们在刚才的Controller中
    注入这个模板
    在这里插入图片描述
    并且采用这个对象里的方法进行网络请求就可以了!!
    在这里插入图片描述
    其余部分和方法一一样!

    ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
    至此调用微信接口实现授权登录主体内容就是上面所述,至于登录态控制和将用户信息存入数据库本例未涉及,可以自行编写!
    本例也是自己和朋友钻研的结果,之前很是头疼,可以说手把手,nt式教学,不懂的宝贝们评论区见~~
    再见再见再见~

    展开全文
  • 例如,用户可以请求铸造100个组织令牌以换取100个DAI。 该请求将需要投票批准,如果投票被拒绝,则用户将收到他们的付款,如果批准,则付款将被存入组织的保险库中。 :police_car_light: 安全审查状态:已 它是...
  • 这是一款整理发布的餐厅布件换取工作流程图,需要了解相关餐厅布件换取工作流程图的你一定不容...该文档为餐厅布件换取工作流程图,是一份很不错的参考资料,具有较高参考价值,感兴趣的可以下载看看
  • 成功最有效的是复制,并非所有复制能够起效果,希望整理发布的章子怡:用机会换取更多的机会能...该文档为章子怡:用机会换取更多的机会,是一份很不错的参考资料,具有较高参考价值,感兴趣的可以下载看看
  • 无线无处不在,这是毫无疑问的。而现在可以无线的方式为移动设备充电的方法有许多种,而这种在生活不用电线(意为缆线和连接器)的方便性似乎非常具有吸引力。 不管是功率传输或数据连接,这些有线链路意味着需要一...
  • 餐厅布草换取流程图(表格模板、DOC格式).doc
  • 基于RFID技术的光阻换取智能推车系统设计.pdf
  • 银行行业月度报告:以利润换取资产质量好转.pdf
  • 工业电子中的我们是否需要以电力为代价来换取无线?工业电子中的我们是否需要以电力为代价来换取无线?无线无处不在,这是毫无疑问的。而现在可以无线的方式为移动设备充电的方法有许多种,而这种在生活不用电线(意...
  • 网络游戏-游戏中角色进行任务以换取复活的方法.zip
  • 从“环境换取增长”到“环境优化增长”环境与经济.pptx
  • 目录前言一、配置回调地址二、用户同意授权,获取code三、前端传回code 换取openid结语 前言 说实话前几天好想看到用户信息那玩意接口又改了,有点e心了就,老改来改去的。 官方网页授权文档:点击直达 步骤; 第一...

    ❤️砥砺前行,不负余光,永远在路上❤️

    前言

    说实话前几天好想看到用户信息那玩意接口又改了,有点e心了就,老改来改去的。
    官方网页授权文档:点击直达
    步骤;

    1. 第一步:用户同意授权,获取code
    2. 第二步:通过code换取网页授权access_token
    3. 第三步:刷新access_token(如果需要)
    4. 第四步:拉取用户信息(需scope为 snsapi_userinfo)

    一、配置回调地址

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    二、用户同意授权,获取code

    也就是他给你一个网址你在微信中打开,授权之后会携带code以及一些额外的参数跳转到你配置的回调地址中,然后你在回调页面做自己的业务,可以拿到code,用code去换取openid 以及access_token
    原地址如下,我拆分参数说一下:

    https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
    

    APPID:不用说吧 后台的公众号APPID
    REDIRECT_URI :就是你配置的那个域名 要上传一个验证文件通过才可以,没通过会有响应的报错信息。
    SCOPE:这玩意有snsapi_base和snsapi_userinfo 两种 如果只需要获取code 直接snsapi_base就行,后边一个好像可以授权用户信息(自测,没试过)
    state:额外的参数,重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值,最多128字节

    例子:https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx6f877428ac5ee3f2&redirect_uri=https://nmxgzs.cn/&response_type=code&scope=snsapi_userinfo&state=STATE&connect_redirect=1#wechat_redirect
    我把这玩意复制到微信打开之后就会跳转到我自己的域名下,并且携带code

    https://nmxgzs.cn/?code=031FaeHa1yCecD03enHa1RkDnl2FaeHF&state=STATE#/home
    

    前端获取code以及业务代码,我这里就是拿到code 传回后端 后端请求接口拿到 openid

    /* 从URL中拿到CODE 转换为OPEN_ID */
    const url = window.location.href;
    const query = qs.parse(url.split("?")[1]);
    console.log(query, "query");
    const { code } = query;
    if (code) {
    	getOpenidByCode({
    		code,
    	}).then((res) => {
    		const { openid } = res.data;
    		if (openid) {
    			getCarList({
    				OPEN_ID: openid,
    				// OPEN_ID: 'oatSL6WPLJc_ypZ0_Q3w77TBEg9M',
    			}).then((res) => {
    				carList.value = res.data;
    			});
    			localStorage.setItem("openid", openid);
    		}
    	});
    }
    

    三、前端传回code 换取openid

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

    正确返回的结果如下:

    {
      "access_token":"ACCESS_TOKEN",
      "expires_in":7200,
      "refresh_token":"REFRESH_TOKEN",
      "openid":"OPENID",
      "scope":"SCOPE" 
    }
    

    结语

    主要是做个记录,官网有更加详细的说明,可能有些人不是很了解回调地址那玩意咋个用,咋个配置。其实我做这个也就是为了拿到openid 前端记录一些信心然后公众号发送模板消息。

    展开全文
  • 用户在当地市场上发布小职位(厚待)以换取现金的市场; 目前处于测试阶段。 Favours-io在协作消费领域发挥作用。 需要帮忙吗? 还是想快速赚一些钱? 该应用程序旨在通过现有社交网络利用本地联系将本地社区聚集在...
  • 从“环境换取增长”到“环境优化增长”——环境与经济关系的转.pptx
  • 微信小程序使用code 换取openId

    千次阅读 2020-06-12 16:13:36
    使用button组件的open-type的getPhoneNumber和bindgetphonenumber ...2.调用wx.login属性 在成功的回调中拿到code码 wx.login({ success:function(res){ res.code//成功的回调拿到的code } }) ...
    1. 使用button组件的open-typegetPhoneNumberbindgetphonenumber
      在这里插入图片描述
      点击允许可以拿到相对应的encryptedData(完整的加密数据)码和iv(加密算法的初始向量)
      2.调用wx.login属性 在成功的回调中拿到code码
    wx.login({
    	success:function(res){
    		res.code//成功的回调拿到的code
    	}
    })
    

    3.通过wx.request 吧参数发送给后端 后端在解码之后,会获取到对应的手机号码和openId 完整步骤

    	getPhoneNumber: function(e) {
    		if (e.detail.errMsg == "getPhoneNumber:ok") {
    			wx.login({
    				success(res) {
    					wx.request({
    						url: '请求地址',
    						method: "post",
    						data: {
    							code:res.code,
    							encryptedData: e.detail.encryptedData,
    							iv: e.detail.iv
    						},
    						success: function(res) {
    							if(res.data.status==200){
    							//返回的openId
    								wx.setStorageSync('token',res.data.data.openId)
    							}else{
    								wx.showModal({
    									title:"提示",
    									content:"出错了,请稍后重试"
    								})
    							}
    						}
    					})
    				}
    			})
    		}
    	},
    
    展开全文
  • 银行业月度报告:以利润换取资产质量好转-20190311-财富证券-11页.pdf
  • 人才交流一个供有才华的人寻找影响组织以换取食宿的市场目录发展安装依赖安装 运行 Postgres.app npm installnpm start堆表示助焊剂节点.js ReactPostgreSQL 续集API 端点
  • 微信小程序的用户信息获取需要请求微信的服务器,通过小程序提供的API在小程序端获取CODE,然后将CODE传入到我们自己的服务器,用我们的服务器来换取session_key和openid。 小程序端比较简单,从教程的API部分把...
  • 1、设置某个页面为启动后打开的第一个页面 在开发微信小程序的时候,除了tabBar上设置的页面之外,想进入肯定要走跳转之类的进入,但是我们开发的时候肯定想要直接看到该页面,那么我们就需要设置一下启动页面了有两...
  • 碳信用账户这是邀请修改“ Cyclos” OS银行软件以进行碳排放交易-以换取碳信用奖励。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 87,823
精华内容 35,129
关键字:

怎么换取