1. 程式人生 > >Java開發微信小程式(一)登入並獲取小程式的openId和unionId

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