开发中遇到的第一个问题
TypeError: wx.requestSubscribeMessage is not a function
经查是基础调试库版本过低导致,设置最高版本可以。
小程序代码如下:
//消息订阅
sendMessage:function(e){
wx.requestSubscribeMessage({
tmplIds: ['订阅消息模板id'],
success (res) {
console.log(res)
}
})
},
Java部分:
遇到的第一个问题是
{"errcode":47003,"errmsg":"argument invalid! data.amount10.value invalid rid: 5f44b02d-493e82c5-44ad9b73"}
查看官方文档,表示是参数错误,amount10。
原来官方给的示例格式必须严格参照,比如纯数字就必须纯数字哪怕你看起来好像是可以加字符串也不可以。
第二个问题是
No mapping found for HTTP request with URI [/echar/undefined/oDI2B4phDxrNgFt1i9IBYhlAtjtc]
消息发送成功,但是点击消息体进入小程序的跳转页面时出错,我在代码中明明已经设置了
messageModel.setPage("pages/pie/pie");
但是结果是跳转了一个完全错误的页面。原因是因为我自己的小程序页面跳转的时候需要参数,所以在你设置的页面也需要添加参数。
排查完毕,粘贴Java代码
package com.gaara.controller;
import com.gaara.model.WeChartModel.TemplateData;
import com.gaara.model.WeChartModel.WeChartMessageModel;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RestController;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestClientException;
import org.springframework.web.client.RestTemplate;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/********************************
* Author Gaara *
* Version 1.0 *
* @ClassName SendMessageController
* @Date 2020/8/25 下午1:54
* @Description TODO *
********************************/
@RestController
public class SendMessageController {
// 微信登陆回调地址
@Value("${myDatas.WXLoginURL}")
String WXLoginURL;
// 微信APPID
@Value("${myDatas.WXAPPID}")
String WXAPPID;
// 微信秘钥
@Value("${myDatas.SECRET}")
String SECRET;
/*
* 发送订阅消息
* */
@GetMapping("/pushOneUser")
public String pushOneUser() {
return push("目标用户的openid");
}
public String push(String openid) {
RestTemplate restTemplate = new RestTemplate();
//这里简单起见我们每次都获取最新的access_token(时间开发中,应该在access_token快过期时再重新获取)
String url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=" + getAccessToken();
//拼接推送的模版
WeChartMessageModel messageModel = new WeChartMessageModel();
messageModel.setTouser(openid);//用户的openid(要发送给那个用户,通常这里应该动态传进来的)
messageModel.setTemplate_id("4nbuFFbJyN7kWTx4KdFuvDZUajLNd-FFvs0VHF2Lbso");//订阅消息模板id
messageModel.setPage("pages/pie/pie?type_name=month");
Map<String, TemplateData> m = new HashMap<>(3);
m.put("date1", new TemplateData("2020年08月22日"));
m.put("amount10", new TemplateData("3000"));
m.put("amount4", new TemplateData("3333"));
m.put("thing13", new TemplateData("weedxu"));
m.put("thing9", new TemplateData("本月超支哦"));
messageModel.setData(m);
ResponseEntity<String> responseEntity =
restTemplate.postForEntity(url, messageModel, String.class);
return responseEntity.getBody();
}
@GetMapping("/getAccessToken")
public String getAccessToken() {
RestTemplate restTemplate = new RestTemplate();
Map<String, String> params = new HashMap<>();
params.put("APPID", WXAPPID); //
params.put("APPSECRET", SECRET); //
ResponseEntity<String> responseEntity = restTemplate.getForEntity(
"https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={APPID}&secret={APPSECRET}", String.class, params);
String body = responseEntity.getBody();
JSONObject object = JSON.parseObject(body);
String Access_Token = object.getString("access_token");
String expires_in = object.getString("expires_in");
System.out.println("有效时长expires_in:" + expires_in);
return Access_Token;
}
}
这部分代码借鉴了另一个作者的文章(小程序订阅消息推送),侵删。
网友评论