微信公眾平臺(tái)近日悄然開(kāi)始內(nèi)測(cè)微信小程序(微信公眾號(hào))功能,引來(lái)無(wú)數(shù)開(kāi)發(fā)者和普通用戶(hù)關(guān)注,微信支付的能力,是隨著小程序的發(fā)布一并推出的,具有介紹如下:
wx.login(OBJECT)
調(diào)用接口獲取登錄憑證(code)進(jìn)而換取用戶(hù)登錄態(tài)信息,包括用戶(hù)的唯一標(biāo)識(shí)(openid) 及本次登錄的 會(huì)話密鑰(session_key)。用戶(hù)數(shù)據(jù)的加解密通訊需要依賴(lài)會(huì)話密鑰完成。
OBJECT參數(shù)說(shuō)明:
success返回參數(shù)說(shuō)明:
示例代碼:
//app.jsApp({ onLaunch: function() { wx.login({ success: function(res) { if (res.code) { //發(fā)起網(wǎng)絡(luò)請(qǐng)求 wx.request({ url: 'https://test.com/onLogin', data: { code: res.code } }) } else { console.log('獲取用戶(hù)登錄態(tài)失敗!' + res.errMsg) } } }); }})code 換取 session_key
這是一個(gè) HTTP 接口,開(kāi)發(fā)者服務(wù)器使用登錄憑證 code 獲取 session_key 和 openid。其中 session_key 是對(duì)用戶(hù)數(shù)據(jù)進(jìn)行加密簽名的密鑰。為了自身應(yīng)用安全,session_key 不應(yīng)該在網(wǎng)絡(luò)上傳輸。
接口地址:
請(qǐng)求參數(shù):
返回參數(shù):
返回說(shuō)明:
//正常返回的JSON數(shù)據(jù)包{ "openid": "OPENID", "session_key": "SESSIONKEY" "expires_in": 2592000}//錯(cuò)誤時(shí)返回JSON數(shù)據(jù)包(示例為Code無(wú)效){ "errcode": 40029, "errmsg": "invalid code"}登錄態(tài)維護(hù)
通過(guò) wx.login() 獲取到用戶(hù)登錄態(tài)之后,需要維護(hù)登錄態(tài)。開(kāi)發(fā)者要注意不應(yīng)該直接把 session_key、openid 等字段作為用戶(hù)的標(biāo)識(shí)或者 session 的標(biāo)識(shí),而應(yīng)該自己派發(fā)一個(gè) session 登錄態(tài)(請(qǐng)參考登錄時(shí)序圖)。對(duì)于開(kāi)發(fā)者自己生成的 session,應(yīng)該保證其安全性且不應(yīng)該設(shè)置較長(zhǎng)的過(guò)期時(shí)間。session 派發(fā)到小程序客戶(hù)端之后,可將其存儲(chǔ)在 storage ,用于后續(xù)通信使用。
登錄時(shí)序圖
wx.checkSession(OBJECT)
檢查登陸態(tài)是否過(guò)期
示例代碼:
wx.checkSession({ success: function(){ //登錄態(tài)未過(guò)期 }, fail: function(){ //登錄態(tài)過(guò)期 wx.login() }})用戶(hù)數(shù)據(jù)的簽名驗(yàn)證和加解密
數(shù)據(jù)簽名校驗(yàn)
為了確保 開(kāi)放接口 返回用戶(hù)數(shù)據(jù)的安全性,微信會(huì)對(duì)明文數(shù)據(jù)進(jìn)行簽名。開(kāi)發(fā)者可以根據(jù)業(yè)務(wù)需要對(duì)數(shù)據(jù)包進(jìn)行簽名校驗(yàn),確保數(shù)據(jù)的完整性。
如wx.getUserInfo的數(shù)據(jù)校驗(yàn):
接口返回的rawData:
{ "nickName": "Band", "gender": 1, "language": "zh_CN", "city": "Guangzhou", "province": "Guangdong", "country": "CN", "avatarUrl": "http://wx.qlogo.cn/mmopen/vi_32/1vZvI39NWFQ9XM4LtQpFrQJ1xlgZxx3w7bQxKARol6503Iuswjjn6nIGBiaycAjAtpujxyzYsrztuuICqIM5ibXQ/0"}用戶(hù)的 session-key:
HyVFkGl5F5OQWJZZaNzBBg==
所以,用于簽名的字符串為:
{ "nickName": "Band", "gender": 1, "language": "zh_CN", "city": "Guangzhou", "province": "Guangdong", "country": "CN", "avatarUrl": "http://wx.qlogo.cn/mmopen/vi_32/1vZvI39NWFQ9XM4LtQpFrQJ1xlgZxx3w7bQxKARol6503Iuswjjn6nIGBiaycAjAtpujxyzYsrztuuICqIM5ibXQ/0"}HyVFkGl5F5OQWJZZaNzBBg==使用sha1得到的結(jié)果為
75e81ceda165f4ffa64f4068af58c64b8f54b88c
加密數(shù)據(jù)解密算法
接口如果涉及敏感數(shù)據(jù)(如wx.getUserInfo當(dāng)中的 openId 和unionId ),接口的明文內(nèi)容將不包含這些敏感數(shù)據(jù)。開(kāi)發(fā)者如需要獲取敏感數(shù)據(jù),需要對(duì)接口返回的加密數(shù)據(jù)( encryptedData )進(jìn)行對(duì)稱(chēng)解密。 解密算法如下:
微信官方提供了多種編程語(yǔ)言的示例代碼(點(diǎn)擊下載)。每種語(yǔ)言類(lèi)型的接口名字均一致。調(diào)用方式可以參照示例。
注:此前提供的加密數(shù)據(jù)(encryptData)以及對(duì)應(yīng)的加密算法將被棄用,請(qǐng)開(kāi)發(fā)者不要再依賴(lài)舊邏輯。
用戶(hù)信息:
### wx.getUserInfo(OBJECT)
獲取用戶(hù)信息,需要先調(diào)用 wx.login 接口。
OBJECT參數(shù)說(shuō)明:
success返回參數(shù)說(shuō)明:
示例代碼:
wx.getUserInfo({ success: function(res) { var userInfo = res.userInfo var nickName = userInfo.nickName var avatarUrl = userInfo.avatarUrl var gender = userInfo.gender //性別 0:未知、1:男、2:女 var province = userInfo.province var city = userInfo.city var country = userInfo.country }})encryptedData 解密后為以下 json 結(jié)構(gòu),詳見(jiàn)加密數(shù)據(jù)解密算法
{ "appId": "APPID", "openId": "OPENID", "nickName": "NICKNAME", "gender": 1, "city": "CITY", "province": "PROVINCE", "country": "COUNTRY", "avatarUrl": "AVATARURL", "unionId": "UNIONID"}UnionID機(jī)制說(shuō)明:
如果開(kāi)發(fā)者擁有多個(gè)移動(dòng)應(yīng)用、網(wǎng)站應(yīng)用、和公眾帳號(hào)(包括小程序),可通過(guò)unionid來(lái)區(qū)分用戶(hù)的唯一性,因?yàn)橹灰峭粋€(gè)微信開(kāi)放平臺(tái)帳號(hào)下的移動(dòng)應(yīng)用、網(wǎng)站應(yīng)用和公眾帳號(hào)(包括小程序),用戶(hù)的unionid是唯一的。換句話說(shuō),同一用戶(hù),對(duì)同一個(gè)微信開(kāi)放平臺(tái)下的不同應(yīng)用,unionid是相同的。
微信開(kāi)放平臺(tái)綁定小程序流程
前提:微信開(kāi)放平臺(tái)帳號(hào)必須已完成開(kāi)發(fā)者資質(zhì)認(rèn)證
開(kāi)發(fā)者資質(zhì)認(rèn)證流程:
登錄微信開(kāi)放平臺(tái)(open.weixin.qq.com) 主站蜘蛛池模板: 晋江市| 濮阳市| 西畴县| 玉溪市| 瑞昌市| 开原市| 车致| 南召县| 金昌市| 达日县| 榆社县| 文化| 绥化市| 洱源县| 定远县| 长兴县| 威远县| 屏东市| 西城区| 梓潼县| 英吉沙县| 安宁市| 沈阳市| 新邵县| 桑日县| 彰化县| 栾川县| 綦江县| 阿坝县| 永宁县| 蒙山县| 巢湖市| 化州市| 垫江县| 合肥市| 温泉县| 竹溪县| 舟山市| 阿克苏市| 体育| 三台县|