2018-02-09 16:41:56 sinat_35861727 阅读数 1705
  • 微信开发群发多图文消息-微信开发16(PHP)

    会员免费看,http://edu.csdn.net/lecturer/842 右侧可办理会员卡。微信群发多图文消息开发是子恒老师《子恒说微信开发》视频教程的第16部。详细讲解了用php开发微信群发图文消息。内容包含图文消息前端页面,一个页面插入多个百度UEditor,群发多图文,查询和删除图文消息等等。欢迎反馈,微信号:QQ68183131

    8086 人正在学习 去看看 秦子恒
微信小程序发送模板消息,跟公众号发模板消息有区别,小程序不存在订阅(关注),所以没办法通过对话窗口给用户推送消息,小程序下发模板消息统一通过微信“服务通知”发送,如下图:

但是其实现流程跟公众号发模板消息一样,步骤如下:
1. 获取 access_token
access_token 是全局唯一接口调用凭据,开发者调用各接口时都需使用 access_token,需妥善保存。做过微信开发和公众号开发,这都是最基本的,这里获取方法跟公众号获取 access_token 一模一样,方法见: 获取微信基础接口凭证Access_token

2. 添加模板消息
跟公众号一样,需要现在小程序后台添加模板消息,然后获取到对应的模板消息ID。

3. 发送模板消息
根据模板消息ID对应的模板消息关键字,在后端构造消息内容,在用户提交表单或者支付的时候,获取到form_id(表单提交场景下,为 submit 事件带上的 formId;支付场景下,为本次支付的 prepay_id),然后端将消息发送出去。消息参数如下:

代码实现示例如下:

function sendtpl(){
	$accessToken = 'xxxxxxxxxxxxxxxxxxxxxx';
	$postData = array(
		"touser"		=>'xxxxxxxxxxxxxxxxxxxxxx',  	//用户openid
		"template_id"	=>'xxxxxxxxxxxxxxxxxxxxxx', 	//模板消息ID
		"page"			=>'pages/index/index',          
		"form_id"		=>'xxxxxxxxxxxxxxxxxxxxxx',   	//表单提交场景下,事件带上的 formId;支付场景下,为本次支付的 prepay_id 
		"data"			=>array(
				'keyword1'	=> array('value'=>'港荣蒸蛋糕','color'=>'#000000'),
				'keyword2'	=> array('value'=>'您购买的的港荣蒸蛋糕已经发货,点击进入小程序查看详情','color'=>'#000000')
			),
		'emphasis_keyword'=>''
	);
	$postData =  json_encode($postData,JSON_UNESCAPED_UNICODE);
	$url = "https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token={$accessToken}";
	$rtn = request($url,true,'POST',$postData);
	
	return $rtn;
}
2018-03-31 12:12:32 Programming_NewBie 阅读数 56
  • 微信开发群发多图文消息-微信开发16(PHP)

    会员免费看,http://edu.csdn.net/lecturer/842 右侧可办理会员卡。微信群发多图文消息开发是子恒老师《子恒说微信开发》视频教程的第16部。详细讲解了用php开发微信群发图文消息。内容包含图文消息前端页面,一个页面插入多个百度UEditor,群发多图文,查询和删除图文消息等等。欢迎反馈,微信号:QQ68183131

    8086 人正在学习 去看看 秦子恒


在微信公众平台-消息管理-客服消息里获取帮助文档


在微信公众平台-开发者工具-公众平台测试账号注册测试账号-获得APPID和APPsecret,下滑在测试号二维码扫二维码得到openid


在微信公众平台-开发者工具-在线借口测试工具里编写代码,发送消息




在接口类型中选择基础服务,接口列表中选择上传logo,填写token,获得图片url




发送图文消息
{
    "touser": "oG1XL0ZMIc291aRgablK6P_SadZc", 
    "msgtype": "news", 
    "news": {
        "articles": [
            {
                "title": "Happy Day", 
                "description": "Is Really A Happy Day", 
                "url": "URL", 
                "picurl": "http://mmbiz.qpic.cn/mmbiz_jpg/iaPJc3uk8HfQxI8Nljt7jiawZiaCBf2UIBtAm00RtTcKiaR7FMfEhdgCdUia8e34fhvengmUmflM0rejpic7pq0VsDIA/0"
            }
        ]
    }
}






发送普通消息


{
    "touser":"oG1XL0ZMIc291aRgablK6P_SadZc",
    "msgtype":"text",
    "text":
    {
         "content":"Hello World"
    }
}
2016-01-19 11:03:00 weixin_30731287 阅读数 0
  • 微信开发群发多图文消息-微信开发16(PHP)

    会员免费看,http://edu.csdn.net/lecturer/842 右侧可办理会员卡。微信群发多图文消息开发是子恒老师《子恒说微信开发》视频教程的第16部。详细讲解了用php开发微信群发图文消息。内容包含图文消息前端页面,一个页面插入多个百度UEditor,群发多图文,查询和删除图文消息等等。欢迎反馈,微信号:QQ68183131

    8086 人正在学习 去看看 秦子恒

本内容为,微信消息发送参考:

1,首先,获取开发者测试账号(申请),会根据当前扫码提供的账号生成测试账号: 链接地址:http://mp.weixin.qq.com/wiki/home/index.html

 

  这时候可以获取到测试用的appid和appsecrept,然后调用获取接口调用凭证 接口获取access_token;

2,下面说信息发送,模拟了单用户信息发送和多用户消息批量发送

  (1)基础方法,http方法

    

/// <summary>
        ///      http  get/post 公用方法
        /// </summary>
        /// <param name="requestUrl">请求链接</param>
        /// <param name="requestJsonParams">请求参数值(如果是get方式此处为“”值,默认为 "")</param>
        /// <param name="requestMethod">请求方式  post or get</param>
        /// <returns></returns>
        public static string Request(this string requestUrl, string requestMethod, string requestJsonParams = "")
        {
            string returnText = "";
            StreamReader streamReader = null;
            HttpWebRequest request = null;
            HttpWebResponse response = null;

            Encoding encoding = Encoding.UTF8;
            request = (HttpWebRequest)WebRequest.Create(requestUrl);
            request.Method = requestMethod;
            if (!string.IsNullOrEmpty(requestJsonParams) && requestMethod.ToLower() == "post")
            {
                byte[] buffer = encoding.GetBytes(requestJsonParams);
                request.ContentLength = buffer.Length;
                request.GetRequestStream().Write(buffer, 0, buffer.Length);
            }

            try
            {
                response = (HttpWebResponse)request.GetResponse();
                using (streamReader = new StreamReader(response.GetResponseStream(), System.Text.Encoding.GetEncoding("gb2312")))//utf-8
                {
                    returnText = streamReader.ReadToEnd();
                }
            }
            catch (Exception ex)
            {
                returnText = ex.Message;
            }

            return returnText;
        }

(2)模拟发送:

  

/// <summary>
        ///     发送微信信息(单用户发送)
        /// </summary>
        /// <param name="access_token">授权码(微信token)</param>
        /// <param name="messageInfo">发送信息模型</param>
        /// <returns></returns>
        public static string SendSingleMessage(WeChatParamEntity messageInfo, string access_token)
        {
            messageInfo.MsgType = string.IsNullOrEmpty(messageInfo.MsgType) ? "text" : messageInfo.MsgType;
            string jsonDataParams = messageInfo == null ? "" : JsonConvert.SerializeObject(new
            {
                touser = messageInfo.ToUser,
                msgtype = messageInfo.MsgType,
                text = new { content = messageInfo.Text }
            });
            string requestUrl = string.Format(Consts.URL_POSTSINGLETEXTMESSAGE, access_token);
            return requestUrl.Request("POST", jsonDataParams);
        }
        /// <summary>
        ///     发送微信信息(多用户批量发送)
        /// </summary>
        /// <param name="access_token">授权码(微信token)</param>
        /// <param name="messageInfo">发送信息模型</param>
        /// <returns></returns>
        public static string SendMessages(WeChatParamsEntity messageInfo, string access_token)
        {
            messageInfo.MsgType = string.IsNullOrEmpty(messageInfo.MsgType) ? "text" : messageInfo.MsgType;
            string jsonDataParams = messageInfo == null ? "" : JsonConvert.SerializeObject(new
            {
                touser = messageInfo.ToUser,
                msgtype = messageInfo.MsgType,
                text = new { content = messageInfo.Text }
            });
            string requestUrl = string.Format(Consts.URL_POSTTEXTMESSAGES, access_token);
            return requestUrl.Request("POST", jsonDataParams);
        }

  (3)两个参数 模型:

  

/// <summary>
    ///     微信 发送信息 参数实体模型
    /// </summary>
    public class WeChatParamEntity
    {
        /// <summary>
        ///     普通用户openid
        /// </summary>
        public string ToUser { get; set; }
        /// <summary>
        ///     传输的文件类型(text,image, and so on)
        /// </summary>
        public string MsgType { get; set; } = "text";
        /// <summary>
        ///     传输文本内容
        /// </summary>
        public string Text { get; set; }

    }

    /// <summary>
    ///     微信 发送信息 参数实体模型
    /// </summary>
    public class WeChatParamsEntity
    {
        /// <summary>
        ///     普通用户openid
        /// </summary>
        public string[] ToUser { get; set; }
        /// <summary>
        ///     传输的文件类型(text,image, and so on)
        /// </summary>
        public string MsgType { get; set; } = "text";
        /// <summary>
        ///     传输文本内容
        /// </summary>
        public string Text { get; set; }

    }

   (4)web.config中的链接

  

  <!--微信接口-->

    <add key="appid" value="wx123456789021"/>
    <add key="appSecret" value="adasdsadasdasdsadasdsaqweqw"/>
    <add key="getAccessTokenUrl" value="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&amp;appid={0}&amp;secret={1}"/>
    <!--单用户信息发送-->
    <add key="postSingleTextMessageUrl" value="https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token={0}"/>
    <!--多用户批量发送-->
    <add key="postTextMessagesUrl" value="https://api.weixin.qq.com/cgi-bin/message/mass/send?access_token={0}"/>
    <!--\微信接口-->
    
    

 

 

3,测试使用涉及到  touser的这个参数,这个是需要发送的对象的  openID,这个很简单,在开发者文档(也就是上面的步骤二中,)获取

appid  和appsecrept的时候,当前这个页面下面有一个二维码,找几个人用微信扫扫就可以自动获取openID ,这时候将参数带入脚本模拟

post即可

  另外需要注意:文档中提示的  json 参数格式

  注意三:token有效时间为7200,俩小时,需要判断当前发送信息用户的token有效性,同时每天最大可请求次数为2000.

获取token :

  #region 获取token,并验证token过期时间

        public static string GetAccessToken(string appid, string appSecret)
        {
            string token = "";
            string requestUrl = string.Format(ConfigBLL.URL_GETACCESSTOKEN, appid, appSecret);
            string requestResult = WebAPITransfer.Request(requestUrl, "GET", "");

            CommonBLL.DebugLog(requestResult, "AccessToken-token-Params");
            string[] strArray = requestResult.Split(',');
            token = strArray[0].Split(':')[1].Replace("\"", "");

            return token;
        }

        #endregion

 

转载于:https://www.cnblogs.com/Tmc-Blog/p/5141542.html

2019-07-04 13:31:06 qq_41808386 阅读数 19
  • 微信开发群发多图文消息-微信开发16(PHP)

    会员免费看,http://edu.csdn.net/lecturer/842 右侧可办理会员卡。微信群发多图文消息开发是子恒老师《子恒说微信开发》视频教程的第16部。详细讲解了用php开发微信群发图文消息。内容包含图文消息前端页面,一个页面插入多个百度UEditor,群发多图文,查询和删除图文消息等等。欢迎反馈,微信号:QQ68183131

    8086 人正在学习 去看看 秦子恒

java发送模板消息 

1:微信开发平台上注册模板 获取模板from_id(from_id只能用一次)

2:获取用户的openid    获取自己的appid 和appsecret

3: 调试的时候 微信开发者工具获取的from_id不对  要用真机调试才能获取到正确格式的from_id

下面上代码CommUtil

@Autowired
HttpServletRequest httpsRequest;

public final static String token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
//获取小程序token
public Token getToken(String appid, String appsecret) {

    final Logger log = LoggerFactory.getLogger(this.getClass());
    Token token = null;
    String requestUrl = token_url.replace("APPID", appid).replace("APPSECRET", appsecret);
    // 发起GET请求获取凭证
    JSONObject jsonObject = HttpUtil.httpsRequest(requestUrl, "GET", null);

    if (null != jsonObject) {
        try {
            token = new Token();
            token.setAccessToken(jsonObject.getString("access_token"));
            token.setExpiresIn(jsonObject.getInt("expires_in"));
        } catch (JSONException e) {
            token = null;
            // 获取token失败
            log.error("获取token失败 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg"));
        }
    }
    return token;
}



//发送模板消息
public static String sendTemplateMessage(WxMssVo wxMssVo) {
    PrintWriter out = null;
    String info = "";
    try {
        //创建连接
        URL url = new URL(wxMssVo.getRequest_url());
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setDoOutput(true);
        connection.setDoInput(true);
        connection.setRequestMethod("POST");
        connection.setUseCaches(false);
        connection.setInstanceFollowRedirects(true);
        connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
        connection.setRequestProperty("Content-Type", "utf-8");
        connection.connect();
        //POST请求
        //DataOutputStream out = new DataOutputStream(connection.getOutputStream());
        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(connection.getOutputStream(), "utf-8");
        out =new PrintWriter(outputStreamWriter);
        JSONObject obj = new JSONObject();

        obj.put("access_token", wxMssVo.getAccess_token());
        obj.put("touser", wxMssVo.getTouser());
        obj.put("template_id", wxMssVo.getTemplate_id());
        obj.put("form_id", wxMssVo.getForm_id());
        obj.put("page", wxMssVo.getPage());

        JSONObject jsonObject = new JSONObject();

        for (int i = 0; i < wxMssVo.getParams().size(); i++) {
            JSONObject dataInfo = new JSONObject();
            dataInfo.put("value", wxMssVo.getParams().get(i).getValue());
            dataInfo.put("color", wxMssVo.getParams().get(i).getColor());
            jsonObject.put("keyword" + (i + 1), dataInfo);
        }

        obj.put("data", jsonObject);
        out.write(obj.toString());
        out.flush();
        out.close();

        //读取响应
        BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
        String lines;
        StringBuffer sb = new StringBuffer("");
        while ((lines = reader.readLine()) != null) {
            lines = new String(lines.getBytes(), "utf-8");
            sb.append(lines);
        }
        info = sb.toString();
        System.out.println(sb);
        reader.close();
        // 断开连接
        connection.disconnect();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return info;
}

HttpUtil类
private static Logger log = LoggerFactory.getLogger(HttpUtil.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 BaseHttpSSLSocketFactory.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.fromObject(buffer.toString());
        jsonObject = JSONObject.fromObject(buffer.toString());
    } catch (ConnectException ce) {
        log.error("连接超时:{}", ce);
    } catch (Exception e) {
        log.error("https请求异常:{}", e);
    }
    return jsonObject;
}
Service实现类
CommonUtil commonUtil = new CommonUtil();
Token token = commonUtil.getToken("wx544ed79f3818e021","d2fe5bb194bf1929b47df7c82323e82c");
WxMssVo wxMssVo = new WxMssVo();
wxMssVo.setTemplate_id("KeFUCUMJZDEo_frO1SeVcIazsw_BtvCHSMhtq2TSj2g");
wxMssVo.setTouser(miniProgramTemplateInfoRequestDTO.getOpenId());
wxMssVo.setPage("pages/index/index");
wxMssVo.setRequest_url("https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token=" + token.getAccessToken());
wxMssVo.setForm_id(miniProgramTemplateInfoRequestDTO.getFormId());

List<TemplateData> list = new ArrayList<>();
list.add(new TemplateData("通知","#ffffff"));
list.add(new TemplateData("测试数据","#ffffff"));
list.add(new TemplateData("发布成功","#ffffff"));
list.add(new TemplateData(DateFormatUtils.format(new Date(),"yyyy-MM-dd"),"#ffffff"));
wxMssVo.setParams(list);
CommonUtil.sendTemplateMessage(wxMssVo);

如果发送的模板中文乱码 发送请求的代码替换成下面即可

2019-06-28 15:30:19 qq_41808386 阅读数 830
  • 微信开发群发多图文消息-微信开发16(PHP)

    会员免费看,http://edu.csdn.net/lecturer/842 右侧可办理会员卡。微信群发多图文消息开发是子恒老师《子恒说微信开发》视频教程的第16部。详细讲解了用php开发微信群发图文消息。内容包含图文消息前端页面,一个页面插入多个百度UEditor,群发多图文,查询和删除图文消息等等。欢迎反馈,微信号:QQ68183131

    8086 人正在学习 去看看 秦子恒

下载微信开发者工具

注册开发者 获取appid 和 appSecret 

获取code 发送后台获取openid 和sessionKey(获取用户信息)

用sessionKey iv  encrypetdData 传到后台进行解密 得到手机号

 

获取用户信息java代码

Map<String, String> params = new HashMap<String, String>();
    params.put("appid", appid);
    params.put("secret", appSecret);
    params.put("grant_type", grantType);
    params.put("js_code", code);

    String resultStr = HttpUtil.httpsGet(this.code2SessionUrl, params);

    Map<String, Object> result = JsonUtils.parseJSON2Map(resultStr);

    if (result.containsKey("errcode")) {
        Integer errorCode = (Integer) result.get("errcode");
        throw new ServiceException(errorCode.toString());
    }

    String openId = (String) result.get("openid");
    String sessionKey = (String) result.get("session_key");


    // 每次获取新的sessionKey后更新缓存
    this.setSessionKeyCache(openId, sessionKey);

    MiniProgramLoginInfo info = new MiniProgramLoginInfo();

    info.setOpenId(openId);

    Member member = this.getMemberByOpenId(openId);

    if (null != member) {
        Long memberId = member.getId();
        info.setMemberId(memberId.toString());
        info.setMobileNo(member.getMobile());
    }

    return info;
}

 

获取用户手机号java代码

private JSONObject decryptData(String encryptedData, String sessionKey, String iv) throws Exception {
    byte[] dataByte = Base64.decodeBase64(encryptedData);
    // 加密秘钥
    byte[] keyByte = Base64.decodeBase64(sessionKey);
    // 偏移量
    byte[] ivByte = Base64.decodeBase64(iv);
    try {
        // 如果密钥不足16位,那么就补足.  这个if 中的内容很重要
        int base = 16;
        if (keyByte.length % base != 0) {
            int groups = keyByte.length / base + (keyByte.length % base != 0 ? 1 : 0);
            byte[] temp = new byte[groups * base];
            Arrays.fill(temp, (byte) 0);
            System.arraycopy(keyByte, 0, temp, 0, keyByte.length);
            keyByte = temp;
        }
        // 初始化
        // 初始化
        Security.addProvider(new BouncyCastleProvider());
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        SecretKeySpec spec = new SecretKeySpec(keyByte, "AES");
        AlgorithmParameters parameters = AlgorithmParameters.getInstance("AES");
        parameters.init(new IvParameterSpec(ivByte));
        cipher.init(Cipher.DECRYPT_MODE, spec, parameters);// 初始化
        byte[] resultByte = cipher.doFinal(dataByte);
        if (null != resultByte && resultByte.length > 0) {
            String result = new String(resultByte, "UTF-8");
            return JSONObject.fromObject(result);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

获取手机号时  个人开发者是没有权限的  encryptedData 和 iv 发送到后台的数据如果带 + 号会被解析成空格 所以要进行转换再解密 

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