版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
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.js
let 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.js
const 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