国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > JavaScript > 正文

微信小程序-詳解微信登陸、微信支付、模板消息

2019-11-19 18:51:42
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

微信公眾平臺(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ò)上傳輸。

接口地址:

https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code

請(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ù)的完整性。

  • 簽名校驗(yàn)算法涉及用戶(hù)的session_key,通過(guò) wx.login 登錄流程獲取用戶(hù)session_key,并自行維護(hù)與應(yīng)用自身登錄態(tài)的對(duì)應(yīng)關(guān)系。
  • 通過(guò)調(diào)用接口(如 wx.getUserInfo)獲取數(shù)據(jù)時(shí),接口會(huì)同時(shí)返回 rawData、signature,其中 signature = sha1( rawData + session_key )
  • 開(kāi)發(fā)者將 signature、rawData 發(fā)送到開(kāi)發(fā)者服務(wù)器進(jìn)行校驗(yàn)。服務(wù)器利用用戶(hù)對(duì)應(yīng)的 session_key 使用相同的算法計(jì)算出簽名 signature2 ,比對(duì) signature 與 signature2 即可校驗(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)解密。 解密算法如下:

  • 對(duì)稱(chēng)解密使用的算法為 AES-128-CBC,數(shù)據(jù)采用PKCS#7填充。
  • 對(duì)稱(chēng)解密的目標(biāo)密文為 Base64_Decode(encryptedData),
  • 對(duì)稱(chēng)解密秘鑰 aeskey = Base64_Decode(session_key), aeskey 是16字節(jié)
  • 對(duì)稱(chēng)解密算法初始向量 iv 會(huì)在數(shù)據(jù)接口中返回。

微信官方提供了多種編程語(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)

主站蜘蛛池模板: 晋江市| 濮阳市| 西畴县| 玉溪市| 瑞昌市| 开原市| 车致| 南召县| 金昌市| 达日县| 榆社县| 文化| 绥化市| 洱源县| 定远县| 长兴县| 威远县| 屏东市| 西城区| 梓潼县| 英吉沙县| 安宁市| 沈阳市| 新邵县| 桑日县| 彰化县| 栾川县| 綦江县| 阿坝县| 永宁县| 蒙山县| 巢湖市| 化州市| 垫江县| 合肥市| 温泉县| 竹溪县| 舟山市| 阿克苏市| 体育| 三台县|