2018-12-19 13:20:51 yw8886484 阅读数 756
  • java开发小程序和微信消息推送后台

    本课程将带领大家使用java实现微信公号和小程序的推送功能。 本节课你能学到以下知识点 1, 实战入门java后台的开发 2,学会springboot 3 ,微信公号模版推送功能的实现 4,小程序推送的实现 5,入门小程序开发 6,搭建自己的后台服务器

    1531 人正在学习 去看看 邱石

PHP实现微信模板消息推送

    本篇文章博主主要是想和大家分享PHP实现微信模板消息推送的问题,下面我们就一块来看一下PHP如何实现微信模板消息推送,文章有具体的代码展现,具有一定的参考价值,对微信开发感兴趣的小伙伴们可以参考一下。

1、微信公众号模板消息配置

2、PHP代码

/**
* 发送模板消息
*/
 public function send_notice(){
 //获取access_token
 if ($_COOKIE['access_token']){
 $access_token2=$_COOKIE['access_token'];
 }else{
 $json_token=$this>curl_post("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.$appid.'&secret='.$appsecret.'");
 $access_token1=json_decode($json_token,true);
 $access_token2=$access_token1['access_token'];
 setcookie('access_token',$access_token2,7200);
 }
 //模板消息
 $json_template = $this->json_tempalte();
 $url="https://api.weixin.qq.com/cgi- bin/message/template/send?access_token=".$access_token2;
 $res=$this->curl_post($url,urldecode($json_template));
 if ($res['errcode']==0){
 return '发送成功';
 }else{
 return '发送失败';
 }
 }
 /**
 * 将模板消息json格式化
 */
 public function json_tempalte(){
 //模板消息
 $template=array(
 'touser'=>'.$openid.', //用户openid
 'template_id'=>".$tenpalate_id.", //在公众号下配置的模板id
 'url'=>".$uel.", //点击模板消息会跳转的链接
 'topcolor'=>"#7B68EE",
 'data'=>array(
 'first'=>array('value'=>urlencode("您的活动已通过"),'color'=>"#FF0000"),
 'keyword1'=>array('value'=>urlencode('测试文章标题'),'color'=>'#FF0000'), //keyword需要与配置的模板消息对应
 'keyword2'=>array('value'=>urlencode(date("Y-m-d H:i:s")),'color'=>'#FF0000'),
 'keyword3'=>array('value'=>urlencode('测试发布人'),'color'=>'#FF0000'),
 'keyword4'=>array('value'=>urlencode('测试状态'),'color'=>'#FF0000'),
 'remark' =>array('value'=>urlencode('备注:这是测试'),'color'=>'#FF0000'), )
 );
 $json_template=json_encode($template);
 return $json_template;
 }
 /**
 * @param $url
 * @param array $data
 * @return mixed
 * curl请求
 */
 function curl_post($url , $data=array()){
 $ch = curl_init();
 curl_setopt($ch, CURLOPT_URL, $url);
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
 // POST数据
 curl_setopt($ch, CURLOPT_POST, 1);
 // 把post的变量加上
 curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
 $output = curl_exec($ch);
 curl_close($ch);
 return $output;
 }
    以上就是小编做的简单分享,希望对想研究微信开发的小伙伴们有所帮助。
2017-06-22 09:40:54 bobobobo345 阅读数 1138
  • java开发小程序和微信消息推送后台

    本课程将带领大家使用java实现微信公号和小程序的推送功能。 本节课你能学到以下知识点 1, 实战入门java后台的开发 2,学会springboot 3 ,微信公号模版推送功能的实现 4,小程序推送的实现 5,入门小程序开发 6,搭建自己的后台服务器

    1531 人正在学习 去看看 邱石
<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2017/5/24
 * Time: 14:25
 */
define('APPID',       "开发者id" );
define('APPSECRET',    "开发者密码");

class weixin_class
{
      public static $access_token = null;
      public static $appid = APPID;
      public static $appsecret = APPSECRET;
      //保证Access Token有效
      public static function valid()
      {
		//先获取缓存中的access_token,没有或者过期,重新获取access_token
            $mem = new ICache();
            self::$access_token = $mem->get('access_token');
            if (empty(self::$access_token)){
		//access_token接口路径
                  $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".self::$appid."&secret=".self::$appsecret;
                  //获取access_token
		  $res = self::getWxAccessToken($url);
                  self::$access_token = $res['access_token'];
                  $mem->set('access_token', self::$access_token,3600);
            }
      }

      // 获取access_token,调用微信接口
      public function getWxAccessToken($url){
            //初始化
            $ch = curl_init();
            //设置参数
            curl_setopt($ch,CURLOPT_URL,$url);
            curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
            //执行
            $res = curl_exec($ch);
            //关闭句柄
            curl_close($ch);
            //检查错误
            if(curl_errno($ch))
            {
                  echo 'Curl error:'.curl_error($ch);
            }

            $arr = json_decode($res,true);
            return $arr;
      }

      // 发送采集请求的方法
      public function http_curl($url,$type='get',$res='json',$data=''){
            //1.创建连接资源
            $ch = curl_init();
            //2.设置参数
            curl_setopt($ch,CURLOPT_URL,$url);
            curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
            //设置超时时间
            curl_setopt($ch,CURLOPT_TIMEOUT,10);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
            if($type=='post'){
                  curl_setopt($ch,CURLOPT_POST,1);
                  curl_setopt($ch,CURLOPT_POSTFIELDS,$data);
            }
            //3.采集
            $output = curl_exec($ch);
            //4.关闭
            curl_close($ch);
            if(curl_errno($ch)){
                  return curl_errno($ch);
            }
            return json_decode($output,true);

      }
      //1.param array  发送模板信息内容
      public static function sendMsg($data=NULL)
      {
            //access_token拼接发送接口
            $url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=".self::$access_token;
            $arr = array(
		//关注公众号的用户openid
                "touser"=>"用户openid",
		//服务号预设的模板id
                "template_id"=>"模板id",
		//点击模板后链接地址
                "url"=>"http://www.baidu.com",
		//依据预设的模板填入相应的对应字段的信息
                "data"=>array(
                    'name'=>array(
                        'value'=>'你好啊',
                        'color'=>'#173177'
                    ),
                    'date'=>array(
                        'value'=>date('Y-m-d H:i:s'),
                        'color'=>'#173177'
                    ),
                    'content'=>array(
                        'value'=>'欢迎光临',
                        'color'=>'#173177'
                    )
                )
            );
            //数组->json
            $jsonData = json_encode($arr);
            //调用curl函数
            $res = self::http_curl($url,'post','json',$jsonData);
            var_dump($res);
      }
2019-06-11 11:26:44 love468092550 阅读数 1998
  • java开发小程序和微信消息推送后台

    本课程将带领大家使用java实现微信公号和小程序的推送功能。 本节课你能学到以下知识点 1, 实战入门java后台的开发 2,学会springboot 3 ,微信公号模版推送功能的实现 4,小程序推送的实现 5,入门小程序开发 6,搭建自己的后台服务器

    1531 人正在学习 去看看 邱石

java实现微信公众号模版消息推送

准备

登录微信公众号后台(公众号模版消息推送必须为认证后的服务号)获取获取添加模版消息ID 

具体实现

java代码

/**
	 * 体脂数据推送信息给微信
	 * @param access_token
	 * @param open_id
	 * @param highPressure
	 * @param lowPressure
	 * @param heart
	 * @param bloodPressureLevel
	 */
	public  void sendBodyCompostionInfoToWeChart(final String access_token,final String open_id,final String user_name,final String bodyCompostionText,final String test_time){

			try {
				String	regUser = "http://wxdemo.xxxx.com/wxdevices/bodycompositionmain?openId="+open_id;
				String url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token="+access_token;
				Map<String, Object> map = new HashMap<String, Object>();
				map.put("touser", open_id); //推送用户openid
				map.put("template_id", WXUtil.TTJK_TEMP_TIZHI_ID); //指定模版ID
				map.put("url", regUser);  //点击模版跳转地址
				Map<String, Object> data_map =new HashMap<String, Object>();
				Map<String, Object> first = new HashMap<String, Object>();
				first.put("value", "您好,你有一条体脂检测信息");
				first.put("color", "#000000");
				Map<String, Object> keynote1 = new HashMap<String, Object>();
				keynote1.put("value", user_name);
				keynote1.put("color", "#000000");
				Map<String, Object> keynote2 = new HashMap<String, Object>();
				keynote2.put("value", test_time);
				keynote2.put("color", "#000000");
				Map<String, Object> keynote3 = new HashMap<String, Object>();
				keynote3.put("value", bodyCompostionText);
				keynote3.put("color", "#000000");
				Map<String, Object> remark = new HashMap<String, Object>();
				remark.put("value", "点击查看详情");
				remark.put("color", "#000000");
				data_map.put("first", first);
				data_map.put("keyword1", keynote1);
				data_map.put("keyword2", keynote2);
				data_map.put("keyword3", keynote3);
				data_map.put("remark", remark);
				map.put("data", data_map);
				JSONObject json = JSONObject.fromObject(map);
				String result = HttpUtil.sendPost(url, json.toString());
				System.out.println(result);
				JSONObject json_arr = JSONObject.fromObject(result);
				String isOk = String.valueOf(json_arr.get("errmsg"));
				logger.info(" errmsg >>>>>>>>> "+isOk);
				if(isOk.equals("ok")){
					logger.info("体脂据推送成功 , "+open_id );
				}else{
					logger.info("体脂据推送失败 , "+open_id );
				}
			} catch (Exception e) {
				logger.error("", e);
			}
			
	}

 成功截图

 

就是这么简单,如有不明白可以点击博客左边+ wx 帮你解答

2019-03-28 11:02:55 qiushi_1990 阅读数 1993
  • java开发小程序和微信消息推送后台

    本课程将带领大家使用java实现微信公号和小程序的推送功能。 本节课你能学到以下知识点 1, 实战入门java后台的开发 2,学会springboot 3 ,微信公号模版推送功能的实现 4,小程序推送的实现 5,入门小程序开发 6,搭建自己的后台服务器

    1531 人正在学习 去看看 邱石

视频讲解:https://edu.csdn.net/course/detail/23750

今天来带大家学习下微信模版消息推送。

先看效果图:
在这里插入图片描述

核心代码只有下面几行,即可轻松实现微信模版消息推送

        //1,配置
        WxMpInMemoryConfigStorage wxStorage = new WxMpInMemoryConfigStorage();
        wxStorage.setAppId("wx77bb69292323a000");
        wxStorage.setSecret("29bd368145806115ad6820133e62806e");
        WxMpService wxMpService = new WxMpServiceImpl();
        wxMpService.setWxMpConfigStorage(wxStorage);
        //2,推送消息
        WxMpTemplateMessage templateMessage = WxMpTemplateMessage.builder()
                .toUser("o5kho6DgC7SDry8zCmXuvHJGvrgI")//要推送的用户openid
                .templateId("Tpln-Eue2obJ0B-8JNkgkiRJaDMPgVeIgGxna982xrg")//模版id
                .url("https://30paotui.com/")//点击模版消息要访问的网址
                .build();
        try {
            wxMpService.getTemplateMsgService().sendTemplateMsg(templateMessage);
        } catch (Exception e) {
            System.out.println("推送失败:" + e.getMessage());
        }

所用知识点

  • 1, springboot实现java后台
  • 2,微信测试账号的申请
  • 3,微信模版推送的配置
    接下来就带领大家来一步步实现微信模版消息推送。

一,springboot创建java后台

至于springboot怎么创建java后台,我这里就不再唠叨了,大家百度一下,一大堆的文章。这里只需要重点讲解下以下几点。

  • 1,在pom.xml文件里引入下面类库
        <!--微信模版消息推送三方sdk-->
        <dependency>
            <groupId>com.github.binarywang</groupId>
            <artifactId>weixin-java-mp</artifactId>
            <version>3.3.0</version>
        </dependency>
  • 2,写一个推送的controller
package com.qiushi.wxpush;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import me.chanjar.weixin.mp.api.WxMpInMemoryConfigStorage;
import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
import me.chanjar.weixin.mp.bean.template.WxMpTemplateMessage;

/**
 * Created by qcl on 2019-03-28
 * 微信:2501902696
 * desc: 模版消息推送模拟
 */
@RestController
public class PushController {


    /*
     * 微信测试账号推送
     * */
    @GetMapping("/push")
    public void push() {
        //1,配置
        WxMpInMemoryConfigStorage wxStorage = new WxMpInMemoryConfigStorage();
        wxStorage.setAppId("wx77bb69292323a000");
        wxStorage.setSecret("29bd368145806115ad6820133e62806e");
        WxMpService wxMpService = new WxMpServiceImpl();
        wxMpService.setWxMpConfigStorage(wxStorage);

        //2,推送消息
        WxMpTemplateMessage templateMessage = WxMpTemplateMessage.builder()
                .toUser("o5kho6DgC7SDry8zCmXuvHJGvrgI")//要推送的用户openid
                .templateId("Tpln-Eue2obJ0B-8JNkgkiRJaDMPgVeIgGxna982xrg")//模版id
                .url("https://30paotui.com/")//点击模版消息要访问的网址
                .build();
        //3,如果是正式版发送模版消息,这里需要配置你的信息
        //        templateMessage.addData(new WxMpTemplateData("name", "value", "#FF00FF"));
        //                templateMessage.addData(new WxMpTemplateData(name2, value2, color2));
        try {
            wxMpService.getTemplateMsgService().sendTemplateMsg(templateMessage);
        } catch (Exception e) {
            System.out.println("推送失败:" + e.getMessage());
            e.printStackTrace();
        }

    }


}

二,接下来就来重点讲讲我们如何注册微信测试账号,并实现推送功能。

正常我们企业开发,实现微信模版消息推送,必须要有微信公众号,备案的网址,并且最麻烦的一点是要获取到用户的openid,作为个人,这些条件基本上都不具备。所以今天就来带大家注册微信开发测试账号,来轻松实现微信模版消息推送。

  • 1,微信扫码登录下面网址
    https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
    扫码登录成功后,就会给我们生成微信公号的appid和appsecret
    在这里插入图片描述

  • 2,微信扫码关注 测试号二维码,微信给我们返回我们的openid,这个openid在推送时特别重要。因为你推送肯定要知道推送给 谁啊,就比如你打电话,肯定要知道用户的电话号码吧。这个openid就是我们要推送给那个用户的唯一标示。
    在这里插入图片描述

  • 3,拿到这些以后,我们就可以去实现微信推送了。推送的代码就只有下面这么点。

         //1,配置
        WxMpInMemoryConfigStorage wxStorage = new WxMpInMemoryConfigStorage();
        wxStorage.setAppId("wx77bb69292323a000");//appid
        wxStorage.setSecret("29bd368145806115ad6820133e62806e");//appsecret
        WxMpService wxMpService = new WxMpServiceImpl();
        wxMpService.setWxMpConfigStorage(wxStorage);

        //2,推送消息
        WxMpTemplateMessage templateMessage = WxMpTemplateMessage.builder()
                .toUser("o5kho6DgC7SDry8zCmXuvHJGvrgI")//要推送的用户openid
                .templateId("Tpln-Eue2obJ0B-8JNkgkiRJaDMPgVeIgGxna982xrg")//模版id
                .url("https://30paotui.com/")//点击模版消息要访问的网址
                .build();
        //3,如果是正式版发送模版消息,这里需要配置你的信息
        //        templateMessage.addData(new WxMpTemplateData("name", "value", "#FF00FF"));
        //                templateMessage.addData(new WxMpTemplateData(name2, value2, color2));

        //发起推送
        try {
            String msg = wxMpService.getTemplateMsgService().sendTemplateMsg(templateMessage);
            System.out.println("推送成功:" + msg);
        } catch (Exception e) {
            System.out.println("推送失败:" + e.getMessage());
            e.printStackTrace();
        }

三,推送测试

代码都完成后,我们就可以来测试推送了。测试我们这个分两种

  • 1,java的单元测试
  • 2,运行springboot,通过get请求来触发推送

单元测试

package com.qiushi.wxpush;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import static org.junit.Assert.*;

/**
 * Created by qcl on 2019-03-28
 * 微信:2501902696
 * desc:测试用例
 */
@RunWith(SpringRunner.class)
@SpringBootTest
public class PushControllerTest {

    @Autowired
    PushController pushController;

    @Test
    public void push() {
        pushController.push();
    }
}

单元测试其实很简单,我们只需要点击箭头所指的绿色按钮,即可运行单元测试,运行通过后就可以看到发送消息成功了。
在这里插入图片描述
log里可以看出我们是10:46发起推送的,看下图我们微信接受到的推送消息也是10:46
在这里插入图片描述

运行springboot,通过get请求来触发推送

这个就更简单了,我们启动springboot项目,然后调用get请求:
在这里插入图片描述
在这里插入图片描述
可以看到我们也推送成功了。

到这里我们就轻松通过简单几行代码实现了微信模版消息推送的功能了。

我们在企业生产环境时,实现这个功能,步骤和这里是一样的。代码也和这里差不多,只不过多了一个获取用户openid的步骤,这个步骤微信要求比较严格,必须要有备案的网址作为回调,今天就不给大家深入讲解了,后期我会专门写一篇获取微信用户openid的文章出来。

如果你有微信或者java开发方面的问题,可以加我微信交流学习:2501902696。也可以加我微信获取完整源码。

视频讲解:https://edu.csdn.net/course/detail/23750

2017-05-12 15:46:54 bao_smart 阅读数 10981
  • java开发小程序和微信消息推送后台

    本课程将带领大家使用java实现微信公号和小程序的推送功能。 本节课你能学到以下知识点 1, 实战入门java后台的开发 2,学会springboot 3 ,微信公号模版推送功能的实现 4,小程序推送的实现 5,入门小程序开发 6,搭建自己的后台服务器

    1531 人正在学习 去看看 邱石
/**
 * 注册成功,通知模板消息实体类
 */
public class TemplateMessage {
    private String touser; //用户OpenID
    private String template_id; //模板消息ID
    private String url; //URL置空,在发送后,点模板消息进入一个空白页面(ios),或无法点击(android)。
    private String topcolor; //标题颜色
    private Map<String, TemplateData> templateData; //模板详细信息
   //此处省略get/set 方法
   }
/**
 * 模板详细信息 
 */
public class TemplateData {
    private String value;
    private String color;
    public TemplateData(String value,String color){
        this.value = value;
        this.color = color;
    }
    //此处省略get/set 方法
}
/*
*AccessToken 对象
*/
public class AccessToken  implements Serializable{
    //获取到的凭证
    private String accessToken;
    //凭证有效时间,单位:秒
    private int expiresin;    
    //此处省略get/set 方法
}
/**
 * 微信请求 - 信任管理器
 */
public class MyX509TrustManager implements X509TrustManager {
    @Override
    public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
    }
    @Override
    public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
    }
    @Override
    public X509Certificate[] getAcceptedIssuers() {
    //        return new X509Certificate[0];
        return  null;
    }
}
/**
 * 微信枚举
 * /
public class WeiXinEnum {    
     // 缓存类型     
    public enum CACHE_TYPE {
        CACHE_WX_ACCESS_TOKEN,   //模板消息access_token
    }    
    // 模板消息编号
    public enum WX_TEMPLATE_MSG_NUMBER{
        USER_REGISTER_SUCCESS(0,"OPENTM407796225", "注册成功"),
        ORDER_PAYED_SUCCESS(1, "OPENTM207421553","订单支付"),
        ORDER_...;
        private int code;
        private String msgNumber;
        private String label;
        WX_TEMPLATE_MSG_NUMBER(int code, String msgNumber,String label){
            this.code = code;
            this.msgNumber = msgNumber;
            this.label = label;
        }
        public int getCode(){
            return code;
        }
        public String getMsgNumber(){
            return msgNumber;
        }
        public String getLabel(){
            return label;
        }
    }
}
import com.alibaba.fastjson.JSONObject;
import com.qyuedai.crm.weixin.vo.MyX509TrustManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ConnectException;
import java.net.URL;
public class WX_HttpsUtil {
    private static Logger log = LoggerFactory.getLogger(WX_HttpsUtil.class);
    /**
     * 发送https请求
     * @param requestUrl 请求地址
     * @param requestMethod 请求方式(GET、POST)
     * @param outputStr 提交的数据
     * @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值)
     */
    public static JSONObject httpsRequest(String requestUrl, String requestMethod, String outputStr) {
        JSONObject jsonObject = null;
        try {
            // 创建SSLContext对象,并使用我们指定的信任管理器初始化
            TrustManager[] tm = { new MyX509TrustManager() };
            SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
            sslContext.init(null, tm, new java.security.SecureRandom());
            // 从上述SSLContext对象中得到SSLSocketFactory对象
            SSLSocketFactory ssf = sslContext.getSocketFactory();
            URL url = new URL(requestUrl);
            HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
            conn.setSSLSocketFactory(ssf);
            conn.setDoOutput(true);
            conn.setDoInput(true);
            conn.setUseCaches(false);
            // 设置请求方式(GET/POST)
            conn.setRequestMethod(requestMethod);
            // 当outputStr不为null时向输出流写数据
            if (null != outputStr) {
                OutputStream outputStream = conn.getOutputStream();
                // 注意编码格式
                outputStream.write(outputStr.getBytes("UTF-8"));
                outputStream.close();
            }
            // 从输入流读取返回内容
            InputStream inputStream = conn.getInputStream();
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
            String str = null;
            StringBuffer buffer = new StringBuffer();
            while ((str = bufferedReader.readLine()) != null) {
                buffer.append(str);
            }
            // 释放资源
            bufferedReader.close();
            inputStreamReader.close();
            inputStream.close();
            inputStream = null;
            conn.disconnect();
            jsonObject = JSONObject.parseObject(buffer.toString());
        } catch (ConnectException ce) {
            log.error("连接超时:{}", ce);
        } catch (Exception e) {
            log.error("https请求异常:{}", e);
        }
        return jsonObject;
    }
}
import com.alibaba.fastjson.JSONException;
import com.alibaba.fastjson.JSONObject;
import com.qyuedai.common.redis.Redis;
import com.qyuedai.crm.weixin.vo.AccessToken;
import com.qyuedai.crm.weixin.vo.WeiXinEnum;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class WX_TokenUtil {
    private static Logger log = LoggerFactory.getLogger(WX_TokenUtil.class);
   /**
     *  获得微信 AccessToken
     * access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。
     * 开发者需要access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取
     * 的access_token失效。  
     * (此处我是把token存在Redis里面了)   
     */
    public static AccessToken getWXToken() {
        AccessToken access_token = Redis.getInstance().get(WeiXinEnum.CACHE_TYPE.CACHE_WX_ACCESS_TOKEN.name());
        if(access_token == null || access_token.getAccessToken().equals("")){
            String tokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+ appId+"&secret="+ appSecret;
            JSONObject jsonObject = WX_HttpsUtil.httpsRequest(tokenUrl, "GET", null);
            if (null != jsonObject) {
                try {
                    access_token = new AccessToken();
                    access_token.setAccessToken(jsonObject.getString("access_token"));
                    access_token.setExpiresin(jsonObject.getInteger("expires_in"));
                } catch (JSONException e) {
                    access_token = null;
                    // 获取token失败
                    log.error("获取token失败 errcode:{} errmsg:{}", jsonObject.getInteger("errcode"), jsonObject.getString("errmsg"));
                }
            }
            Redis.getInstance().set(WeiXinEnum.CACHE_TYPE.CACHE_WX_ACCESS_TOKEN.name(), access_token,7100);
        }
        return access_token;
    }
}
import com.alibaba.fastjson.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class WX_UserUtil {
    private static Logger log = LoggerFactory.getLogger(WX_UserUtil.class);
    /**
     * 根据微信openId 获取用户是否订阅
     * @param openId 微信openId
     * @return 是否订阅该公众号标识
     */
    public static Integer subscribeState(String openId){
        String tmpurl = "https://api.weixin.qq.com/cgi-bin/user/info?access_token="+WX_TokenUtil.getWXToken().getAccessToken() +"&openid="+openId;
        JSONObject result = WX_HttpsUtil.httpsRequest(tmpurl, "GET",null);
        JSONObject resultJson = new JSONObject(result);
        log.error("获取用户是否订阅 errcode:{} errmsg:{}", resultJson.getInteger("errcode"), resultJson.getString("errmsg"));
        String errmsg = (String) resultJson.get("errmsg");
        if(errmsg==null){
            //用户是否订阅该公众号标识(0代表此用户没有关注该公众号 1表示关注了该公众号)。
            Integer subscribe = (Integer) resultJson.get("subscribe");
            return subscribe;
        }
        return -1;
    }

}
import com.alibaba.fastjson.JSONObject;
import com.qyuedai.crm.weixin.vo.TemplateData;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Map;
public class WX_TemplateMsgUtil {
    private static Logger log = LoggerFactory.getLogger(WX_TemplateMsgUtil.class);

    /**
     * 封装模板详细信息
     * @return
     */
    public static JSONObject packJsonmsg(Map<String, TemplateData> param) {
        JSONObject json = new JSONObject();
        for (Map.Entry<String,TemplateData> entry : param.entrySet()) {
            JSONObject keyJson = new JSONObject();
            TemplateData  dta=  entry.getValue();
            keyJson.put("value",dta.getValue());
            keyJson.put("color", dta.getColor());
            json.put(entry.getKey(), keyJson);
        }
        return json;
    }

    /**
     * 根据模板的编号 新增并获取模板ID
     * @param templateSerialNumber 模板库中模板的 "编号"
     * @return 模板ID
     */
    public static String getWXTemplateMsgId(String templateSerialNumber){
        String tmpurl = "https://api.weixin.qq.com/cgi-bin/template/api_add_template?access_token="+ WX_TokenUtil.getWXToken().getAccessToken();
        JSONObject json = new JSONObject();
        json.put("template_id_short", templateSerialNumber);
        JSONObject result = WX_HttpsUtil.httpsRequest(tmpurl, "POST", json.toString());
        JSONObject resultJson = new JSONObject(result);
        String errmsg = (String) resultJson.get("errmsg");
        log.info("获取模板编号返回信息:" + errmsg);
        if(!"ok".equals(errmsg)){
            return "error";
        }
        String templateId = (String) resultJson.get("template_id");
        return templateId;
    }

    /**
     * 根据模板ID 删除模板消息
     * @param templateId 模板ID
     * @return
     */
    public static String deleteWXTemplateMsgById(String templateId){
        String tmpurl = "https://api.weixin.qq.com/cgi-bin/template/del_private_template?access_token="+ WX_TokenUtil.getWXToken().getAccessToken();
        JSONObject json = new JSONObject();
        json.put("template_id", templateId);
        try{
            JSONObject result = WX_HttpsUtil.httpsRequest(tmpurl, "POST", json.toString());
            JSONObject resultJson = new JSONObject(result);
            log.info("删除"+templateId+"模板消息,返回CODE:"+ resultJson.get("errcode"));
            String errmsg = (String) resultJson.get("errmsg");
            if(!"ok".equals(errmsg)){
                return "error";
            }
        }catch(Exception e){
         e.printStackTrace();
        }
        return "success";
    }


    /**
     * 发送微信消息(模板消息)
     * @param touser 用户 OpenID
     * @param templatId 模板消息ID
     * @param clickurl URL置空,则在发送后,点击模板消息会进入一个空白页面(ios),或无法点击(android)。
     * @param topcolor 标题颜色
     * @param data 详细内容
     * @return
     */
    public static String sendWechatMsgToUser(String touser, String templatId, String clickurl, String topcolor, JSONObject data) {
        String tmpurl = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token="+ WX_TokenUtil.getWXToken().getAccessToken();
        JSONObject json = new JSONObject();
        json.put("touser", touser);
        json.put("template_id", templatId);
        json.put("url", clickurl);
        json.put("topcolor", topcolor);
        json.put("data", data);
        try{
            JSONObject result = WX_HttpsUtil.httpsRequest(tmpurl, "POST", json.toString());
            JSONObject resultJson = new JSONObject(result);
            log.info("发送微信消息返回信息:" + resultJson.get("errcode"));
            String errmsg = (String) resultJson.get("errmsg");
            if(!"ok".equals(errmsg)){  //如果为errmsg为ok,则代表发送成功,公众号推送信息给用户了。
                return "error";
            }
         }catch(Exception e){
            e.printStackTrace();
            return "error";
        }finally {
            if(templatId!=null) {
                //删除新增的 微信模板
                deleteWXTemplateMsgById(templatId);
            }
        }
        return "success";
   }
}
import com.qyuedai.crm.weixin.util.WX_TemplateMsgUtil;
import com.qyuedai.crm.weixin.util.WX_UserUtil;
import com.qyuedai.crm.weixin.vo.TemplateData;
import com.qyuedai.crm.weixin.vo.WeiXinEnum;
import java.util.HashMap;
import java.util.Map;
import static com.qyuedai.crm.weixin.util.WX_TemplateMsgUtil.getWXTemplateMsgId;
import static com.qyuedai.crm.weixin.util.WX_TemplateMsgUtil.packJsonmsg;
public class Test {

    public static void main(String[] args) {
        //新增用户成功 - 推送微信消息
        senMsg("oUBBZwTa7qxb0vP98X8WhAazdvUE");
    }
   static void senMsg(String openId){
        //用户是否订阅该公众号标识 (0代表此用户没有关注该公众号 1表示关注了该公众号)
        Integer  state= WX_UserUtil.subscribeState(openId);
        // 绑定了微信并且关注了服务号的用户 , 注册成功-推送注册短信
        if(state==1){
            Map<String,TemplateData> param = new HashMap<>();
            param.put("first",new TemplateData("恭喜您注册成功!","#696969"));
            param.put("keyword1",new TemplateData("15618551533","#696969"));
            param.put("keyword2",new TemplateData("2017年05月06日","#696969"));
            param.put("remark",new TemplateData("祝投资愉快!","#696969"));
            //注册的微信-模板Id
            String regTempId =  getWXTemplateMsgId(WeiXinEnum.WX_TEMPLATE_MSG_NUMBER.USER_REGISTER_SUCCESS.getMsgNumber());
            //调用发送微信消息给用户的接口
            WX_TemplateMsgUtil.sendWechatMsgToUser(openId,regTempId, "", "#000000", packJsonmsg(param));
        }
    }
}

其他消息模板请参考 微信服务号 - 模板消息-模板库 里面的消息模板。
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140183&token=&lang=zh_CN

微信模板消息推送

阅读数 154

没有更多推荐了,返回首页