小程序端
將下面代碼放在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)
?? ??? ?}
?? ?})
}