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 只能使用一次

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章