小程序實現微信服務通知(消息/模板通知)

小程序端

將下面代碼放在mixin里面

export default {

??methods:{

?? ??saveFormIds() {

?? ??? ?/*

?? ??? ?* 調保存接口有兩種情況:

?? ??? ?* 1: 退出小程序

?? ??? ?* 2: formID數組達到一定數量(此處設為30個)

?? ??? ?*/

?? ??? ?console.log('saveFormIds')

?? ??? ?let formIds=this.$storage('formIds')

?? ??? ?if(formIds.length>0) {

?? ??? ??? ?this.$storage('formIds', [])

?? ??? ?}

?? ??? ?console.log('formIds:',formIds)

?? ??? ?if(formIds.length>0) {

?? ??? ??? ?this.$api.saveFormIds({

?? ??? ??? ?formIds:formIds

?? ??? ?}).then(res=>{

?? ??? ??? ?console.log(res)

?? ??? ?}).catch(err=>{

?? ??? ??? ?console.error(err)

?? ??? ?})

?? ?}

??},

dealFormIds(formId) {

?? ?console.log('dealFormIds')

?? ?console.log('click formId:',formId)

?? ?// 開發工具上點擊按鈕生成的mock FormId不收集

?? ?if(!formId||formId==='the formId is a mock one') return

?? ??? ?let formIds=this.$storage('formIds')

?? ??? ?let expire=parseInt(newDate().getTime()/1000)+604800// 計算七天后過期的時間戳

?? ??? ?if(!formIds) formIds=[]

?? ??? ?let item={

?? ??? ???formId:formId,

?? ??? ???expire:expire

?? ??? ?}

?? ??? ?formIds.push(item)

?? ??? ?this.$storage('formIds',formIds)

?? ??? ?// formID 長度大于30時,調用接口保存formId

?? ??? ?if(formIds.length>=30) {

?? ??? ??? ?console.log('長度大于30啦啦啦啦啦啦啦啦啦啦啦')

?? ??? ??? ?this.saveFormIds()

?? ??? ?}

?}

??}

}

app.js里面引入全局mixin:

import mixin from '@/mixin'

Vue.mixin(mixin)

小程序端formId收集示例(一般加在按鈕上面):

<form report-submit='true'

?? ?@submit="go2($event)">

?? ?<button hover-class="none"

?? ??? ??? ?formType="submit">

?? ??? ?button內容

?? ?</button>

</form>

// go2方法

go2(type,event) {

?? ?let formId=event.target.formId

?? ???// 存儲formId

?? ?this.dealFormIds(formId)

}

在關閉小程序頁面或者formId收集到30個的時候調用保存formId的接口

onHide() {

?? ?this.saveFormIds()

?? ?console.log('app hide')

}

node端(node+mongodb)

1.保存formId

// 保存formId

static async saveFormId(ctx) {

?? ?let params=ctx.request.body

?? ?console.log('==================保存formId==================')

?? ?console.log('params',params)

?? ?let userId=await ctx.getUserId()

?? ?if(!userId) {

?? ??? ?return ctx.sendError('000002','用戶未登錄')

?? ?}


?? ?// 判斷是否存在這個用戶的記錄

?? ?let check=await TemplateMsg.findOne({userId:userId})

?? ?let update

?? ?let add

?? ?if(check) {

?? ?// 存在,更新

?? ??? ?update=await TemplateMsg.updateOne({userId:userId},

?? ??? ??? ?{

?? ??? ??? ??? ?$push:{

?? ??? ??? ??? ??? ?formIdList:{

?? ??? ??? ??? ??? ??? ?$each:params.formIds

?? ??? ??? ??? ??? ?}

?? ??? ??? ?}

?? ??? ?})

?? ?}else{

?? ??? ?// 不存在,添加

?? ??? ?let item={

?? ??? ?userId:userId,

?? ??? ?formIdList:params.formIds

?? ??? ?}

?? ??? ?add=await TemplateMsg(item).save()

?? ?}

?? ?if(update&&update.ok===1||add) {

?? ??? ?return ctx.send(null,'保存formId成功')

?? ?}else{

?? ??? ?return ctx.sendError('000002','保存formId失敗')

?? ?}

}

2.發送模板消息

const sendTemplateMsg=async(template_id,

?? ??? ??? ??? ??? ??? ??? ?wx_url,

?? ??? ??? ??? ??? ??? ??? ?data,

? ? ? ? ? ? ? ? ? ? ? ? ? ? touserOpenId,

?? ??? ??? ??? ??? ??? ??? ?userId)=>{

?? ?// 獲取并判斷token是否失效

?? ?let token=await getToken()

?? ?// 獲取有效的formId

?? ?let formId=await getFormId(userId)

?? ?if(!formId) {

?? ??? ?console.log('沒有formId或者formId都已經過期了')

?? ??? ?return false

?? ?}

?? ?console.log('token',token)

?? ?let options={

?? ??? ?method:'POST',

?? ??? ?uri:`https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token=${token}`,

?? ??? ?body:{

?? ??? ??? ?'touser':touserOpenId,// 待推送用戶ID

?? ??? ??? ?'template_id':template_id,// 模板ID

?? ??? ??? ?'page':wx_url,// 小程序頁面URL

?? ??? ??? ?'form_id':formId,

?? ??? ??? ?'data':data

?? ??? ?},

?? ??? ?json:true// Automatically stringifies the body to JSON

?? ?}

?? ?// 模板消息推送

?? ?request(options)

?? ?.then(parsedBody=>{

?? ??? ?console.log('推送結果',parsedBody)

?? ??? ?// POST succeeded...

?? ?})

?? ?.catch(function(err) {

?? ??? ?console.log(err)

?? ?// POST failed...

?? ?})

}

//判斷token是否過期

function isTokenVaild(token) {

?? ?return newPromise(async(resolve,reject)=>{

?? ?let isVaild=true

?? ?if(token.expires_in>parseInt(newDate().getTime()/1000)) {

?? ?// 未過期

?? ?console.log('沒過期')

?? ?console.log('token',token.access_token)

?? ?// 判斷是否失效

?? ?await request({

?? ??? ?uri:`https://api.weixin.qq.com/cgi-bin/getcallbackip?access_token=${token.access_token}`,

?? ??? ?json:true

?? ?}).then(function(res) {

?? ??? ?if(res.errcode) {

?? ??? ??? ?isVaild=false

?? ??? ??? ?console.log('失效')

?? ??? ?}else{

?? ??? ??? ?isVaild=true

?? ??? ?}

?? ?})

?? ?}else{

?? ??? ?// 過期

?? ??? ?console.log('過期')

?? ??? ?isVaild=false

?? ?}

?? ?resolve(isVaild)

?? ?})

}

// 獲取并判斷token是否失效

async function getToken() {

?? ?let token

?? ?let isVaild=false

?? ?if(global.token) {

?? ??? ?isVaild=await isTokenVaild(global.token)

?? ?}

?? ?return new Promise(async(resolve,reject)=>{

?? ??? ?// 判斷token是否失效/過期

?? ??? ?if(isVaild) {

?? ??? ??? ?token=global.token

?? ??? ?}else{

?? ??? ??? ?// 失效/過期/不存在重新獲取

?? ??? ??? ?await request({

?? ??? ??? ??? ?uri:`https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${config.APP_ID}&secret=${config.APP_SECRET}`,

?? ??? ??? ??? ?json:true

?? ??? ??? ?}).then((res)=>{

?? ??? ??? ??? ?console.log(res)

?? ??? ??? ??? ?res.expires_in=parseInt(newDate().getTime()/1000)+res.expires_in// access_token過期時間

?? ??? ??? ??? ?console.log('存儲token',res)

?? ??? ??? ??? ?// 存儲token

?? ??? ??? ??? ?token={

?? ??? ??? ??? ??? ?access_token:res.access_token,

?? ??? ??? ??? ??? ?expires_in:res.expires_in

?? ??? ??? ??? ?}

?? ??? ??? ??? ?global.token=token

?? ??? ??? ?})

?? ??? ??? ?.catch(function(err) {

?? ??? ??? ??? ?console.log(err)

?? ??? ??? ?})

?? ??? ?}

?? ??? ?console.log('最后的access_token',token.access_token)

?? ??? ?resolve(token.access_token)

?? ?})

}

// 獲取有效的formId

function getFormId(userId) {

?? ?return new Promise(async(resolve,reject)=>{

?? ??? ?let form=await TemplateMsg.findOne({userId:userId})

?? ??? ?let formId

?? ??? ?if(form.formIdList.length<0) {

?? ??? ??? ?resolve(false)

?? ??? ?}

?? ??? ?let updateFormIdList=JSON.parse(JSON.stringify(form.formIdList))

?? ??? ?let isExist=false

?? ??? ?form.formIdList.forEach((item,index)=>{

?? ??? ??? ?if(item.expire<=parseInt(newDate().getTime())/1000) {

?? ??? ??? ?// 過期

?? ??? ??? ?console.log('過期',item)

?? ??? ??? ?updateFormIdList.splice(index,1)

?? ??? ??? ?}else{

?? ??? ??? ?// 沒過期

?? ??? ??? ??? ?isExist=true

?? ??? ??? ??? ?formId=item.formId

?? ??? ??? ??? ?updateFormIdList.splice(index,1)

?? ??? ??? ??? ?return

?? ??? ??? ?}

?? ??? ?})

?? ??? ?console.log('updateFormIdList',updateFormIdList)

?? ??? ?// 更新去除過期的formId和將被用掉的formId

?? ??? ?let update=await TemplateMsg.updateOne({userId:userId},{$set:{

?? ??? ??? ?formIdList:updateFormIdList

?? ??? ?}})

?? ??? ?if(update.ok===1&&isExist) {

?? ??? ??? ?resolve(formId)

?? ??? ?}else{

?? ??? ??? ?resolve(false)

?? ??? ?}

?? ?})

}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,739評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,634評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,653評論 0 377
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,063評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,835評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,235評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,315評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,459評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,000評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,819評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,004評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,560評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,257評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,676評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,937評論 1 288
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,717評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,003評論 2 374