WeChat アプレット - サービス通知、サブスクリプション メッセージの送信

1. メッセージプッシュとは

879572be08624b21959549689920618f.png

2. 全体的な効果

ここに画像の説明を挿入

3. 導入手順

1 アプレットがサブスクリプション メッセージを開きます

画像.png
画像.png

2 postApi テスト結果

画像.png

3、ユニアプリ構成

ここで特に注意が必要なのですが、ユーザーにメッセージを送りたい場合には、以下のようにユーザーに認証を誘導する必要があります。

画像.png
ユーザーはクリックして許可しないため、ユーザーにメッセージをプッシュする方法はありません。1 つの承認につき送信できるメッセージは 1 つだけなので、できるだけ多くのメッセージを送信したい場合は、できるだけ多くのメッセージを承認するようにユーザーを誘導する必要があります。

wx.requestSubscribeMessage メソッドは、ユーザーの承認を取得するために使用されます。
フロントエンドコード:

<button bindtap="getAuthority" type='primary'>获取订阅消息授权</button>

//获取授权的点击事件
			getAuthority() {
    
    
				console.log("点击了")
				wx.requestSubscribeMessage({
    
    
					tmplIds: ['grwQUkOPAaJg-pzSZWeZawYTRFjmKmVPbkfckxWcPYQ'], //这里填入我们生成的模板id
					success(res) {
    
    
						console.log('授权成功', res)
						wx.getUserInfo({
    
    
						  //成功后会返回
						  success:(res)=>{
    
    
							console.log(res);
							// 把你的用户信息存到一个变量中方便下面使用
							let userInfo= res.userInfo
							//获取openId(需要code来换取)这是用户的唯一标识符
							// 获取code值
							wx.login({
    
    
							  //成功放回
							  success:(res)=>{
    
    
								console.log("返回",res);
								let code=res.code
								console.log("code",code);
								// 通过code换取openId
								wx.request({
    
    
								  url: `https://api.weixin.qq.com/sns/jscode2session?appid=wxf85bf469c5f5d12b&secret=76a1479c2adc31ab8eeefd23a09d4410&js_code=${
      
      code}&grant_type=authorization_code`,
								  success:(res)=>{
    
    
									console.log(res);
									userInfo.openid=res.data.openid
									console.log("openid",userInfo.openid);
								  }
								})
							  }
							})	
						  }
						})
					},
					fail(res) {
    
    
						console.log('授权失败', res)
					}
				})
			},

第四に、背景の全体的な準備

画像.png
1. 対応するエンティティ クラス
PushDTO.java

package com.soil.data.dto.push;

import lombok.Data;

import java.util.Map;

/**
 * 小程序推送所需数据
 *
 * @author hlc
 */
@Data
public class PushDTO {
    
    
    /**
     * 用户openid
     */
    private String touser;
    /**
     * //模版id
     */
    private String template_id;
    /**
     * 默认
     */
    private String page = "pages/index/index";
    /**
     * 跳转小程序页面
     */
    private MiniprogramData miniprogram;
    /**
     * 放大那个推送字段
     */
    private String emphasisKeyword = "keyword1.DATA";
    /**
     * 推送文字
     */
    private Map<String, TemplateData> data;

}

テンプレートデータ.java

package com.soil.data.dto.push;

import lombok.Data;

/**
 * 设置推送的文字
 *
 * @author hlc
 */
@Data
public class TemplateData {
    
    
    private String value;

    public TemplateData(String value) {
    
    
        this.value = value;
    }
}

ミニプログラムデータ.java

package com.soil.data.dto.push;

import lombok.Data;

/**
 * 跳转小程序时填写
 *
 * @author hlc
 */
@Data
public class MiniprogramData {
    
    


    private String appid;

    private String pagepath;
}

2. コードの実装

package com.soil.biz.service.push;

import com.alibaba.fastjson.JSONObject;
import com.soil.core.exception.AppServiceException;
import com.soil.core.exception.ExceptionDefinition;
import com.soil.core.util.DateUtils;
import com.soil.core.util.Log;
import com.soil.data.dto.push.MiniprogramData;
import com.soil.data.dto.push.PushDTO;
import com.soil.data.dto.push.TemplateData;
import com.soil.data.enums.UserLoginType;
import lombok.SneakyThrows;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;


/**
 * hlc
 */
@Service
public class PushBizService {
    
    

    private OkHttpClient okHttpClient = new OkHttpClient();

    public static final String WX_ACCESS_TOKEN = "https://api.weixin.qq.com/cgi-bin/token?grant_type={grant_type}&appid={appid}&secret={secret}";


    /**
     * 发送方法
     * @param pushDTO 所需数据
     * @return responseEntity
     */
    @SneakyThrows
    public ResponseEntity<String> pushOneUser(PushDTO pushDTO) {
    
    
        final String SEND_INFO_URL = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=";

        RestTemplate restTemplate = new RestTemplate();
        String appId = "wxf85bf469c5f5d12b";
        String appSecret = "76a1479c2adc31ab8eeefd23a09d4410";
        // 获取accessTokenJson
        String accessTokenJson = getAccessTokenJSON(appId, appSecret);
        // 获取accessToken
        JSONObject jsonObject = JSONObject.parseObject(accessTokenJson);
        String accessToken = jsonObject.getString("access_token");
        // 获取过期时间
        Long expiresTime = jsonObject.getLong("expires_in");
        System.out.println(accessToken);
        String url = SEND_INFO_URL + accessToken;

        return restTemplate.postForEntity(url, pushDTO, String.class);
    }


    /**
     * 测试方法
     */
    public static void main(String[] args) {
    
    
        String openid = "o7TAS4zVL5D3IlVEnucI09FrCwjE";
        String templateId = "grwQUkOPAaJg-pzSZWeZawYTRFjmKmVPbkfckxWcPYQ";
        //拼接推送的模版
        PushDTO pushDTO = new PushDTO();


        //用户的openId
        pushDTO.setTouser(openid);
        pushDTO.setTemplate_id(templateId);
        MiniprogramData miniprogram = new MiniprogramData();
        pushDTO.setMiniprogram(miniprogram);
        Map<String, TemplateData> data = new HashMap<>();
        data.put("thing9", new TemplateData("新婴儿奶瓶"));
        data.put("character_string1", new TemplateData("11231323"));
        data.put("amount24", new TemplateData("0.01"));
        data.put("time21", new TemplateData("2023-02-16"));
        pushDTO.setData(data);
        System.out.println("发送的模板" + data);
        Date date = new Date();
        System.out.println(DateUtils.format(date, DateUtils.DATE_TIME_PATTERN));
        PushBizService pushBizService = new PushBizService();
        ResponseEntity<String> stringResponseEntity = pushBizService.pushOneUser(pushDTO);

        System.out.println(stringResponseEntity);
    }


    /**
     * 查微信AcessToken,返回JSON值
     *
     * @param appId
     * @param appSecret
     * @return
     * @throws Exception
     */
    private String getAccessTokenJSON(String appId, String appSecret) throws Exception {
    
    
        String json = okHttpClient.newCall(
                new Request.Builder().url("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="
                        + appId + "&secret=" + appSecret).build())
                .execute().body().string();
        JSONObject jsonObject = JSONObject.parseObject(json);
        Integer errcode = jsonObject.getInteger("errcode");
        if (errcode == null || errcode == 0) {
    
    
            return json;
        } else {
    
    
            Log.info("[微信 getAccessToken] 回复失败 回复报文:" + json);
            throw new AppServiceException(ExceptionDefinition.THIRD_PART_SERVICE_EXCEPTION);
        }
    }

}

おすすめ

転載: blog.csdn.net/weixin_44391817/article/details/127763984