微信小程序消息订阅完整教程前端+后端。
内容较多!!!如果有没涉及到的欢迎补充或提问。一、订阅模板,前端调用根据官方文档来:第一步在小程序里面找到消息订阅,随便选个模板就行,我们需要的是模板idhttps://mp.weixin.qq.comhttps://mp.weixin.qq.com/在前端页面我们只需要调用方法wx.requestSubscribeMessage({tmplIds: ['填写我们申请的模板id'],...
内容较多!!!如果有没涉及到的欢迎补充或提问。
一、订阅模板,前端调用
根据官方文档来:第一步
在小程序里面找到消息订阅,随便选个模板就行,我们需要的是模板id
https://mp.weixin.qq.comhttps://mp.weixin.qq.com/ 在前端页面我们只需要调用方法
wx.requestSubscribeMessage({
tmplIds: ['填写我们申请的模板id'],
success (res) {
}
})
调用这个方法必须是在点击时间里面出发,它不能默认触发。下面为前端页面触发样式
当用户允许之后,只能获取到一条消息,个人小程序只能进行一次消息订阅,只有再次触发这个方法,用户点击允许,才可以接收到下个消息,但有个bug,用户可以连续点很多次允许,那么就可以接收到很多次消息。
二、获取token
前端的任务已经完成,下面是后端的内容,我们先以php为例子。
我们不使用云调用的话,首先我们需要获取access_token 获取access_token 的方法在官方文档里面有。auth.getAccessToken | 微信开放文档
需要在后端调用的接口为
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
需要appid 和appsecret 这两个参数我们从小程序里面可以找到:开发管理==》开发设置 appsecret 忘记的话 重置即可。
下面贴上后端获取access_token的代码:PHP
$openid = $_POST['openid'];
$appid = '小程序的appid';//小程序的appid
$secret = '小程序的$appSecret';// 小程序的$appSecret
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$appid}&secret={$secret}";
$res = curl_get($url);
$res = json_decode($res,1);
if($res['errcode']!=0) throw new Exception($res['errmsg']);
$token = $res['access_token'];//保存下来token,下面要用
三、后端发送消息
做测试的话,可以在前端,设置一个事件,在后端写一个接口。前端去调用接口,去实现消息发送
第三步的官方文档:subscribeMessage.send | 微信开放文档
后端调用接口需要的参数为:上面获取到的token 和下图
其中data:是消息模板中的数据,数据填写根据自己的模板数据填写。在小程序里,打开自己的模板就可以看到对应的额数据怎么填写:上图中的number0 就对应这个图中的thing2,value就对应这个图中的data,随便填。
看具体代码部分
强调一下,使用php的时候,post_data 不要设置成对象,要设置成数组的形式,然后将post_data转化成json格式不然会报错47001
$post_data = [
'touser' => '用户的openid,你只需要前端调接口的时候穿过来就行',
'template_id' => '你的模板id',
'page' => '/pages/index',//你点击消息要跳转的页面
'miniprogram_state' => "developer",//跳转小程序类型:developer为开发版;trial为体验版;formal为正式版;默认为正式版
'lang' => 'zh_CN',
'data'=>[
'thing2'=>[
"value"=> "你可以睡觉了"
],
'thing3'=>[
"value"=> "你已经很多天没有睡了"
],
'name1'=>[
"value"=> "帅气的黑大王"
]
]
];
$url="https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token={$token}";
// send_post($url, $post_data);
$curl = curl_init();
$post_data = json_encode($post_data);
// $post_data = http_build_query($post_data);
curl_setopt($curl,CURLOPT_URL,$url1);
curl_setopt($curl,CURLOPT_POST,1);
curl_setopt($curl,CURLOPT_POSTFIELDS,$post_data);
curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);
$resulet = curl_exec($curl);
var_dump($resulet);
此时我们在前端页面增加点击事件测试一下:下图为测试结果
四、后端python代码
import requests
import time
from flask import Flask, json, request, jsonify, render_template
from hashlib import sha1
app = Flask(__name__)
app.config['JSON_AS_ASCII'] = False #解决中文乱码
appid = ''
secret = ''
openid = None
template_id = ''
@app.route('/', methods=['GET', 'POST'])
def home():
return '<h1>Home</h1>'
# 小程序消息发送启用接口
@app.route('/check_msg_auth', methods=['GET'])
def check_msg_auth():
signature = request.args.get("signature")
timestamp = request.args.get("timestamp")
nonce = request.args.get("nonce")
echostr = request.args.get("echostr")
print("echostr: ", echostr)
token = "qimhui"
tmpArr = [token, timestamp, nonce]
tmpArr.sort()
tmpStr = "".join(tmpArr)
s1 = sha1()
s1.update(json.dumps(tmpStr).encode())
tmpStr = s1.hexdigest()
print("tmpstr: ", tmpStr)
return echostr
# 登录获取openid
@app.route('/login', methods=['POST'])
def login():
ret_json = {'status': 0, 'msg': '未访问', 'data': None}
global openid
try:
code = request.form.get('code')
print("---------------code =", code)
url = "https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code" % (
appid, secret, code)
res = requests.get(url).json()
openid = res.openid
print("----------res =", res)
ret_json['data'] = res
except Exception as e:
ret_json['msg'] = str(e)
ret_json['status'] = 1
finally:
return jsonify(ret_json)
# 获取access_token
@app.route('/get_authtoken', methods=['POST'])
def get_authtoken():
url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s" % (
appid, secret)
res = requests.get(url).json()
print("----------res =", res['access_token'])
return res['access_token']
# 发送消息
@app.route('/send_msg', methods=['POST'])
def send_msg():
ret_json = {'status': 0, 'msg': '成功', 'data': None}
try:
access_token = get_authtoken()
print("-----------access_token =", access_token)
url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=%s" % (
access_token)
curr_time = time.strftime("%Y年%m月%d日 %H:%M:%S", time.localtime())
payload = {
"access_token": access_token,
"touser": openid,
"template_id": template_id,
"page": "pages/index/iconView",
"miniprogram_state": "developer",
"lang": "zh_CN",
"data": {
"thing1": {
"value": ""
},
"date2": {
"value": curr_time
},
"thing3": {
"value": ""
},
"thing4": {
"value": "中国"
}
}
}
# res = json.dumps(payload)
# print("res =", res)
data = json.dumps(payload, ensure_ascii=False)
res = requests.post(url, data=data.encode("utf-8")).json()
ret_json['data'] = res
except Exception as e:
ret_json['msg'] = str(e)
ret_json['status'] = 1
finally:
return jsonify(ret_json)
if __name__ == '__main__':
# get_authtoken()
app.run()
么么哒。
更多推荐
所有评论(0)