formid用过一次,立即失效,如果formid不使用,7天内天可以用
步骤:
1、获取用户openid (api)
2、获取access_token(api)
3、提交时获取formid
4、发送模板消息 (api)
小程序代码:
// index.wxml<form report-submit bindsubmit="formSubmit"> <label> 选择日期: <picker mode="date" value="{{date}}" start="2019-09-01" end="2022-09-01" bindchange="bindDateChange"> <view class="picker"> 当前选择: {{date}} </view> </picker> </label> <label>商品名称:<input style="border:1px solid red" type="text" name="name" /></label> {{formId}} <button form-type='submit'>提交</button></form>// app.jslet AppID = 'wx8ee7bbc68ab9eba4'let AppSecret = '0c3ed148008d18401b5531fdfae8081a'App({ onLaunch: function () { let _that = this wx.login({ success: function (res) { // 登录时获取code可以换取openid和session_key let code = res.code wx.request({ url: 'https://cff.mynatapp.cc/api/getOpenid', method: 'POST', data: { code: res.code }, success(res) { let { session_key, openid, access_token } = res.data.data _that.globalData.session_key = session_key, _that.globalData.openid = openid, _that.globalData.access_token = access_token wx.setStorageSync('openid', openid) } }) } }) }, globalData: { openid: null, session_key: null, access_token: null }})//index.js//获取应用实例const app = getApp()Page({ data: { date:'2019-09-10', formId:null, obj:null, openid: null, session_key: null, access_token: null }, bindDateChange:function(e){ this.setData({ date: e.detail.value }) }, formSubmit:function(e){ wx.request({ url: 'https://cff.mynatapp.cc/api/sendMessage', method: 'POST', data: { access_token: app.globalData.access_token, openid: app.globalData.openid, formId: e.detail.formId // 点击按钮获取formId }, header: { 'content-type': 'application/json' // 默认值 }, success(res) { console.log(res) } }) }})nodejs(koa2)代码:
// index.jsconst router = require('koa-router')()const request = require('superagent')router.prefix('/api/')let AppID = 'wx8ee7bbc68ab9eba4'let AppSecret = '0c3ed148008d18401b5531fdfae8081a'router.post('/getOpenid',async (ctx, next) => { let code = ctx.request.body.code // 1、获取openid let aUrl=`https://api.weixin.qq.com/sns/jscode2session?appid=${AppID}&secret=${AppSecret}&js_code=${code}&grant_type=authorization_code` let aRes = await request.get(aUrl) // 2、获取access_token let bUrl=`https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${AppID}&secret=${AppSecret}` let bRes = await request.get(bUrl) let { session_key, openid} = JSON.parse(aRes.text) let { access_token , expires_in } = JSON.parse(bRes.text) ctx.body = { code: '200', data:{ session_key, openid, access_token, expires_in }, msg: '操作成功' }})router.post('/sendMessage', async (ctx, next) => { let access_token = ctx.request.body.access_token let openid = ctx.request.body.openid let formId = ctx.request.body.formId console.log(ctx.request.body) let requestData ={ "touser": openid, "template_id": 'hfMGUjT-OOOD0PKpud6UD7uDA9vEx1Fz2_Fp0g7KWRk', "page": "index", "form_id": formId, "data": { "keyword1": { "value": "喵眼电影院" }, "keyword2": { "value": "2019年10月19日 12:30" }, "keyword3": { "value": "广州市海珠区新港中路397号" } , "keyword4": { "value": "50元" }, "keyword5": { "value": "取票通知成功,闪开,我要开始装逼了" } }, "emphasis_keyword": "keyword1.DATA" }// 4、发送模板消息 let res = await request .post(`https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token=${access_token}`) .send(requestData) .set('Accept', 'application/json') // console.log(res) ctx.body = { code: '200', data: null, msg: '操作成功' }})module.exports = router遇到的坑:
1、手机预览,请求数据必须用https
2、formid用完就失效,如果多次使用,可以收集formid保存到数据库
参考
收集formid













