Java開發微信小程式(一)登入並獲取小程式的openId和unionId
第一篇 小程式登入獲取,小程式的openId和unionId。
最近公司做了一個微信的小程式應用,做了一些技術研究也踩了不少坑,不過最終結果不錯小程式順利上線。
在這裡做一個開發筆記,主要記錄以下幾個方面,分別用四篇文章來記錄:
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&secret=%s&js_code=%s&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 只能使用一次