Enseñarle paso a paso cómo implementar un subprograma WeChat para enviar mensajes de suscripción únicos a usuarios específicos.

Mini programa y preparación de cuentas públicas.

Actualmente hay unacuenta de suscripción certificada por WeChat Escriba cuenta pública, una < un subprograma i=5>autenticación WeChat, el subprograma y la cuenta pública están relacionados entre sí. No está claro si se requiere autenticación de WeChat o un tipo específico, porque hasta ahora no se han encontrado discrepancias de tipos ni problemas relacionados, y hay menos restricciones para enviar mensajes de suscripción únicos a los miniprogramas de WeChat

Insertar descripción de la imagen aquí
Insertar descripción de la imagen aquí
Insertar descripción de la imagen aquí

¿Qué es el mensaje de suscripción al mini programa?

1. Introducción a la función

  • Ubicación del mensaje de suscripción: notificación de servicio
    Insertar descripción de la imagen aquí

  • Condiciones de entrega de mensajes de suscripción: Los usuarios se suscriben de forma independiente
    Insertar descripción de la imagen aquí

  • Capacidad de saltar a la tarjeta de mensaje de suscripción: haga clic para ver los detalles para ir a la página del mini programa
    Insertar descripción de la imagen aquí

2. Tipo de mensaje

  • Mensaje de suscripción única (Tipo de mensaje implementado en este artículo)
    Mensaje de suscripción única se utiliza para resolver Después de que el usuario usa el mini programa, habrá problemas de notificación en sesiones de servicio posteriores. Después de que el usuario se suscribe, el desarrollador puede enviar un mensaje de servicio correspondiente sin límite de tiempo; cada mensaje se puede suscribir o cancelar por separado.

  • Mensajes de suscripción a largo plazo
    Los mensajes de suscripción únicos pueden satisfacer las necesidades de la mayoría de los escenarios de servicio de mini programas, pero existen escenarios en el campo del servicio público fuera de línea que los mensajes únicos las suscripciones no pueden cumplir, como retrasos en los vuelos. Los recordatorios de mensajes deben enviarse varias veces según la dinámica del vuelo en tiempo real. Para facilitar el servicio, proporcionamos mensajes de suscripción a largo plazo. Después de que un usuario se suscribe una vez, los desarrolladores pueden enviar varios mensajes durante un largo período de tiempo.

    Actualmente, la información de suscripción a largo plazo solo está abierta a servicios públicos fuera de línea, como asuntos gubernamentales y medios de vida de las personas, atención médica, transporte, finanzas, educación, etc., y gradualmente admitirá otros servicios públicos fuera de línea en el futuro.

  • Mensaje de suscripción del dispositivo
    El mensaje de suscripción del dispositivo es un tipo especial de mensaje de suscripción. Es un tipo de mensaje de suscripción a largo plazo y requiere que se complete el "acceso al dispositivo" antes de poder ser usado.

    Los mensajes de suscripción del dispositivo se utilizan para enviar notificaciones de mensajes a los usuarios cuando el dispositivo desencadena ciertos eventos que requieren intervención manual (como falla del dispositivo, suministros insuficientes del dispositivo, etc.). Consulte la documentación del mensaje de suscripción del dispositivo para obtener más detalles.

Para una introducción detallada, lea usted mismo los documentos oficiales:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/subscribe-message .html

Proceso de implementación

1. Selección de plantilla de mensaje de suscripción.

  • Inicie sesión en la plataforma pública WeChat del mini programa y haga clic en la función - Suscribirse a mensajes

    Insertar descripción de la imagen aquí

  • Haga clic en la biblioteca de plantillas públicas para buscar y seleccionar la plantilla que necesita.

    Insertar descripción de la imagen aquí

  • Solo se pueden seleccionar 5 palabras clave. Ingrese la descripción de la escena y haga clic en Enviar.

    Insertar descripción de la imagen aquí

  • Si no tiene las palabras clave que desea, haga clic点击申请 en la página para solicitar las palabras clave que necesita. Tenga en cuenta que hay 5 oportunidades de solicitud cada mes. Las palabras clave que solicita son las palabras clave que desea agregar. No vuelva a presentar la solicitud si hay algunas en la plantilla original. Una vez aprobada la solicitud, haga clic en "Seleccionar plantilla" para usar la palabras clave originales y palabras clave para que su solicitud sea aprobada

    Insertar descripción de la imagen aquí

Insertar descripción de la imagen aquí

  • Después de seleccionar las palabras clave de la plantilla y confirmar el envío, estará disponible en我的模板
    Insertar descripción de la imagen aquí
  • Haga clic en Detalles para ver qué parámetros se requieren para enviar mensajes de suscripción usando esta plantilla.
    Insertar descripción de la imagen aquí

2. El acoplamiento abre la ventana emergente de inicio de sesión del mini programa, analiza para obtener el openId del usuario, guarda el openId en la base de datos y lo asocia con la información del usuario o agrega un campo a la tabla de usuarios.

  • Mini programa parcialmente implementado

Documentación oficial:https://uniapp.dcloud.net.cn/api/plugins/login.html

uni.login({
    
    
  success: (result) => {
    
    
  	//保存获取到的code
    this.jsCode = result.code; 
    request({
    
    
      url: '后台接口地址',
      method: "POST",
      data: {
    
     code: result.code },
    })
      .then((res) => {
    
    
        this.openid = res.data.openid;
        this.session_key = res.data.session_key;
      })
      .catch((err) => {
    
    });
  },
  fail: (error) => {
    
    },
});
  • Implementación parcial del backend

Documentación oficial:https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/user-login/code2Session.html

// 对传入code进行解密获取openid
LinkedMultiValueMap<String, String> params = new LinkedMultiValueMap<>();
params.add("appid",appid);
params.add("secret",secret);
// 小程序调接口传的code
params.add("js_code",code);
params.add("grant_type","authorization_code");

String url = "https://api.weixin.qq.com/sns/jscode2session?appid="+appid+"&secret="+secret+"&js_code="+code+"&grant_type=authorization_code";
String result = restTemplate.getForObject(url, String.class);
JSONObject jsonObject = JSON.parseObject(result);

Map<String, String> map = new HashMap<>();
try {
    
    
    map.put("openid", jsonObject.get("openid").toString());
    map.put("session_key", jsonObject.get("session_key").toString());
    log.info("code解密成功");
} catch (Exception e){
    
    
    log.error("code解析失败,"+jsonObject.getString("errmsg"));
    throw new RuntimeException("code解析失败,"+jsonObject.getString("errmsg"));
}
return map;

3. Guíe a los usuarios para que autoricen activamente el envío de mensajes de suscripción.

  • Crear un nuevo archivo en el mini programaappletAuthorize.jsArchivo

Documentación oficial:https://developers.weixin.qq.com/miniprogram/dev/api/open-api/subscribe-message/wx.requestSubscribeMessage.html

import Vue from 'vue'

const templateIds = [
	// 审批结果通知
	'审批结果通知模板id',
	// 领用单领用通知
	'领用单领用通知模板id',
	// 待审核通知
	'待审核通知模板id',
	// 数据报表生成通知
	'数据报表生成通知模板id',
	// 工单完成提醒
	'工单完成提醒模板id'
]

const appletAuthorize = () => {
    
    
	let tmplIds = []
	uni.getStorage({
    
    
		key: "currAuthorizeStep",
		success: ({
     
     
			data
		}) => {
    
    
			console.log("currAuthorizeStep", data);
			let temp = data
			for (var i = 0; i < 3; i++) {
    
    
				if (temp === templateIds.length) {
    
    
					temp = 0
				}
				tmplIds.push(templateIds[temp])
				temp++
			}
			uni.setStorage({
    
    
		 	key: "currAuthorizeStep",
				data: temp,
				success: (result) => {
    
    },
				fail: (error) => {
    
    },
			});
			if (tmplIds.length === 0) {
    
    
				return
			}

			wx.requestSubscribeMessage({
    
    
				tmplIds: tmplIds,
				success(res) {
    
    
					console.log("订阅消息唤起成功 =====>", res)
				},
				fail(err) {
    
    
					console.log("订阅消息唤起失败 =====>", err)
				}
			})
		},
		fail: (error) => {
    
    },
	});
};

Vue.prototype.$appletAuthorize = appletAuthorize

export default appletAuthorize;

Aviso:

(1) setStorage al iniciar sesión

uni.setStorage({
    
    
  key: "currAuthorizeStep",
  data: 0,
  success: (result) => {
    
    },
  fail: (error) => {
    
    },
});

(2) Utilice templateIds para definir los ID de la plantilla y obtenga tres autorizaciones cada vez. Esto se debe a que el ID de la plantilla de mensaje suscrita por wx.requestSubscribeMessage solo se puede pasar como máximo tres a la vez; de lo contrario, la suscripción fallará.

  • Agregue this.$appletAuthorize()
    Solo puede ser
    en el método @click en la página del mini programa. Nota:
    (1) El usuario debe autorizar el mensaje de suscripción antes de la suscripción. se puede enviar al usuario. Mensaje
    (2) La interfaz de mensajes de suscripción se puede abrir solo después de que el usuario haga clic o inicie una devolución de llamada de pago. Es decir, no se puede llamar al método de autorización de suscripción tan pronto como ingresa a la página, sino que debe usarse junto con el enlace de evento de clic

4. La plantilla del mensaje de suscripción está disponible, el openId del usuario está disponible y la autorización del mensaje de suscripción del usuario está disponible. El siguiente paso es enviar el mensaje de suscripción.

官方文档:
(1)https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/mp-message -administración/subscribe-message/sendMessage.html
(2)https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Get_access_token .html

Clase de herramienta de empalme de parámetros

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;

/**
 * 发送订阅消息参数整合
 *
 * @author Administrator
 */
@Component
@RequiredArgsConstructor(onConstructor_ = @Autowired)
@Slf4j
public class AppletParamUtil {
    
    

    /**
     * 待审核通知参数
     * @param thing1Value
     * @param thing11Value
     * @param thing12Value
     * @param time4Value
     * @param thing10Value
     * @return
     */
    public static Map<String, Object> getNeedConfirmParam (String thing1Value,
                                                           String thing11Value,
                                                           String thing12Value,
                                                           String time4Value,
                                                           String thing10Value) {
    
    

        Map<String, Object> objMap = new HashMap<>(5);
        Map<String, String> map = new HashMap<>(1);
        // 申请人
        map.put("value", thing1Value);
        objMap.put("thing1", map);
        // 申请人部门
        map = new HashMap<>(1);
        map.put("value", thing11Value);
        objMap.put("thing11", map);
        // 申请人工种
        map = new HashMap<>(1);
        map.put("value", thing12Value);
        objMap.put("thing12", map);
        // 申请时间
        map = new HashMap<>(1);
        map.put("value", time4Value);
        objMap.put("time4", map);
        // 申请物品
        map = new HashMap<>(1);
        map.put("value", thing10Value);
        objMap.put("thing10", map);

        return objMap;
    }
    
    /**
     * 数据报表生成通知
     * @param thing1Value
     * @param thing2Value
     * @return
     */
    public static Map<String, Object> getDataReportParam (String thing1Value, String thing2Value) {
    
    

        Map<String, Object> objMap = new HashMap<>(2);
        Map<String, String> map = new HashMap<>(1);
        // 报表名称
        map.put("value", thing1Value);
        objMap.put("thing1", map);
        // 数据统计周期
        map = new HashMap<>(1);
        map.put("value", thing2Value);
        objMap.put("thing2", map);

        return objMap;
    }
}

Clase de herramienta de envío de mensajes de suscripción

import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.alibaba.csp.sentinel.util.StringUtil;
import com.alibaba.druid.support.json.JSONUtils;
import com.ruoyi.RemoteSysConfigService;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.system.api.RemoteUserService;
import com.ruoyi.system.api.domain.SysUser;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.http.HttpEntity;
import org.springframework.stereotype.Component;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * 发送小程序信息
 *
 * @author Administrator
 */
@Component
@RequiredArgsConstructor(onConstructor_ = @Autowired)
@Slf4j
public class AppletMsgSendUtil {
    
    

    private final RestTemplate restTemplate;

    private final StringRedisTemplate redisTemplate;


    /**
     * 发送小程序订阅信息
     * @param templateId    所需下发的订阅模板id
     * @param page          点击模板卡片后的跳转页面
     * @param data          模板内容
     * @return
     */
    public void msgSend(String templateId, String page, Map<String, Object> data) {
    
    
        try {
    
    
            
            //region 获取access_token
            String accessToken = getAppletToken();
            //endregion

            //region 推送小程序信息
            String msgUrl = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=" + accessToken;
            // 参数处理
            Map<String, Object> params = new HashMap<>(6);
            params.put("touser", openId);
            params.put("template_id", templateId);
            params.put("page", page);
            params.put("lang", "zh_CN");
            params.put("miniprogram_state", "formal");
            params.put("data", data);
            String jsonData = JSONUtils.toJSONString(params);
            HttpEntity<String> request = new HttpEntity<>(jsonData);
            String msgResult = restTemplate.postForObject(msgUrl, request, String.class);
            JSONObject msgResultObject = JSONUtil.parseObj(msgResult);

            if (!"0".equals(msgResultObject.get("errcode").toString())) {
    
    
                throw new RuntimeException("发送订阅消息失败," + msgResultObject.get("errmsg"));
            }
            //endregion
        } catch (Exception e) {
    
    
            throw new RuntimeException("发送订阅消息失败," + e);
        }
        //endregion
    }

    /**
     * 获取小程序token
     * @return
     */
    public String getAppletToken () {
    
    
        // 先从缓存查看有没有
        String appletToken = redisTemplate.opsForValue().get("AppletToken");
        if (!StringUtil.isBlank(appletToken)) {
    
    
            return appletToken;
        }
        
        //设置查询参数与请求url
        MultiValueMap<String, String> queryParams = new LinkedMultiValueMap<>();
        queryParams.add("appid", appid);
        queryParams.add("secret", secret);
        String tokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential";
        UriComponentsBuilder tokenBuilder = UriComponentsBuilder.fromHttpUrl(tokenUrl).queryParams(queryParams);
        //获取token
        String tokenResult = restTemplate.getForObject(tokenBuilder.toUriString(), String.class);
        JSONObject tokenObject = JSONUtil.parseObj(tokenResult);
        appletToken = tokenObject.getStr("access_token");
        if (StringUtil.isBlank(appletToken)) {
    
    
            throw new RuntimeException("小程序token获取失败," + tokenObject.getStr("errmsg"));
        }
        //将token存到redis,有效期100分钟。官方接口返回的token有效期120分钟
        redisTemplate.opsForValue().set("AppletToken", appletToken);
        redisTemplate.expire("AppletToken", 100, TimeUnit.MINUTES);

        return appletToken;
    }

}

uso

// 发送消息通知领取人已领取物品
Map<String, Object> objMap = AppletParamUtil.getDataReportParam(thing1Value,thing2Value);

msgSendUtil.msgSend(模板id, 需要跳转的小程序页面, objMap);

Nota: Cada parámetro del método en la clase de herramienta de empalme de parámetros se determina en función de la plantilla. El método de la clase de herramienta tiene tantos parámetros como la plantilla.
Insertar descripción de la imagen aquí

Este es el efecto de enviar con éxito el mensaje de suscripción al final.
Insertar descripción de la imagen aquí

Además, adjunte el método de llamada de envío del mensaje de suscripción APIPost. Consulte el documento oficial publicado anteriormente para conocer el significado de los parámetros.

url: https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=你的token
método: POST
cuerpo:
{ “touser”: “”,
“template_id”: “”,
“ página”: “”,
“lang”:“zh_CN”,
“miniprogram_state”: “formal”,
“ datos”: {} }

Insertar descripción de la imagen aquí

Si no entiende nada, vaya a la comunidad abierta de WeChat y pregunte o publique. https://developers.weixin.qq.com/community/develop/mixflow

参考:
(1)https://developers.weixin.qq.com/community/develop/doc/0008aa1fd40ec80b4710e9b2260000https://developers.weixin.qq.com/community/develop/doc/000ce8a9298950338310bc75966800
(2)

Supongo que te gusta

Origin blog.csdn.net/weixin_46099269/article/details/132033003
Recomendado
Clasificación