• 微信公众号开发例子

    2019-07-21 21:33:00
    但是如何开一属于自己的一个微信公众号,其实很简单。这边文章就给一简单的例子。需要准备的环境: 1、域名,用于微信公众号访问我们的服务器,如没有域名,建议使用花生壳进行内网穿透来访问我们的项目(具体...

            微信公众号,我们都很熟悉。但是如何开一个属于自己的一个微信公众号,其实很简单。这边文章就给一个简单的例子。需要准备的环境:

    1、域名,用于微信公众号访问我们的服务器,如没有域名,建议使用花生壳进行内网穿透来访问我们的项目(具体使用方法,不在这里讨论)

    2、需要申请一个微信公众号:https://mp.weixin.qq.com/

    3、需要一个Javaweb项目

          万事俱备后,开始生路。

         第一步,对微信公众号的一些配置:

         登录微信公众平台,找到如图所示

      填写如下的信息,url是我们项目的URL,token是我们自己定义的

    此时,我们点提交会报错,是因为我们还没有校验,当我们点提交之后,会通过get方式发送一些校验的数据到我们的项目。然后我们需要进行校验

    第二步,数据的检验,检验方式是SHA1算法,具体如下代码

    	public void doGet(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException
    	{
    		System.out.println("进入get方法");
    		String str = request.getQueryString();
    		String echostr = check(str);
    		OutputStream out = response.getOutputStream();
    		if(str != null)
    		{
    			try
    			{
    				out.write(echostr.getBytes());
    			}finally{
    				out.close();
    			}			
    		}		
    	}
    private String check(String text)
    	{
    		
    		//解析发过来的参数:
    		//signature=2e334555ebb6e43ec2c975d6ad54f642d7c95252&echostr=9019000808531292887&timestamp=1563681495&nonce=1882518168
    		/*
    		 * 微信公众号会通过get请求发送如上的参数,然后我们验证是否是微信公众号的请求,
    		 * timestamp  nonce  tokone 我们将这三个连起来进行加密,加密前要对他们进行按字母排序,
    		 * 其中tokone是我们自己写的
    		 * 如果密文匹配,我们返回echostr的值,此时微信公众化那边就认为匹配成功
    		 */
    		String[] content =  text.split("&");
    		String signature = content[0].split("=")[1];
    		String echostr = content[1].split("=")[1];
    		String timestamp = content[2].split("=")[1];
    		String nonce = content[3].split("=")[1];
    		String token = "hello2019";//这个自己定义,单要与页面上的一致
    		
    		String[] arr = {token , timestamp , nonce};
    		Arrays.sort(arr);//根据字符的顺序排序
    		//排序后将三个字符串连起来
    		String checkCode = arr[0] + arr[1] + arr[2];//将排序后字符串连接起来		
    		MessageDigest md;
    		try
    		{
    			//进行SHA1加密
    			md = MessageDigest.getInstance("SHA1");
    			md.update(checkCode.getBytes());
    			byte[] code = md.digest();
    			//将加密后的字节数组转成十六 进制字符串
    		    String ss = Hex.encodeHexString(code);
    		    if(ss.endsWith(signature))//判断两个密文是否一致
    		    {
    		    	return echostr;
    		    }
    		} catch (NoSuchAlgorithmException e)
    		{
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		return null;
    	}
    

    校验通过之后,我点提交按钮就会提示校验成功。

    第三步,处理文本信息。当我们检验成功之后,我们在公众号好发一条消息,微信公众号会通post方式以xml格式发送到我的项目,然后我们就对数据进行解析,具体各种字段的含义可以参考微信公众号的开发文档https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1472017492_58YV5

    下面是我自己的处理方法,首先写一个工具类,用来xml与map之间的转换,其中用到dom4j的jar包,代码如下:

    package my;
    
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.io.UnsupportedEncodingException;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Map;
    import java.util.Map.Entry;
    
    import org.dom4j.Document;
    import org.dom4j.DocumentException;
    import org.dom4j.DocumentHelper;
    import org.dom4j.Element;
    import org.dom4j.io.OutputFormat;
    import org.dom4j.io.SAXReader;
    import org.dom4j.io.XMLWriter;
    
    public class TextUtils
    {
    	/**
    	 * 读取字符串
    	 * @param input
    	 * @return
    	 * @throws IOException 
    	 */
    	public static String readAsText(InputStream input , String charSet) throws IOException
    	{
    		ByteArrayOutputStream cache = new ByteArrayOutputStream();
    		byte[] buf = new byte[1024];
    		int count = -1;
    		while(true)
    		{
    			int n = input.read(buf);
    			if(n == 0)
    			{
    				try
    				{
    					Thread.sleep(3000);
    					count++;
    				} catch (InterruptedException e)
    				{
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				}								
    				if(count < 3)
    				{
    					continue;
    				}
    				
    				else
    				{
    					break;
    				}
    		
    				
    			}
    			if(n < 0)
    			{
    				break;
    			}
    			cache.write(buf, 0, n);
    		}
    		return cache.toString(charSet);
    	}
    	/**
    	 * 默认编码格式是UTF-8
    	 * @param input
    	 * @return
    	 * @throws IOException
    	 */
    	public static String readAsText(InputStream input) throws IOException
    	{
    		return readAsText(input , "UTF-8");
    	}
    	/**
    	 * 将xml格式转成map
    	 * @return
    	 * @throws DocumentException 
    	 */
    	public static Map<String , String> xml2Map(InputStream input) throws DocumentException
    	{
    		Map<String , String> map = new HashMap<String , String>();
    		SAXReader xmlReader = new SAXReader();
    		Document x_doc = xmlReader.read(input);
    	    Element x_root = x_doc.getRootElement();
    		List<Element> list = x_root.elements();
    		for(Element e : list)
    		{
    			String name = e.getName();
    			String value = e.getTextTrim();
    			map.put(name, value);
    		}
    		return map;
    	}
    	/**
    	 * 
    	 * @param map
    	 * @return
    	 * @throws IOException 
    	 */
    	public static String map2Xml(Map<String , String> map) throws IOException
    	{
    		//创建一个空的Document
    		Document x_doc = DocumentHelper.createDocument();
    		//添加跟元素
    		Element x_root = x_doc.addElement("xml");
    		Iterator<java.util.Map.Entry<String, String>> entries = map.entrySet().iterator();
    		while(entries.hasNext())
    		{
    			Entry<String, String> entry = entries.next();
    			String key = entry.getKey();
    			Object value = entry.getValue();
    			x_root.addElement(key).addCDATA((String) value);
    		}
    		OutputStream out = new ByteArrayOutputStream();
    		OutputFormat format = OutputFormat.createPrettyPrint();
    		format.setEncoding("UTF-8"); 
    		format.setSuppressDeclaration(true);
    		format.setIndent(true);
    		format.setNewlines(true);
    		XMLWriter xmlWriter = new XMLWriter(out,format);
    		xmlWriter.write(x_doc);
    		xmlWriter.close();		
    		return out.toString();
    		
    	}
    
    }
    

    消息的接收与回复:

    	public void doPost(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException
    	{
    		System.out.println("用户发出信息");
    		InputStream input = request.getInputStream();
    		try
    		{
    			//将用户发过来的信息转成map
    			Map<String , String> map = TextUtils.xml2Map(input);
    			//获取消息内容
    			String content = (String) map.get("Content");
    			//构造返回的信息
    			Map<String , String> reply = new HashMap();
    			reply.put("ToUserName", map.get("FromUserName"));
    			reply.put("FromUserName", map.get("ToUserName"));
    			reply.put("CreateTime", String.valueOf(System.currentTimeMillis()));
    			reply.put("MsgType", "text");
    			reply.put("Content", "欢迎");
    			String str = TextUtils.map2Xml(reply);//将回复的信息转成xml格式的
    			//将信息发出去
    			OutputStream out = response.getOutputStream();
    			out.write(str.getBytes());
    			out.close();
    		} catch (DocumentException e)
    		{
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    
    		
    	}

    此例子只给出了文本信息的处理,其实对其他类型信息的处理也是大同小异,就不在累赘。具体的消息每个字段代表的含义可参考微信公众开发平台的开发文档。最后也提供源码:链接:https://pan.baidu.com/s/1dkRzEJqrn_MyVvz0RL2WAw 
    提取码:ssdv 
    有不足之处,希望多多提出宝贵意见。

    展开全文
  • 微信开发之入门教程

    2016-01-12 10:55:26
    时间葱葱,小宝鸽入职也半年了,刚入的时候刚好负责开发一微信企业号的新项目。从项目的一无所有到第一版上线,再一步步完善升级。期间学到了许多东西。对微信开发也是了一定的认识。在此,小宝鸽再次无私地...

    时间葱葱,小宝鸽入职也有半年了,刚入的时候刚好有负责开发一个微信企业号的新项目。从项目的一无所有到第一版上线,再一步步完善升级。期间学到了许多东西。对微信开发也是有了一定的认识。在此,小宝鸽再次无私地分享给大家啦。

    其实微信开发跟web开发没有多大的区别,只是经过了微信,然后再由浏览器打开。因为经过微信,因此你的web会附加一些微信平台所提供的一些功能,如获取用户地理位置、获取微信用户头像、拍照上传、发送微信消息等等,通过微信接口即可调用。要将web项目挂靠在微信公众平台上是需要一个帐号的。微信公众平号分为服务号、订阅号、企业号。这三种帐号有一些小区别,但是开发流程都是差不多的,只是开放的功能上有些区别,知道其中一种开发,其他的也差不多。关于具体区别先不作过多介绍,后面的文章会讲到。接下来我们以企业号为例带大家进入微信开发之旅。

    接下来将从下面几个角度带大家了解微信开发:

    (1)申请企业号体验号
    (2)企业号的一些配置
    (3)微信JS接口调用

    好了现在马上开始:

    一、申请企业号体验号

    1.1、首先来到微信企业号的网址 https://qy.weixin.qq.com/

    这里写图片描述

    1.2、可以看到“开发者中心”字眼,点击进入相应页面

    这里写图片描述

    1.3、进入后可以看到“欢迎你,开发者”的公告,右侧有个“申请体验号”,点击进入相应页面。

    这里写图片描述

    1.4、进入“申请体验号”后,可以看到注册流程,按照注册流程填写相应资料并申请,验证邮箱绑定微信号后体验号就申请成功啦。

    这里写图片描述

    1.5、申请成功之后,回到https://qy.weixin.qq.com/,用微信扫一扫扫描登录下方的二维码,输入对应密码即可登录成功,来到你的微信企业号首页啦。

    这里写图片描述

    二、企业号的一些配置

    2.1、添加子部门,如下图,将鼠标放到“企业号体验43560625”就会出现小下标,然后点击添加子部门,填写好信息保存,然后刷新页面即可。

    这里写图片描述
    这里写图片描述

    2.2、添加成员,点击通讯录,然后如下图进行操作,即可添加成员。部门选择刚刚添加的部门

    这里写图片描述

    2.3、然成员关注该企业号,如果添加成员的时候有输入邮箱,可以在通讯录的成员管理那里给成员发送关注邀请,邀请会将企业号二维码发送到对应成员邮箱。另外一种方法直接点击“设置”即可看到体验号二维码。让成员扫这个二维码关注也是可以的(需要注意的是,体验号只能最多关注10个成员哦)。另外下图中的CorpID (wx7099477f2de8aded)非常重要的,先记录起来,下面接口微信JS调用的时候会用到。

    这里写图片描述

    2.4、添加管理组,点击“设置”–>”权限管理”,就会跳转到下图页面,然后“新建管理组”,选择管理员的时候,如果提示该成员已在其他管理组,那么估计需要添加成员了。小宝鸽添加了一个管理组“测试”,添加成功后如下图。其中Secret也是非常重要的东西,之后JS接口调用获取签名需要用到。

    这里写图片描述

    2.5、应用管理。猿友们可以看到左侧菜单中有个”应用中心”。点击应用中心将来到下图页面。”企业小助手”就是本企业号默认存在的一个应用。猿友们可以自行创建更多的应用。

    这里写图片描述

    点击”企业小助手”将会来到下面的界面,默认是回调模式,我们需要设置成普通模式。

    这里写图片描述

    点击”普通模式”,启用模式,然后启用”自定义菜单”。

    这里写图片描述

    自定义菜单启用完成之后,点击自定义菜单中的设置,将会跳转到如下页面:

    这里写图片描述

    添加菜单”测试”,然后设置”微信信息”,内容为”测试啦啦啦”,保存–>发布,然后右边有个预览,点击菜单”测试”,就会自动回复消息,如下图:

    这里写图片描述

    菜单响应除了发送微信消息也可以是跳转到某个链接,因为跳转链接是需要配置可信域名的,因此先介绍如何配置可信域名
    应用管理还有一个地方需要设置的,那就可信域名,如下图,回到”企业小助手”应用的详情页面,添加可信域名,可信域名是有一些要求的(1. 设置的应用域名须通过ICP备案的验证,2. 请使用二级或二级以上域名),这里小宝鸽网上找了一个”yo.bbdfun.com”,猿友们也可以使用这个

    这里写图片描述

    配置了可信域名之后呢,猿友们可以配置跳转到链接的菜单啦,注意配置的url必须是已可信域名作为域名哈,例如:

    这里写图片描述

    三、微信JS接口调用

    3.1、微信提供了一系列的JS接口,使得公众号企开发十分快捷高效,微信JS-SDK接口:
    http://qydev.weixin.qq.com/wiki/index.php?title=%E5%BE%AE%E4%BF%A1JS-SDK%E6%8E%A5%E5%8F%A3
    各位猿友们可粗略看一下上面文档,便可知道大概提供的一些功能。

    3.2、各位猿友们粗略看完”微信JS-SDK接口”,应该有看到下图的说明吧,接口的使用是需要注入权限验证配置的,现在我们上面的体验号等等的一系列操作就派上用场啦。

    这里写图片描述

    3.3、接下来将会一点点向大家介绍怎么调用微信接口啦

    微信接口文档之后的猿友们应该都知道微信接口的调用步骤如下:

    这里写图片描述

    最重要的还是步骤二:权限验证配置。里面有几个参数,小宝鸽将会为猿友们一一介绍:
    debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来
    appId: ”, // 必填,企业号的唯一标识,此处填写企业号corpid
    timestamp: , // 必填,生成签名的时间戳
    nonceStr: ”, // 必填,生成签名的随机串
    signature: ”,// 必填,签名,见附录1
    jsApiList: [] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2

    debug、appId和jsApiList相信各位猿友们应该都知道大概是什么东西。那么现在给各位猿友们重点介绍:timestamp、nonceStr、signature。
    其实timestamp、nonceStr是用来生成signature的。
    js生成时间戳方法:timestamp = Date.parse(new Date()); //1414587457
    另外,nonceStr也是一串随机串,我们也用时间戳就好了nonceStr=Date.parse(new Date()); //1414587457

    剩下的就是最关键的signature生成方法,这里需要引入access_token概念
    生成signature签名第一步获得access_token:
    浏览器输入:https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=wx5f24fa0db1819ea2&corpsecret=uQtWzF0bQtl2KRHX0amekjpq8L0aO96LSpSNfctOBLRbuYPO4DUBhMn0_v2jHS-9
    即可得到access_token:YoxXjnJS57r8gk5Nf-Ki_mSvn98fILxv56EE7NFWE3qQNOH3OaW4iDWwLc05g1mdbuNhipK8fgy-q-pA93DqFw(其有效期为7200秒,即两个小时)

    这里写图片描述

    生成signature签名第二步通过access_token获得ticket:
    浏览器输入:https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token=YoxXjnJS57r8gk5Nf-Ki_mSvn98fILxv56EE7NFWE3qQNOH3OaW4iDWwLc05g1mdbuNhipK8fgy-q-pA93DqFw
    即可得到ticket:”sM4AOVdWfPE4DxkXGEs8VLMMSNOZxIv5IhnWCyv5sA4UgJuWuMQdfMCeyC5kSL_c7OIMGeETC2y9PXfLbFIFNw(其有效期也是7200秒,即两个小时)

    这里写图片描述

    生成signature签名第三步通过ticket以及下面参数拼成字符串:
    noncestr=1414587457
    jsapi_ticket(即上面的ticket)=sM4AOVdWfPE4DxkXGEs8VLMMSNOZxIv5IhnWCyv5sA5kumyWTQ2VcKEcphBAW62J_HUgmaiKEQ3qhwj5Vlqq7g
    timestamp=1414587457
    url=http://mp.weixin.qq.com

    通过上面的参数拼成(注意参数顺序必须一样):jsapi_ticket=sM4AOVdWfPE4DxkXGEs8VLMMSNOZxIv5IhnWCyv5sA5kumyW
    TQ2VcKEcphBAW62J_HUgmaiKEQ3qhwj5Vlqq7g
    &noncestr=1414587457&timestamp=1414587457&url=http://mp.weixin.qq.com

    最后利用上面的字符串进行sha1加密,有在线的校验工具http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign。但是真正开发的时候肯定是需要写代码的,下面附上sha1加密的java算法:`

    jdk也有提供这个java.security这个包,里面封装好了sha1加密算法。使用方法可参考博主的另外一篇博客AES加密解密 SHA1、SHA加密 MD5加密

    注意真正获取access_token、ticket的时候是需要通过代码实现的,上面在浏览器输入对应地址获取只是为了理顺流程。下面是通过java代码获取。

    3.4、java代码获取签名

    关于使用java代码获取签名的详细过程请参考博主的另外一篇文章 微信开发之使用java获取签名signature(贴源码,附工程)

    该文章有详细的代码,而且附工程下载。

    获取到了签名之后就可以调用微信js接口了,例子后面的文章将会讲到。

    展开全文
  • 所有微信开发的相关内容,都需要参考官方文档。 [微信公众平台|开发文档] http://mp.weixin.qq.com/wiki/home/。 一、通过网页授权,可以获取用户微信的基本信息。 二、总共5步骤: 1 :用户同意授权,...
    所有微信开发的相关内容,都需要参考官方文档。

    [微信公众平台|开发文档] http://mp.weixin.qq.com/wiki/home/

    一、通过网页授权,可以获取用户微信的基本信息。

    二、总共有5个步骤:

    1 :用户同意授权,获取code

    2 :通过code换取网页授权access_token

    3 :刷新access_token(如果需要)

    4 :拉取用户信息(需scope为 snsapi_userinfo)

    5 附:检验授权凭证(access_token)是否有效

    三、每一个步骤的实现。

    1 :用户同意授权,获取code

    /**
         * @explain
         * 获取code,用于获取openid和access_token
         * @remark
         * code只能使用一次,当获取到之后code失效,再次获取需要重新进入
         * 不会弹出授权页面,适用于关注公众号后自定义菜单跳转等,如果不关注,那么只能获取openid
         **/
        public function getCode()
        {
            if (isset($_GET["code"])) {
                return $_GET["code"];
            } else {
                $str = "location: https://open.weixin.qq.com/connect/oauth2/authorize?appid=" . $this->appid . "&redirect_uri=" . $this->index_url . "&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect";
                header($str);
                exit;
            }
        }

    2 :通过code换取网页授权access_token

    /**
         * @explain
         * 用于获取access_token,返回的<span style="font-family: Arial, Helvetica, sans-serif;">$access_token_array中也包含有用户的openid信息。</span>
    
         **/
        public function getOpenId()
        {
            $access_token_url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" . $this->appid . "&secret=" . $this->appsecret . "&code=" . $this->code . "&grant_type=authorization_code";
            $access_token_json = $this->https_request($access_token_url);
            $access_token_array = json_decode($access_token_json, TRUE);
            return $access_token_array;
        }

    3 :刷新access_token(如果需要)

    这一步直接略过。

    4 :拉取用户信息(需scope为 snsapi_userinfo)

    /**
         * @explain
         * 获取到用户的openid之后可以判断用户是否有数据,可以直接跳过获取access_token,也可以继续获取access_token
         **/
        public function getUserInfo()
        {
            
            $userinfo_url = "https://api.weixin.qq.com/sns/userinfo?access_token=".$this->access_token['access_token'] ."&openid=" . $this->access_token['openid']."&lang=zh_CN";
            $userinfo_json = $this->https_request($userinfo_url);
            $userinfo_array = json_decode($userinfo_json, TRUE);
            return $userinfo_array;
        }
    至此四个步骤全部完成。


    四、完整代码。实际项目使用TP3.2.3。

    <?php
    
    namespace Wechat\Controller;
    
    use Think\Controller;
    
    //微信接口基础类,其他微信类都继承这个基础类。可以自动判断用户状态,获取用户信息。
    class WxbaseController extends Controller
    {
    
        public $appid = 'wxba09d9f0fed4b84b';                   //微信APPID,公众平台获取
        public $appsecret = '332c2b1fc1eb282c0136b73723db4237'; //微信APPSECREC,公众平台获取
        public $index_url = "http://www.你的域名.cn/项目目录/index.php?m=分组&c=控制器&a=方法";  //微信回调地址,要跟公众平台的配置域名相同
        public $code;
        public $openid;
    
        /**
         *检测有无$_SESSION。<span style="font-family: Arial, Helvetica, sans-serif;">如果有,直接忽略。</span>
         *如果没有$<span style="font-family:Arial, Helvetica, sans-serif;">_SESSION</span>,就依次执行getCode、getOpenId、getUserInfo来获取用户信息。目的是解决CODE只能获取一次,刷新页面openid会丢失的问题。
         *再判断是否在数据库中,没有则写入数据库。最后将open_id写入session。
    <span style="white-space:pre">	</span>*/
        public function _initialize()
        {
                if (!$_SESSION['openid']) {                             //如果$_SESSION中没有openid,说明用户刚刚登陆,就执行getCode、getOpenId、getUserInfo获取他的信息
                    $this->code = $this->getCode();
                    $this->access_token = $this->getOpenId();
                    $userInfo = $this->getUserInfo();
                    if ($userInfo) {
                        $ins = M('Wechat_user_info');<span style="white-space:pre">		</span>    //其他框架请自行调整方法。
                        $map['openid'] = $userInfo['openid'];
                        $result = $ins->where($map)->find();            //根据OPENID查找数据库中是否有这个用户,如果没有就写数据库。继承该类的其他类,用户都写入了数据库中。
                        if (!$result) {
                            $ins->add($userInfo);
                        }
                        session('openid', $userInfo['openid']);         //写到$_SESSION中。微信缓存很坑爹,调试时请及时清除缓存再试。
                    }
                }
    
        }
    
        /**
         * @explain
         * 获取code,用于获取openid和access_token
         * @remark
         * code只能使用一次,当获取到之后code失效,再次获取需要重新进入
         * 不会弹出授权页面,适用于关注公众号后自定义菜单跳转等,如果不关注,那么只能获取openid
         **/
        public function getCode()
        {
            if (isset($_GET["code"])) {
                return $_GET["code"];
            } else {
                $str = "location: https://open.weixin.qq.com/connect/oauth2/authorize?appid=" . $this->appid . "&redirect_uri=" . $this->index_url . "&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect";
                header($str);
                exit;
            }
        }
    
        /**
         * @explain
         * 用于获取用户openid
         **/
        public function getOpenId()
        {
            $access_token_url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" . $this->appid . "&secret=" . $this->appsecret . "&code=" . $this->code . "&grant_type=authorization_code";
            $access_token_json = $this->https_request($access_token_url);
            $access_token_array = json_decode($access_token_json, TRUE);
            return $access_token_array;
        }
    
        /**
         * @explain
         * 通过code获取用户openid以及用户的微信号信息
         * @return
         * @remark
         * 获取到用户的openid之后可以判断用户是否有数据,可以直接跳过获取access_token,也可以继续获取access_token
         * access_token每日获取次数是有限制的,access_token有时间限制,可以存储到数据库7200s. 7200s后access_token失效
         **/
        public function getUserInfo()
        {
    
            $userinfo_url = "https://api.weixin.qq.com/sns/userinfo?access_token=".$this->access_token['access_token'] ."&openid=" . $this->access_token['openid']."&lang=zh_CN";
            $userinfo_json = $this->https_request($userinfo_url);
            $userinfo_array = json_decode($userinfo_json, TRUE);
            return $userinfo_array;
        }
    
    
        /**
         * @explain
         * 发送http请求,并返回数据
         **/
        public function https_request($url, $data = null)
        {
            $curl = curl_init();
            curl_setopt($curl, CURLOPT_URL, $url);
            curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
            curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
            if (!empty($data)) {
                curl_setopt($curl, CURLOPT_POST, 1);
                curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
            }
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
            $output = curl_exec($curl);
            curl_close($curl);
            return $output;
        }
    }



    展开全文
  • 本课程是一系列入门教程,目标是从 0 开始带领读者上手实战,课程以微信小程序的核心概念作为主线,介绍配置文件、页面样式文件、JavaScript 的基本知识并以指南针为例对基本知识进行扩展,另外加上开发工具的安装...

    课程介绍

    本课程是一个系列入门教程,目标是从 0 开始带领读者上手实战,课程以微信小程序的核心概念作为主线,介绍配置文件、页面样式文件、JavaScript 的基本知识并以指南针为例对基本知识进行扩展,另外加上开发工具的安装、小程序发布等内容,共 9 篇文章。

    本课程共包含四个部分。

    第一部分(第1-3篇)带你初步了解小程序是什么,然后进行小程序开发的准备工作,从注册账号到安装开发工具一应俱全。工欲善其事,必先利其器。

    第二部分(第4-6篇)。面向入门级读者介绍小程序构成的各个部分。您不需要事前准备任何知识,需要掌握的会进行说明,需要扩展的会提供信息的出处。千里之行始于足下。

    第三部分(第7-8篇)通过指南针的例子,介绍一个小程序的实现过程。通过这个实例,综合运用所学知识,使小程序开发能力进一步提高。麻雀虽小,五脏俱全。

    第四部分(第9篇)只包含一篇文章,具体介绍小程序发布的过程。使读者能够对小程序开发的全过程有一个完整的了解。编筐编篓,全在收口。

    哪怕您事先没有任何微信小程序相关技术的经验,认真学完该达人课之后,您会掌握基本的小程序开发方法,并具备自主扩展知识面,以及进行更高层次开发的能力。

    点击查看课程全部内容

    作者介绍

    薛卫国,现就职于某外企担任架构小组责任人,CSDN 博客专家,长期从事 C++ 开发,精通 UML、设计模式,创办有公众号《面向对象思考》。毕业于东北大学,曾留校在国家重点实验室工作。

    课程内容

    第01课:初识微信小程序

    要火的节奏

    最近有一则来自北京商报的新闻引起了不少人的注意,我们这里选取一部分:

    争夺流量 手机厂商“抱团”对抗微信小程序

    3月20日,小米、中兴、华为等10家手机厂商联合对外宣布,推出基于手机硬件平台的新型应用生态“快应用”及相关标准。在微信小程序用户规模日益壮大、硬件利润微薄的背景下,本次快应用的推出被看做是手机厂商与腾讯争夺流量与利益的举动。业内人士认为,对于整个市场来说,流量竞争有促进作用,但微信已经具有较强的用户黏性,十大手机厂商要想争夺用户流量并非易事。

    估计这些厂家的标准出台还需要一段时间,但是有一点可以确定的是:小程序类的开发要火。

    但如果你打开轻应用的文档可以发现两点:

    1.应用文档的信息量还很有限。2.轻应用的架构,采用的技术和微信小程序很相似。

    处于这个目的,作者赶在这个时机制作了本课程,希望可以为潮流加一份力;作为程序员,希望各位可以通过本课程的学习,在有限的时间内为自己添一份技能!

    参考资料:轻应用开发文档

    什么是小程序?

    最近一个小游戏“跳一跳”火得不得了,相信即使您自己没有玩过,身边的亲戚朋友也一定玩过。画面大致如下:

    当然了,关于玩法等等不是本文的内容,可以参照百度百科

    这就是微信小程序的成功案例了。

    微信小程序简介

    微信小程序简称小程序,张小龙在微信公开课 Pro 上发布的小程序正式上线,时间是2017年1月9日。关于小程序,张小龙在他的公开课中有过很详细的说明,大家尽可以到网上去搜,这里不再赘述,只说作者自己的理解。

    微信小程序这个词可以分解为“微信”和“小程序”两部分。

    其中“微信”可以理解为“微信中的”,指的是小程序的执行环境;当然微信在提供执行环境的同时也延长了用户使用微信的时间。

    “小程序”是说它首先是程序,然后具备轻便的特征。小程序并不像其他应用那样,它不需要安装,而是通过扫描二维码等打开后直接执行;用完以后也不需要卸载。这就是所谓用完即走的原则。

    另外,微信不会提供类似于小程序商店的地方,需要小程序提供者自己通过二维码,群分享的手段来传播,这就是所谓去中心化的形态。

    微信朋友圈提供了好友之间沟通信息的手段,订阅号提供了面向粉丝推送信息的手段,而小程序则是提供了用户通过自己的操作而与服务实现互动的手段。

    小程序相关技术介绍

    本课程的目标读者群是了解基本的 C/C++ 语法但对小程序开发完全没有经验的程序员,因此在说明微信小程序的同时,对相关技术也将进行相应的介绍。通过这种方式,可使读者能够非常顺利地学习,而无需到处寻找资料导致忘了学习微信小程序这个本来的目的。

    微信小程序推出一年多一点的时间,算是一个新事物,但是利用的技术却都是已经存在的技术。如果你稍加调查就会发现,不光是微信小程序,很多类似形态的应用都采用类似的架构:

    1. 使用 JSON 技术来表现应用的配置信息。包含应用的基本信息,页面配置和路由,应用全体的信息等。
    2. 使用经过定制 CSS+XML 技术来实现视图层的描述。画面元素,例如列表、按钮、文本框、选择框等都通过 XML 语言来描述,遵从 XML 语法,对于页面的共同风格,使用 CSS 进行定义。
    3. 使用 JavaScript 语言来实现逻辑层结构。包括用户操作的处理,系统 API 的调用等。
    4. 架构在视图层和逻辑层之间提供数据和事件传输功能,从而尽量减少难度。由于类似应有都属于轻应用,所以提供的功能都比较单一。

    具体的语法,用途等将会在使用的时候详细介绍,这里只提一下相关技术的基本情况,了解即可。

    换一种说法就是:并不需要另外自己调查,跟着本课程走下去就好。

    JSON

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。它基于 ECMAScript(W3C 制定的 JavaScript 规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

    XML

    XML(Extensible Markup Language),中文名为可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。

    在电子计算机中,标记指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种的信息,比如文章等。它可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。它非常适合万维网传输,提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。是 Internet 环境中跨平台的、依赖于内容的技术,也是当今处理分布式结构信息的有效工具。早在1998年,W3C 就发布了 XML1.0 规范,使用它来简化 Internet 的文档信息传输。

    CSS

    层叠样式表(英文全称:Cascading Style Sheets)是一种用来表现 HTML 或 XML 等文件样式的计算机语言。CSS 不仅可以静态地修饰网页,还可以配合各种脚本语言动态地对网页各元素进行格式化。

    CSS 能够对网页中元素位置的排版进行像素级精确控制,支持几乎所有的字体字号样式,拥有对网页对象和模型样式编辑的能力。

    JavaScript

    JavaScript 一种直译式脚本语言,是一种动态类型、弱类型、基于原型的语言,内置支持类型。它的解释器被称为 JavaScript 引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在 HTML 网页上使用,用来给 HTML 网页增加动态功能。

    在1995年时,由 Netscape 公司的 Brendan Eich,在网景导航者浏览器上首次设计实现而成。因为 Netscape 与 Sun 合作,Netscape 管理层希望它外观看起来像 Java,因此取名为 JavaScript。但实际上它的语法风格与 Self 及 Scheme 较为接近。

    为了取得技术优势,微软推出了 JScript,CEnvi 推出 ScriptEase,与 JavaScript 同样可在浏览器上运行。为了统一规格,再加上 JavaScript 兼容于 ECMA 标准,因此也称为 ECMAScript。

    学习方法

    微信小程序虽然是新事物,但学习方法却不是新方法。

    我们的套路是:首先生产一个最简单的小程序实例,通过这个实例介绍微信小程序的构造和想法,这算是学习这个活动中“学”的部分。然后扩展这些知识点,通过开发一个简单的小程序的过程来运用这些知识点,这算是“习”的过程。

    这是作者这些年来屡试不爽的方法。

    参考资料

    在学习和开发的过程中,我们主要会参考微信的开发文档。其原因是小程序太新了,相应的知识储备还不够丰富。虽然也可以找到一些开发方面的书籍,但是说实话,内容并不比微信本身的开发文档更详尽。

    第02课:开发环境的准备

    创建自己的小程序账号

    在开发自己的微信小程序之前,首先需要注册小程序账号,接下来我们一步一步做详细说明。

    打开浏览器,输入:mp.weixin.qq.com。

    因为是第一次使用,所以选择画面右上角的“立即注册”。

    选择左下角的“小程序”方框。

    输入邮箱、密码、确认密码、验证码,之后选择同意协议和条款。当然这里的密码不是邮箱的密码,而是正在申请的小程序账号的密码。

    最后按下“注册”按钮。

    点击“登录邮箱”按钮。打开相应的软件后,应该可以收到下面的邮件。如果没收到的话,建议看一下垃圾邮件,没准儿那里有。

    单击下半部一大片绿色的部分,就可以回到注册界面继续剩下的工作。

    选择主题类型为“个人”,然后输入管理员的姓名,身份证号码。

    输入手机号码并单击“获取验证码”,将手机接收到的验证码输入到短信验证码栏中。

    完成上述步骤,画面下部会出现一个二维码,需要用已经绑定银行卡的微信的扫一扫功能扫描该二维码进行实名认证。

    如果认证成功,画面会变成下面这个样子。

    点击“继续”按钮。

    意思就是现在后悔还来得及,如果不后悔今后就没法后悔了。我们按下“确定”按钮。

    大功告成!

    小程序管理平台

    账号申请成功之后,就可以登录“微信公众平台 | 小程序”了。在目前这个时间点虽然并不需要马上做什么。本文接下来将对其中重要的菜单功能做简单介绍。

    首页

    内容比较简单,主要是表示小程序的实时访问次数和系统公告。

    开发管理

    用户在使用小程序的时候,需要扫描二维码进入。而这个二维码需要开发者将小程序上传到腾讯服务器之后从腾讯取得。上传过程便在该页面上完成。

    过程也不复杂,一共分为三步:上传代码,提交审核和发布小程序。

    用户身份

    这个画面用来指定小程序项目的管理员和项目成员。其中项目成员又包括开发者和体验者。

    数据分析

    这个画面可以统计小程序的访问数量,对用户来源、性别、年龄分布等进行分析。

    模板消息

    这个画面可以定制微信小程序向客户发送的消息。

    客服消息

    通过这个画面可以指定小程序的客服人员,从而实现小程序的在线客服功能。

    附近的小程序

    当小程序的主体为企业、政府、媒体及其他组织时可以开通此功能。此功能有效时,小程序指定地点以后,用户可以通过微信的“附近的小程序”界面发现该小程序。

    运维中心

    一共有两个页面,分别用于查询小程序的错误日志和对客户端进行监控。

    推广

    用来自定义小程序推广关键字。

    设置

    设置分类中一共有五个页面,这里只介绍前两个。

    基本设置

    顾名思义,这里主要是用来设置小程序的基本信息。内容包括:

    1. 设定小程序名称,小程序头像;
    2. 取得小程序码;
    3. 取得认证;
    4. 设定主题信息;
    5. 其他省略。

    开发设置

    这个页面主要负责和小程序开发相关的设定信息,内容包括:

    1. 取得小程序 ID。每一个发布的小程序都需要唯一的 ID。
    2. 生成小程序秘钥。
    3. 指定服务器域名。小程序可以访问外部网站,可以上传和下载文件。但是对象服务器不是任意的,需要在这里指定。
    4. 其他省略。

    其他

    在画面的右上角,有两个链接“文档”和“社区”分别可以进入小程序开发文档和社区。在实际的学习过程中可以积极利用。

    安装开发工具

    小程序账号申请成功之后的工作就是准备开发环境。

    早期的版本在首页分类中有开发工具的下载链接,最近不知道为什么变成了访问次数统计画面。但是没有关系,可以直接点击这里,便可打开下面的下载地址页面。

    根据操作系统选择合适的下载链接。

    下载完成后打开安装程序,首先是开始画面。

    按下“下一步”按钮。

    按下“我接受”按钮。

    指定适当的安装目录后按下“安装”按钮。

    安装中……

    完成!

    接下来就可以开始微信小程序的开发之旅啦!

    第03课:微信开发者工具介绍

    第04课:小程序构成介绍——配置文件的形式和内容

    第05课:小程序构成介绍——WXML 和 WXSS

    第06课:小程序构成介绍——事件处理和数据绑定

    第07课:小程序开发实例——指南针(上)

    第08课:小程序开发实例——指南针(下)

    第09课:发布小程序

    点击查看课程全部内容

    展开全文
  • 微信开发之难点解析

    2015-12-13 21:57:03
    微信开发就是调用接口。这难点就是调用接口时需要验证,必须按照微信要求的验证规则验证成功后才能调用接口。那么以我开发的微信小项目总结一下微信开发的难点。 1.微信开发属于web开发,要选合适的语言 尽管web...

    微信开发就是调用接口。这个难点就是调用接口时需要验证,必须按照微信要求的验证规则验证成功后才能调用接口。那么以我开发的微信小项目总结一下微信开发的难点。

    1.微信开发属于web开发,要选合适的语言

    尽管web开发有众多的语言,但是我觉得有必要提醒尽量选择主流、合适的语言。通过微信给的例子支持的语言就可以看出个一二三。PHP,jsp我觉得貌似比较主流,其他的语言也能做,可能没那么有优势吧。

    2.微信接口调用验证

    这个我觉得稍微有点难或者说繁,因为接口调用很好办,直接调用。而验证往往需要验证你的身份、权限各种(其实这也是微信为了安全起见、掌握控制权的体现)。解决这个问题我觉得直接阅读开发者文档最有效,文档里面也说的很明确。

    3.调试技巧

    如果你没有web程序的开发经验,你可能会忽视调试的作用。我曾经也想当然地回避调试,就各种看、想,硬把程序调对,后来发现web程序的调试很有技巧,如果掌握了会极大地加快开发速度。就比如我验证jssdk时,一直找不出错误。后来我运行网页,右键点击审查元素,就可以检查自己运行时的代码,进而找到了为什么验证不成功。

    微信开发其实并不难,开发者文档我觉得是最好的参考资料,同时注意网络程序的安全性,以及相关网络程序开发的技巧就可以了。

    展开全文
  • 开发微信使用的 微信支付的接口, 在公众帐号上跳转到的 html页面上,使用js进行支付,里面 java php asp c# 的例子
  • 微信小程序开发文档及文档上传示例 一、什么是微信小程序 小程序是一种无需下载安装,即可使用的手机应用。只需要扫描二维码,或是搜一搜,就能立即使用。 与APP不同的是,小程序无需下载安装、无需卸载、用完即走,...
  • 微信H5开发(三)

    2018-06-03 14:36:36
    微信H5开发在使用微信SDK,会碰到很多问题,特别是由于微信文档的介绍不够细致或者某些功能被限制但在文档上没有提及。我这篇文不提微信上的这些小小的坑,只讲H5和iOS 、安卓 的一些兼容问题。 微信H5 单页面项目...
  • 操作微信界面、拍照、上传下载语音和图片、坐标获取、使用地图、微信支付 等都要用到JS-SDK,但是好多人不知道怎么用,其实不会用的都是没有仔细看开发文档,文档里写的还是比较详细的 文档地址:...
  • 微信获取用户信息接入例子 java实现微信公众平台开发文档以下例子主要用到静默方式获取用户信息,即无需用户授权直接获取用户信息的方式前台代码后台代码 微信公众平台开发文档 主要用到&quot;微信网页授权&...
  • 在JavaScript中有三种声明变量的方式:var、let、const。 var:声明全局变量,换句话理解就是,声明在for循环中的变量,跳出for循环同样可以使用。 for(var i=0;i&lt;=1000;i++){ var sum=0; sum+=i; } ...
  • 文档将带你一步步创建完成一个微信小程序,并可以在手机上体验该小程序的实际效果。这小程序的首页将会显示欢迎语以及当前用户的微信头像,点击头像,可以在新开的页面查看当前小程序的启动日志  1. 获取...
  • 要成为第三方供应商,先按开发文档步骤操作。服务商注册应用 1,注册成功后,配置开发信息:通用开发参数 这里的CorpID是第三方供应商供应商的企业ID,不同于企业微信的CorpID。 ProviderSecret:还未用到,之后再...
  • 微信开发文件介绍

    2018-05-27 11:51:23
    项目里边生成了不同类型的文件: 1.json 后缀的 JSON 配置文件 2.wxml 后缀的 WXML 模板文件 3.wxss 后缀的 WXSS 样式文件 4.js 后缀的 JS 脚本逻辑文件JSON 配置 我们可以看到在项目的根目录 app....
  • 由于要接入微信公众号,查看了官网上的接入文档,必需是80端口而且微信服务器需要验证token,那我本地开发不可能每次都把源码上传到服务器上吧,而且也不方便,这就需要能内网穿透的工具,能让外网通过外网域名访问...
  • 使用该接口可以获得多带不同场景值的二维码,用户扫描后,公众号可以接收到事件推送。 目前2种类型的二维码,分别是临时二维码和永久二维码,前者过期时间,最大为1800秒,但能够生成较多数量,后者无过期...
  • .net微信开发吐血总结

    2018-04-13 16:33:04
    微信对接总结一、 微信公众平台概念微信公众平台是运营者通过公众号为微信用户提供资讯和服务的平台,而公众平台开发接口则是提供服务的基础,开发者在公众平台网站创建公众号、获取接口权限后,进行开发。...
  • 微信小程序开发者文档教程,从入门到精通 多种实例源代码 超过100完整项目源代码、文档
1 2 3 4 5 ... 20
收藏数 18,372
精华内容 7,348