微信小程序-詳解微信登陸、微信支付、模板消息
微信公眾平臺近日悄然開始內(nèi)測微信小程序(微信公眾號)功能,引來無數(shù)開發(fā)者和普通用戶關(guān)注,微信支付的能力,是隨著小程序的發(fā)布一并推出的,具有介紹如下:
wx.login(OBJECT)
調(diào)用接口獲取登錄憑證(code)進(jìn)而換取用戶登錄態(tài)信息,包括用戶的唯一標(biāo)識(openid) 及本次登錄的 會話密鑰(session_key)。用戶數(shù)據(jù)的加解密通訊需要依賴會話密鑰完成。
OBJECT參數(shù)說明:
success返回參數(shù)說明:
示例代碼:
//app.js App({ onLaunch: function() { wx.login({ success: function(res) { if (res.code) { //發(fā)起網(wǎng)絡(luò)請求 wx.request({ url: 'https://test.com/onLogin', data: { code: res.code } }) } else { console.log('獲取用戶登錄態(tài)失??!' + res.errMsg) } } }); } })
code 換取 session_key
這是一個 HTTP 接口,開發(fā)者服務(wù)器使用登錄憑證 code 獲取 session_key 和 openid。其中 session_key 是對用戶數(shù)據(jù)進(jìn)行加密簽名的密鑰。為了自身應(yīng)用安全,session_key 不應(yīng)該在網(wǎng)絡(luò)上傳輸。
接口地址:
請求參數(shù):
返回參數(shù):
返回說明:
//正常返回的JSON數(shù)據(jù)包 { "openid": "OPENID", "session_key": "SESSIONKEY" "expires_in": 2592000 } //錯誤時返回JSON數(shù)據(jù)包(示例為Code無效) { "errcode": 40029, "errmsg": "invalid code" }
登錄態(tài)維護(hù)
通過 wx.login() 獲取到用戶登錄態(tài)之后,需要維護(hù)登錄態(tài)。開發(fā)者要注意不應(yīng)該直接把 session_key、openid 等字段作為用戶的標(biāo)識或者 session 的標(biāo)識,而應(yīng)該自己派發(fā)一個 session 登錄態(tài)(請參考登錄時序圖)。對于開發(fā)者自己生成的 session,應(yīng)該保證其安全性且不應(yīng)該設(shè)置較長的過期時間。session 派發(fā)到小程序客戶端之后,可將其存儲在 storage ,用于后續(xù)通信使用。
登錄時序圖
wx.checkSession(OBJECT)
檢查登陸態(tài)是否過期
示例代碼:
wx.checkSession({ success: function(){ //登錄態(tài)未過期 }, fail: function(){ //登錄態(tài)過期 wx.login() } })
用戶數(shù)據(jù)的簽名驗證和加解密
數(shù)據(jù)簽名校驗
為了確保 開放接口 返回用戶數(shù)據(jù)的安全性,微信會對明文數(shù)據(jù)進(jìn)行簽名。開發(fā)者可以根據(jù)業(yè)務(wù)需要對數(shù)據(jù)包進(jìn)行簽名校驗,確保數(shù)據(jù)的完整性。
- 簽名校驗算法涉及用戶的session_key,通過 wx.login 登錄流程獲取用戶session_key,并自行維護(hù)與應(yīng)用自身登錄態(tài)的對應(yīng)關(guān)系。
- 通過調(diào)用接口(如 wx.getUserInfo)獲取數(shù)據(jù)時,接口會同時返回 rawData、signature,其中 signature = sha1( rawData + session_key )
- 開發(fā)者將 signature、rawData 發(fā)送到開發(fā)者服務(wù)器進(jìn)行校驗。服務(wù)器利用用戶對應(yīng)的 session_key 使用相同的算法計算出簽名 signature2 ,比對 signature 與 signature2 即可校驗數(shù)據(jù)的完整性。
如wx.getUserInfo的數(shù)據(jù)校驗:
接口返回的rawData:
{ "nickName": "Band", "gender": 1, "language": "zh_CN", "city": "Guangzhou", "province": "Guangdong", "country": "CN", "avatarUrl": "http://wx.qlogo.cn/mmopen/vi_32/1vZvI39NWFQ9XM4LtQpFrQJ1xlgZxx3w7bQxKARol6503Iuswjjn6nIGBiaycAjAtpujxyzYsrztuuICqIM5ibXQ/0" }
用戶的 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ù)。開發(fā)者如需要獲取敏感數(shù)據(jù),需要對接口返回的加密數(shù)據(jù)( encryptedData )進(jìn)行對稱解密。 解密算法如下:
- 對稱解密使用的算法為 AES-128-CBC,數(shù)據(jù)采用PKCS#7填充。
- 對稱解密的目標(biāo)密文為 Base64_Decode(encryptedData),
- 對稱解密秘鑰 aeskey = Base64_Decode(session_key), aeskey 是16字節(jié)
- 對稱解密算法初始向量 iv 會在數(shù)據(jù)接口中返回。
微信官方提供了多種編程語言的示例代碼(點擊下載)。每種語言類型的接口名字均一致。調(diào)用方式可以參照示例。
注:此前提供的加密數(shù)據(jù)(encryptData)以及對應(yīng)的加密算法將被棄用,請開發(fā)者不要再依賴舊邏輯。
用戶信息:
### wx.getUserInfo(OBJECT)
獲取用戶信息,需要先調(diào)用 wx.login 接口。
OBJECT參數(shù)說明:
success返回參數(shù)說明:
示例代碼:
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),詳見加密數(shù)據(jù)解密算法
{ "appId": "APPID", "openId": "OPENID", "nickName": "NICKNAME", "gender": 1, "city": "CITY", "province": "PROVINCE", "country": "COUNTRY", "avatarUrl": "AVATARURL", "unionId": "UNIONID" }
UnionID機(jī)制說明:
如果開發(fā)者擁有多個移動應(yīng)用、網(wǎng)站應(yīng)用、和公眾帳號(包括小程序),可通過unionid來區(qū)分用戶的唯一性,因為只要是同一個微信開放平臺帳號下的移動應(yīng)用、網(wǎng)站應(yīng)用和公眾帳號(包括小程序),用戶的unionid是唯一的。換句話說,同一用戶,對同一個微信開放平臺下的不同應(yīng)用,unionid是相同的。
微信開放平臺綁定小程序流程
前提:微信開放平臺帳號必須已完成開發(fā)者資質(zhì)認(rèn)證
開發(fā)者資質(zhì)認(rèn)證流程:
登錄微信開放平臺(open.weixin.qq.com) – 帳號中心 – 開發(fā)者資質(zhì)認(rèn)證
微信支付:
wx.requestPayment(OBJECT)
發(fā)起微信支付。
Object參數(shù)說明:
示例代碼:
wx.requestPayment({ 'timeStamp': '', 'nonceStr': '', 'package': '', 'signType': 'MD5', 'paySign': '', 'success':function(res){ }, 'fail':function(res){ } })
基于微信的通知渠道,我們?yōu)殚_發(fā)者提供了可以高效觸達(dá)用戶的模板消息能力,以便實現(xiàn)服務(wù)的閉環(huán)并提供更佳的體驗。
模板推送位置:服務(wù)通知
模板下發(fā)條件:用戶本人在微信體系內(nèi)與頁面有交互行為后觸發(fā),詳見下發(fā)條件說明
模板跳轉(zhuǎn)能力:點擊查看詳情僅能跳轉(zhuǎn)下發(fā)模板的該帳號的各個頁面
使用說明
獲取模板 id
登錄https://mp.weixin.qq.com獲取模板,如果沒有合適的模板,可以申請?zhí)砑有履0?,審核通過后可使用,詳見模板審核說明
頁面的 <form/> 組件,屬性report-submit為true時,可以聲明為需發(fā)模板消息,此時點擊按鈕提交表單可以獲取formId,用于發(fā)送模板消息。或者當(dāng)用戶完成支付行為,可以獲取prepay_id用于發(fā)送模板消息。
調(diào)用接口下發(fā)模板消息(詳見接口說明)
接口說明
1. 獲取 access_token
access_token 是全局唯一接口調(diào)用憑據(jù),開發(fā)者調(diào)用各接口時都需使用 access_token,請妥善保存。access_token 的存儲至少要保留512個字符空間。access_token 的有效期目前為2個小時,需定時刷新,重復(fù)獲取將導(dǎo)致上次獲取的 access_token 失效。
公眾平臺的 API 調(diào)用所需的 access_token 的使用及生成方式說明:
- 為了保密 appsecrect,第三方需要一個 access_token 獲取和刷新的中控服務(wù)器。而其他業(yè)務(wù)邏輯服務(wù)器所使用的 access_token 均來自于該中控服務(wù)器,不應(yīng)該各自去刷新,否則會造成 access_token 覆蓋而影響業(yè)務(wù);
- 目前 access_token 的有效期通過返回的 expires_in 來傳達(dá),目前是7200秒之內(nèi)的值。中控服務(wù)器需要根據(jù)這個有效時間提前去刷新新 access_token。在刷新過程中,中控服務(wù)器對外輸出的依然是老 access_token,此時公眾平臺后臺會保證在刷新短時間內(nèi),新老 access_token 都可用,這保證了第三方業(yè)務(wù)的平滑過渡;
- access_token 的有效時間可能會在未來有調(diào)整,所以中控服務(wù)器不僅需要內(nèi)部定時主動刷新,還需要提供被動刷新 access_token 的接口,這樣便于業(yè)務(wù)服務(wù)器在 API 調(diào)用獲知 access_token 已超時的情況下,可以觸發(fā) access_token 的刷新流程。
開發(fā)者可以使用 AppID 和 AppSecret 調(diào)用本接口來獲取 access_token。AppID 和 AppSecret 可登錄微信公眾平臺官網(wǎng)-設(shè)置-開發(fā)設(shè)置中獲得(需要已經(jīng)綁定成為開發(fā)者,且?guī)ぬ枦]有異常狀態(tài))。AppSecret 生成后請自行保存,因為在公眾平臺每次生成查看都會導(dǎo)致 AppSecret 被重置。注意調(diào)用所有微信接口時均需使用 https 協(xié)議。如果第三方不使用中控服務(wù)器,而是選擇各個業(yè)務(wù)邏輯點各自去刷新 access_token,那么就可能會產(chǎn)生沖突,導(dǎo)致服務(wù)不穩(wěn)定。
接口地址:
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
HTTP請求方式:
GET
參數(shù)說明 :
返回參數(shù)說明:
正常情況下,微信會返回下述 JSON 數(shù)據(jù)包給開發(fā)者:
{"access_token": "ACCESS_TOKEN", "expires_in": 7200}
2. 發(fā)送模板消息
接口地址:(ACCESS_TOKEN 需換成上文獲取到的 access_token)
https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token=ACCESS_TOKEN
HTTP請求方式:
POST
POST參數(shù)說明:
示例:
{ "touser": "OPENID", "template_id": "TEMPLATE_ID", "page": "index", "form_id": "FORMID", "data": { "keyword1": { "value": "339208499", "color": "#173177" }, "keyword2": { "value": "2015年01月05日 12:30", "color": "#173177" }, "keyword3": { "value": "粵海喜來登酒店", "color": "#173177" } , "keyword4": { "value": "廣州市天河區(qū)天河路208號", "color": "#173177" } }, "emphasis_keyword": "keyword1.DATA" }
返回碼說明:
在調(diào)用模板消息接口后,會返回JSON數(shù)據(jù)包。
正常時的返回JSON數(shù)據(jù)包示例:
{ "errcode": 0, "errmsg": "ok", }
錯誤時會返回錯誤碼信息,說明如下:
使用效果:
注意:內(nèi)部測試階段,模板消息下發(fā)后,在客戶端僅能看到由“公眾號安全助手”下發(fā)的簡單通知。能收到該提示,即表明模板消息功能已經(jīng)調(diào)試成功。待該功能正式上線后,將可以展示成上圖效果。
下發(fā)條件說明
1、支付
當(dāng)用戶在小程序內(nèi)完成過支付行為,可允許開發(fā)者向用戶在7天內(nèi)推送有限條數(shù)的模板消息(1次支付可下發(fā)1條,多次支付下發(fā)條數(shù)獨(dú)立,互相不影響)
2、提交表單
當(dāng)用戶在小程序內(nèi)發(fā)生過提交表單行為且該表單聲明為要發(fā)模板消息的,開發(fā)者需要向用戶提供服務(wù)時,可允許開發(fā)者向用戶在7天內(nèi)推送有限條數(shù)的模板消息(1次提交表單可下發(fā)1條,多次提交下發(fā)條數(shù)獨(dú)立,相互不影響)
審核說明
1.標(biāo)題
1.1標(biāo)題不能存在相同
1.2標(biāo)題意思不能存在過度相似
1.3標(biāo)題必須以“提醒”或“通知”結(jié)尾
1.4標(biāo)題不能帶特殊符號、個性化字詞等沒有行業(yè)通用性的內(nèi)容
1.5標(biāo)題必須能體現(xiàn)具體服務(wù)場景
1.6標(biāo)題不能涉及營銷相關(guān)內(nèi)容,包括不限于:
消費(fèi)優(yōu)惠類、購物返利類、商品更新類、優(yōu)惠券類、代金券類、紅包類、會員卡類、積分類、活動類等營銷傾向通知
2.關(guān)鍵詞
2.1同一標(biāo)題下,關(guān)鍵詞不能存在相同
2.2同一標(biāo)題下,關(guān)鍵詞不能存在過度相似
2.3關(guān)鍵詞不能帶特殊符號、個性化字詞等沒有行業(yè)通用性的內(nèi)容
2.4關(guān)鍵詞內(nèi)容示例必須與關(guān)鍵詞對應(yīng)匹配
2.5關(guān)鍵詞不能太過寬泛,需要具有限制性,例如:“內(nèi)容”這個就太寬泛,不能審核通過
違規(guī)說明
除不能違反運(yùn)營規(guī)范外,還不能違反以下規(guī)則,包括但不限于:
- 不允許惡意誘導(dǎo)用戶進(jìn)行觸發(fā)操作,以達(dá)到可向用戶下發(fā)模板目的
- 不允許惡意騷擾,下發(fā)對用戶造成騷擾的模板
- 不允許惡意營銷,下發(fā)營銷目的模板
- 不允許通過服務(wù)號下發(fā)模板來告知用戶在小程序內(nèi)觸發(fā)的服務(wù)相關(guān)內(nèi)容
處罰說明
根據(jù)違規(guī)情況給予相應(yīng)梯度的處罰,一般處罰規(guī)則如下:
- 第一次違規(guī),刪除違規(guī)模板以示警告,
- 第二次違規(guī),封禁接口7天,
- 第三次違規(guī),封禁接口30天,
- 第四次違規(guī),永久封禁接口
處罰結(jié)果及原因以站內(nèi)信形式告知
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
JS使用遮罩實現(xiàn)點擊某區(qū)域以外時彈窗的彈出與關(guān)閉功能示例
這篇文章主要介紹了JS使用遮罩實現(xiàn)點擊某區(qū)域以外時彈窗的彈出與關(guān)閉功能,結(jié)合實例形式分析了javascript事件響應(yīng)及頁面元素屬性動態(tài)操作彈出與關(guān)閉遮罩層相關(guān)實現(xiàn)技巧,需要的朋友可以參考下2018-07-07JavaScript用JSONP跨域請求數(shù)據(jù)實例詳解
Javascript跨域訪問是web開發(fā)者經(jīng)常遇到的問題,什么是跨域,就是一個域上加載的腳本獲取或操作另一個域上的文檔屬性。下面這篇文章主要介紹了JavaScript用JSONP跨域請求數(shù)據(jù)的方法,需要的朋友可以參考借鑒,下面來一起看看吧。2017-01-01微信小程序 組件的外部樣式externalClasses使用詳解
這篇文章主要介紹了微信小程序里 組件的外部樣式externalClasses使用詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-09-09