微信公众号发送模板消息中文乱码(java)

使用 restTemplate 发送。

/**
 * 微信模板类
 */
@Data
public class WeChatTemplate implements Serializable {

    private static final long serialVersionUID = 612571563869874653L;
    /**
     * 模板id
     */
    private String template_id;

    /**
     * 接收者 openId
     */
    private String touser;

    /**
     * 模板跳转链接
     */
    @JsonSerialize(include= JsonSerialize.Inclusion.NON_EMPTY)
    private String url;

    /**
     * data的数据
     */
    private TreeMap> data;

    /**
     * data 里的数据
     *
     * @param value :模板参数
     * @param color :颜色 可选
     * @return
     */
    public static TreeMap item(String value, String color) {
        TreeMap params = new TreeMap();
        params.put("value", value);
        params.put("color", color==null?"#173177":color);
        return params;
    }
}
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONException;
import com.alibaba.fastjson.JSONObject;
import com.company.platform.base.config.wxpay.sdk.MyWXPayConfig;
import com.company.platform.restapi.dao.hfss.WechatTemplateMessageLogMapper;
import com.company.platform.restapi.model.hfss.WechatTemplateMessageLogWithBLOBs;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.time.DateUtils;
import org.apache.http.entity.StringEntity;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
import java.util.Date;
import java.util.Map;

@Component
@Slf4j
public class WeChatTemplateMessageService {

    @Autowired
    private RestTemplate restTemplate;

    private static AccessToken accessToken = null;

    @Resource
    private MyWXPayConfig wxPayConfig;

    @Resource
    private WechatTemplateMessageLogMapper templateMessageLogMapper;

    /**
     * 获取access_token的接口地址
     */
    public final static String access_token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";

    /**发送模板消息*/
    public static final String SEND_TEMPLATE_MESSAGE = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN";

    /**
     * 通过APPID 和 APPSECRET
     * 获取assess_token
     * @return
     */
    public AccessToken getAccessToken() {

        String appid = wxPayConfig.getAppID();
        String appsecret = wxPayConfig.getAppsecret();

        if(accessToken == null
            || DateUtils.addSeconds(accessToken.getReceiveTime(), accessToken.getExpires_in()).before(new Date())) {
            String requestUrl = access_token_url.replace("APPID", appid).replace("APPSECRET", appsecret);
            JSONObject jsonObject = restTemplate.getForObject(requestUrl,JSONObject.class);
            // 如果请求成功
            if (null != jsonObject) {
                try {
                    accessToken = new AccessToken();
                    accessToken.setAccess_token(jsonObject.getString("access_token"));
                    accessToken.setExpires_in(jsonObject.getInteger("expires_in"));
                    accessToken.setReceiveTime(new Date());
                } catch (JSONException e) {
                    accessToken = null;
                    // 获取token失败
                    log.error("获取token失败 errcode:{} errmsg:{}", jsonObject.getInteger("errcode"), jsonObject.getString("errmsg"));
                }
            }
        }

        return accessToken;
    }

    /**
     * 发送模板消息
     * @param accessToken
     * @param template
     * @return
     */
    public void sendTemplateMsg(String accessToken, WeChatTemplate template){

        String requestUrl =SEND_TEMPLATE_MESSAGE.replace("ACCESS_TOKEN",accessToken);
        JSONObject jsonObject = restTemplate.postForObject(requestUrl,template,JSONObject.class);
        log.info("返回jsonObject值:"+jsonObject);
        if (null != jsonObject) {
            int errorCode = jsonObject.getIntValue("errcode");

            //发送日志

            if (0 == errorCode) {
                log.info("模板消息发送成功");
            } else {
                String errorMsg = jsonObject.getString("errmsg");
                log.info("模板消息发送失败,错误是 "+errorCode+",错误信息是"+ errorMsg);
            }
        }
    }

}

发送时,直接使用bean发送,不要转换成json,本人亲测转换成json串后发送会中文乱码
如果有哪位知道原因请留言,谢谢!

你可能感兴趣的:(微信公众号发送模板消息中文乱码(java))