当前位置: 首页 > news >正文

uniapp开发微信、支付宝小程序订阅消息

uniapp开发微信小程序订阅消息

  • 微信小程序订阅消息
    • 一、小程序订阅模板准备
      • 1.1、获取模板id及模板字段名称
    • 二、Java服务端代码
      • 2.1、编写消息模板配置文件
      • 2.2、编写订阅消息请求对象
      • 2.3、编写充电开始订阅消息模板对象
        • 2.2.1、DataEntry
        • 2.2.2、ChargeStartModel
      • 2.4、编写发送接口
    • 三、uniapp代码
    • 四、测试
  • 支付宝下程序开发订阅消息
    • 一、小程序订阅模板准备

微信小程序订阅消息

一、小程序订阅模板准备

使用微信小程序账号登录微信公众平台,找到如下页面,点击选用,选择自己需要的合适的模板。

微信发送订阅消息接口文档在这里插入图片描述

1.1、获取模板id及模板字段名称

在这里插入图片描述

二、Java服务端代码

2.1、编写消息模板配置文件

用于保存消息的id和pages
package com.nis.charge.config.wechat;


import lombok.Getter;

/**
 * <h1>微信订阅消息模板</h1>
 *
 * @author lwj
 */
@Getter
public enum WechatMsgTempConfig {

    /**
     * 开始充电
     */
    START_CHARGE("76-w0HT6wfZVP0F8DtVNuGyOWWMALAmQHPgBBgcQUgY", "/pages/mine/charge-record/charge-record"),
    ;


    /**
     * 缓存键
     */
    private String tempId;

    /**
     * 订阅消息跳转的url
     */
    private String page;

    WechatMsgTempConfig(String tempId, String page) {
        this.tempId = tempId;
        this.page = page;
    }
}

2.2、编写订阅消息请求对象

package com.nis.charge.domain.dto.subscribeMsg.model.wechat;

import lombok.Builder;
import lombok.Data;

/**
 * <h1>微信小程序订阅消息请求参数</h1>
 *
 * @author lwj
 */
@Data
@Builder
public class WechatMiniMsgParams {
    /**
     * 接口调用凭证
     */
    private String access_token;

    /**
     * 模板id
     */
    private String template_id;

    /**
     * 点击模板卡片后的跳转页面,仅限本小程序内的页面。支持带参数,(示例index?foo=bar)。该字段不填则模板无跳转
     */
    private String page;

    /**
     * 接收者(用户)的 openid
     */
    private String touser;

    /**
     * 模板内容,格式形如 { "key1": { "value": any }, "key2": { "value": any } }的object
     */
    private Object data;

    /**
     * 跳转小程序类型:developer为开发版;trial为体验版;formal为正式版;默认为正式版
     */
    private String miniprogram_state;

    /**
     * 进入小程序查看”的语言类型,支持zh_CN(简体中文)、en_US(英文)、zh_HK(繁体中文)、zh_TW(繁体中文),默认为zh_CN
     */
    private String lang;
}

2.3、编写充电开始订阅消息模板对象

2.2.1、DataEntry

package com.nis.charge.domain.dto.subscribeMsg.model;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

/**
 * @Author 朱潘栋
 * @Data 15:28 2021/8/20
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class DataEntry implements Serializable {

    private static final long serialVersionUID = 7946471752462379765L;
    private String value;
}

2.2.2、ChargeStartModel

package com.nis.charge.domain.dto.subscribeMsg.model.wechat;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.nis.charge.domain.dto.subscribeMsg.model.DataEntry;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * <h1>充电开始微信订阅消息模板</h1>
 * 订单编号{{character_string11.DATA}}
 * 开始时间{{time2.DATA}}
 * 充电站名称{{thing5.DATA}}
 * 充电桩编码{{character_string6.DATA}}
 * 充电插座{{thing7.DATA}}
 *
 * @author lwj
 */

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@JsonInclude(JsonInclude.Include.NON_EMPTY)
public class ChargeStartModel {
    /**
     * 订单编号
     */
    private DataEntry character_string11;

    /**
     * 开始时间
     */
    private DataEntry time2;
    /**
     * 充电站名称
     */
    private DataEntry thing5;

    /**
     * 充电桩编码
     */
    private DataEntry character_string6;

    /**
     * 充电插座
     */
    private DataEntry thing7;
}

2.4、编写发送接口

   /**
     * 发送充电开始订阅消息
     *
     * @return
     */
    @Override
    public boolean sendChargeStartMsg(String openId, String orderId, String createTime, String placeName, String equipCode, String portName) {
        boolean sendSuccess = false;

        String accessToken = iWechatService.getAccessToken();
        ChargeStartModel startCharge = ChargeStartModel.builder().character_string11(DataEntry.builder().value(orderId).build())
                .time2(DataEntry.builder().value(createTime).build())
                .thing5(DataEntry.builder().value(placeName).build())
                .character_string6(DataEntry.builder().value(equipCode).build())
                .thing7(DataEntry.builder().value(portName).build()).build();
        WechatMiniMsgParams wechatMiniMsgParams = WechatMiniMsgParams.builder()
                .touser(openId).template_id(WechatMsgTempConfig.START_CHARGE.getTempId()).page(WechatMsgTempConfig.START_CHARGE.getPage())
                .data(startCharge).build();
        JSONObject jsonResult = restTemplate.postForObject(WechatConstant.SEND_SUBSCRIBE_URL + "?access_token=" + accessToken, wechatMiniMsgParams, JSONObject.class);
        log.info("充电开始推送消息返回参数:{}", JSON.toJSONString(jsonResult));
        Integer errorCode = jsonResult.getInteger("errcode");
        String errorMessage = jsonResult.getString("errmsg");
        if (errorCode == 0) {
            sendSuccess = true;
            log.info("充电开始推送消息发送成功");
        } else {
            log.info("充电开始推送消息发送失败,errcode:{},errorMessage:{}", errorCode, errorMessage);
        }
        return sendSuccess;
    }

三、uniapp代码

uni.requestSubscribeMessage({
	tmplIds: ['76-w0HT6wfZVP0F8DtVNuGyOWWMALAmQHPgBBgcQUgY'],
	complete(res) {
		//	调用支付接口
		_this.wechatPay(chargeData)
	}
})

四、测试

在这里插入图片描述

支付宝下程序开发订阅消息

支付宝消息部分文档链接
支付宝小程序消息部分文档链接

一、小程序订阅模板准备

在这里插入图片描述

相关文章:

  • IC入行第一步:怎样选择岗位和公司?
  • flink1.13报错:The file STDOUT does not exist on the TaskExecutor
  • java计算机毕业设计口腔医院网站源码+数据库+系统+lw文档+mybatis+运行部署
  • 比较两个文本,找出在另一文本中出现过的串并换某种格式输出
  • Windows下安装虚拟环境
  • SpringMVC之注解驱动的控制器
  • Flask--路由配置
  • Linux定时器
  • iNFTnews | 一词解答区块链技术普及的制胜关键
  • 京准,PTP时间同步服务器在运营商通信网应用
  • 判断数组类型的方法(Array.isArray)以及Math数字对象
  • zemax---Tangential plane, meridian plane and sagittal plane(切线面,子午面与弧矢面)(完结)
  • Java配置42-配置redis高可用(sentinel监控)
  • 共话龙蜥:中国操作系统到底有没有角力世界舞台的实力?
  • vue独立提供模板下载功能
  • JavaScript 如何正确处理 Unicode 编码问题!
  • 自己简单写的 事件订阅机制
  • “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • 【技术性】Search知识
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • Android框架之Volley
  • EventListener原理
  • js 实现textarea输入字数提示
  • PAT A1017 优先队列
  • SwizzleMethod 黑魔法
  • 翻译--Thinking in React
  • 诡异!React stopPropagation失灵
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 使用parted解决大于2T的磁盘分区
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • ​如何在iOS手机上查看应用日志
  • ​学习一下,什么是预包装食品?​
  • #define用法
  • #QT(一种朴素的计算器实现方法)
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (42)STM32——LCD显示屏实验笔记
  • (八)c52学习之旅-中断实验
  • (定时器/计数器)中断系统(详解与使用)
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (十一)图像的罗伯特梯度锐化
  • (循环依赖问题)学习spring的第九天
  • (转)JAVA中的堆栈
  • .NET gRPC 和RESTful简单对比
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • .NET 中 GetProcess 相关方法的性能
  • .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证
  • .NET/C# 项目如何优雅地设置条件编译符号?
  • .NET成年了,然后呢?
  • .net打印*三角形
  • .NET的微型Web框架 Nancy
  • .net获取当前url各种属性(文件名、参数、域名 等)的方法
  • .NET开发人员必知的八个网站
  • /usr/lib/mysql/plugin权限_给数据库增加密码策略遇到的权限问题
  • @angular/cli项目构建--http(2)