第一篇 小程序登錄獲取,小程序的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&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 只能使用一次