2016-11-07 15:44:27 guolulu0223 阅读数 3600
  • 微信公众平台应用开发(开发模式

    微信公众平台开发教程,该课程内容包括本地调试:业务逻辑测试、消息接收与响应、测试流程;符号表情,微信开发模式,消息加解密等。 讲师:刘运强,网名柳峰,计算机硕士研究生,畅销书《微信公众平台应用开发:方法、技巧与案例》作者。 本课程主要面向有一定Java基础、对微信公众平台开发感兴趣的人员,能够帮助他们入门微信公众平台开发,少走弯路。

    8595 人正在学习 去看看 CSDN讲师

接入微信公众平台开发,开发者需要按照如下步骤完成:

1、填写服务器配置
2、验证服务器地址的有效性
3、依据接口文档实现业务逻辑

第一步:填写服务器配置

登录微信公众平台官网后,在公众平台后台管理页面 - 开发者中心页,点击“修改配置”按钮,填写服务器地址(URL)、Token和EncodingAESKey,其中URL是开发者用来接收微信消息和事件的接口URL。Token可由开发者可以任意填写,用作生成签名(该Token会和接口URL中包含的Token进行比对,从而验证安全性)。EncodingAESKey由开发者手动填写或随机生成,将用作消息体加解密密钥。

同时,开发者可选择消息加解密方式:明文模式、兼容模式和安全模式。模式的选择与服务器配置在提交后都会立即生效,请开发者谨慎填写及选择。加解密方式的默认状态为明文模式,选择兼容模式和安全模式需要提前配置好相关加解密代码,详情请参考消息体签名及加解密部分的文档。


废话不多说;直接上真家伙(php为例)


假如你填写的信息如下:

URL:http://www.baidu.com/weixin.php

Token:weixin

那么就直接将一下内容复制到你的weixin.php文件里面就OK了(记得一定要是在根目录下哦,或者你填写的URL同步的能访问的也行)

<?php
/**
  * wechat php test
  */
//define your token
define("TOKEN", "weixin");
$wechatObj = new wechatCallbackapiTest();
if(isset($_GET["echostr"])){ #验证过token,成为开发者之后,可以直接$wechatObj->responseMsg();
$wechatObj->valid();
}else{
$wechatObj->responseMsg();
}

class wechatCallbackapiTest
{
public function valid()
    {
        $echoStr = $_GET["echostr"];
        //valid signature , option
        if($this->checkSignature()){
        echo $echoStr;
        exit;
        }
    }


    public function responseMsg(){
        //get post data, May be due to the different environments
        $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];


              //extract post data
        if (!empty($postStr)){
                        
            $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); #这里有从用户通过公众平台接收过来的数据,具体是什么类型的数据,开发者文档上写的很清楚,可以去上面查。
            $fromUsername = $postObj->FromUserName;
            $toUsername = $postObj->ToUserName;
            $keyword = trim($postObj->Content);
            $msgType = $postObj->MsgType;
            $time = time();
            switch( $msgType ){
                case "text": #这个xml格式的数据是你服务器上的数据,是要传回公众平台的。我在这刚开始有点糊涂了
                $textTpl = "<xml>
                <ToUserName><![CDATA[%s]]></ToUserName>
                <FromUserName><![CDATA[%s]]></FromUserName>
                <CreateTime>%s</CreateTime>
                <MsgType><![CDATA[%s]]></MsgType>
                <Content><![CDATA[%s]]></Content>
                <FuncFlag>0</FuncFlag>

                </xml>";

                #这里是我自己写的,关于时间的自动回复     
                if( $keyword =='时间' || $keyword =='time' || $keyword =="shijian"){
                    $contentStr = date("Y-m-d H:i:s",time());
                    $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                    echo $resultStr;
                }
                else
                {
                    $msgType = "text";
                    $contentStr = "欢迎关注shenghuoju";
                    $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                    echo $resultStr;
                }

                break;

                case "event": #这个是事件的操作,当关注的时候自动回复
                $textTpl = "<xml>
                <ToUserName><![CDATA[%s]]></ToUserName>
                <FromUserName><![CDATA[%s]]></FromUserName>
                <CreateTime>%s</CreateTime>
                <MsgType><![CDATA[%s]]></MsgType>
                <Content><![CDATA[%s]]></Content>
                <FuncFlag>0</FuncFlag>
                </xml>";
                $event = $postObj->Event;
                $msgType = "text";
                if( $event =='subscribe'){
                    $contentStr = "欢迎关注shenghuoju";

                    $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                    echo $resultStr;
                    break;
                }
            }

        }else {
            echo "欢迎关注shenghuoju";
            exit;
        }
    }
///----------------------------------------------------------------------------------
private function checkSignature() #这个函数验证过之后就可以删除了
{
    $signature = $_GET["signature"];
    $timestamp = $_GET["timestamp"];
    $nonce = $_GET["nonce"];
       
$token = TOKEN;
$tmpArr = array($token, $timestamp, $nonce);
sort($tmpArr);
$tmpStr = implode( $tmpArr );
$tmpStr = sha1( $tmpStr );

if( $tmpStr == $signature ){
return true;
}else{
return false;
}
}
}

?> 


然后就提交就OK了,然后呢。。。。



恭喜你,成为了一名基础的微信开发者!



偷偷的告诉你哦,代码里面已经给你写了一个自动回复的小功能哦,自己找找看!



深层次的开发,请继续查看下一内容!


也可以加一下我的qq哦!


2018-03-09 14:14:03 qq_38038920 阅读数 856
  • 微信公众平台应用开发(开发模式

    微信公众平台开发教程,该课程内容包括本地调试:业务逻辑测试、消息接收与响应、测试流程;符号表情,微信开发模式,消息加解密等。 讲师:刘运强,网名柳峰,计算机硕士研究生,畅销书《微信公众平台应用开发:方法、技巧与案例》作者。 本课程主要面向有一定Java基础、对微信公众平台开发感兴趣的人员,能够帮助他们入门微信公众平台开发,少走弯路。

    8595 人正在学习 去看看 CSDN讲师

1.  点击打开链接  找到第二步的位置

2.

3.   

   3.1 获取appsecret           3.2  根据要求填写服务器的ip地址 

4.   

     打开修改配置看第五步

5.    根据要求修改下面的内容(注:通过url必选能读取待文件才能成功 )


2016-11-26 19:45:03 u012309389 阅读数 152
  • 微信公众平台应用开发(开发模式

    微信公众平台开发教程,该课程内容包括本地调试:业务逻辑测试、消息接收与响应、测试流程;符号表情,微信开发模式,消息加解密等。 讲师:刘运强,网名柳峰,计算机硕士研究生,畅销书《微信公众平台应用开发:方法、技巧与案例》作者。 本课程主要面向有一定Java基础、对微信公众平台开发感兴趣的人员,能够帮助他们入门微信公众平台开发,少走弯路。

    8595 人正在学习 去看看 CSDN讲师

自定义菜单的创建

微信公众号设置开发模式之后,本身自带的菜单按钮就不能够使用了,此时微信开放了自定义菜单的接口让开发者使用,这比自带的菜单功能要强大的多,因为普通模式下的菜单每次修改需要等待24个小时左右,而自定义菜单修改并不需要等待.
首先是url地址https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN,access_token就是我上一篇文章中获取到的唯一凭证,后文中不再赘续,该请求是POST请求,所以我们可以使用httppost方法(自定义方法,请看上篇文章).
自定义菜单分为一级菜单和二级菜单,最多3个一级菜单,每个一级菜单最多包含五个二级菜单,一级菜单最多4个汉字,二级菜单最多7个汉字,多出来的部分会以..代替,请注意
菜单的类型有很多,我们常用的有view,click,media_id这三种,其他的不在此赘叙,如有需要可以查看开发文档
view : 用户点击后会推送event事件给公众号,类似于用户发送消息给我们的服务器,类型是event,在我们的项目 中可以使用消息接受模块接收,key值代表需要推送的事件,可以自己设置
click : 点击跳转url
media_id : 点击推送素材(这个内容关系到素材的上传和下载,后面的文章中会写出来)
大致上使用的就这三种类型,参数说明在开发文档中查看
在项目中新建一个JAVA类来存放自己设置的菜单信息,最好放入数据库中保存
package com.pub.vo;

import java.util.List;

public class WechatMenuVo {

	private String type;

	private String name;

	private String key;

	private String url;

	private String media_id;

	private List<WechatMenuVo> sub_button;
	
	private Long parent;
	
	private Long id;
	
	public String getType() {
		return type;
	}

	public void setType(String type) {
		this.type = type;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getKey() {
		return key;
	}

	public void setKey(String key) {
		this.key = key;
	}

	public String getUrl() {
		return url;
	}

	public void setUrl(String url) {
		this.url = url;
	}

	public String getMedia_id() {
		return media_id;
	}

	public void setMedia_id(String media_id) {
		this.media_id = media_id;
	}

	public List<WechatMenuVo> getSub_button() {
		return sub_button;
	}

	public void setSub_button(List<WechatMenuVo> sub_button) {
		this.sub_button = sub_button;
	}
	
	public WechatMenuVo(){
		
	}

	public Long getParent() {
		return parent;
	}

	public void setParent(Long parent) {
		this.parent = parent;
	}

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

}
最后利用jackson的ObjectMapper将值转化为JSON字符串,调用httppost方法发送给微信服务器,返回正确时的数据包为
{"errcode":0,"errmsg":"ok"}
2014-03-23 22:44:47 luopotaotao 阅读数 988
  • 微信公众平台应用开发(开发模式

    微信公众平台开发教程,该课程内容包括本地调试:业务逻辑测试、消息接收与响应、测试流程;符号表情,微信开发模式,消息加解密等。 讲师:刘运强,网名柳峰,计算机硕士研究生,畅销书《微信公众平台应用开发:方法、技巧与案例》作者。 本课程主要面向有一定Java基础、对微信公众平台开发感兴趣的人员,能够帮助他们入门微信公众平台开发,少走弯路。

    8595 人正在学习 去看看 CSDN讲师

用人家的东西当然要在人家那里注册了,传送门https://mp.weixin.qq.com。

注册后登陆,左侧点击高级功能,然后页面中间选择开发者模式。

哦忘了,注册后要填写基本信息然后审核后才会有高级功能-->开发者模式。


进入开发者模式

修改Url和token

这时候你需要有一个Web站点,其中有一个Servlet,其中有一个doGet方法,doGet方法中获取微信服务器发来的信息,

将信息进行处理后,返回一个验证成功的信息,然后就成功接入,你就成为开发者了。那个token就是你自己定义的一个令牌,验证用的。

于是我们就有两个问题要处理:1,Web站点的搭建;2,doGet方法中的验证与返回


1.Web搭建

用MyEclipse建一个WebProject,新建一个Servlet,doGet,doPost都要用到的。

首先用到的时doGet,主要是一个验证函数。

import java.io.BufferedReader;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.ant.xml.XmlParser;

public class Hello extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		String timestamp = request.getParameter("timestamp");
		String token = "684946";
		String nonce = request.getParameter("nonce");
		String signature = request.getParameter("signature");
		
		System.out.println("signature:"+signature);
		System.out.println("timestamp:"+timestamp);
		System.out.println("nonce:"+nonce);
		
		String echostr = request.getParameter("echostr");
		if(Validate.validate(signature, token, timestamp, nonce))
			response.getWriter().print(echostr);
	}
}

验证函数如下:

	public static boolean validate(String signature,String token,String timestamp,String nonce)
	{
		try {
			String[] array = {token,timestamp,nonce};
			Arrays.sort(array);
			String str = array[0]+array[1]+array[2];
			
			MessageDigest dgt = MessageDigest.getInstance("SHA1");
			byte[] encodeResult = dgt.digest(str.getBytes());
			return encodeResult.equals(signature.getBytes());
		} catch (NoSuchAlgorithmException e) {
			return false;
		}
		
	}

程序做好了,现在就是把它架设起来:

我想处于测试学习阶段的朋友比较多吧,所以没必要先开一个服务器了,当然SAE或者BAE好像也不是很贵,但是调试起来还是不方便,

因此我们使用花生壳将站点架设在本机上,便于调试。至于具体操作,传送门http://blog.163.com/ppy2790@126/blog/static/10324224120134109111231/

架设好之后,激动人心的时刻就要来了……


填好你架设好的域名地址和你的token,点击提交,没有问题的话,你应该看到成为开发者的页面了。

到此为止,已经联通了微信服务器,接下来就是信息的接收与发送了…………


新手上路,请多关照!


2016-06-12 11:24:10 w410589502 阅读数 1893
  • 微信公众平台应用开发(开发模式

    微信公众平台开发教程,该课程内容包括本地调试:业务逻辑测试、消息接收与响应、测试流程;符号表情,微信开发模式,消息加解密等。 讲师:刘运强,网名柳峰,计算机硕士研究生,畅销书《微信公众平台应用开发:方法、技巧与案例》作者。 本课程主要面向有一定Java基础、对微信公众平台开发感兴趣的人员,能够帮助他们入门微信公众平台开发,少走弯路。

    8595 人正在学习 去看看 CSDN讲师

在我们启用开发者模式之后,我们就可以进行接口的配置了

1、接口配置信息

  登录微信公众平台官网后,在公众平台后台管理页面 - 开发者中心页,点击“修改配置”按钮,填写服务器地址(URL)、Token和EncodingAESKey,其中URL是开发者用来接收微信消息和事件的接口URL。Token可由开发者可以任意填写,用作生成签名(该Token会和接口URL中包含的Token进行比对,从而验证安全性)。EncodingAESKey由开发者手动填写或随机生成,将用作消息体加解密密钥。


  我们需要填入URL和Token,EncodingAESKey点击即可自动生成。URL指的是能够接收处理微信服务器发送的GET/POST请求的地址,并且是已经存在的,现在就能够在浏览器访问到的地址,这就要求我们先把公众帐号后台处理程序开发好(至少应该完成了对GET请求的处理)并部署在公网服务器上。

  也就是说要完成接口配置,只需要先完成微信服务器的GET请求处理就可以?是的。 那这是为什么呢?因为这是微信公众平台接口中定义的。具体请参考API文档-消息接口-消息接口指南中的网址接入部分。

  同时,开发者可选择消息加解密方式:明文模式、兼容模式和安全模式。模式的选择与服务器配置在提交后都会立即生效,请开发者谨慎填写及选择。加解密方式的默认状态为明文模式,选择兼容模式和安全模式需要提前配置好相关加解密代码,详情请参考消息体签名及加解密部分的文档。


2、验证服务器有效性


3、创建公众帐号后台接口程序

创建一个Java Web工程,并新建一个能够处理请求的Servlet,代码如下:

package org.liufeng.course.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.liufeng.course.service.CoreService;
import org.liufeng.course.util.SignUtil;

/**
 * 核心请求处理类
 * 
 * @author liufeng
 * @date 2013-05-18
 */
public class CoreServlet extends HttpServlet {
	private static final long serialVersionUID = 4440739483644821986L;

	/**
	 * 确认请求来自微信服务器
	 */
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 微信加密签名
		String signature = request.getParameter("signature");
		// 时间戳
		String timestamp = request.getParameter("timestamp");
		// 随机数
		String nonce = request.getParameter("nonce");
		// 随机字符串
		String echostr = request.getParameter("echostr");

		PrintWriter out = response.getWriter();
		// 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败
		if (SignUtil.checkSignature(signature, timestamp, nonce)) {
			out.print(echostr);
			System.out.println("微信服务验证成功!");
		}
		out.close();
		out = null;
	}

	/**
	 * 处理微信服务器发来的消息
	 */
	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 将请求、响应的编码均设置为UTF-8(防止中文乱码)
		request.setCharacterEncoding("UTF-8");
		response.setCharacterEncoding("UTF-8");

		// 调用核心业务类接收消息、处理消息
		String respMessage = CoreService.processRequest(request);
		
		// 响应消息
		PrintWriter out = response.getWriter();
		out.print(respMessage);
		
		out.close();
	}

}
在doGet方法中调用了checkSignature方法,SignUtil.java的实现如下:

package org.liufeng.course.util;

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

/**
 * 请求校验工具类
 * 
 * @author liufeng
 * @date 2013-05-18
 */
public class SignUtil {
	// 与接口配置信息中的Token要一致
	private static String token = "weixin";

	/**
	 * 验证签名
	 * 
	 * @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;
	}
}


4、配置web.xml文件

这里唯一需要注意的就是SignUtil类中的成员变量token,这里赋予什么值,在接口配置信息中的Token就要填写什么值,两边保持一致即可,没有其他要求,建议用项目名称、公司名称缩写等,我在这里用的是项目名称weixin。
最后再来看一下web.xml中,CoreServlet是怎么配置的,web.xml中的配置代码如下:

<?xml version="1.0" encoding="UTF-8"?>  
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">  
    <servlet>  
        <servlet-name>coreServlet</servlet-name>  
        <servlet-class>  
            org.liufeng.course.servlet.CoreServlet  
        </servlet-class>  
    </servlet>  
  
    <!-- url-pattern中配置的/coreServlet用于指定该Servlet的访问路径 -->  
    <servlet-mapping>  
        <servlet-name>coreServlet</servlet-name>  
        <url-pattern>/coreServlet</url-pattern>  
    </servlet-mapping>  
  
    <welcome-file-list>  
        <welcome-file>index.jsp</welcome-file>  
    </welcome-file-list>  
</web-app>
已经完成简单的接口配置,之后我们可以将web项目打成war包,发布到百度云,阿里云,新浪云上。我使用的是阿里云服务器。发布到服务器之后,访问coreServlet。


说明配置成功。代码包空指针异常是因为直接在地址栏访问coreServlet,就相当于提交的是GET请求,而我们什么参数都没有传,在验证的时候当然会报空指针异常。

接下来,把coreServlet的访问路径拷贝下来,再回到微信公众平台的接入配置信息界面,将coreServlet的访问路径粘贴到URL中,并将SignUtil类中指定的token值weixin填入到Token中。




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