微信小程序 客服消息 接口接入分享

由于公司业务需要,在小程序上开发客服功能
先浏览微信提供的接口文档https://developers.weixin.qq.com/miniprogram/dev/framework/server-ability/message-push.html
浏览完后,我们开始配置
1、先开发一个接口,用于验证需要填写的“URL服务器地址”,此接口用GET请求

     @IgnoreToken
	@GetMapping("/XXXXXXX")
	public void weixinProcessGetMethod(@RequestParam(required = false) Map<String, Object> params,HttpServletResponse response) {
		// 微信加密签名
		String msgSignature = (String) params.get("signature");
		// 时间戳
		String timeStamp = (String) params.get("timestamp");
		// 随机数
		String nonce = (String) params.get("nonce");
		// 随机字符串
		String echoStr = (String) params.get("echostr");
		log.info("客服消息验证url参数:{}", JSONObject.toJSONString(params));
		String result = "";
		if (SignUtil.checkSignature(msgSignature, timeStamp, nonce)) {
			result = echoStr;
		}

		log.info("客服消息验证url验证结果:{}",result);
		
		WXCommonUtils.responeOutputResult(response,result);
	}

再附一个工具类

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;

import cn.dankal.jb.core.util.ComponetWX;

import java.io.BufferedReader;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;

/**
 * ClassName: SignUtil <br/>
 * Function: 此工具类用于验证微信小程序消息接收接口url验证使用 <br/>
 * date: Jun 19, 2019 10:14:54 AM <br/>
 *
 * @version 
 * @since JDK 1.7
 */
public class SignUtil {
    // 与接口配置信息中的Token要一致
    //private static String token = "xxxx";  
 
    /**
     * 验证签名
     * @ sc
     * @param signature
     * @param timestamp
     * @param nonce
     * @return
     */
    public static boolean checkSignature(String signature, String timestamp,
            String nonce) {
        String[] arr = new String[] { 'token令牌', timestamp, nonce };
        // 将token、timestamp、nonce三个参数进行字典序排序
        Arrays.sort(arr);
        StringBuilder content = new StringBuilder();
        for (int i = 0; i < arr.length; i++) {
            content.append(arr[i]);
        }
        MessageDigest md = null;
        String tmpStr = null;
        try {
            md = MessageDigest.getInstance("SHA-1");
            // 将三个参数字符串拼接成一个字符串进行sha1加密
            byte[] digest = md.digest(content.toString().getBytes());
            tmpStr = byteToStr(digest);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        content = null;
        // 将sha1加密后的字符串可与signature对比,标识该请求来源于微信
        return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false;
    }
    /**
     * 将字节数组转换为十六进制字符串
     * 
     * @param byteArray
     * @return
     */
    private static String byteToStr(byte[] byteArray) {
        String strDigest = "";
        for (int i = 0; i < byteArray.length; i++) {
            strDigest += byteToHexStr(byteArray[i]);
        }
        return strDigest;
    }
    /**
     * 将字节转换为十六进制字符串
     * 
     * @param mByte
     * @return
     */
    private static String byteToHexStr(byte mByte) {
        char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A',
                'B', 'C', 'D', 'E', 'F' };
        char[] tempArr = new char[2];
        tempArr[0] = Digit[(mByte >>> 4) & 0X0F];
        tempArr[1] = Digit[mByte & 0X0F];
 
        String s = new String(tempArr);
        return s;
    }
    
	@SuppressWarnings("unchecked")
	public static String getBodyFromRequest(HttpServletRequest request) {

		BufferedReader br = null;
		StringBuilder sb = new StringBuilder("");
		try {
			br = request.getReader();
			String str;
			while ((str = br.readLine()) != null) {
				sb.append(str);
			}
			br.close();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (null != br) {
				try {
					br.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		return sb.toString();
	}

}

注:小程序后台中的 url服务器地址可以先不填,先设置好 token 令牌,消息加密密钥
图一
就此验证部分写完,如果消息加密方式选择了加密方式,验证接口不变!!!因为微信验证没有加密,只是验证接口可用

2、再写一个方法,接收用户发送的消息(用户发送消息,小程序调用配置的“URL服务器地址”),如图2效果
图二
不多说,上代码

    @IgnoreToken
	@PostMapping("/XXXXXXX")
	@ResponseBody
	public void receiveMessage(HttpServletRequest request, HttpServletResponse response) {
		String result = "fail";
		try {
			String postData = SignUtil.getBodyFromRequest(request);

			log.info("接收小程序客户消息开始:{},postData:{}", request.getQueryString(), postData);
			Map<String, String> xmlToMap = WXPayUtil.xmlToMap(postData);
			JSONObject jsonObject = JSONObject.parseObject(JSONObject.toJSONString(xmlToMap));

			if (jsonObject.containsKey("MsgType") && jsonObject.getString("MsgType").equals("text")) { //收到的是文本消息
				//customerServerService.handleCustomerMessageText(jsonObject); 这里处理消息,我是放到了kafka里面
				result = "success";
			} else { //其他消息
				log.info("非文本消息不予处理");
				//也回复一个图片消息
				result = "success";
			}
		} catch (Exception e) {
			log.error("接收消息出现异常", e);
		}
		
		WXCommonUtils.responeOutputResult(response,result);
	}

WXCommonUtils.responeOutputResult 内容如下

public static void responeOutputResult(HttpServletResponse response, String result) {
		try (ServletOutputStream outputStream = response.getOutputStream()) {
			//此处需要用repsone,返回不能带引号
			outputStream.print(result);
		} catch (IOException e) {
			log.error("response 输出结果出现异常", e);
		}
	}

特别在这里提醒,响应微信要用response输出方式,因为其他方式都会返回时带引号,而微信接收时,是不能带引号的,这个微信接口没有提到,一定要注意

3、发送回应消息的内容,稍后补上。。。

这里借鉴到了https://blog.csdn.net/syj921029/article/details/81301548 这位兄台的内容,这是找到的比较详细的,在此多谢!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
微信小程序请求百度API接口的代码通常可以分为以下几个步骤: 1. 在小程序的配置文件app.json中注册百度API接口的域名。在"my"字段下添加"request"字段,并在列表中填入百度API的域名,例如:"https://api.baidu.com"。 2. 在小程序的页面中通过wx.request方法发起请求。首先,需要在小程序页面的js文件中引入wx.request方法。然后,可以使用wx.request方法来发送请求,具体代码如下: ```javascript wx.request({ url: 'https://api.baidu.com/your_api_path', // 你要请求的百度API接口地址 data: { // 若有参数,可通过data字段传递给API接口 param1: value1, param2: value2 }, header: { 'Content-Type': 'application/json' // 根据实际情况设置header信息 }, method: 'GET', // 根据API接口要求设置请求方式 success: function (res) { // 请求成功后的处理逻辑 console.log(res.data) }, fail: function (res) { // 请求失败后的处理逻辑 } }) ``` 3. 根据百度API接口的要求来设置请求参数和请求头信息。可以通过data字段来传递请求参数,通过header字段来设置请求头信息。根据API接口的要求设置正确的Content-Type,并选择适当的请求方式(GET、POST等)。 4. 处理请求成功和失败的回调函数。在success字段中可以编写请求成功后的处理逻辑,在fail字段中可以编写请求失败后的处理逻辑。可以根据需要对返回的数据进行处理和展示。 需要注意的是,在使用百度API接口前,需要先申请相关的密钥或授权,并按照官方文档提供的要求进行接口调用。以上是一个简单的示例,具体使用方式根据实际情况可能有所不同。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值