`

微信小程序使用code换openid的方法(JAVA、SpringBoot)

阅读更多
  微信小程序序的代码中提示,使用code换取openid,但官方文档中没有给出进一步的说明。
  换取openid的要点:由于安全的原因,必须由自己小程序的服务器端完成。知道了这个要点,实现起来就简单了,服务器端写一个RestController,接收code参数,使用httpclient向微信的服务端换openid就行了。
  代码使用了SpringBoot,不会也不难理解。主要代码如下:

package com.wallimn.iteye.sp.asset.common.controller;

import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.wallimn.iteye.sp.asset.common.util.AesUtil;
import com.wallimn.iteye.sp.asset.common.util.HttpUtil;

@RestController
@RequestMapping("/api/wx")
public class WeixinController {

	private static Logger log = LoggerFactory.getLogger(WeixinController.class);

	@Value("${wx.appId}")
	private String appId;

	@Value("${wx.appSecret}")
	private String appSecret;

	@Value("${wx.grantType}")
	private String grantType;
	// wx.grantType=authorization_code

	@Value("${wx.requestUrl}")
	private String requestUrl;
	// wx.requestUrl=https://api.weixin.qq.com/sns/jscode2session

	@RequestMapping("/session")
	public Map<String, Object> getSession(@RequestParam(required = true) String code) {
		return this.getSessionByCode(code);
	}

	@SuppressWarnings("unchecked")
	private Map<String, Object> getSessionByCode(String code) {
		String url = this.requestUrl + "?appid=" + appId + "&secret=" + appSecret + "&js_code=" + code + "&grant_type="
				+ grantType;
		// 发送请求
		String data = HttpUtil.get(url);
		log.debug("请求地址:{}", url);
		log.debug("请求结果:{}", data);
		ObjectMapper mapper = new ObjectMapper();
		Map<String, Object> json = null;
		try {
			json = mapper.readValue(data, Map.class);
		} catch (Exception e) {
			e.printStackTrace();
		}
		// 形如{"session_key":"6w7Br3JsRQzBiGZwvlZAiA==","openid":"oQO565cXXXXXEvc4Q_YChUE8PqB60Y"}的字符串
		return json;
	}
}


用到了一个httpclient封闭的工具类,代码如下:
package com.wallimn.iteye.sp.asset.common.util;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.message.BasicNameValuePair;

public class HttpUtil {

	private static final String Charset = "utf-8";


	/**
	 * 发送请求,如果失败,会返回null
	 * @param url
	 * @param map
	 * @return
	 */
	public static String post(String url, Map<String, String> map) {
		// 处理请求地址
		try {
			HttpClient client = HttpClientBuilder.create().build();
			URI uri = new URI(url);
			HttpPost post = new HttpPost(uri);

			// 添加参数
			List<NameValuePair> params = new ArrayList<NameValuePair>();
			for (String str : map.keySet()) {
				params.add(new BasicNameValuePair(str, map.get(str)));
			}
			post.setEntity(new UrlEncodedFormEntity(params, Charset));
			// 执行请求
			HttpResponse response = client.execute(post);

			if (response.getStatusLine().getStatusCode() == 200) {
				// 处理请求结果
				StringBuffer buffer = new StringBuffer();
				InputStream in = null;
				try {
					in = response.getEntity().getContent();
					BufferedReader reader = new BufferedReader(new InputStreamReader(in,Charset));
					String line = null;
					while ((line = reader.readLine()) != null) {
						buffer.append(line);
					}

				} catch (Exception e) {
					e.printStackTrace();
				} finally {
					// 关闭流
					if (in != null)
						try {
							in.close();
						} catch (Exception e) {
							e.printStackTrace();
						}
				}

				return buffer.toString();
			} else {
				return null;
			}
		} catch (Exception e1) {
			e1.printStackTrace();
		}
		return null;

	}

	/**
	 * 发送请求,如果失败会返回null
	 * @param url
	 * @param str
	 * @return
	 */
	public static String post(String url, String str) {
		// 处理请求地址
		try {
			HttpClient client = HttpClientBuilder.create().build();
			URI uri = new URI(url);
			HttpPost post = new HttpPost(uri);
			post.setEntity(new StringEntity(str, Charset));
			// 执行请求
			HttpResponse response = client.execute(post);

			if (response.getStatusLine().getStatusCode() == 200) {
				// 处理请求结果
				StringBuffer buffer = new StringBuffer();
				InputStream in = null;
				try {
					in = response.getEntity().getContent();
					BufferedReader reader = new BufferedReader(new InputStreamReader(in,"utf-8"));
					String line = null;
					while ((line = reader.readLine()) != null) {
						buffer.append(line);
					}

				} finally {
					// 关闭流
					if (in != null)
						in.close();
				}

				return buffer.toString();
			} else {
				return null;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;

	}

	/**
	 * 发送GET方式的请求,并返回结果字符串。
	 * <br>
	 * 时间:2017年2月27日,作者:http://wallimn.iteye.com
	 * @param url
	 * @return 如果失败,返回为null
	 */
	public static String get(String url) {
		try {
			HttpClient client = HttpClientBuilder.create().build();
			URI uri = new URI(url);
			HttpGet get = new HttpGet(uri);
			HttpResponse response = client.execute(get);
			if (response.getStatusLine().getStatusCode() == 200) {
				StringBuffer buffer = new StringBuffer();
				InputStream in = null;
				try {
					in = response.getEntity().getContent();
					BufferedReader reader = new BufferedReader(new InputStreamReader(in,Charset));
					String line = null;
					while ((line = reader.readLine()) != null) {
						buffer.append(line);
					}

				} finally {
					if (in != null)
						in.close();
				}

				return buffer.toString();
			} else {
				return null;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;

	}
}



小程序中,使用wx.request(url:'https://域名/api/wx/session',....),就可以拿到一个JSON对象,其中有openid。
1
0
分享到:
评论

相关推荐

    微信小程序 springboot后台如何获取用户的openid

    在上面的代码中,我们可以看到,微信小程序 SpringBoot 后台获取用户的 OpenID 的过程需要通过微信 API 来实现,后台需要使用微信 API 的 jscode2session 接口来换取 openid,並将其返回到微信小程序中。 在 ...

    Java-Spring Boot 微信小程序支付模块完整版

    1.在小程序中获取用户的登录信息,成功后可以获取到用户的code值 2.在用户自己的服务端请求微信获取用户openid接口,成功后可以获取用户的openid值 ...4.在微信小程序中支付订单,最终实现微信的支付功能

    微信小程序后端开发demo包括获取openid微信支付

    首先,**获取openid**是微信小程序与微信服务器进行数据交互的基础。Openid是每个微信用户在小程序中的唯一标识,它允许小程序识别并关联到具体的微信用户。获取openid通常通过以下几个步骤完成: 1. **授权登录**:...

    微信jsapi V3支付、退款、小程序登录

    微信小程序登录功能允许用户授权后获取微信用户的基本信息,如openid和unionid。用户点击授权后,小程序会跳转到微信服务器获取code,然后服务器端使用code换取openid和access_token,再进一步获取用户信息。这样...

    微信小程序书店springboot后端源码案例设计.zip

    微信小程序书店SpringBoot后端源码案例设计是一个典型的Web开发项目,主要采用了微信小程序作为前端交互界面,结合SpringBoot框架构建后端服务。这个案例旨在教授开发者如何将这两种技术有效地结合,实现一个完整的...

    springboot实现web端微信扫码登录项目(基于微信开放平台)

    在本文中,我们将深入探讨如何使用SpringBoot框架来实现一个基于微信开放平台的Web端扫码登录功能。微信扫码登录是一种安全、便捷的用户身份验证方式,它允许用户通过扫描二维码来授权登录,而无需输入用户名和密码...

    springboot对接小程序登录、模板消息完整代码

    在本文中,我们将深入探讨如何使用SpringBoot框架与微信小程序进行对接,实现小程序的用户登录功能以及发送模板消息。SpringBoot以其简洁、高效的特点,在Java Web开发中广泛应用,而微信小程序则是移动端的一种轻量...

    基于 springboot 实现微信扫描小程序码登录.zip

    在本项目"基于 springboot 实现微信扫描小程序码登录.zip"中,主要涉及的技术栈包括 Java、Spring Boot、以及微信小程序的相关开发。下面将详细解释这些技术及其在项目中的应用。 1. **Java**: 作为项目的编程语言...

    springboot+微信端登录demo

    首先,我们需要了解SpringBoot框架,它是Spring平台的核心模块,简化了创建独立的、生产级别的基于Java的应用程序过程。微信登录则涉及到微信开放平台,允许开发者通过API与微信用户进行交互。 1. **SpringBoot基础...

    微信小程序如何通过用户授权获取手机号(getPhoneNumber)

    在微信小程序开发中,获取用户授权获取手机号是一个关键的功能,特别是在需要实名认证或个性化服务的场景下。本文将详细讲解如何使用`getPhoneNumber` API来实现这一功能,并提供具体的实现思路和示例代码。 首先,...

    【微信JSPI支付】小程序支付/公众号支付 Java后台源码 项目采用SpringBoot框架 可直接运行

    项目采用SpringBoot框架,可直接运行,...包含统一下单(支付接口)即WeixinController中pay方法、支付结果通知(回调接口)即WeixinController中notify方法、使用code获取openid接口即WeixinController中prepay方法

    Java中基于Shiro,JWT实现微信小程序登录完整例子及实现过程

    4. 处理微信小程序的登录请求,使用code换取openid和session_key,生成JWT并返回给小程序。 5. 配置Shiro的过滤器链,实现JWT的自动鉴权。 6. 使用Redis存储JWT,实现登录状态的持久化。 通过以上步骤,你可以构建...

    wxdome.rar

    2. **SpringBoot后端处理**:当后端接收到微信小程序发送的授权码后,通过调用微信API,使用AppID和AppSecret换取access_token和openid。access_token是微信服务器用于识别调用方身份的凭证,而openid是用户的唯一...

    【主流技术】Spring Boot中的微信支付(小程序).doc

    1. 在微信小程序公众平台注册小程序,获取唯一APPID。 2. 在微信支付商户平台中绑定已获取的APPID,确保支付功能可用。 六、实战——SpringBoot框架集成 1. 初始化Spring Boot项目,配置不同环境的属性文件。 2. ...

Global site tag (gtag.js) - Google Analytics