Java开发微信小程序(一)登录并获取小程序的openId和unionId

第一篇 小程序登录获取,小程序的openId和unionId。

最近公司做了一个微信的小程序应用,做了一些技术研究也踩了不少坑,不过最终结果不错小程序顺利上线。

在这里做一个开发笔记,主要记录以下几个方面,分别用四篇文章来记录:

1.小程序登录获取,小程序的openId和unionId。

2.获取并解密小程序的加密信息包括用户和手机信息。

3.用小程序给用户推送服务消息。

4.给绑定小程序而且又关注微信公众号的用户推送公众号消息。

1.首先从最基础开始介绍一下小程序账号的登录

    1.1 微信小程序注册前准备

https://developers.weixin.qq.com/miniprogram/introduction/index.html

    1.2 开发前准备

https://developers.weixin.qq.com/miniprogram/dev/index.html

    1.3 小程序开发工具下载

https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html?t=18101520

    1.4 小程序开发API文档

https://developers.weixin.qq.com/miniprogram/dev/api/network/download/wx.downloadFile.html

2.微信公众平台登录https://mp.weixin.qq.com/

3.登录后配置服务器,在开发设置页面查看AppID和AppSecret,配置服务器域名

4.完成以上设置后AppID和AppSecret保存在java服务端,接下来我们看一下小程序和java后台的交互过程

首先是小程序端调用wx.login()发起登录,将code也就是票据传递给我们自己的java后台,

wx.login({
        success: function (res) {
          console.log(res);
          if (res.code) {
            wx.request({
              url: "https://www.test.com/miniprogramLogin",
              data: {
                head: {},
                body: {
                  code: res.code
                }
              },
              method: "POST",
              header: {
                'content-type': 'application/json',
              },
              success: function (res) {
                console.log(res);
              },
              fail: function (error) {
                console.log(error);
              }
            })
          }
        },
        fail: function (error) {
          console.log(error);
        }
})

接下来在java后台我们用保存好的AppID,AppSecret和传递过来的code,调用 code2Session 接口获取openId,unionId和session_key

public class MiniprogramLoginInterfaceAction extends BaseInterfaceAction {
	private static final Logger logger = LoggerFactory.getLogger(MiniprogramLoginInterfaceAction.class);

	@Override
	public String execute() throws Exception {
		logger.debug("小程序登录后获取用户在小程序里的openid和unionId-----开始");
		// 获取前端传递的数据
		HttpServletRequest request = this.getRequest();
		String code = request.getParameter("code");
		//AppID,AppSecret和传递过来的code,调用 code2Session 接口获取openId,unionId和session_key
		MiniprogramResult miniprogramResult = MiniprogramUtil.getOpenId(code);
		if (miniprogramResult != null) {
			// 获取用户的唯一标识openid
			String openid = miniprogramResult.getOpenid();
			// 获取用户的唯一标识unionid
			 String unionid = miniprogramResult.getUnionid();
			// 获取会话秘钥
			 String session_key = miniprogramResult.getSession_key();
			// 下面就可以写自己的业务代码了

		}
		logger.debug("小程序登录后获取用户在小程序里的openid和unionId-----结束返回数据:" + miniprogramResult);
		return null;
	}

}

MiniprogramUtil.getOpenId(code)方法 

	/**
	 * 微信登录成功后获取用户的openId和unionId
	 * <p/>
	 * Date 2018年9月29日 下午5:03:15
	 * <p/>
	 * 
	 * @author 网行天下
	 */
	public static MiniprogramResult getOpenId(String code) {
		logger.info("获取小程序OpenId和SessionKey数据开始code:" + code);
		MiniprogramResult miniprogramResult = null;
		String sessionData = "";
		String appid = "xxx";
		String secret = "xxx";
		String authorizationCodeUrl= "https://api.weixin.qq.com/sns/jscode2session?appid=%s&amp;secret=%s&amp;js_code=%s&amp;grant_type=authorization_code";
		// 微信的接口
		String url = String.format(authorizationCodeUrl, appid,secret, code);
		logger.debug(url);
		RestTemplate restTemplate = new RestTemplate();
		// 进行网络请求,访问url接口
		ResponseEntity<String> responseEntity = restTemplate.exchange(url, HttpMethod.GET, null, String.class);
		// 根据返回值进行后续操作
		if (responseEntity != null && responseEntity.getStatusCode() == HttpStatus.OK) {
			sessionData = responseEntity.getBody();
			// 此处为返回json数据转换成javabean,可以自己查阅其他材料写
			miniprogramResult = FastJsonUtils.getJavaBean(sessionData, MiniprogramResult.class);
			if (miniprogramResult != null) {
				return miniprogramResult;
			}
		}
		logger.info("获取小程序OpenId和SessionKey数据结束result:" + miniprogramResult);
		return miniprogramResult;
	}

MiniprogramResult   JavaBean

import java.io.Serializable;

public class MiniprogramResult implements Serializable {

	private static final long serialVersionUID = 1L;

	/** 获取到openid */
	public String openid;
	/** 获取到unionid */
	public String unionid;
	/** 获取到session_key */
	public String session_key;
	/** 获取到的凭证 */
	public String access_token;
	/** 凭证有效时间,单位:秒 */
	public Integer expires_in;
	/** 错误码 */
	public Integer errcode;
	/** 错误信息 */
	public String errmsg;

    // get set 省略
}

然后openId,unionId取得后需要保存到数据库,session_key取到后保存在服务端缓存中。

需要注意

a.会话密钥 session_key 是对用户数据进行 加密签名 的密钥。session_key的有效期不固定,微信通过用户行为来维护
b.临时登录凭证 code 只能使用一次

猜你喜欢

转载自blog.csdn.net/ieflex/article/details/83147163