<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>移动端开发 &#8211; 个人随笔</title>
	<atom:link href="/classify/%E7%A7%BB%E5%8A%A8%E7%AB%AF%E5%BC%80%E5%8F%91/feed" rel="self" type="application/rss+xml" />
	<link>/</link>
	<description></description>
	<lastBuildDate>Tue, 29 Mar 2022 15:26:11 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.6.1</generator>

<image>
	<url>/wp-content/uploads/2022/01/cropped-截屏2022-01-01-18.57.09-32x32.png</url>
	<title>移动端开发 &#8211; 个人随笔</title>
	<link>/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>微信公众号（一）服务号与订阅号、编辑模式和开发模式、接口开发、TOKEN、微信六大接口、阿里云服务器</title>
		<link>/%e7%a7%bb%e5%8a%a8%e7%ab%af%e5%bc%80%e5%8f%91/5626.html</link>
					<comments>/%e7%a7%bb%e5%8a%a8%e7%ab%af%e5%bc%80%e5%8f%91/5626.html#respond</comments>
		
		<dc:creator><![CDATA[Mr.Lee]]></dc:creator>
		<pubDate>Sat, 19 May 2018 15:22:41 +0000</pubDate>
				<category><![CDATA[微信公众号]]></category>
		<category><![CDATA[移动端开发]]></category>
		<category><![CDATA[TOKEN]]></category>
		<category><![CDATA[微信六大接口]]></category>
		<category><![CDATA[接口开发]]></category>
		<category><![CDATA[服务号与订阅号]]></category>
		<category><![CDATA[编辑模式和开发模式]]></category>
		<category><![CDATA[阿里云服务器]]></category>
		<guid isPermaLink="false">/?p=5626</guid>

					<description><![CDATA[移动端开发（微信开发）day1 一、微信公众平台概述 1、历史起源 2011年1月21日，腾讯推出微信（张小龙 [&#8230;]]]></description>
										<content:encoded><![CDATA[<h1>移动端开发（微信开发）day1</h1>
<h1><a id="post-5626-_Toc450923180"></a>一、微信公众平台概述</h1>
<h2><a id="post-5626-_Toc438049747"></a><a id="post-5626-_Toc450923181"></a><a id="post-5626-_Toc445307507"></a>1、历史起源 </h2>
<ul>
<li>
    2011年1月21日，腾讯推出微信（张小龙）
  </li>
<li>
    2011年8月，用户达到1500万 。到2011年底，微信用户已超过5000万
  </li>
<li>
    2012年8月20日，腾讯推出微信公众平台功能，同年11月开放第三方接口
  </li>
<li>
    2013年1月微信突破3亿，海外版wechat用户也达到7000万
  </li>
<li>
    2013年10月24日，腾讯微信的用户数量已经超过了6亿，每日活跃用户1亿
  </li>
</ul>
<h2><a id="post-5626-_Toc438049748"></a><a id="post-5626-_Toc445307508"></a><a id="post-5626-_Toc450923182"></a>2、微信公众平台 </h2>
<ul>
<li>
    微信公众平台：给个人、企业和组织提供业务服务与用户管理能力的服务平台，如：
  </li>
</ul>
<p>
  查看关注用户，回复用户消息，推送文章消息给用户等
</p>
<ul>
<li>
    平台地址：<a href="https://mp.weixin.qq.com/">https://mp.weixin.qq.com/</a>
  </li>
</ul>
<h2><a id="post-5626-_Toc450923183"></a><a id="post-5626-_Toc438049749"></a><a id="post-5626-_Toc445307509"></a>3、微信与微信公众平台区别（★） </h2>
<ul>
<li>
    微信：是一款跨平台的通讯工具。支持单人、多人参与。通过手机网络发送语音、
  </li>
</ul>
<p>
  图片、视频和文字。
</p>
<ul>
<li>
    微信公众平台：管理公众号的系统/平台，可以查看关注用户，推送消息给用户
  </li>
</ul>
<h2><a id="post-5626-_Toc438049751"></a><a id="post-5626-_Toc450923185"></a><a id="post-5626-_Toc445307511"></a>4、微信公众号</h2>
<p><img fetchpriority="high" decoding="async" width="610" height="322" src="/wp-content/uploads/2018/05/word-image-5101.png" class="wp-image-5627" srcset="/wp-content/uploads/2018/05/word-image-5101.png 610w, /wp-content/uploads/2018/05/word-image-5101-300x158.png 300w" sizes="(max-width: 610px) 100vw, 610px" /></p>
<h1><a id="post-5626-_Toc438049752"></a><a id="post-5626-_Toc445307512"></a><a id="post-5626-_Toc450923186"></a>二、概念</h1>
<h2><a id="post-5626-_Toc438049754"></a><a id="post-5626-_Toc450923188"></a><a id="post-5626-_Toc445307514"></a>1、微信公众号：订阅号与服务号的区别 </h2>
<ul>
<li><strong>订阅号：</strong>针对的是个人和媒体，每天只能发送一条信息，默认有自定义菜单（不可
  </li>
</ul>
<p>
  以自定义跳转地址），不支持微信认证（注：目前订阅号不支持升级服务号）
</p>
<ul>
<li><strong>服务号：</strong>针对的是企业或组织，每月只能发送4条信息，默认有自定义的菜单，认
  </li>
</ul>
<p>
  证（300/年），认证完成可以使用高级接口（如：微信支付，用户管理等）
</p>
<p><img decoding="async" width="388" height="80" src="/wp-content/uploads/2018/05/word-image-5102.png" class="wp-image-5628" srcset="/wp-content/uploads/2018/05/word-image-5102.png 388w, /wp-content/uploads/2018/05/word-image-5102-300x62.png 300w" sizes="(max-width: 388px) 100vw, 388px" /><br />
<img decoding="async" width="1032" height="489" src="/wp-content/uploads/2018/05/word-image-5103.png" class="wp-image-5629" srcset="/wp-content/uploads/2018/05/word-image-5103.png 1032w, /wp-content/uploads/2018/05/word-image-5103-300x142.png 300w, /wp-content/uploads/2018/05/word-image-5103-768x364.png 768w, /wp-content/uploads/2018/05/word-image-5103-1024x485.png 1024w" sizes="(max-width: 1032px) 100vw, 1032px" /><br />
<img loading="lazy" decoding="async" width="634" height="455" src="/wp-content/uploads/2018/05/word-image-5104.png" class="wp-image-5630" srcset="/wp-content/uploads/2018/05/word-image-5104.png 634w, /wp-content/uploads/2018/05/word-image-5104-300x215.png 300w" sizes="(max-width: 634px) 100vw, 634px" /></p>
<h2><a id="post-5626-_Toc450923189"></a>微信平台的两种运营模式（★）</h2>
<ul>
<li>
    说明：在微信公众平台注册成功后可以获得一个微信公众号（订阅/服务
  </li>
</ul>
<p>
  等），该公众号可以分享给用户关注，并且后期登录公众平台可以进去管
</p>
<p>
  理（如：查看关注用户，回复关注用户消息，推送消息给关注用户等）
</p>
<ul>
<li>
    编辑模式运营：通过之前注册的公众平台管理公众号
  </li>
<li>
    开发模式运营：不用原来注册的平台管理公众号，而是自己独立开发
  </li>
</ul>
<p>
  脚下留心：开发者模式和编辑模式相互排斥
</p>
<h2><a id="post-5626-_Toc450923190"></a>编辑模式适用场景</h2>
<ul>
<li>
    不具备开发能力的运营者
  </li>
<li>
    主要是进行品牌宣传、新闻媒体、自助客服的公众帐号
  </li>
<li>
    运营初期，不需要特别多的功能
  </li>
<li>
    开发模式系统升级、故障等特殊情况
  </li>
</ul>
<h1>三、公众平台注册</h1>
<h2>1、打开官网</h2>
<p>
  官网：<a href="https://mp.weixin.qq.com/">https://mp.weixin.qq.com/</a>
</p>
<p><img loading="lazy" decoding="async" width="1200" height="509" src="/wp-content/uploads/2018/05/word-image-5105.png" class="wp-image-5631" srcset="/wp-content/uploads/2018/05/word-image-5105.png 1200w, /wp-content/uploads/2018/05/word-image-5105-300x127.png 300w, /wp-content/uploads/2018/05/word-image-5105-768x326.png 768w, /wp-content/uploads/2018/05/word-image-5105-1024x434.png 1024w" sizes="(max-width: 1200px) 100vw, 1200px" /></p>
<h2>2、填写基本资料</h2>
<p><img loading="lazy" decoding="async" width="824" height="722" src="/wp-content/uploads/2018/05/word-image-5106.png" class="wp-image-5632" srcset="/wp-content/uploads/2018/05/word-image-5106.png 824w, /wp-content/uploads/2018/05/word-image-5106-300x263.png 300w, /wp-content/uploads/2018/05/word-image-5106-768x673.png 768w" sizes="(max-width: 824px) 100vw, 824px" /></p>
<h2>3、验证邮箱，选择账号类型</h2>
<p><img loading="lazy" decoding="async" width="1217" height="611" src="/wp-content/uploads/2018/05/word-image-5107.png" class="wp-image-5633" srcset="/wp-content/uploads/2018/05/word-image-5107.png 1217w, /wp-content/uploads/2018/05/word-image-5107-300x151.png 300w, /wp-content/uploads/2018/05/word-image-5107-768x386.png 768w, /wp-content/uploads/2018/05/word-image-5107-1024x514.png 1024w" sizes="(max-width: 1217px) 100vw, 1217px" /><br />
<img loading="lazy" decoding="async" width="633" height="293" src="/wp-content/uploads/2018/05/word-image-5108.png" class="wp-image-5634" srcset="/wp-content/uploads/2018/05/word-image-5108.png 633w, /wp-content/uploads/2018/05/word-image-5108-300x139.png 300w" sizes="(max-width: 633px) 100vw, 633px" /></p>
<p><img loading="lazy" decoding="async" width="1163" height="716" src="/wp-content/uploads/2018/05/word-image-5109.png" class="wp-image-5635" srcset="/wp-content/uploads/2018/05/word-image-5109.png 1163w, /wp-content/uploads/2018/05/word-image-5109-300x185.png 300w, /wp-content/uploads/2018/05/word-image-5109-768x473.png 768w, /wp-content/uploads/2018/05/word-image-5109-1024x630.png 1024w" sizes="(max-width: 1163px) 100vw, 1163px" /><br />
<img loading="lazy" decoding="async" width="950" height="501" src="/wp-content/uploads/2018/05/word-image-5110.png" class="wp-image-5636" srcset="/wp-content/uploads/2018/05/word-image-5110.png 950w, /wp-content/uploads/2018/05/word-image-5110-300x158.png 300w, /wp-content/uploads/2018/05/word-image-5110-768x405.png 768w" sizes="(max-width: 950px) 100vw, 950px" /></p>
<h2>4、选择【订阅号】后，信息录入</h2>
<p>
  填写身份证姓名和身份证卡号
</p>
<p><img loading="lazy" decoding="async" width="993" height="530" src="/wp-content/uploads/2018/05/word-image-5111.png" class="wp-image-5637" srcset="/wp-content/uploads/2018/05/word-image-5111.png 993w, /wp-content/uploads/2018/05/word-image-5111-300x160.png 300w, /wp-content/uploads/2018/05/word-image-5111-768x410.png 768w" sizes="(max-width: 993px) 100vw, 993px" /><br />
<img loading="lazy" decoding="async" width="839" height="406" src="/wp-content/uploads/2018/05/word-image-5112.png" class="wp-image-5638" srcset="/wp-content/uploads/2018/05/word-image-5112.png 839w, /wp-content/uploads/2018/05/word-image-5112-300x145.png 300w, /wp-content/uploads/2018/05/word-image-5112-768x372.png 768w" sizes="(max-width: 839px) 100vw, 839px" /></p>
<h2>5、公众号信息</h2>
<p><img loading="lazy" decoding="async" width="1071" height="559" src="/wp-content/uploads/2018/05/word-image-5113.png" class="wp-image-5639" srcset="/wp-content/uploads/2018/05/word-image-5113.png 1071w, /wp-content/uploads/2018/05/word-image-5113-300x157.png 300w, /wp-content/uploads/2018/05/word-image-5113-768x401.png 768w, /wp-content/uploads/2018/05/word-image-5113-1024x534.png 1024w" sizes="(max-width: 1071px) 100vw, 1071px" /><br />
<img loading="lazy" decoding="async" width="774" height="455" src="/wp-content/uploads/2018/05/word-image-5114.png" class="wp-image-5640" srcset="/wp-content/uploads/2018/05/word-image-5114.png 774w, /wp-content/uploads/2018/05/word-image-5114-300x176.png 300w, /wp-content/uploads/2018/05/word-image-5114-768x451.png 768w" sizes="(max-width: 774px) 100vw, 774px" /></p>
<h2>6、注册成功页</h2>
<p>
  通过网址【<a href="https://mp.weixin.qq.com/">https://mp.weixin.qq.com/</a>】登录，也可以进入该页面
</p>
<p><img loading="lazy" decoding="async" width="1256" height="520" src="/wp-content/uploads/2018/05/word-image-5115.png" class="wp-image-5641" srcset="/wp-content/uploads/2018/05/word-image-5115.png 1256w, /wp-content/uploads/2018/05/word-image-5115-300x124.png 300w, /wp-content/uploads/2018/05/word-image-5115-768x318.png 768w, /wp-content/uploads/2018/05/word-image-5115-1024x424.png 1024w" sizes="(max-width: 1256px) 100vw, 1256px" /></p>
<h1><a id="post-5626-_Toc450923191"></a>四、编辑模式运营（了解）</h1>
<h2>1、编辑模式和开发模式切换</h2>
<p><img loading="lazy" decoding="async" width="1178" height="513" src="/wp-content/uploads/2018/05/word-image-5116.png" class="wp-image-5642" srcset="/wp-content/uploads/2018/05/word-image-5116.png 1178w, /wp-content/uploads/2018/05/word-image-5116-300x131.png 300w, /wp-content/uploads/2018/05/word-image-5116-768x334.png 768w, /wp-content/uploads/2018/05/word-image-5116-1024x446.png 1024w" sizes="(max-width: 1178px) 100vw, 1178px" /></p>
<p>
  脚下留心：切换开发模式后编辑模式将禁用
</p>
<p><img loading="lazy" decoding="async" width="1140" height="304" src="/wp-content/uploads/2018/05/word-image-5117.png" class="wp-image-5643" srcset="/wp-content/uploads/2018/05/word-image-5117.png 1140w, /wp-content/uploads/2018/05/word-image-5117-300x80.png 300w, /wp-content/uploads/2018/05/word-image-5117-768x205.png 768w, /wp-content/uploads/2018/05/word-image-5117-1024x273.png 1024w" sizes="(max-width: 1140px) 100vw, 1140px" /></p>
<h2>2、编辑模式功能</h2>
<h3>1）群发功能</h3>
<p><img loading="lazy" decoding="async" width="947" height="656" src="/wp-content/uploads/2018/05/word-image-5118.png" class="wp-image-5644" srcset="/wp-content/uploads/2018/05/word-image-5118.png 947w, /wp-content/uploads/2018/05/word-image-5118-300x208.png 300w, /wp-content/uploads/2018/05/word-image-5118-768x532.png 768w" sizes="(max-width: 947px) 100vw, 947px" /><br />
<img loading="lazy" decoding="async" width="653" height="210" src="/wp-content/uploads/2018/05/word-image-5119.png" class="wp-image-5645" srcset="/wp-content/uploads/2018/05/word-image-5119.png 653w, /wp-content/uploads/2018/05/word-image-5119-300x96.png 300w" sizes="(max-width: 653px) 100vw, 653px" /><br />
<img loading="lazy" decoding="async" width="1147" height="557" src="/wp-content/uploads/2018/05/word-image-5120.png" class="wp-image-5646" srcset="/wp-content/uploads/2018/05/word-image-5120.png 1147w, /wp-content/uploads/2018/05/word-image-5120-300x146.png 300w, /wp-content/uploads/2018/05/word-image-5120-768x373.png 768w, /wp-content/uploads/2018/05/word-image-5120-1024x497.png 1024w" sizes="(max-width: 1147px) 100vw, 1147px" /></p>
<h3>2）回复功能 &#8211; 被关注添加自动回复</h3>
<p>
  关注公共账号，平台发送的关注信息或欢迎语，我们通常称之为<strong>订阅回复</strong>或<strong>关注回复</strong>。
</p>
<p><img loading="lazy" decoding="async" width="1110" height="480" src="/wp-content/uploads/2018/05/word-image-5121.png" class="wp-image-5647" srcset="/wp-content/uploads/2018/05/word-image-5121.png 1110w, /wp-content/uploads/2018/05/word-image-5121-300x130.png 300w, /wp-content/uploads/2018/05/word-image-5121-768x332.png 768w, /wp-content/uploads/2018/05/word-image-5121-1024x443.png 1024w" sizes="(max-width: 1110px) 100vw, 1110px" /></p>
<h3>3）回复功能 &#8211; 关键词自动回复</h3>
<p><img loading="lazy" decoding="async" width="535" height="163" src="/wp-content/uploads/2018/05/word-image-5122.png" class="wp-image-5648" srcset="/wp-content/uploads/2018/05/word-image-5122.png 535w, /wp-content/uploads/2018/05/word-image-5122-300x91.png 300w" sizes="(max-width: 535px) 100vw, 535px" /></p>
<p>
  当我们<strong>设定的关键词</strong>与<strong>用户发送的关键词</strong>相匹配时，系统自动回复执行消息。
</p>
<p><img loading="lazy" decoding="async" width="1046" height="576" src="/wp-content/uploads/2018/05/word-image-5123.png" class="wp-image-5649" srcset="/wp-content/uploads/2018/05/word-image-5123.png 1046w, /wp-content/uploads/2018/05/word-image-5123-300x165.png 300w, /wp-content/uploads/2018/05/word-image-5123-768x423.png 768w, /wp-content/uploads/2018/05/word-image-5123-1024x564.png 1024w" sizes="(max-width: 1046px) 100vw, 1046px" /></p>
<p><strong>未全匹配</strong>：当用户发送的内容包含当前关键词，系统自动回复。
</p>
<p><strong>已全匹配</strong>：当用户发送的内容与当前关键词完全匹配，系统自动回复
</p>
<p><img loading="lazy" decoding="async" width="951" height="540" src="/wp-content/uploads/2018/05/word-image-5124.png" class="wp-image-5650" srcset="/wp-content/uploads/2018/05/word-image-5124.png 951w, /wp-content/uploads/2018/05/word-image-5124-300x170.png 300w, /wp-content/uploads/2018/05/word-image-5124-768x436.png 768w" sizes="(max-width: 951px) 100vw, 951px" /><br />
<img loading="lazy" decoding="async" width="957" height="567" src="/wp-content/uploads/2018/05/word-image-5125.png" class="wp-image-5651" srcset="/wp-content/uploads/2018/05/word-image-5125.png 957w, /wp-content/uploads/2018/05/word-image-5125-300x178.png 300w, /wp-content/uploads/2018/05/word-image-5125-768x455.png 768w" sizes="(max-width: 957px) 100vw, 957px" /></p>
<p><strong>︴思考：如何修改已经存在的规则</strong>
</p>
<p><img loading="lazy" decoding="async" width="998" height="447" src="/wp-content/uploads/2018/05/word-image-5126.png" class="wp-image-5652" srcset="/wp-content/uploads/2018/05/word-image-5126.png 998w, /wp-content/uploads/2018/05/word-image-5126-300x134.png 300w, /wp-content/uploads/2018/05/word-image-5126-768x344.png 768w" sizes="(max-width: 998px) 100vw, 998px" /></p>
<h3>4）回复功能 &#8211; 消息自动回复</h3>
<p>
  当用户发送的关键词与我们设定的关键词不匹配时，系统自动回复此信息。
</p>
<p><img loading="lazy" decoding="async" width="1070" height="489" src="/wp-content/uploads/2018/05/word-image-5127.png" class="wp-image-5653" srcset="/wp-content/uploads/2018/05/word-image-5127.png 1070w, /wp-content/uploads/2018/05/word-image-5127-300x137.png 300w, /wp-content/uploads/2018/05/word-image-5127-768x351.png 768w, /wp-content/uploads/2018/05/word-image-5127-1024x468.png 1024w" sizes="(max-width: 1070px) 100vw, 1070px" /></p>
<p>
  温馨提示：
</p>
<p>
  1、消息自动回复：1个小时内回复1—2条内容；
</p>
<p>
  2、暂不支持设置图文、网页地址消息回复；
</p>
<p>
  3、消息自动回复只能设置一条信息回复。
</p>
<p><img loading="lazy" decoding="async" width="668" height="460" src="/wp-content/uploads/2018/05/word-image-5128.png" class="wp-image-5654" srcset="/wp-content/uploads/2018/05/word-image-5128.png 668w, /wp-content/uploads/2018/05/word-image-5128-300x207.png 300w, /wp-content/uploads/2018/05/word-image-5128-220x150.png 220w" sizes="(max-width: 668px) 100vw, 668px" /></p>
<h2><a id="post-5626-_Toc450923192"></a>︴案例：简单号码薄</h2>
<h3>1）功能需求和效果</h3>
<p>
  用户关注后或输【？】自动弹出自定义回复文本信息如下：
</p>
<p>
  回复1特种服务号码
</p>
<p>
  回复2通讯服务号码
</p>
<p>
  回复3银行服务号码
</p>
<p>
  回复4用户反馈
</p>
<p><img loading="lazy" decoding="async" width="1035" height="345" src="/wp-content/uploads/2018/05/word-image-5129.png" class="wp-image-5655" srcset="/wp-content/uploads/2018/05/word-image-5129.png 1035w, /wp-content/uploads/2018/05/word-image-5129-300x100.png 300w, /wp-content/uploads/2018/05/word-image-5129-768x256.png 768w, /wp-content/uploads/2018/05/word-image-5129-1024x341.png 1024w" sizes="(max-width: 1035px) 100vw, 1035px" /></p>
<h3>2）回复1 </h3>
<p>
  常用特种服务号码：
</p>
<p>
  匪警：110
</p>
<p>
  火警：119
</p>
<p>
  急救中心：120
</p>
<p><img loading="lazy" decoding="async" width="1035" height="467" src="/wp-content/uploads/2018/05/word-image-5130.png" class="wp-image-5656" srcset="/wp-content/uploads/2018/05/word-image-5130.png 1035w, /wp-content/uploads/2018/05/word-image-5130-300x135.png 300w, /wp-content/uploads/2018/05/word-image-5130-768x347.png 768w, /wp-content/uploads/2018/05/word-image-5130-1024x462.png 1024w" sizes="(max-width: 1035px) 100vw, 1035px" /></p>
<h3>3）回复2 </h3>
<p>
  常用通讯服务号码：
</p>
<p>
  中移动：10086
</p>
<p>
  中电信：10000
</p>
<p>
  中联通：10010
</p>
<p><img loading="lazy" decoding="async" width="1061" height="468" src="/wp-content/uploads/2018/05/word-image-5131.png" class="wp-image-5657" srcset="/wp-content/uploads/2018/05/word-image-5131.png 1061w, /wp-content/uploads/2018/05/word-image-5131-300x132.png 300w, /wp-content/uploads/2018/05/word-image-5131-768x339.png 768w, /wp-content/uploads/2018/05/word-image-5131-1024x452.png 1024w" sizes="(max-width: 1061px) 100vw, 1061px" /></p>
<h3>4）回复3</h3>
<p>
  银行服务号码
</p>
<p>
  建设银行：95533
</p>
<p>
  工商银行：99588
</p>
<p>
  农业银行：95599
</p>
<p><img loading="lazy" decoding="async" width="1027" height="420" src="/wp-content/uploads/2018/05/word-image-5132.png" class="wp-image-5658" srcset="/wp-content/uploads/2018/05/word-image-5132.png 1027w, /wp-content/uploads/2018/05/word-image-5132-300x123.png 300w, /wp-content/uploads/2018/05/word-image-5132-768x314.png 768w, /wp-content/uploads/2018/05/word-image-5132-1024x419.png 1024w" sizes="(max-width: 1027px) 100vw, 1027px" /></p>
<h3>5）回复4</h3>
<p>
  尊敬的用户，为了更好的为您服务，请将系统的不足之处反馈给我们。
</p>
<p>
  反馈格式：@+建议内容
</p>
<p>
  例如：@希望增加***号码
</p>
<p>
  回复：感谢您的宝贵建议，我们会努力为您提供更好的服务！
</p>
<p><img loading="lazy" decoding="async" width="1031" height="285" src="/wp-content/uploads/2018/05/word-image-5133.png" class="wp-image-5659" srcset="/wp-content/uploads/2018/05/word-image-5133.png 1031w, /wp-content/uploads/2018/05/word-image-5133-300x83.png 300w, /wp-content/uploads/2018/05/word-image-5133-768x212.png 768w, /wp-content/uploads/2018/05/word-image-5133-1024x283.png 1024w" sizes="(max-width: 1031px) 100vw, 1031px" /></p>
<h3>5）关注：</h3>
<p>
  欢迎关注简易号码簿！
</p>
<p>
  在这里，我们为您提供常用号码查询服务。您可以通过文本菜单交互或关键字搜索的方式查找号码。
</p>
<p>
  快回复？开始体验吧！
</p>
<p><img loading="lazy" decoding="async" width="960" height="457" src="/wp-content/uploads/2018/05/word-image-5134.png" class="wp-image-5660" srcset="/wp-content/uploads/2018/05/word-image-5134.png 960w, /wp-content/uploads/2018/05/word-image-5134-300x143.png 300w, /wp-content/uploads/2018/05/word-image-5134-768x366.png 768w" sizes="(max-width: 960px) 100vw, 960px" /></p>
<h2>︴案例：自定义菜单</h2>
<h3>1）说明</h3>
<ul>
<li>
    自定义菜单一级菜单3个二级菜单5个（共15个菜单）
  </li>
<li>
    微信自定义菜单，默认是有24小时的缓冲期，所以无法实时预览（注：可以通过取消关注并再次关注，解决此问题）
  </li>
</ul>
<h3>2）需求：精仿传智播客官方微信</h3>
<p><img loading="lazy" decoding="async" width="499" height="584" src="/wp-content/uploads/2018/05/word-image-5135.png" class="wp-image-5661" srcset="/wp-content/uploads/2018/05/word-image-5135.png 499w, /wp-content/uploads/2018/05/word-image-5135-256x300.png 256w" sizes="(max-width: 499px) 100vw, 499px" /></p>
<h3>3）步骤</h3>
<p><img loading="lazy" decoding="async" width="854" height="559" src="/wp-content/uploads/2018/05/word-image-5136.png" class="wp-image-5662" srcset="/wp-content/uploads/2018/05/word-image-5136.png 854w, /wp-content/uploads/2018/05/word-image-5136-300x196.png 300w, /wp-content/uploads/2018/05/word-image-5136-768x503.png 768w" sizes="(max-width: 854px) 100vw, 854px" /></p>
<h1><a id="post-5626-_Toc450923193"></a>五、开发者模式运营（重要）</h1>
<h2><a id="post-5626-_Toc450923194"></a>1、概念</h2>
<h3>1）编辑模式原理图 </h3>
<p>
  当用户发送消息时,直接发送到微信服务器上,经过微信服务器的处理,则返回给客户端.
</p>
<p><img loading="lazy" decoding="async" width="668" height="338" src="/wp-content/uploads/2018/05/word-image-5137.png" class="wp-image-5663" srcset="/wp-content/uploads/2018/05/word-image-5137.png 668w, /wp-content/uploads/2018/05/word-image-5137-300x152.png 300w" sizes="(max-width: 668px) 100vw, 668px" /></p>
<h3>2）开发者模式原理图 </h3>
<p><img loading="lazy" decoding="async" width="1011" height="432" src="/wp-content/uploads/2018/05/word-image-5138.png" class="wp-image-5664" srcset="/wp-content/uploads/2018/05/word-image-5138.png 1011w, /wp-content/uploads/2018/05/word-image-5138-300x128.png 300w, /wp-content/uploads/2018/05/word-image-5138-768x328.png 768w" sizes="(max-width: 1011px) 100vw, 1011px" /></p>
<p>
  请求：用户发送消息 -&gt;（XML报文）-&gt;  微信服务器  -&gt;（XML报文）-&gt; 自定义服务器
</p>
<p>
  响应：用户发送消息 &lt;-（XML报文）&lt;-  微信服务器  &lt;-（XML报文）&lt;- 自定义服务器
</p>
<h2>2、准备自定义服务器（SAE云 或者 阿里云）</h2>
<h3>1）SAE云（默认有PHP环境）</h3>
<ul>
<li><strong>步骤1</strong>：打开官网注册进入用户中心
  </li>
</ul>
<p><a href="http://www.sinacloud.com/">http://www.sinacloud.com/</a>
</p>
<ul>
<li><strong>步骤2</strong>：创建应用（相当于创建虚拟主机）
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="967" height="559" src="/wp-content/uploads/2018/05/word-image-5139.png" class="wp-image-5665" srcset="/wp-content/uploads/2018/05/word-image-5139.png 967w, /wp-content/uploads/2018/05/word-image-5139-300x173.png 300w, /wp-content/uploads/2018/05/word-image-5139-768x444.png 768w" sizes="(max-width: 967px) 100vw, 967px" /><br />
<img loading="lazy" decoding="async" width="646" height="482" src="/wp-content/uploads/2018/05/word-image-5140.png" class="wp-image-5666" srcset="/wp-content/uploads/2018/05/word-image-5140.png 646w, /wp-content/uploads/2018/05/word-image-5140-300x224.png 300w" sizes="(max-width: 646px) 100vw, 646px" /><br />
<img loading="lazy" decoding="async" width="974" height="501" src="/wp-content/uploads/2018/05/word-image-5141.png" class="wp-image-5667" srcset="/wp-content/uploads/2018/05/word-image-5141.png 974w, /wp-content/uploads/2018/05/word-image-5141-300x154.png 300w, /wp-content/uploads/2018/05/word-image-5141-768x395.png 768w" sizes="(max-width: 974px) 100vw, 974px" /><br />
<img loading="lazy" decoding="async" width="897" height="638" src="/wp-content/uploads/2018/05/word-image-5142.png" class="wp-image-5668" srcset="/wp-content/uploads/2018/05/word-image-5142.png 897w, /wp-content/uploads/2018/05/word-image-5142-300x213.png 300w, /wp-content/uploads/2018/05/word-image-5142-768x546.png 768w" sizes="(max-width: 897px) 100vw, 897px" /><br />
<img loading="lazy" decoding="async" width="719" height="606" src="/wp-content/uploads/2018/05/word-image-5143.png" class="wp-image-5669" srcset="/wp-content/uploads/2018/05/word-image-5143.png 719w, /wp-content/uploads/2018/05/word-image-5143-300x253.png 300w" sizes="(max-width: 719px) 100vw, 719px" /><br />
<img loading="lazy" decoding="async" width="1161" height="623" src="/wp-content/uploads/2018/05/word-image-5144.png" class="wp-image-5670" srcset="/wp-content/uploads/2018/05/word-image-5144.png 1161w, /wp-content/uploads/2018/05/word-image-5144-300x161.png 300w, /wp-content/uploads/2018/05/word-image-5144-768x412.png 768w, /wp-content/uploads/2018/05/word-image-5144-1024x549.png 1024w" sizes="(max-width: 1161px) 100vw, 1161px" /><br />
<img loading="lazy" decoding="async" width="1230" height="676" src="/wp-content/uploads/2018/05/word-image-5145.png" class="wp-image-5671" srcset="/wp-content/uploads/2018/05/word-image-5145.png 1230w, /wp-content/uploads/2018/05/word-image-5145-300x165.png 300w, /wp-content/uploads/2018/05/word-image-5145-768x422.png 768w, /wp-content/uploads/2018/05/word-image-5145-1024x563.png 1024w" sizes="(max-width: 1230px) 100vw, 1230px" /></p>
<ul>
<li><strong>步骤3</strong>：服务器代码管理（svn版本控制软件）
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1187" height="682" src="/wp-content/uploads/2018/05/word-image-5146.png" class="wp-image-5672" srcset="/wp-content/uploads/2018/05/word-image-5146.png 1187w, /wp-content/uploads/2018/05/word-image-5146-300x172.png 300w, /wp-content/uploads/2018/05/word-image-5146-768x441.png 768w, /wp-content/uploads/2018/05/word-image-5146-1024x588.png 1024w" sizes="(max-width: 1187px) 100vw, 1187px" /><br />
<img loading="lazy" decoding="async" width="1265" height="656" src="/wp-content/uploads/2018/05/word-image-5147.png" class="wp-image-5673" srcset="/wp-content/uploads/2018/05/word-image-5147.png 1265w, /wp-content/uploads/2018/05/word-image-5147-300x156.png 300w, /wp-content/uploads/2018/05/word-image-5147-768x398.png 768w, /wp-content/uploads/2018/05/word-image-5147-1024x531.png 1024w" sizes="(max-width: 1265px) 100vw, 1265px" /><br />
<img loading="lazy" decoding="async" width="608" height="415" src="/wp-content/uploads/2018/05/word-image-5148.png" class="wp-image-5674" srcset="/wp-content/uploads/2018/05/word-image-5148.png 608w, /wp-content/uploads/2018/05/word-image-5148-300x205.png 300w, /wp-content/uploads/2018/05/word-image-5148-220x150.png 220w" sizes="(max-width: 608px) 100vw, 608px" /></p>
<p>
  脚下留心：仓库目录下必须有以1命名的文件下
</p>
<p><img loading="lazy" decoding="async" width="975" height="415" src="/wp-content/uploads/2018/05/word-image-5149.png" class="wp-image-5675" srcset="/wp-content/uploads/2018/05/word-image-5149.png 975w, /wp-content/uploads/2018/05/word-image-5149-300x128.png 300w, /wp-content/uploads/2018/05/word-image-5149-768x327.png 768w" sizes="(max-width: 975px) 100vw, 975px" /><br />
<img loading="lazy" decoding="async" width="1006" height="466" src="/wp-content/uploads/2018/05/word-image-5150.png" class="wp-image-5676" srcset="/wp-content/uploads/2018/05/word-image-5150.png 1006w, /wp-content/uploads/2018/05/word-image-5150-300x139.png 300w, /wp-content/uploads/2018/05/word-image-5150-768x356.png 768w" sizes="(max-width: 1006px) 100vw, 1006px" /></p>
<ul>
<li><strong>步骤4</strong>：浏览器代码
  </li>
</ul>
<p>
  #常看创建应用设置的二级域名是什么，每个人填写的不一样）
</p>
<p><a href="http://phpopenfather.applinzi.com/index.php" class="broken_link">http://php0225.applinzi.com/test.php</a>
</p>
<p><img loading="lazy" decoding="async" width="473" height="184" src="/wp-content/uploads/2018/05/word-image-5151.png" class="wp-image-5677" srcset="/wp-content/uploads/2018/05/word-image-5151.png 473w, /wp-content/uploads/2018/05/word-image-5151-300x117.png 300w" sizes="(max-width: 473px) 100vw, 473px" /><br />
<img loading="lazy" decoding="async" width="973" height="236" src="/wp-content/uploads/2018/05/word-image-5152.png" class="wp-image-5678" srcset="/wp-content/uploads/2018/05/word-image-5152.png 973w, /wp-content/uploads/2018/05/word-image-5152-300x73.png 300w, /wp-content/uploads/2018/05/word-image-5152-768x186.png 768w" sizes="(max-width: 973px) 100vw, 973px" /></p>
<h3>2）创建阿里云服务器（需要自己安装PHP环境）</h3>
<ul>
<li><strong>步骤1</strong>：打开官网注册并点击顶部控制台，进入控制台页点击左侧菜单购买服务器
  </li>
</ul>
<p><a href="https://www.aliyun.com/">https://www.aliyun.com/</a>
</p>
<p><img loading="lazy" decoding="async" width="473" height="99" src="/wp-content/uploads/2018/05/word-image-5153.png" class="wp-image-5679" srcset="/wp-content/uploads/2018/05/word-image-5153.png 473w, /wp-content/uploads/2018/05/word-image-5153-300x63.png 300w" sizes="(max-width: 473px) 100vw, 473px" /><br />
<img loading="lazy" decoding="async" width="855" height="448" src="/wp-content/uploads/2018/05/word-image-5154.png" class="wp-image-5680" srcset="/wp-content/uploads/2018/05/word-image-5154.png 855w, /wp-content/uploads/2018/05/word-image-5154-300x157.png 300w, /wp-content/uploads/2018/05/word-image-5154-768x402.png 768w" sizes="(max-width: 855px) 100vw, 855px" /></p>
<ul>
<li><strong>步骤2</strong>：选择购买指定节点服务器
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1365" height="280" src="/wp-content/uploads/2018/05/word-image-5155.png" class="wp-image-5681" srcset="/wp-content/uploads/2018/05/word-image-5155.png 1365w, /wp-content/uploads/2018/05/word-image-5155-300x62.png 300w, /wp-content/uploads/2018/05/word-image-5155-768x158.png 768w, /wp-content/uploads/2018/05/word-image-5155-1024x210.png 1024w" sizes="(max-width: 1365px) 100vw, 1365px" /></p>
<ul>
<li><strong>步骤3</strong>：选择计费方式（ps. 该方式需要账号有100元）
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="751" height="518" src="/wp-content/uploads/2018/05/word-image-5156.png" class="wp-image-5682" srcset="/wp-content/uploads/2018/05/word-image-5156.png 751w, /wp-content/uploads/2018/05/word-image-5156-300x207.png 300w" sizes="(max-width: 751px) 100vw, 751px" /><br />
<img loading="lazy" decoding="async" width="585" height="556" src="/wp-content/uploads/2018/05/word-image-5157.png" class="wp-image-5683" srcset="/wp-content/uploads/2018/05/word-image-5157.png 585w, /wp-content/uploads/2018/05/word-image-5157-300x285.png 300w" sizes="(max-width: 585px) 100vw, 585px" /><br />
<img loading="lazy" decoding="async" width="578" height="624" src="/wp-content/uploads/2018/05/word-image-5158.png" class="wp-image-5684" srcset="/wp-content/uploads/2018/05/word-image-5158.png 578w, /wp-content/uploads/2018/05/word-image-5158-278x300.png 278w" sizes="(max-width: 578px) 100vw, 578px" /></p>
<ul>
<li><strong>步骤4</strong>：服务器购买清单
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="946" height="548" src="/wp-content/uploads/2018/05/word-image-5159.png" class="wp-image-5685" srcset="/wp-content/uploads/2018/05/word-image-5159.png 946w, /wp-content/uploads/2018/05/word-image-5159-300x174.png 300w, /wp-content/uploads/2018/05/word-image-5159-768x445.png 768w" sizes="(max-width: 946px) 100vw, 946px" /></p>
<ul>
<li><strong>步骤5</strong>：获取服务器公网IP地址
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="682" height="317" src="/wp-content/uploads/2018/05/word-image-5160.png" class="wp-image-5686" srcset="/wp-content/uploads/2018/05/word-image-5160.png 682w, /wp-content/uploads/2018/05/word-image-5160-300x139.png 300w" sizes="(max-width: 682px) 100vw, 682px" /><br />
<img loading="lazy" decoding="async" width="930" height="283" src="/wp-content/uploads/2018/05/word-image-5161.png" class="wp-image-5687" srcset="/wp-content/uploads/2018/05/word-image-5161.png 930w, /wp-content/uploads/2018/05/word-image-5161-300x91.png 300w, /wp-content/uploads/2018/05/word-image-5161-768x234.png 768w" sizes="(max-width: 930px) 100vw, 930px" /></p>
<h3>配置阿里云（LAMP环境）</h3>
<ul>
<li>
    安装apache服务
  </li>
</ul>
<p>
  步骤1：安装
</p>
<p><img loading="lazy" decoding="async" width="598" height="168" src="/wp-content/uploads/2018/05/word-image-5162.png" class="wp-image-5688" srcset="/wp-content/uploads/2018/05/word-image-5162.png 598w, /wp-content/uploads/2018/05/word-image-5162-300x84.png 300w" sizes="(max-width: 598px) 100vw, 598px" /><br />
<img loading="lazy" decoding="async" width="508" height="229" src="/wp-content/uploads/2018/05/word-image-5163.png" class="wp-image-5689" srcset="/wp-content/uploads/2018/05/word-image-5163.png 508w, /wp-content/uploads/2018/05/word-image-5163-300x135.png 300w" sizes="(max-width: 508px) 100vw, 508px" /></p>
<p>
  步骤2：启动（注：第一次需要修改下配置文件）
</p>
<p><img loading="lazy" decoding="async" width="608" height="150" src="/wp-content/uploads/2018/05/word-image-5164.png" class="wp-image-5690" srcset="/wp-content/uploads/2018/05/word-image-5164.png 608w, /wp-content/uploads/2018/05/word-image-5164-300x74.png 300w" sizes="(max-width: 608px) 100vw, 608px" /><br />
<img loading="lazy" decoding="async" width="492" height="109" src="/wp-content/uploads/2018/05/word-image-5165.png" class="wp-image-5691" srcset="/wp-content/uploads/2018/05/word-image-5165.png 492w, /wp-content/uploads/2018/05/word-image-5165-300x66.png 300w" sizes="(max-width: 492px) 100vw, 492px" /><br />
<img loading="lazy" decoding="async" width="536" height="55" src="/wp-content/uploads/2018/05/word-image-5166.png" class="wp-image-5692" srcset="/wp-content/uploads/2018/05/word-image-5166.png 536w, /wp-content/uploads/2018/05/word-image-5166-300x31.png 300w" sizes="(max-width: 536px) 100vw, 536px" /></p>
<p>
  步骤3：输入ip访问
</p>
<p><img loading="lazy" decoding="async" width="973" height="385" src="/wp-content/uploads/2018/05/word-image-5167.png" class="wp-image-5693" srcset="/wp-content/uploads/2018/05/word-image-5167.png 973w, /wp-content/uploads/2018/05/word-image-5167-300x119.png 300w, /wp-content/uploads/2018/05/word-image-5167-768x304.png 768w" sizes="(max-width: 973px) 100vw, 973px" /></p>
<p>
  步骤4：修改网页访问
</p>
<p><img loading="lazy" decoding="async" width="811" height="121" src="/wp-content/uploads/2018/05/word-image-5168.png" class="wp-image-5694" srcset="/wp-content/uploads/2018/05/word-image-5168.png 811w, /wp-content/uploads/2018/05/word-image-5168-300x45.png 300w, /wp-content/uploads/2018/05/word-image-5168-768x115.png 768w" sizes="(max-width: 811px) 100vw, 811px" /></p>
<ul>
<li>
    安装php
  </li>
</ul>
<p>
  步骤1：安装
</p>
<p>
  yum -y install php php-mysql
</p>
<p><img loading="lazy" decoding="async" width="589" height="121" src="/wp-content/uploads/2018/05/word-image-5169.png" class="wp-image-5695" srcset="/wp-content/uploads/2018/05/word-image-5169.png 589w, /wp-content/uploads/2018/05/word-image-5169-300x62.png 300w" sizes="(max-width: 589px) 100vw, 589px" /><br />
<img loading="lazy" decoding="async" width="575" height="230" src="/wp-content/uploads/2018/05/word-image-5170.png" class="wp-image-5696" srcset="/wp-content/uploads/2018/05/word-image-5170.png 575w, /wp-content/uploads/2018/05/word-image-5170-300x120.png 300w" sizes="(max-width: 575px) 100vw, 575px" /></p>
<p>
  yum -y install gd php-gd gd-devel php-xml php-common php-curl php-mbstring php-ldap php-pear php-xmlrpc php-imap
</p>
<p><img loading="lazy" decoding="async" width="1119" height="170" src="/wp-content/uploads/2018/05/word-image-5171.png" class="wp-image-5697" srcset="/wp-content/uploads/2018/05/word-image-5171.png 1119w, /wp-content/uploads/2018/05/word-image-5171-300x46.png 300w, /wp-content/uploads/2018/05/word-image-5171-768x117.png 768w, /wp-content/uploads/2018/05/word-image-5171-1024x156.png 1024w" sizes="(max-width: 1119px) 100vw, 1119px" /><br />
<img loading="lazy" decoding="async" width="656" height="270" src="/wp-content/uploads/2018/05/word-image-5172.png" class="wp-image-5698" srcset="/wp-content/uploads/2018/05/word-image-5172.png 656w, /wp-content/uploads/2018/05/word-image-5172-300x123.png 300w" sizes="(max-width: 656px) 100vw, 656px" /></p>
<p>
  步骤2：重启apache，创建php文件测试
</p>
<p><img loading="lazy" decoding="async" width="740" height="493" src="/wp-content/uploads/2018/05/word-image-5173.png" class="wp-image-5699" srcset="/wp-content/uploads/2018/05/word-image-5173.png 740w, /wp-content/uploads/2018/05/word-image-5173-300x200.png 300w" sizes="(max-width: 740px) 100vw, 740px" /><br />
<img loading="lazy" decoding="async" width="637" height="338" src="/wp-content/uploads/2018/05/word-image-5174.png" class="wp-image-5700" srcset="/wp-content/uploads/2018/05/word-image-5174.png 637w, /wp-content/uploads/2018/05/word-image-5174-300x159.png 300w" sizes="(max-width: 637px) 100vw, 637px" /></p>
<ul>
<li>
    安装MySQL
  </li>
</ul>
<p>
  步骤1：安装
</p>
<p>
  yum -y install mysql mysql-server mysql-devel
</p>
<p><img loading="lazy" decoding="async" width="707" height="220" src="/wp-content/uploads/2018/05/word-image-5175.png" class="wp-image-5701" srcset="/wp-content/uploads/2018/05/word-image-5175.png 707w, /wp-content/uploads/2018/05/word-image-5175-300x93.png 300w" sizes="(max-width: 707px) 100vw, 707px" /><br />
<img loading="lazy" decoding="async" width="916" height="249" src="/wp-content/uploads/2018/05/word-image-5176.png" class="wp-image-5703" srcset="/wp-content/uploads/2018/05/word-image-5176.png 916w, /wp-content/uploads/2018/05/word-image-5176-300x82.png 300w, /wp-content/uploads/2018/05/word-image-5176-768x209.png 768w" sizes="(max-width: 916px) 100vw, 916px" /></p>
<p>
  步骤2：启动服务（service mysqld start）
</p>
<p><img loading="lazy" decoding="async" width="591" height="311" src="/wp-content/uploads/2018/05/word-image-5177.png" class="wp-image-5704" srcset="/wp-content/uploads/2018/05/word-image-5177.png 591w, /wp-content/uploads/2018/05/word-image-5177-300x158.png 300w" sizes="(max-width: 591px) 100vw, 591px" /></p>
<p>
  步骤3：登录，更改密码（注：默认密码为空）
</p>
<p><img loading="lazy" decoding="async" width="667" height="378" src="/wp-content/uploads/2018/05/word-image-5178.png" class="wp-image-5705" srcset="/wp-content/uploads/2018/05/word-image-5178.png 667w, /wp-content/uploads/2018/05/word-image-5178-300x170.png 300w" sizes="(max-width: 667px) 100vw, 667px" /></p>
<p><strong>update mysql.user set password=password(&#8216;admin888&#8242;) where User=&#8217;root&#8217;;</strong>
</p>
<p><strong>flush privileges;</strong>
</p>
<p><img loading="lazy" decoding="async" width="579" height="428" src="/wp-content/uploads/2018/05/word-image-5179.png" class="wp-image-5706" srcset="/wp-content/uploads/2018/05/word-image-5179.png 579w, /wp-content/uploads/2018/05/word-image-5179-300x222.png 300w" sizes="(max-width: 579px) 100vw, 579px" /></p>
<h2>3、微信接口开发</h2>
<h3>1）下载微信PHP SDK</h3>
<p><img loading="lazy" decoding="async" width="1200" height="531" src="/wp-content/uploads/2018/05/word-image-5180.png" class="wp-image-5707" srcset="/wp-content/uploads/2018/05/word-image-5180.png 1200w, /wp-content/uploads/2018/05/word-image-5180-300x133.png 300w, /wp-content/uploads/2018/05/word-image-5180-768x340.png 768w, /wp-content/uploads/2018/05/word-image-5180-1024x453.png 1024w" sizes="(max-width: 1200px) 100vw, 1200px" /><br />
<img loading="lazy" decoding="async" width="1134" height="549" src="/wp-content/uploads/2018/05/word-image-5181.png" class="wp-image-5708" srcset="/wp-content/uploads/2018/05/word-image-5181.png 1134w, /wp-content/uploads/2018/05/word-image-5181-300x145.png 300w, /wp-content/uploads/2018/05/word-image-5181-768x372.png 768w, /wp-content/uploads/2018/05/word-image-5181-1024x496.png 1024w" sizes="(max-width: 1134px) 100vw, 1134px" /><br />
<img loading="lazy" decoding="async" width="984" height="525" src="/wp-content/uploads/2018/05/word-image-5182.png" class="wp-image-5709" srcset="/wp-content/uploads/2018/05/word-image-5182.png 984w, /wp-content/uploads/2018/05/word-image-5182-300x160.png 300w, /wp-content/uploads/2018/05/word-image-5182-768x410.png 768w" sizes="(max-width: 984px) 100vw, 984px" /></p>
<p>
  下载地址：
</p>
<p><a href="http://mp.weixin.qq.com/mpres/htmledition/res/wx_sample.20140819.zip">http://mp.weixin.qq.com/mpres/htmledition/res/wx_sample.20140819.zip</a>
</p>
<h3>2）微信接口初体验</h3>
<ul>
<li>
    步骤1：下载微信官方SDK
  </li>
</ul>
<p><a href="http://mp.weixin.qq.com/mpres/htmledition/res/wx_sample.20140819.zip">http://mp.weixin.qq.com/mpres/htmledition/res/wx_sample.20140819.zip</a>
</p>
<p>
  SDK就是别人开发好的功能或者接口，一般工作中下载第三方SDK输入APPID和APPKEY即可完
</p>
<p>
  成对应功能。
</p>
<ul>
<li>
    步骤2：更改微信SDK，上传服务器（代码如下）
  </li>
</ul>
<p>
  wx.php
</p>
<p>
  &lt;?php
</p>
<p>
  /**
</p>
<p>
    * wechat php test
</p>
<p>
    */
</p>
<p>
  //define your token
</p>
<p>
  define(&#8220;TOKEN&#8221;, &#8220;itcast&#8221;);  //脚下留心：token必须和微信公众平台保持一致
</p>
<p>
  $wechatObj = new wechatCallbackapiTest();
</p>
<p><strong>$wechatObj-&gt;valid();</strong>
</p>
<p>
  class wechatCallbackapiTest
</p>
<p>
  {
</p>
<p>
  	public function valid()
</p>
<p>
      {
</p>
<p>
          $echoStr = $_GET[&#8220;echostr&#8221;];
</p>
<p>
          //valid signature , option
</p>
<p>
          if($this-&gt;checkSignature()){
</p>
<p>
          	echo $echoStr;
</p>
<p>
          	exit;
</p>
<p>
          }
</p>
<p>
      }
</p>
<p>
      public function responseMsg()
</p>
<p>
      {
</p>
<p>
  		//get post data, May be due to the different environments
</p>
<p>
  		$postStr = $GLOBALS[&#8220;HTTP_RAW_POST_DATA&#8221;];
</p>
<p>
        	//extract post data
</p>
<p>
  		if (!empty($postStr)){
</p>
<p>
                  /* libxml_disable_entity_loader is to prevent XML eXternal Entity Injection,
</p>
<p>
                     the best way is to check the validity of xml by yourself */
</p>
<p>
                  libxml_disable_entity_loader(true);
</p>
<p>
                	$postObj = simplexml_load_string($postStr, &#8216;SimpleXMLElement&#8217;, LIBXML_NOCDATA);
</p>
<p>
                  $fromUsername = $postObj-&gt;FromUserName;
</p>
<p>
                  $toUsername = $postObj-&gt;ToUserName;
</p>
<p>
                  $keyword = trim($postObj-&gt;Content);
</p>
<p>
                  $time = time();
</p>
<p>
                  $textTpl = &#8220;&lt;xml&gt;
</p>
<p>
  							&lt;ToUserName&gt;&lt;![CDATA[%s]]&gt;&lt;/ToUserName&gt;
</p>
<p>
  							&lt;FromUserName&gt;&lt;![CDATA[%s]]&gt;&lt;/FromUserName&gt;
</p>
<p>
  							&lt;CreateTime&gt;%s&lt;/CreateTime&gt;
</p>
<p>
  							&lt;MsgType&gt;&lt;![CDATA[%s]]&gt;&lt;/MsgType&gt;
</p>
<p>
  							&lt;Content&gt;&lt;![CDATA[%s]]&gt;&lt;/Content&gt;
</p>
<p>
  							&lt;FuncFlag&gt;0&lt;/FuncFlag&gt;
</p>
<p>
  							&lt;/xml&gt;&#8221;;
</p>
<p>
  				if(!empty( $keyword ))
</p>
<p>
                  {
</p>
<p>
                		$msgType = &#8220;text&#8221;;
</p>
<p>
                  	$contentStr = &#8220;滚!&#8221;;
</p>
<p>
                  	$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
</p>
<p>
                  	echo $resultStr;
</p>
<p>
                  }else{
</p>
<p>
                  	echo &#8220;Input something&#8230;&#8221;;
</p>
<p>
                  }
</p>
<p>
          }else {
</p>
<p>
          	echo &#8220;&#8221;;
</p>
<p>
          	exit;
</p>
<p>
          }
</p>
<p>
      }
</p>
</p>
<p>
  	private function checkSignature()
</p>
<p>
  	{
</p>
<p>
          // you must define TOKEN by yourself
</p>
<p>
          if (!defined(&#8220;TOKEN&#8221;)) {
</p>
<p>
              throw new Exception(&#8216;TOKEN is not defined!&#8217;);
</p>
<p>
          }
</p>
</p>
<p>
          $signature = $_GET[&#8220;signature&#8221;];
</p>
<p>
          $timestamp = $_GET[&#8220;timestamp&#8221;];
</p>
<p>
          $nonce = $_GET[&#8220;nonce&#8221;];
</p>
</p>
<p>
  		$token = TOKEN;
</p>
<p>
  		$tmpArr = array($token, $timestamp, $nonce);
</p>
<p>
          // use SORT_STRING rule
</p>
<p>
  		sort($tmpArr, SORT_STRING);
</p>
<p>
  		$tmpStr = implode( $tmpArr );
</p>
<p>
  		$tmpStr = sha1( $tmpStr );
</p>
</p>
<p>
  		if( $tmpStr == $signature ){
</p>
<p>
  			return true;
</p>
<p>
  		}else{
</p>
<p>
  			return false;
</p>
<p>
  		}
</p>
<p>
  	}
</p>
<p>
  }
</p>
<p>
  ?&gt;
</p>
<ul>
<li>
    步骤3：开启开发者模式（校验token）
  </li>
</ul>
<p>
  打开微信公众号管理平台 -&gt; 点击左侧菜单（开发-&gt;基本配置） -&gt; 开启开发者模式
</p>
<p><img loading="lazy" decoding="async" width="933" height="582" src="/wp-content/uploads/2018/05/word-image-5183.png" class="wp-image-5710" srcset="/wp-content/uploads/2018/05/word-image-5183.png 933w, /wp-content/uploads/2018/05/word-image-5183-300x187.png 300w, /wp-content/uploads/2018/05/word-image-5183-768x479.png 768w" sizes="(max-width: 933px) 100vw, 933px" /></p>
<ul>
<li>
    步骤4：修改SDK（关闭校验，开启响应用户请求）
  </li>
</ul>
<p>
  wx.php
</p>
<p>
  &lt;?php
</p>
<p>
  /**
</p>
<p>
    * wechat php test
</p>
<p>
    */
</p>
<p>
  //define your token
</p>
<p>
  define(&#8220;TOKEN&#8221;, &#8220;itcast&#8221;);  //脚下留心：token必须和微信公众平台保持一致
</p>
<p>
  $wechatObj = new wechatCallbackapiTest();
</p>
<p><strong>//$wechatObj-&gt;valid();</strong>
</p>
<p><strong>$wechatObj-&gt;responseMsg();</strong>
</p>
<p>
  class wechatCallbackapiTest
</p>
<p>
  {
</p>
<p>
  	public function valid()
</p>
<p>
      {
</p>
<p>
          $echoStr = $_GET[&#8220;echostr&#8221;];
</p>
<p>
          //valid signature , option
</p>
<p>
          if($this-&gt;checkSignature()){
</p>
<p>
          	echo $echoStr;
</p>
<p>
          	exit;
</p>
<p>
          }
</p>
<p>
      }
</p>
<p>
      public function responseMsg()
</p>
<p>
      {
</p>
<p>
  		//get post data, May be due to the different environments
</p>
<p>
  		$postStr = $GLOBALS[&#8220;HTTP_RAW_POST_DATA&#8221;];
</p>
<p>
        	//extract post data
</p>
<p>
  		if (!empty($postStr)){
</p>
<p>
                  /* libxml_disable_entity_loader is to prevent XML eXternal Entity Injection,
</p>
<p>
                     the best way is to check the validity of xml by yourself */
</p>
<p>
                  libxml_disable_entity_loader(true);
</p>
<p>
                	$postObj = simplexml_load_string($postStr, &#8216;SimpleXMLElement&#8217;, LIBXML_NOCDATA);
</p>
<p>
                  $fromUsername = $postObj-&gt;FromUserName;
</p>
<p>
                  $toUsername = $postObj-&gt;ToUserName;
</p>
<p>
                  $keyword = trim($postObj-&gt;Content);
</p>
<p>
                  $time = time();
</p>
<p>
                  $textTpl = &#8220;&lt;xml&gt;
</p>
<p>
  							&lt;ToUserName&gt;&lt;![CDATA[%s]]&gt;&lt;/ToUserName&gt;
</p>
<p>
  							&lt;FromUserName&gt;&lt;![CDATA[%s]]&gt;&lt;/FromUserName&gt;
</p>
<p>
  							&lt;CreateTime&gt;%s&lt;/CreateTime&gt;
</p>
<p>
  							&lt;MsgType&gt;&lt;![CDATA[%s]]&gt;&lt;/MsgType&gt;
</p>
<p>
  							&lt;Content&gt;&lt;![CDATA[%s]]&gt;&lt;/Content&gt;
</p>
<p>
  							&lt;FuncFlag&gt;0&lt;/FuncFlag&gt;
</p>
<p>
  							&lt;/xml&gt;&#8221;;
</p>
<p>
  				if(!empty( $keyword ))
</p>
<p>
                  {
</p>
<p>
                		$msgType = &#8220;text&#8221;;
</p>
<p>
                  	$contentStr = &#8220;滚!&#8221;;
</p>
<p>
                  	$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
</p>
<p>
                  	echo $resultStr;
</p>
<p>
                  }else{
</p>
<p>
                  	echo &#8220;Input something&#8230;&#8221;;
</p>
<p>
                  }
</p>
<p>
          }else {
</p>
<p>
          	echo &#8220;&#8221;;
</p>
<p>
          	exit;
</p>
<p>
          }
</p>
<p>
      }
</p>
</p>
<p>
  	private function checkSignature()
</p>
<p>
  	{
</p>
<p>
          // you must define TOKEN by yourself
</p>
<p>
          if (!defined(&#8220;TOKEN&#8221;)) {
</p>
<p>
              throw new Exception(&#8216;TOKEN is not defined!&#8217;);
</p>
<p>
          }
</p>
</p>
<p>
          $signature = $_GET[&#8220;signature&#8221;];
</p>
<p>
          $timestamp = $_GET[&#8220;timestamp&#8221;];
</p>
<p>
          $nonce = $_GET[&#8220;nonce&#8221;];
</p>
</p>
<p>
  		$token = TOKEN;
</p>
<p>
  		$tmpArr = array($token, $timestamp, $nonce);
</p>
<p>
          // use SORT_STRING rule
</p>
<p>
  		sort($tmpArr, SORT_STRING);
</p>
<p>
  		$tmpStr = implode( $tmpArr );
</p>
<p>
  		$tmpStr = sha1( $tmpStr );
</p>
</p>
<p>
  		if( $tmpStr == $signature ){
</p>
<p>
  			return true;
</p>
<p>
  		}else{
</p>
<p>
  			return false;
</p>
<p>
  		}
</p>
<p>
  	}
</p>
<p>
  }
</p>
<p>
  ?&gt;
</p>
<h2>4、微信接口分析</h2>
<h3>函数认识</h3>
<ul>
<li>
    函数：simplexml_load_string
  </li>
<li>
    作用：将xml字符串载入到对象中
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="396" height="526" src="/wp-content/uploads/2018/05/word-image-5184.png" class="wp-image-5711" srcset="/wp-content/uploads/2018/05/word-image-5184.png 396w, /wp-content/uploads/2018/05/word-image-5184-226x300.png 226w" sizes="(max-width: 396px) 100vw, 396px" /></p>
<ul>
<li>
    函数：sprintf()
  </li>
<li>
    作用：将字符串中的百分号替换成变量
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="496" height="152" src="/wp-content/uploads/2018/05/word-image-5185.png" class="wp-image-5712" srcset="/wp-content/uploads/2018/05/word-image-5185.png 496w, /wp-content/uploads/2018/05/word-image-5185-300x92.png 300w" sizes="(max-width: 496px) 100vw, 496px" /></p>
<h3>接口代码注释</h3>
<p>
  &lt;?php
</p>
<p>
  /**
</p>
<p>
    * wechat php test
</p>
<p>
    */
</p>
<p>
  //define your token
</p>
<p>
  //定义TOKEN秘钥，用于微信服务器和自定义服务器之间的校验
</p>
<p>
  define(&#8220;TOKEN&#8221;, &#8220;itcast&#8221;);
</p>
<p>
  //创建一个wechatObj对象
</p>
<p>
  $wechatObj = new wechatCallbackapiTest();
</p>
<p>
  //调用valid方法，用于微信开发验证和回复
</p>
<p>
  //$wechatObj-&gt;valid();
</p>
<p>
  //
</p>
<p>
  $wechatObj-&gt;responseMsg();
</p>
<p>
  class wechatCallbackapiTest
</p>
<p>
  {
</p>
<p>
  	public function valid()
</p>
<p>
      {
</p>
<p>
  		// 接受随机字符串
</p>
<p>
          $echoStr = $_GET[&#8220;echostr&#8221;];
</p>
<p>
          //valid signature , option
</p>
<p>
          if($this-&gt;checkSignature()){
</p>
<p>
          	echo $echoStr;
</p>
<p>
          	exit;
</p>
<p>
          }
</p>
<p>
      }
</p>
<p>
      public function responseMsg()
</p>
<p>
      {
</p>
<p>
  		//get post data, May be due to the different environments
</p>
<p>
  		//$GLOBALS[&#8220;HTTP_RAW_POST_DATA&#8221;]功能与$_POST功能类似，主要用于接收HTTP中的POST请求
</p>
<p>
  		//但是$GLOBALS[&#8220;HTTP_RAW_POST_DATA&#8221;]可以接收XML数据
</p>
<p>
  		$postStr = $GLOBALS[&#8220;HTTP_RAW_POST_DATA&#8221;];
</p>
<p>
        	//extract post data
</p>
<p>
  		if (!empty($postStr)){
</p>
<p>
                  /* libxml_disable_entity_loader is to prevent XML eXternal Entity Injection,
</p>
<p>
                     the best way is to check the validity of xml by yourself */
</p>
<p>
  				//安全处理：禁止引用外部xml实体， 防止XXE漏洞
</p>
<p>
              // <a href="http://www.thinkphp.cn/topic/37740.html" class="broken_link">http://www.thinkphp.cn/topic/37740.html</a>
</p>
<p>
                  libxml_disable_entity_loader(true);
</p>
<p>
  				// simplexml_load_string() 函数把 XML 字符串载入对象中
</p>
<p>
                	$postObj = simplexml_load_string($postStr, &#8216;SimpleXMLElement&#8217;, LIBXML_NOCDATA);
</p>
<p>
                  $fromUsername = $postObj-&gt;FromUserName;	// 发送方帐号（一个OpenID）
</p>
<p>
                  $toUsername = $postObj-&gt;ToUserName;		// 开发者微信号
</p>
<p>
                  $keyword = trim($postObj-&gt;Content);     // 文本消息内容
</p>
<p>
                  $time = time();
</p>
<p>
  				// 文本消息XML模板
</p>
<p>
                  $textTpl = &#8220;&lt;xml&gt;
</p>
<p>
  							&lt;ToUserName&gt;&lt;![CDATA[%s]]&gt;&lt;/ToUserName&gt;
</p>
<p>
  							&lt;FromUserName&gt;&lt;![CDATA[%s]]&gt;&lt;/FromUserName&gt;
</p>
<p>
  							&lt;CreateTime&gt;%s&lt;/CreateTime&gt;
</p>
<p>
  							&lt;MsgType&gt;&lt;![CDATA[%s]]&gt;&lt;/MsgType&gt;
</p>
<p>
  							&lt;Content&gt;&lt;![CDATA[%s]]&gt;&lt;/Content&gt;
</p>
<p>
  							&lt;FuncFlag&gt;0&lt;/FuncFlag&gt;
</p>
<p>
  							&lt;/xml&gt;&#8221;;
</p>
<p>
  				if(!empty( $keyword ))
</p>
<p>
                  {
</p>
<p>
                		$msgType = &#8220;text&#8221;;
</p>
<p>
                  	$contentStr = &#8220;Welcome to wechat world!&#8221;;
</p>
</p>
<p>
  					// 给XML模板填充数据
</p>
<p>
                  	$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $toUsername.&#8217;__&#8217;.$fromUsername);
</p>
<p>
                  	echo $resultStr;
</p>
<p>
                  }else{
</p>
<p>
                  	echo &#8220;Input something&#8230;&#8221;;
</p>
<p>
                  }
</p>
<p>
          }else {
</p>
<p>
          	echo &#8220;&#8221;;
</p>
<p>
          	exit;
</p>
<p>
          }
</p>
<p>
      }
</p>
</p>
<p>
  	// 验证数字签名
</p>
<p>
  	private function checkSignature()
</p>
<p>
  	{
</p>
<p>
          // you must define TOKEN by yourself
</p>
<p>
  		// 校验TOKEN秘钥
</p>
<p>
          if (!defined(&#8220;TOKEN&#8221;)) {
</p>
<p>
              throw new Exception(&#8216;TOKEN is not defined!&#8217;);
</p>
<p>
          }
</p>
</p>
<p>
  		// 接受数字签名
</p>
<p>
          $signature = $_GET[&#8220;signature&#8221;];
</p>
<p>
  		// 接受时间戳
</p>
<p>
          $timestamp = $_GET[&#8220;timestamp&#8221;];
</p>
<p>
  		// 接受随机数
</p>
<p>
          $nonce = $_GET[&#8220;nonce&#8221;];
</p>
</p>
<p>
  		// 定义$token 获取TOKEN秘钥
</p>
<p>
  		$token = TOKEN;
</p>
<p>
  		// token、timestamp、nonce组成数组
</p>
<p>
  		$tmpArr = array($token, $timestamp, $nonce);
</p>
<p>
          // use SORT_STRING rule
</p>
<p>
  		//数组排序
</p>
<p>
  		sort($tmpArr, SORT_STRING);
</p>
<p>
  		// 划分成字符串
</p>
<p>
  		$tmpStr = implode( $tmpArr );
</p>
<p>
  		// 通过哈希算法进行加密
</p>
<p>
  		$tmpStr = sha1( $tmpStr );
</p>
</p>
<p>
  		// 与当前发送过来的数字签名进行比对，成功返回true，否则返回false
</p>
<p>
  		if( $tmpStr == $signature ){
</p>
<p>
  			return true;
</p>
<p>
  		}else{
</p>
<p>
  			return false;
</p>
<p>
  		}
</p>
<p>
  	}
</p>
<p>
  }
</p>
<p>
  ?&gt;
</p>
<h1>六、微信的6大接收接口</h1>
<h2>︴思考：如何区分数据类型（文本、图片、语音、视频、地理、链接消息）</h2>
<p><img loading="lazy" decoding="async" width="936" height="624" src="/wp-content/uploads/2018/05/word-image-5186.png" class="wp-image-5713" srcset="/wp-content/uploads/2018/05/word-image-5186.png 936w, /wp-content/uploads/2018/05/word-image-5186-300x200.png 300w, /wp-content/uploads/2018/05/word-image-5186-768x512.png 768w" sizes="(max-width: 936px) 100vw, 936px" /></p>
<h2>2、使用php代码判断代码判断用户发送的消息类型</h2>
<p>
  需求：用户发送图片则响应图片消息，视频响应视频消息，文本响应文本消息
</p>
<p>
  发现：通过xml报文中的msgTtype可以判断类型
</p>
<p><img loading="lazy" decoding="async" width="1032" height="608" src="/wp-content/uploads/2018/05/word-image-5187.png" class="wp-image-5714" srcset="/wp-content/uploads/2018/05/word-image-5187.png 1032w, /wp-content/uploads/2018/05/word-image-5187-300x177.png 300w, /wp-content/uploads/2018/05/word-image-5187-768x452.png 768w, /wp-content/uploads/2018/05/word-image-5187-1024x603.png 1024w" sizes="(max-width: 1032px) 100vw, 1032px" /></p>
<p>
  &lt;?php
</p>
<p>
  /**
</p>
<p>
    * wechat php test
</p>
<p>
    */
</p>
<p>
  //定义token
</p>
<p>
  define(&#8220;TOKEN&#8221;, &#8220;itcast&#8221;);
</p>
<p>
  //创建wechatObj对象
</p>
<p>
  $wechatObj = new wechatCallbackapiTest();
</p>
<p>
  //校验token
</p>
<p>
  //$wechatObj-&gt;valid();  仅开启开发者模式使用一下后期不需要使用
</p>
<p>
  //调用方法响应用户数据
</p>
<p>
  $wechatObj-&gt;responseMsg();
</p>
<p>
  class wechatCallbackapiTest
</p>
<p>
  {
</p>
<p>
  	public function valid()
</p>
<p>
      {
</p>
<p>
      	//随机字符串
</p>
<p>
          $echoStr = $_GET[&#8220;echostr&#8221;];
</p>
<p>
          //校验token
</p>
<p>
          if($this-&gt;checkSignature()){
</p>
<p>
          	echo $echoStr;
</p>
<p>
          	exit;
</p>
<p>
          }
</p>
<p>
      }
</p>
<p>
      public function responseMsg()
</p>
<p>
      {
</p>
<p>
  		//get post data, May be due to the different environments
</p>
<p>
  		//和POST一样获取数据，只不过他可以获取xml数据
</p>
<p>
  		//接受微信服务器提交过来的xml报文
</p>
<p>
  		$postStr = $GLOBALS[&#8220;HTTP_RAW_POST_DATA&#8221;];
</p>
<p>
        	//extract post data
</p>
<p>
  		if (!empty($postStr)) {
</p>
<p>
                  /* libxml_disable_entity_loader is to prevent XML eXternal Entity Injection,
</p>
<p>
                     the best way is to check the validity of xml by yourself */
</p>
<p>
                  //安全处理：禁止引用外部xml实体， 防止XXE漏洞
</p>
<p>
                  // http://www.thinkphp.cn/topic/37740.html
</p>
<p>
                  libxml_disable_entity_loader(true);
</p>
<p>
                  //将xml数据转化为对象
</p>
<p>
                	$postObj = simplexml_load_string($postStr, &#8216;SimpleXMLElement&#8217;, LIBXML_NOCDATA);
</p>
<p>
                  $fromUsername = $postObj-&gt;FromUserName;   //那个用户发送的
</p>
<p>
                  $toUsername = $postObj-&gt;ToUserName;		  //发送给那个用户
</p>
<p>
                  $keyword = trim($postObj-&gt;Content);		  //发送的内容（可能是图片、文字、视频等）
</p>
<p>
                  $time = time();
</p>
<p>
                  $textTpl = &#8220;&lt;xml&gt;
</p>
<p>
  							&lt;ToUserName&gt;&lt;![CDATA[%s]]&gt;&lt;/ToUserName&gt;
</p>
<p>
  							&lt;FromUserName&gt;&lt;![CDATA[%s]]&gt;&lt;/FromUserName&gt;
</p>
<p>
  							&lt;CreateTime&gt;%s&lt;/CreateTime&gt;
</p>
<p>
  							&lt;MsgType&gt;&lt;![CDATA[%s]]&gt;&lt;/MsgType&gt;
</p>
<p>
  							&lt;Content&gt;&lt;![CDATA[%s]]&gt;&lt;/Content&gt;
</p>
<p>
  							&lt;FuncFlag&gt;0&lt;/FuncFlag&gt;
</p>
<p>
  							&lt;/xml&gt;&#8221;; //被动回复文本xml报文
</p>
</p>
<p>
                  //根据消息xml报文的MsgType参数判断请求文件类型
</p>
<p>
              	switch ($postObj-&gt;MsgType) {
</p>
<p>
                      case &#8216;text&#8217;:
</p>
<p>
                          $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, &#8220;text&#8221;, &#8216;文本消息&#8217;);
</p>
<p>
                          break;
</p>
<p>
                      case &#8216;image&#8217;:
</p>
<p>
                          $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, &#8220;text&#8221;, &#8216;图片消息&#8217;);
</p>
<p>
                          break;
</p>
<p>
                      case &#8216;voice&#8217;:
</p>
<p>
                          $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, &#8220;text&#8221;, &#8216;语法消息&#8217;);
</p>
<p>
                          break;
</p>
<p>
                      case &#8216;video&#8217;:
</p>
<p>
                          $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, &#8220;text&#8221;, &#8216;视频消息&#8217;);
</p>
<p>
                          break;
</p>
<p>
                      case &#8216;shortvideo&#8217;:
</p>
<p>
                          $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, &#8220;text&#8221;, &#8216;小视频消息&#8217;);
</p>
<p>
                          break;
</p>
<p>
                      case &#8216;location&#8217;:
</p>
<p>
                          $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, &#8220;text&#8221;, &#8216;位置消息&#8217;);
</p>
<p>
                          break;
</p>
<p>
                      case &#8216;link&#8217;:
</p>
<p>
                          $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, &#8220;text&#8221;, &#8216;链接消息&#8217;);
</p>
<p>
                          break;
</p>
<p>
                      default:
</p>
<p>
                          $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, &#8220;text&#8221;, &#8216;滚！&#8217;);
</p>
<p>
                          break;
</p>
<p>
                  }
</p>
<p>
              	echo $resultStr;
</p>
<p>
          }else {
</p>
<p>
          	echo &#8220;&#8221;;
</p>
<p>
          	exit;
</p>
<p>
          }
</p>
<p>
      }
</p>
</p>
<p>
  	private function checkSignature()
</p>
<p>
  	{
</p>
<p>
          //检测token是否定义
</p>
<p>
          if (!defined(&#8220;TOKEN&#8221;)) {
</p>
<p>
              throw new Exception(&#8216;TOKEN is not defined!&#8217;);
</p>
<p>
          }
</p>
</p>
<p>
          //微信加密签名，signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
</p>
<p>
          $signature = $_GET[&#8220;signature&#8221;];
</p>
<p>
          //时间戳
</p>
<p>
          $timestamp = $_GET[&#8220;timestamp&#8221;];
</p>
<p>
          //随机数
</p>
<p>
          $nonce = $_GET[&#8220;nonce&#8221;];
</p>
<p>
          //将一个常量的值赋给$token变量
</p>
<p>
  		$token = TOKEN;
</p>
<p>
  		//将token、时间戳、随机数放到一个数组中
</p>
<p>
  		$tmpArr = array($token, $timestamp, $nonce);
</p>
<p>
          //给数组排序
</p>
<p>
  		sort($tmpArr, SORT_STRING);
</p>
<p>
  		//将数组转化为字符串
</p>
<p>
  		$tmpStr = implode( $tmpArr );
</p>
<p>
  		//哈希加密
</p>
<p>
  		$tmpStr = sha1( $tmpStr );
</p>
</p>
<p>
  		if( $tmpStr == $signature ){
</p>
<p>
  			return true;
</p>
<p>
  		}else{
</p>
<p>
  			return false;
</p>
<p>
  		}
</p>
<p>
  	}
</p>
<p>
  }
</p>
<p>
  ?&gt;
</p>
<h2>■ 代码（封装优化）</h2>
<p><img loading="lazy" decoding="async" width="1189" height="592" src="/wp-content/uploads/2018/05/word-image-5188.png" class="wp-image-5715" srcset="/wp-content/uploads/2018/05/word-image-5188.png 1189w, /wp-content/uploads/2018/05/word-image-5188-300x149.png 300w, /wp-content/uploads/2018/05/word-image-5188-768x382.png 768w, /wp-content/uploads/2018/05/word-image-5188-1024x510.png 1024w" sizes="(max-width: 1189px) 100vw, 1189px" /></p>
<p>
  &lt;?php
</p>
<p>
  /**
</p>
<p>
    * wechat php test
</p>
<p>
    */
</p>
<p>
  //定义token
</p>
<p>
  define(&#8220;TOKEN&#8221;, &#8220;itcast&#8221;);
</p>
<p>
  //创建wechatObj对象
</p>
<p>
  $wechatObj = new wechatCallbackapiTest();
</p>
<p>
  //校验token
</p>
<p>
  //$wechatObj-&gt;valid();  仅开启开发者模式使用一下后期不需要使用
</p>
<p>
  //调用方法响应用户数据
</p>
<p>
  $wechatObj-&gt;responseMsg();
</p>
<p>
  class wechatCallbackapiTest
</p>
<p>
  {
</p>
<p>
  	public function valid()
</p>
<p>
      {
</p>
<p>
      	//随机字符串
</p>
<p>
          $echoStr = $_GET[&#8220;echostr&#8221;];
</p>
<p>
          //校验token
</p>
<p>
          if($this-&gt;checkSignature()){
</p>
<p>
          	echo $echoStr;
</p>
<p>
          	exit;
</p>
<p>
          }
</p>
<p>
      }
</p>
<p>
      public function responseMsg()
</p>
<p>
      {
</p>
<p>
  		//get post data, May be due to the different environments
</p>
<p>
  		//和POST一样获取数据，只不过他可以获取xml数据
</p>
<p>
  		//接受微信服务器提交过来的xml报文
</p>
<p>
  		$postStr = $GLOBALS[&#8220;HTTP_RAW_POST_DATA&#8221;];
</p>
<p>
        	//extract post data
</p>
<p>
  		if (!empty($postStr)) {
</p>
<p>
                  /* libxml_disable_entity_loader is to prevent XML eXternal Entity Injection,
</p>
<p>
                     the best way is to check the validity of xml by yourself */
</p>
<p>
                  //安全处理：禁止引用外部xml实体， 防止XXE漏洞
</p>
<p>
                  // http://www.thinkphp.cn/topic/37740.html
</p>
<p>
                  libxml_disable_entity_loader(true);
</p>
<p>
                  //将xml数据转化为对象
</p>
<p>
                	$postObj = simplexml_load_string($postStr, &#8216;SimpleXMLElement&#8217;, LIBXML_NOCDATA);
</p>
<p>
                  $fromUsername = $postObj-&gt;FromUserName;   //发送者：那个用户发送的
</p>
<p>
                  $toUsername = $postObj-&gt;ToUserName;		  //接受者：发送给那个用户
</p>
<p>
                  $keyword = trim($postObj-&gt;Content);		  //发送的内容（可能是图片、文字、视频等）
</p>
</p>
<p>
                  //根据消息xml报文的MsgType参数判断请求文件类型
</p>
<p>
              	switch ($postObj-&gt;MsgType) {
</p>
<p>
                      case &#8216;text&#8217;:
</p>
<p>
                          $this-&gt;sendText($fromUsername, $toUsername, &#8216;文本消息&#8217;);
</p>
<p>
                          break;
</p>
<p>
                      case &#8216;image&#8217;:
</p>
<p>
                          $this-&gt;sendText($fromUsername, $toUsername, &#8216;图片消息&#8217;);
</p>
<p>
                          break;
</p>
<p>
                      case &#8216;voice&#8217;:
</p>
<p>
                          $this-&gt;sendText($fromUsername, $toUsername, &#8216;语音消息&#8217;);
</p>
<p>
                          break;
</p>
<p>
                      case &#8216;video&#8217;:
</p>
<p>
                          $this-&gt;sendText($fromUsername, $toUsername, &#8216;视频消息&#8217;);
</p>
<p>
                          break;
</p>
<p>
                      case &#8216;shortvideo&#8217;:
</p>
<p>
                          $this-&gt;sendText($fromUsername, $toUsername, &#8216;小视频消息&#8217;);
</p>
<p>
                          break;
</p>
<p>
                      case &#8216;location&#8217;:
</p>
<p>
                          $this-&gt;sendText($fromUsername, $toUsername, &#8216;位置消息&#8217;);
</p>
<p>
                          break;
</p>
<p>
                      case &#8216;link&#8217;:
</p>
<p>
                          $this-&gt;sendText($fromUsername, $toUsername, &#8216;链接消息&#8217;);
</p>
<p>
                          break;
</p>
<p>
                      default:
</p>
<p>
                          $this-&gt;sendText($fromUsername, $toUsername, &#8216;滚！&#8217;);
</p>
<p>
                          break;
</p>
<p>
                  }
</p>
<p>
          }else {
</p>
<p>
          	echo &#8220;&#8221;;
</p>
<p>
          	exit;
</p>
<p>
          }
</p>
<p>
      }
</p>
<p>
   <strong>   /**</strong>
</p>
<p><strong>     * @param stirng $fromUsername 接受消息的用户</strong>
</p>
<p><strong>     * @param stirng $toUsername   发送消息的用户</strong>
</p>
<p><strong>     * @param stirng $content      内容</strong>
</p>
<p><strong>     */</strong>
</p>
<p><strong>    private function sendText($fromUsername, $toUsername, $content)</strong>
</p>
<p><strong>    {</strong>
</p>
<p><strong>        $time = time(); </strong>
</p>
<p><strong>        $textTpl = &#8220;&lt;xml&gt;</strong>
</p>
<p><strong>                    &lt;ToUserName&gt;&lt;![CDATA[%s]]&gt;&lt;/ToUserName&gt;</strong>
</p>
<p><strong>                    &lt;FromUserName&gt;&lt;![CDATA[%s]]&gt;&lt;/FromUserName&gt;</strong>
</p>
<p><strong>                    &lt;CreateTime&gt;%s&lt;/CreateTime&gt;</strong>
</p>
<p><strong>                    &lt;MsgType&gt;&lt;![CDATA[%s]]&gt;&lt;/MsgType&gt;</strong>
</p>
<p><strong>                    &lt;Content&gt;&lt;![CDATA[%s]]&gt;&lt;/Content&gt;</strong>
</p>
<p><strong>                    &lt;FuncFlag&gt;0&lt;/FuncFlag&gt;</strong>
</p>
<p><strong>                    &lt;/xml&gt;&#8221;; //被动回复文本xml报文    </strong>
</p>
<p><strong>        $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, &#8220;text&#8221;, $content);</strong>
</p>
<p><strong>        echo  $resultStr;</strong>
</p>
<p><strong>    }</strong>
</p>
</p>
<p>
  	private function checkSignature()
</p>
<p>
  	{
</p>
<p>
          //检测token是否定义
</p>
<p>
          if (!defined(&#8220;TOKEN&#8221;)) {
</p>
<p>
              throw new Exception(&#8216;TOKEN is not defined!&#8217;);
</p>
<p>
          }
</p>
</p>
<p>
          //微信加密签名，signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
</p>
<p>
          $signature = $_GET[&#8220;signature&#8221;];
</p>
<p>
          //时间戳
</p>
<p>
          $timestamp = $_GET[&#8220;timestamp&#8221;];
</p>
<p>
          //随机数
</p>
<p>
          $nonce = $_GET[&#8220;nonce&#8221;];
</p>
<p>
          //将一个常量的值赋给$token变量
</p>
<p>
  		$token = TOKEN;
</p>
<p>
  		//将token、时间戳、随机数放到一个数组中
</p>
<p>
  		$tmpArr = array($token, $timestamp, $nonce);
</p>
<p>
          //给数组排序
</p>
<p>
  		sort($tmpArr, SORT_STRING);
</p>
<p>
  		//将数组转化为字符串
</p>
<p>
  		$tmpStr = implode( $tmpArr );
</p>
<p>
  		//哈希加密
</p>
<p>
  		$tmpStr = sha1( $tmpStr );
</p>
</p>
<p>
  		if( $tmpStr == $signature ){
</p>
<p>
  			return true;
</p>
<p>
  		}else{
</p>
<p>
  			return false;
</p>
<p>
  		}
</p>
<p>
  	}
</p>
<p>
  }
</p>
<p>
  ?&gt;
</p>
<h1>七、微信订阅回复接口</h1>
<h2><a id="post-5626-_Toc475986511"></a>1、订阅回复接口（关注回复接口）</h2>
<p><img loading="lazy" decoding="async" width="870" height="678" src="/wp-content/uploads/2018/05/word-image-5189.png" class="wp-image-5716" srcset="/wp-content/uploads/2018/05/word-image-5189.png 870w, /wp-content/uploads/2018/05/word-image-5189-300x234.png 300w, /wp-content/uploads/2018/05/word-image-5189-768x599.png 768w" sizes="(max-width: 870px) 100vw, 870px" /><br />
<img loading="lazy" decoding="async" width="847" height="454" src="/wp-content/uploads/2018/05/word-image-5190.png" class="wp-image-5717" srcset="/wp-content/uploads/2018/05/word-image-5190.png 847w, /wp-content/uploads/2018/05/word-image-5190-300x161.png 300w, /wp-content/uploads/2018/05/word-image-5190-768x412.png 768w" sizes="(max-width: 847px) 100vw, 847px" /></p>
<h2><a id="post-5626-_Toc475986513"></a>2、编写PHP代码判断订阅回复</h2>
<p><img loading="lazy" decoding="async" width="892" height="519" src="/wp-content/uploads/2018/05/word-image-5191.png" class="wp-image-5718" srcset="/wp-content/uploads/2018/05/word-image-5191.png 892w, /wp-content/uploads/2018/05/word-image-5191-300x175.png 300w, /wp-content/uploads/2018/05/word-image-5191-768x447.png 768w" sizes="(max-width: 892px) 100vw, 892px" /></p>
<p>
  &lt;?php
</p>
<p>
  /**
</p>
<p>
    * wechat php test
</p>
<p>
    */
</p>
<p>
  //定义token
</p>
<p>
  define(&#8220;TOKEN&#8221;, &#8220;itcast&#8221;);
</p>
<p>
  //创建wechatObj对象
</p>
<p>
  $wechatObj = new wechatCallbackapiTest();
</p>
<p>
  //校验token
</p>
<p>
  //$wechatObj-&gt;valid();  仅开启开发者模式使用一下后期不需要使用
</p>
<p>
  //调用方法响应用户数据
</p>
<p>
  $wechatObj-&gt;responseMsg();
</p>
<p>
  class wechatCallbackapiTest
</p>
<p>
  {
</p>
<p>
  	public function valid()
</p>
<p>
      {
</p>
<p>
      	//随机字符串
</p>
<p>
          $echoStr = $_GET[&#8220;echostr&#8221;];
</p>
<p>
          //校验token
</p>
<p>
          if($this-&gt;checkSignature()){
</p>
<p>
          	echo $echoStr;
</p>
<p>
          	exit;
</p>
<p>
          }
</p>
<p>
      }
</p>
<p>
      public function responseMsg()
</p>
<p>
      {
</p>
<p>
  		//get post data, May be due to the different environments
</p>
<p>
  		//和POST一样获取数据，只不过他可以获取xml数据
</p>
<p>
  		//接受微信服务器提交过来的xml报文
</p>
<p>
  		$postStr = $GLOBALS[&#8220;HTTP_RAW_POST_DATA&#8221;];
</p>
<p>
        	//extract post data
</p>
<p>
  		if (!empty($postStr)) {
</p>
<p>
                  /* libxml_disable_entity_loader is to prevent XML eXternal Entity Injection,
</p>
<p>
                     the best way is to check the validity of xml by yourself */
</p>
<p>
                  //安全处理：禁止引用外部xml实体， 防止XXE漏洞
</p>
<p>
                  // http://www.thinkphp.cn/topic/37740.html
</p>
<p>
                  libxml_disable_entity_loader(true);
</p>
<p>
                  //将xml数据转化为对象
</p>
<p>
                	$postObj = simplexml_load_string($postStr, &#8216;SimpleXMLElement&#8217;, LIBXML_NOCDATA);
</p>
<p>
                  $fromUsername = $postObj-&gt;FromUserName;   //发送者：那个用户发送的
</p>
<p>
                  $toUsername = $postObj-&gt;ToUserName;		  //接受者：发送给那个用户
</p>
<p>
                  $keyword = trim($postObj-&gt;Content);		  //发送的内容（可能是图片、文字、视频等）
</p>
</p>
<p>
                  //根据消息xml报文的MsgType参数判断请求文件类型
</p>
<p>
              	switch ($postObj-&gt;MsgType) {
</p>
<p>
                      <strong>case &#8216;event&#8217;:</strong>
</p>
<p><strong>                        //Event 事件类型，subscribe(订阅)、unsubscribe(取消订阅)</strong>
</p>
<p><strong>                        if ($postObj-&gt;Event == &#8216;subscribe&#8217;) {</strong>
</p>
<p><strong>                            $this-&gt;sendText($fromUsername, $toUsername, &#8216;感谢老板关注，需要xx请服务1&#8217;);</strong>
</p>
<p><strong>                        } else {</strong>
</p>
<p><strong>                            //后期项目封装可能需要修改数据库</strong>
</p>
<p><strong>                        }</strong>
</p>
<p><strong>                        break;</strong>
</p>
<p>
                      case &#8216;text&#8217;:
</p>
<p>
                          $this-&gt;sendText($fromUsername, $toUsername, &#8216;文本消息&#8217;);
</p>
<p>
                          break;
</p>
<p>
                      case &#8216;image&#8217;:
</p>
<p>
                          $this-&gt;sendText($fromUsername, $toUsername, &#8216;图片消息&#8217;);
</p>
<p>
                          break;
</p>
<p>
                      case &#8216;voice&#8217;:
</p>
<p>
                          $this-&gt;sendText($fromUsername, $toUsername, &#8216;语音消息&#8217;);
</p>
<p>
                          break;
</p>
<p>
                      case &#8216;video&#8217;:
</p>
<p>
                          $this-&gt;sendText($fromUsername, $toUsername, &#8216;视频消息&#8217;);
</p>
<p>
                          break;
</p>
<p>
                      case &#8216;shortvideo&#8217;:
</p>
<p>
                          $this-&gt;sendText($fromUsername, $toUsername, &#8216;小视频消息&#8217;);
</p>
<p>
                          break;
</p>
<p>
                      case &#8216;location&#8217;:
</p>
<p>
                          $this-&gt;sendText($fromUsername, $toUsername, &#8216;位置消息&#8217;);
</p>
<p>
                          break;
</p>
<p>
                      case &#8216;link&#8217;:
</p>
<p>
                          $this-&gt;sendText($fromUsername, $toUsername, &#8216;链接消息&#8217;);
</p>
<p>
                          break;
</p>
<p>
                      default:
</p>
<p>
                          $this-&gt;sendText($fromUsername, $toUsername, &#8216;滚！&#8217;);
</p>
<p>
                          break;
</p>
<p>
                  }
</p>
<p>
          }else {
</p>
<p>
          	echo &#8220;&#8221;;
</p>
<p>
          	exit;
</p>
<p>
          }
</p>
<p>
      }
</p>
<p>
      /**
</p>
<p>
       * @param stirng $fromUsername 接受消息的用户
</p>
<p>
       * @param stirng $toUsername   发送消息的用户
</p>
<p>
       * @param stirng $content      内容
</p>
<p>
       */
</p>
<p>
      private function sendText($fromUsername, $toUsername, $content)
</p>
<p>
      {
</p>
<p>
          $time = time();
</p>
<p>
          $textTpl = &#8220;&lt;xml&gt;
</p>
<p>
                      &lt;ToUserName&gt;&lt;![CDATA[%s]]&gt;&lt;/ToUserName&gt;
</p>
<p>
                      &lt;FromUserName&gt;&lt;![CDATA[%s]]&gt;&lt;/FromUserName&gt;
</p>
<p>
                      &lt;CreateTime&gt;%s&lt;/CreateTime&gt;
</p>
<p>
                      &lt;MsgType&gt;&lt;![CDATA[%s]]&gt;&lt;/MsgType&gt;
</p>
<p>
                      &lt;Content&gt;&lt;![CDATA[%s]]&gt;&lt;/Content&gt;
</p>
<p>
                      &lt;FuncFlag&gt;0&lt;/FuncFlag&gt;
</p>
<p>
                      &lt;/xml&gt;&#8221;; //被动回复文本xml报文
</p>
<p>
          $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, &#8220;text&#8221;, $content);
</p>
<p>
          echo  $resultStr;
</p>
<p>
      }
</p>
</p>
<p>
  	private function checkSignature()
</p>
<p>
  	{
</p>
<p>
          //检测token是否定义
</p>
<p>
          if (!defined(&#8220;TOKEN&#8221;)) {
</p>
<p>
              throw new Exception(&#8216;TOKEN is not defined!&#8217;);
</p>
<p>
          }
</p>
</p>
<p>
          //微信加密签名，signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
</p>
<p>
          $signature = $_GET[&#8220;signature&#8221;];
</p>
<p>
          //时间戳
</p>
<p>
          $timestamp = $_GET[&#8220;timestamp&#8221;];
</p>
<p>
          //随机数
</p>
<p>
          $nonce = $_GET[&#8220;nonce&#8221;];
</p>
<p>
          //将一个常量的值赋给$token变量
</p>
<p>
  		$token = TOKEN;
</p>
<p>
  		//将token、时间戳、随机数放到一个数组中
</p>
<p>
  		$tmpArr = array($token, $timestamp, $nonce);
</p>
<p>
          //给数组排序
</p>
<p>
  		sort($tmpArr, SORT_STRING);
</p>
<p>
  		//将数组转化为字符串
</p>
<p>
  		$tmpStr = implode( $tmpArr );
</p>
<p>
  		//哈希加密
</p>
<p>
  		$tmpStr = sha1( $tmpStr );
</p>
</p>
<p>
  		if( $tmpStr == $signature ){
</p>
<p>
  			return true;
</p>
<p>
  		}else{
</p>
<p>
  			return false;
</p>
<p>
  		}
</p>
<p>
  	}
</p>
<p>
  }
</p>
<p>
  ?&gt;
</p>
<h1>八、微信消息的6大回复接口</h1>
<h2>1、回复文本接口</h2>
<h3>1）xml报文</h3>
<p><img loading="lazy" decoding="async" width="240" height="398" src="/wp-content/uploads/2018/05/word-image-5192.png" class="wp-image-5719" srcset="/wp-content/uploads/2018/05/word-image-5192.png 240w, /wp-content/uploads/2018/05/word-image-5192-181x300.png 181w" sizes="(max-width: 240px) 100vw, 240px" /><br />
<img loading="lazy" decoding="async" width="533" height="313" src="/wp-content/uploads/2018/05/word-image-5193.png" class="wp-image-5720" srcset="/wp-content/uploads/2018/05/word-image-5193.png 533w, /wp-content/uploads/2018/05/word-image-5193-300x176.png 300w" sizes="(max-width: 533px) 100vw, 533px" /></p>
<h3>2）代码</h3>
<p><img loading="lazy" decoding="async" width="730" height="374" src="/wp-content/uploads/2018/05/word-image-5194.png" class="wp-image-5721" srcset="/wp-content/uploads/2018/05/word-image-5194.png 730w, /wp-content/uploads/2018/05/word-image-5194-300x154.png 300w" sizes="(max-width: 730px) 100vw, 730px" /></p>
<p>
  /**
</p>
<p>
   * @param stirng $fromUsername 接受消息的用户
</p>
<p>
   * @param stirng $toUsername   发送消息的用户
</p>
<p>
   * @param stirng $content      内容
</p>
<p>
   */
</p>
<p>
  private function sendText($fromUsername, $toUsername, $content)
</p>
<p>
  {
</p>
<p>
      $time = time();
</p>
<p>
      $textTpl = &#8220;&lt;xml&gt;
</p>
<p>
                  &lt;ToUserName&gt;&lt;![CDATA[%s]]&gt;&lt;/ToUserName&gt;
</p>
<p>
                  &lt;FromUserName&gt;&lt;![CDATA[%s]]&gt;&lt;/FromUserName&gt;
</p>
<p>
                  &lt;CreateTime&gt;%s&lt;/CreateTime&gt;
</p>
<p>
                  &lt;MsgType&gt;&lt;![CDATA[%s]]&gt;&lt;/MsgType&gt;
</p>
<p>
                  &lt;Content&gt;&lt;![CDATA[%s]]&gt;&lt;/Content&gt;
</p>
<p>
                  &lt;FuncFlag&gt;0&lt;/FuncFlag&gt;
</p>
<p>
                  &lt;/xml&gt;&#8221;; //被动回复文本xml报文
</p>
<p>
      $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, &#8220;text&#8221;, $content);
</p>
<p>
      echo  $resultStr;
</p>
<p>
  }
</p>
<h2>2、回复图片、语音、视频消息</h2>
<h3>1）图片xml报文</h3>
<p><img loading="lazy" decoding="async" width="462" height="270" src="/wp-content/uploads/2018/05/word-image-5195.png" class="wp-image-5722" srcset="/wp-content/uploads/2018/05/word-image-5195.png 462w, /wp-content/uploads/2018/05/word-image-5195-300x175.png 300w" sizes="(max-width: 462px) 100vw, 462px" /></p>
<p>
  &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-
</p>
<p>
  【获取Mediald】
</p>
<p><img loading="lazy" decoding="async" width="613" height="66" src="/wp-content/uploads/2018/05/word-image-5196.png" class="wp-image-5723" srcset="/wp-content/uploads/2018/05/word-image-5196.png 613w, /wp-content/uploads/2018/05/word-image-5196-300x32.png 300w" sizes="(max-width: 613px) 100vw, 613px" /></p>
<p>
  步骤1：
</p>
<p><img loading="lazy" decoding="async" width="287" height="131" src="/wp-content/uploads/2018/05/word-image-5197.png" class="wp-image-5724" /><br />
<img loading="lazy" decoding="async" width="423" height="175" src="/wp-content/uploads/2018/05/word-image-5198.png" class="wp-image-5725" srcset="/wp-content/uploads/2018/05/word-image-5198.png 423w, /wp-content/uploads/2018/05/word-image-5198-300x124.png 300w" sizes="(max-width: 423px) 100vw, 423px" /></p>
<p><a href="https://mp.weixin.qq.com/debug/cgi-bin/apiinfo?t=index&amp;type=基础支持">https://mp.weixin.qq.com/debug/cgi-bin/apiinfo?t=index&amp;type=基础支持</a>
</p>
<p><img loading="lazy" decoding="async" width="1087" height="602" src="/wp-content/uploads/2018/05/word-image-5199.png" class="wp-image-5726" srcset="/wp-content/uploads/2018/05/word-image-5199.png 1087w, /wp-content/uploads/2018/05/word-image-5199-300x166.png 300w, /wp-content/uploads/2018/05/word-image-5199-768x425.png 768w, /wp-content/uploads/2018/05/word-image-5199-1024x567.png 1024w" sizes="(max-width: 1087px) 100vw, 1087px" /><br />
<img loading="lazy" decoding="async" width="1200" height="709" src="/wp-content/uploads/2018/05/word-image-5200.png" class="wp-image-5727" srcset="/wp-content/uploads/2018/05/word-image-5200.png 1200w, /wp-content/uploads/2018/05/word-image-5200-300x177.png 300w, /wp-content/uploads/2018/05/word-image-5200-768x454.png 768w, /wp-content/uploads/2018/05/word-image-5200-1024x605.png 1024w" sizes="(max-width: 1200px) 100vw, 1200px" /></p>
<h3>2）代码</h3>
<p>
  Eg2F6ND63LqjRvlOdaEV_lxGjgO9KIRDZm8e54hcTYH-P-FyBZA55FNad8a8pQMA
</p>
<p><img loading="lazy" decoding="async" width="851" height="445" src="/wp-content/uploads/2018/05/word-image-5201.png" class="wp-image-5728" srcset="/wp-content/uploads/2018/05/word-image-5201.png 851w, /wp-content/uploads/2018/05/word-image-5201-300x157.png 300w, /wp-content/uploads/2018/05/word-image-5201-768x402.png 768w" sizes="(max-width: 851px) 100vw, 851px" /></p>
<h3>视频xml报文</h3>
<p><img loading="lazy" decoding="async" width="452" height="347" src="/wp-content/uploads/2018/05/word-image-5202.png" class="wp-image-5729" srcset="/wp-content/uploads/2018/05/word-image-5202.png 452w, /wp-content/uploads/2018/05/word-image-5202-300x230.png 300w" sizes="(max-width: 452px) 100vw, 452px" /></p>
<h3>代码</h3>
<p><img loading="lazy" decoding="async" width="991" height="531" src="/wp-content/uploads/2018/05/word-image-5203.png" class="wp-image-5730" srcset="/wp-content/uploads/2018/05/word-image-5203.png 991w, /wp-content/uploads/2018/05/word-image-5203-300x161.png 300w, /wp-content/uploads/2018/05/word-image-5203-768x412.png 768w" sizes="(max-width: 991px) 100vw, 991px" /></p>
<h2>3、音乐回复接口</h2>
<h3>1）xml报文</h3>
<p><img loading="lazy" decoding="async" width="541" height="374" src="/wp-content/uploads/2018/05/word-image-5204.png" class="wp-image-5731" srcset="/wp-content/uploads/2018/05/word-image-5204.png 541w, /wp-content/uploads/2018/05/word-image-5204-300x207.png 300w" sizes="(max-width: 541px) 100vw, 541px" /></p>
<h3>2）代码</h3>
<p><img loading="lazy" decoding="async" width="1118" height="542" src="/wp-content/uploads/2018/05/word-image-5205.png" class="wp-image-5732" srcset="/wp-content/uploads/2018/05/word-image-5205.png 1118w, /wp-content/uploads/2018/05/word-image-5205-300x145.png 300w, /wp-content/uploads/2018/05/word-image-5205-768x372.png 768w, /wp-content/uploads/2018/05/word-image-5205-1024x496.png 1024w" sizes="(max-width: 1118px) 100vw, 1118px" /></p>
<h2>4、图文回复接口（重点重点）</h2>
<h3>1）xml报文</h3>
<p><img loading="lazy" decoding="async" width="529" height="529" src="/wp-content/uploads/2018/05/word-image-5206.png" class="wp-image-5733" srcset="/wp-content/uploads/2018/05/word-image-5206.png 529w, /wp-content/uploads/2018/05/word-image-5206-150x150.png 150w, /wp-content/uploads/2018/05/word-image-5206-300x300.png 300w" sizes="(max-width: 529px) 100vw, 529px" /></p>
<h3>2）代码</h3>
<p>
      <strong>/**</strong>
</p>
<p><strong>     * 响应图文（优化版）</strong>
</p>
<p><strong>     * @param stirng $fromUsername 接受消息的用户</strong>
</p>
<p><strong>     * @param stirng $toUsername   发送消息的用户</strong>
</p>
<p><strong>     * @param array  $arr          图文消息二位数组（注；第二层数组字段 title,desc,picurl,url）</strong>
</p>
<p><strong>     */</strong>
</p>
<p><strong>    private function sendImgArticle($fromUsername, $toUsername, $arr)</strong>
</p>
<p><strong>    {</strong>
</p>
<p><strong>        $textTpl = &#8220;&lt;xml&gt;</strong>
</p>
<p><strong>        &lt;ToUserName&gt;&lt;![CDATA[%s]]&gt;&lt;/ToUserName&gt;</strong>
</p>
<p><strong>        &lt;FromUserName&gt;&lt;![CDATA[%s]]&gt;&lt;/FromUserName&gt;</strong>
</p>
<p><strong>        &lt;CreateTime&gt;%s&lt;/CreateTime&gt;</strong>
</p>
<p><strong>        &lt;MsgType&gt;&lt;![CDATA[news]]&gt;&lt;/MsgType&gt;</strong>
</p>
<p><strong>        &lt;ArticleCount&gt;%s&lt;/ArticleCount&gt;</strong>
</p>
<p><strong>        &lt;Articles&gt;&#8221;;</strong>
</p>
<p><strong>        foreach ($arr as $img) {</strong>
</p>
<p><strong>            $textTpl .= &#8220;&lt;item&gt;</strong>
</p>
<p><strong>            &lt;Title&gt;&lt;![CDATA[{$img[&#8216;title&#8217;]}]]&gt;&lt;/Title&gt; </strong>
</p>
<p><strong>            &lt;Description&gt;&lt;![CDATA[{$img[&#8216;desc&#8217;]}]]&gt;&lt;/Description&gt;</strong>
</p>
<p><strong>            &lt;PicUrl&gt;&lt;![CDATA[{$img[&#8216;picurl&#8217;]}]]&gt;&lt;/PicUrl&gt;</strong>
</p>
<p><strong>            &lt;Url&gt;&lt;![CDATA[{$img[&#8216;url&#8217;]}]]&gt;&lt;/Url&gt;</strong>
</p>
<p><strong>            &lt;/item&gt;&#8221;;</strong>
</p>
<p><strong>        }</strong>
</p>
<p><strong>        $textTpl .= &#8220;&lt;/Articles&gt;</strong>
</p>
<p><strong>        &lt;/xml&gt;&#8221;; </strong>
</p>
<p><strong>        $resultStr = sprintf($textTpl, $fromUsername, $toUsername, time(), count($arr));</strong>
</p>
<p><strong>        echo  $resultStr;</strong>
</p>
<p><strong>    }</strong>
</p>
<p>
      /**
</p>
<p>
       * 响应单图文
</p>
<p>
       * @param stirng $fromUsername 接受消息的用户
</p>
<p>
       * @param stirng $toUsername   发送消息的用户
</p>
<p>
       */
</p>
<p>
      private function <strong>sendImgArticle1</strong>($fromUsername, $toUsername)
</p>
<p>
      {
</p>
<p>
          $textTpl = &#8220;&lt;xml&gt;
</p>
<p>
          &lt;ToUserName&gt;&lt;![CDATA[%s]]&gt;&lt;/ToUserName&gt;
</p>
<p>
          &lt;FromUserName&gt;&lt;![CDATA[%s]]&gt;&lt;/FromUserName&gt;
</p>
<p>
          &lt;CreateTime&gt;%s&lt;/CreateTime&gt;
</p>
<p>
          &lt;MsgType&gt;&lt;![CDATA[news]]&gt;&lt;/MsgType&gt;
</p>
<p>
          &lt;ArticleCount&gt;%s&lt;/ArticleCount&gt;
</p>
<p>
          &lt;Articles&gt;
</p>
<p>
          &lt;item&gt;
</p>
<p>
          &lt;Title&gt;&lt;![CDATA[%s]]&gt;&lt;/Title&gt;
</p>
<p>
          &lt;Description&gt;&lt;![CDATA[%s]]&gt;&lt;/Description&gt;
</p>
<p>
          &lt;PicUrl&gt;&lt;![CDATA[%s]]&gt;&lt;/PicUrl&gt;
</p>
<p>
          &lt;Url&gt;&lt;![CDATA[%s]]&gt;&lt;/Url&gt;
</p>
<p>
          &lt;/item&gt;
</p>
<p>
          &lt;/Articles&gt;
</p>
<p>
          &lt;/xml&gt;&#8221;;
</p>
<p>
          $imgCount = 1;
</p>
<p>
          $title = &#8216;单图文&#8217;;
</p>
<p>
          $desc = &#8216;xxx&#8217;;
</p>
<p>
          $picurl = &#8216;http://47.52.95.83/zhaoxiaokang/img/b1.jpg&#8217;;
</p>
<p>
          $url = &#8216;http://baidu.com&/#8217;;
</p>
<p>
          $resultStr = sprintf($textTpl, $fromUsername, $toUsername, time(), $imgCount, $title, $desc, $picurl, $url);
</p>
<p>
          echo  $resultStr;
</p>
<p>
      }
</p>
<p>
      /**
</p>
<p>
       * 响应多图文
</p>
<p>
       * @param stirng $fromUsername 接受消息的用户
</p>
<p>
       * @param stirng $toUsername   发送消息的用户
</p>
<p>
       */
</p>
<p>
      private function <strong>sendImgArticleN</strong>($fromUsername, $toUsername)
</p>
<p>
      {
</p>
<p>
          $textTpl = &#8220;&lt;xml&gt;
</p>
<p>
          &lt;ToUserName&gt;&lt;![CDATA[%s]]&gt;&lt;/ToUserName&gt;
</p>
<p>
          &lt;FromUserName&gt;&lt;![CDATA[%s]]&gt;&lt;/FromUserName&gt;
</p>
<p>
          &lt;CreateTime&gt;%s&lt;/CreateTime&gt;
</p>
<p>
          &lt;MsgType&gt;&lt;![CDATA[news]]&gt;&lt;/MsgType&gt;
</p>
<p>
          &lt;ArticleCount&gt;3&lt;/ArticleCount&gt;
</p>
<p>
          &lt;Articles&gt;
</p>
<p>
          &lt;item&gt;
</p>
<p>
          &lt;Title&gt;&lt;![CDATA[大图]]&gt;&lt;/Title&gt;
</p>
<p>
          &lt;Description&gt;&lt;![CDATA[bigimg]]&gt;&lt;/Description&gt;
</p>
<p>
          &lt;PicUrl&gt;&lt;![CDATA[http://47.52.95.83/zhaoxiaokang/img/b1.jpg]]&gt;&lt;/PicUrl&gt;
</p>
<p>
          &lt;Url&gt;&lt;![CDATA[http://baidu.com]]&gt;&lt;/Url&gt;
</p>
<p>
          &lt;/item&gt;
</p>
<p>
          &lt;item&gt;
</p>
<p>
          &lt;Title&gt;&lt;![CDATA[小图1]]&gt;&lt;/Title&gt;
</p>
<p>
          &lt;Description&gt;&lt;![CDATA[one]]&gt;&lt;/Description&gt;
</p>
<p>
          &lt;PicUrl&gt;&lt;![CDATA[http://47.52.95.83/zhaoxiaokang/img/one.png]]&gt;&lt;/PicUrl&gt;
</p>
<p>
          &lt;Url&gt;&lt;![CDATA[http://baidu.com]]&gt;&lt;/Url&gt;
</p>
<p>
          &lt;/item&gt;
</p>
<p>
          &lt;item&gt;
</p>
<p>
          &lt;Title&gt;&lt;![CDATA[小图2]]&gt;&lt;/Title&gt;
</p>
<p>
          &lt;Description&gt;&lt;![CDATA[two]]&gt;&lt;/Description&gt;
</p>
<p>
          &lt;PicUrl&gt;&lt;![CDATA[http://47.52.95.83/zhaoxiaokang/img/two.png]]&gt;&lt;/PicUrl&gt;
</p>
<p>
          &lt;Url&gt;&lt;![CDATA[http://baidu.com]]&gt;&lt;/Url&gt;
</p>
<p>
          &lt;/item&gt;
</p>
<p>
          &lt;/Articles&gt;
</p>
<p>
          &lt;/xml&gt;&#8221;;
</p>
<p>
          $resultStr = sprintf($textTpl, $fromUsername, $toUsername, time());
</p>
<p>
          echo  $resultStr;
</p>
<p>
      }
</p>
<h1>︴自觉练习</h1>
<p><img loading="lazy" decoding="async" width="247" height="173" src="/wp-content/uploads/2018/05/word-image-5207.png" class="wp-image-5734" /><br />
<img loading="lazy" decoding="async" width="549" height="231" src="/wp-content/uploads/2018/05/word-image-5208.png" class="wp-image-5735" srcset="/wp-content/uploads/2018/05/word-image-5208.png 549w, /wp-content/uploads/2018/05/word-image-5208-300x126.png 300w" sizes="(max-width: 549px) 100vw, 549px" /><br />
<img loading="lazy" decoding="async" width="596" height="255" src="/wp-content/uploads/2018/05/word-image-5209.png" class="wp-image-5736" srcset="/wp-content/uploads/2018/05/word-image-5209.png 596w, /wp-content/uploads/2018/05/word-image-5209-300x128.png 300w" sizes="(max-width: 596px) 100vw, 596px" /></p>
]]></content:encoded>
					
					<wfw:commentRss>/%e7%a7%bb%e5%8a%a8%e7%ab%af%e5%bc%80%e5%8f%91/5626.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>微信公众号（二）CURL、自定义菜单、事件推送、多媒体上传、客服消息接口、群发消息接口</title>
		<link>/%e7%a7%bb%e5%8a%a8%e7%ab%af%e5%bc%80%e5%8f%91/5587.html</link>
					<comments>/%e7%a7%bb%e5%8a%a8%e7%ab%af%e5%bc%80%e5%8f%91/5587.html#respond</comments>
		
		<dc:creator><![CDATA[Mr.Lee]]></dc:creator>
		<pubDate>Sat, 19 May 2018 15:13:58 +0000</pubDate>
				<category><![CDATA[微信公众号]]></category>
		<category><![CDATA[移动端开发]]></category>
		<category><![CDATA[CURL]]></category>
		<category><![CDATA[事件推送]]></category>
		<category><![CDATA[多媒体上传]]></category>
		<category><![CDATA[客服消息接口]]></category>
		<category><![CDATA[群发消息接口]]></category>
		<category><![CDATA[自定义菜单]]></category>
		<guid isPermaLink="false">/?p=5587</guid>

					<description><![CDATA[移动端开发（微信开发2） 复习 什么是微信：就是聊天工具 什么是公众号：企业或个人组织管理其粉丝的应用工具 什 [&#8230;]]]></description>
										<content:encoded><![CDATA[<h1>移动端开发（微信开发2）	</h1>
<h1>复习</h1>
<p>
  什么是微信：就是聊天工具
</p>
<p>
  什么是公众号：企业或个人组织管理其粉丝的应用工具
</p>
<p>
  什么是公众平台：管理公众号数据的后台
</p>
<p>
  编辑模式运营： 通过微信提供的后台管理数据
</p>
<p>
  开发者模式运营： 通过自己开发的后台管理数据
</p>
<p>
  公众号常用的功能：自动回复（关注回复、关键字回复）、自定义菜单等
</p>
<p>
  订阅号和服务号的区别：服务号功能更强大，但是必须有营业执照才能注册。
</p>
<p><img loading="lazy" decoding="async" width="1032" height="489" src="/wp-content/uploads/2018/05/word-image-5064.png" class="wp-image-5588" srcset="/wp-content/uploads/2018/05/word-image-5064.png 1032w, /wp-content/uploads/2018/05/word-image-5064-300x142.png 300w, /wp-content/uploads/2018/05/word-image-5064-768x364.png 768w, /wp-content/uploads/2018/05/word-image-5064-1024x485.png 1024w" sizes="(max-width: 1032px) 100vw, 1032px" /></p>
<h1>︴更改公众平台测试帐号</h1>
<h2>说明</h2>
<p>
  因为注册的是订阅号，很多高级接口无法测试学习，所以使用微信官方提供的测试帐号，可以体验并测试微信公众平台所有高级接口。
</p>
<h2>步骤</h2>
<p>
  步骤1：登录微信公众平台，点击左侧菜单后进入公众测试平台
</p>
<p><img loading="lazy" decoding="async" width="774" height="455" src="/wp-content/uploads/2018/05/word-image-5065.png" class="wp-image-5589" srcset="/wp-content/uploads/2018/05/word-image-5065.png 774w, /wp-content/uploads/2018/05/word-image-5065-300x176.png 300w, /wp-content/uploads/2018/05/word-image-5065-768x451.png 768w" sizes="(max-width: 774px) 100vw, 774px" /></p>
<p>
  步骤2：微信扫码登录
</p>
<p>
  步骤3：配置测试账号（公众号）开发者模式
</p>
<p><img loading="lazy" decoding="async" width="778" height="532" src="/wp-content/uploads/2018/05/word-image-5066.png" class="wp-image-5590" srcset="/wp-content/uploads/2018/05/word-image-5066.png 778w, /wp-content/uploads/2018/05/word-image-5066-300x205.png 300w, /wp-content/uploads/2018/05/word-image-5066-768x525.png 768w, /wp-content/uploads/2018/05/word-image-5066-220x150.png 220w" sizes="(max-width: 778px) 100vw, 778px" /></p>
<p>
  脚下留心：配置好后，需要关注测试账号（公众号）才可以进行高级接口试用
</p>
<p><img loading="lazy" decoding="async" width="498" height="665" src="/wp-content/uploads/2018/05/word-image-5067.png" class="wp-image-5591" srcset="/wp-content/uploads/2018/05/word-image-5067.png 498w, /wp-content/uploads/2018/05/word-image-5067-225x300.png 225w" sizes="(max-width: 498px) 100vw, 498px" /></p>
<h1><a id="post-5587-_Toc475823313"></a>一、PHP中的cURL库</h1>
<h2><a id="post-5587-_Toc475823314"></a>1、cURL库</h2>
<p>
  说明：cURL 是一个功能强大的PHP库。
</p>
<p>
  作用：使用cURL实现Get和Post请求的方法，常用于数据采集或接口请求等
</p>
<h2><a id="post-5587-_Toc475823315"></a>cURL四步骤</h2>
<ul>
<li>
    步骤1：初始化curl，使用函数curl_init()
  </li>
<li>
    步骤2：配置，使用函数curl_setopt（）
  </li>
<li>
    步骤3：发送请求，使用函数curl_exec（）
  </li>
<li>
    步骤4：关闭请求，使用函数curl_close（）
  </li>
</ul>
<h2><a id="post-5587-_Toc475823316"></a>使用cURL发送get请求</h2>
<p><img loading="lazy" decoding="async" width="916" height="478" src="/wp-content/uploads/2018/05/word-image-5068.png" class="wp-image-5592" srcset="/wp-content/uploads/2018/05/word-image-5068.png 916w, /wp-content/uploads/2018/05/word-image-5068-300x157.png 300w, /wp-content/uploads/2018/05/word-image-5068-768x401.png 768w" sizes="(max-width: 916px) 100vw, 916px" /></p>
<p>
  &lt;?php
</p>
<p>
  //1.初始化curl，说明： curl http 简写 ch
</p>
<p>
  $ch = curl_init();
</p>
<p>
  //2.配置
</p>
<p>
  	//2.1配置请求地址（默认get请求）
</p>
<p>
  	curl_setopt($ch, CURLOPT_URL, 请求地址?参数1=值1&amp;参数2=值2);
</p>
<p>
  	//2.2配置数据响应方式（1.默认直接输出，2.复制给变量不输出）
</p>
<p>
  	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
</p>
<p>
  //3.发送http请求
</p>
<p>
  $data = curl_exec($ch);
</p>
<p>
  //4.关闭
</p>
<p>
  curl_close($ch);
</p>
<h2>4、使用cURL发送post请求</h2>
<p><img loading="lazy" decoding="async" width="935" height="614" src="/wp-content/uploads/2018/05/word-image-5069.png" class="wp-image-5593" srcset="/wp-content/uploads/2018/05/word-image-5069.png 935w, /wp-content/uploads/2018/05/word-image-5069-300x197.png 300w, /wp-content/uploads/2018/05/word-image-5069-768x504.png 768w" sizes="(max-width: 935px) 100vw, 935px" /></p>
<p>
  &lt;?php
</p>
<p>
  //1.初始化curl，说明： curl http 简写 ch
</p>
<p>
  $ch = curl_init();
</p>
<p>
  //2.配置
</p>
<p>
  	//2.1配置请求地址（默认get请求）
</p>
<p>
  	curl_setopt($ch, CURLOPT_URL, 请求地址?参数1=值1&amp;参数2=值2);
</p>
<p>
  	//2.2配置数据响应方式（1.默认直接输出，2.复制给变量不输出）
</p>
<p>
  	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
</p>
<p>
  	//2.3设置请求方式
</p>
<p>
  	curl_setopt($ch, CURLOPT_POST, true);
</p>
<p>
  	//2.4设置POST请求数据(post fields)
</p>
<p>
  	$arrData = [
</p>
<p>
  		&#8216;uname&#8217; =&gt; &#8216;陈总&#8217;,
</p>
<p>
  		&#8216;pwd&#8217; =&gt; 123
</p>
<p>
  	];
</p>
<p>
  	curl_setopt($ch, CURLOPT_POSTFIELDS, $arrData);
</p>
<p>
  //3.发送http请求
</p>
<p>
  $data = curl_exec($ch);
</p>
<p>
  //4.关闭
</p>
<p>
  curl_close($ch);
</p>
<h2>■ 案例：请求api接口</h2>
<h3>1）笑话接口</h3>
<p><a href="http://japi.juhe.cn/joke/content/text.from?key=2ca3e19979fadf2279ac6a036669f5ad&amp;page=1&amp;pagesize=10">http://japi.juhe.cn/joke/content/text.from?key=2ca3e19979fadf2279ac6a036669f5ad&amp;page=1&amp;pagesize=10</a>
</p>
<h3>2）代码</h3>
<p><img loading="lazy" decoding="async" width="1006" height="539" src="/wp-content/uploads/2018/05/word-image-5070.png" class="wp-image-5594" srcset="/wp-content/uploads/2018/05/word-image-5070.png 1006w, /wp-content/uploads/2018/05/word-image-5070-300x161.png 300w, /wp-content/uploads/2018/05/word-image-5070-768x411.png 768w" sizes="(max-width: 1006px) 100vw, 1006px" /></p>
<p>
  &lt;?php
</p>
<p>
  // 请求接口：http://japi.juhe.cn/joke/content/text.from?key=您申请的KEY&amp;page=1&amp;pagesize=10
</p>
<p>
  //1.初始化
</p>
<p>
  $ch = curl_init();
</p>
<p>
  //2.配置
</p>
<p>
  	//2.1设置请求地址
</p>
<p>
  	curl_setopt($ch, CURLOPT_URL, &#8216;http://japi.juhe.cn/joke/content/text.from?key=2ca3e19979fadf2279ac6a036669f5ad&amp;page=1&amp;pagesize=10&#8217;);
</p>
<p>
  	//2.2数据流不直接输出
</p>
<p>
  	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
</p>
<p>
  //3.发送请求
</p>
<p>
  $data = curl_exec($ch);
</p>
<p>
  //4.释放资源
</p>
<p>
  curl_close($ch);
</p>
<p>
  //语法：json_encode（数组）  	 转化为json数据
</p>
<p>
  //语法：json_decode（json数据,参数2）
</p>
<p>
  //说明：将数据转化为数组或者对象，（参数2：true-数组，false-对象，默认）
</p>
<p>
  // $data = iconv(&#8216;utf-8&#8217;, &#8216;gbk&#8217;, $data);
</p>
<p>
  // var_dump($data);die;
</p>
<p>
  $data = json_decode($data, true);
</p>
<p>
  echo &#8216;&lt;pre&gt;&#8217;;
</p>
<p>
  print_r($data);
</p>
<h2>■ 案例：采集网站数据</h2>
<p>
  场景：公司网站开发完毕，没有数据，如果不添加数据丑用户体验度不高，但是手动添加工程浩大费事
</p>
<p>
  解决：<a href="http://bbs.itheima.com/forum-393-1.html">http://bbs.itheima.com/forum-393-1.html</a>  采集最新活动
</p>
<p>
  采集表示抓取指定网站数据（注：数据采集就是抓取别人网站的数据保存自己的数据库）
</p>
<p>
  代码
</p>
<p><img loading="lazy" decoding="async" width="885" height="582" src="/wp-content/uploads/2018/05/word-image-5071.png" class="wp-image-5595" srcset="/wp-content/uploads/2018/05/word-image-5071.png 885w, /wp-content/uploads/2018/05/word-image-5071-300x197.png 300w, /wp-content/uploads/2018/05/word-image-5071-768x505.png 768w" sizes="(max-width: 885px) 100vw, 885px" /></p>
<p>
  &lt;?php
</p>
<p>
  //1.初始化
</p>
<p>
  $ch = curl_init();
</p>
<p>
  //2.配置
</p>
<p>
  	//2.1设置请求地址
</p>
<p>
  	curl_setopt($ch, CURLOPT_URL, &#8216;http://bbs.itheima.com/forum-393-1.html&#8217;);
</p>
<p>
  	//2.2数据流不直接输出
</p>
<p>
  	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
</p>
<p>
  //3.发送请求
</p>
<p>
  $data = curl_exec($ch);
</p>
<p>
  //4.释放资源
</p>
<p>
  curl_close($ch);
</p>
<p>
  // var_dump($data);
</p>
<p>
  //语法：preg_match(正则表达式, 待匹配的数据)
</p>
<p>
  //语法：preg_match_all(正则表达式, 待匹配的数据, 匹配的结果)
</p>
<p>
  //待匹配的数据标识&lt;a href=&#8221;thread-345001-1-1.html&#8221; onclick=&#8221;atarget(this)&#8221; class=&#8221;s xst&#8221;&gt;论坛改版签到不变，签到福利兑换接着走起来！&lt;/a&gt;
</p>
<p>
  //[123]  只匹配1或者2或者3
</p>
<p>
  //[^123] 不匹配1或2或3
</p>
<p>
  //[^&gt;]*  表示匹配不等于&gt;的字符任意次数
</p>
<p>
  preg_match_all(&#8216;/&lt;a[^&gt;]* class=&#8221;s xst&#8221;&gt;(.*)&lt;\/a&gt;/&#8217;, $data, $rs);
</p>
<p>
  echo &#8216;&lt;pre&gt;&#8217;;
</p>
<p>
  print_r($rs);
</p>
<h2>︴封装</h2>
<p><img loading="lazy" decoding="async" width="612" height="528" src="/wp-content/uploads/2018/05/word-image-5072.png" class="wp-image-5596" srcset="/wp-content/uploads/2018/05/word-image-5072.png 612w, /wp-content/uploads/2018/05/word-image-5072-300x259.png 300w" sizes="(max-width: 612px) 100vw, 612px" /></p>
<p>
  &lt;?php
</p>
<p>
  //1.单独完成功能
</p>
<p>
  //2.随便写一个空方法
</p>
<p>
  //3.将刚单独写好的功能放到方法中
</p>
<p>
  //4.找需要传递的参数，定义成形参
</p>
<p>
  /**
</p>
<p>
   * PHP发送请求
</p>
<p>
   * @param string $api  		接口地址
</p>
<p>
   * @param array  $postData  POST请求数据
</p>
<p>
   */
</p>
<p>
  function httpRequest($api, $postData = array())
</p>
<p>
  {
</p>
<p>
  	//1.初始化
</p>
<p>
  	$ch = curl_init();
</p>
<p>
  	//2.配置
</p>
<p>
  		//2.1设置请求地址
</p>
<p>
  		curl_setopt($ch, CURLOPT_URL, $api);
</p>
<p>
  		//2.2数据流不直接输出
</p>
<p>
  		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
</p>
<p>
  		//2.3POST请求
</p>
<p>
  		if ($postData) {
</p>
<p>
  			curl_setopt($ch, CURLOPT_POST, true);
</p>
<p>
  			curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
</p>
<p>
  		}
</p>
<p>
  		//curl注意事项，如果发送的请求是https，必须要禁止服务器端校检SSL证书
</p>
<p>
  		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
</p>
<p>
  		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
</p>
<p>
  	//3.发送请求
</p>
<p>
  	$data = curl_exec($ch);
</p>
<p>
  	//4.释放资源
</p>
<p>
  	curl_close($ch);
</p>
<p>
  	return $data;
</p>
<p>
  }
</p>
<h1><a id="post-5587-_Toc475823317"></a>二、获取接口调用凭证access_token</h1>
<h2><a id="post-5587-_Toc475823318"></a>1、说明</h2>
<p><img loading="lazy" decoding="async" width="1275" height="405" src="/wp-content/uploads/2018/05/word-image-5073.png" class="wp-image-5597" srcset="/wp-content/uploads/2018/05/word-image-5073.png 1275w, /wp-content/uploads/2018/05/word-image-5073-300x95.png 300w, /wp-content/uploads/2018/05/word-image-5073-768x244.png 768w, /wp-content/uploads/2018/05/word-image-5073-1024x325.png 1024w" sizes="(max-width: 1275px) 100vw, 1275px" /></p>
<h2><a id="post-5587-_Toc475823319"></a>2、接口说明</h2>
<p><img loading="lazy" decoding="async" width="879" height="440" src="/wp-content/uploads/2018/05/word-image-5074.png" class="wp-image-5598" srcset="/wp-content/uploads/2018/05/word-image-5074.png 879w, /wp-content/uploads/2018/05/word-image-5074-300x150.png 300w, /wp-content/uploads/2018/05/word-image-5074-768x384.png 768w" sizes="(max-width: 879px) 100vw, 879px" /></p>
<p><a href="https://mp.weixin.qq.com/wiki?t=resource/res_main&amp;id=mp1421140183">https://mp.weixin.qq.com/wiki?t=resource/res_main&amp;id=mp1421140183</a>
</p>
<p><img loading="lazy" decoding="async" width="689" height="336" src="/wp-content/uploads/2018/05/word-image-5075.png" class="wp-image-5599" srcset="/wp-content/uploads/2018/05/word-image-5075.png 689w, /wp-content/uploads/2018/05/word-image-5075-300x146.png 300w" sizes="(max-width: 689px) 100vw, 689px" /></p>
<h2><a id="post-5587-_Toc475823320"></a>3、使用curl库获取access_token</h2>
<p>
  &lt;?php
</p>
<p><img loading="lazy" decoding="async" width="1034" height="525" src="/wp-content/uploads/2018/05/word-image-5076.png" class="wp-image-5600" srcset="/wp-content/uploads/2018/05/word-image-5076.png 1034w, /wp-content/uploads/2018/05/word-image-5076-300x152.png 300w, /wp-content/uploads/2018/05/word-image-5076-768x390.png 768w, /wp-content/uploads/2018/05/word-image-5076-1024x520.png 1024w" sizes="(max-width: 1034px) 100vw, 1034px" /></p>
<p>
  $apiData = [
</p>
<p>
  	&#8216;appid&#8217; =&gt; &#8216;wx56e3e3d75414b3d0&#8217;,
</p>
<p>
  	&#8216;secret&#8217; =&gt; &#8216;f8ec8178c6dda48d1cb25c07304eff44&#8217;
</p>
<p>
  ];
</p>
<p>
  $api = &#8216;https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&amp;&#8217;.http_build_query($apiData);
</p>
<p>
  $data = httpRequest($api);
</p>
<p>
  echo $data[&#8216;access_token&#8217;];
</p>
<p>
  /**
</p>
<p>
   * PHP发送请求
</p>
<p>
   * @param string $api  		接口地址
</p>
<p>
   * @param array  $postData  POST请求数据
</p>
<p>
   */
</p>
<p>
  function httpRequest($api, $postData = array())
</p>
<p>
  {
</p>
<p>
  	//1.初始化
</p>
<p>
  	$ch = curl_init();
</p>
<p>
  	//2.配置
</p>
<p>
  		//2.1设置请求地址
</p>
<p>
  		curl_setopt($ch, CURLOPT_URL, $api);
</p>
<p>
  		//2.2数据流不直接输出
</p>
<p>
  		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
</p>
<p>
  		//2.3POST请求
</p>
<p>
  		if ($postData) {
</p>
<p>
  			curl_setopt($ch, CURLOPT_POST, true);
</p>
<p>
  			curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
</p>
<p>
  		}
</p>
<p>
  		//curl注意事项，如果发送的请求是https，必须要禁止服务器端校检SSL证书
</p>
<p>
  		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
</p>
<p>
  		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
</p>
<p>
  	//3.发送请求
</p>
<p>
  	$data = curl_exec($ch);
</p>
<p>
  	//4.释放资源
</p>
<p>
  	curl_close($ch);
</p>
<p>
  	return json_decode($data, true);
</p>
<p>
  }
</p>
<h2>︴封装方法保存access_token</h2>
<p><img loading="lazy" decoding="async" width="1118" height="532" src="/wp-content/uploads/2018/05/word-image-5077.png" class="wp-image-5601" srcset="/wp-content/uploads/2018/05/word-image-5077.png 1118w, /wp-content/uploads/2018/05/word-image-5077-300x143.png 300w, /wp-content/uploads/2018/05/word-image-5077-768x365.png 768w, /wp-content/uploads/2018/05/word-image-5077-1024x487.png 1024w" sizes="(max-width: 1118px) 100vw, 1118px" /></p>
<p>
  /**
</p>
<p>
   * 获取access_token
</p>
<p>
   * @see https://mp.weixin.qq.com/wiki?t=resource/res_main&amp;id=mp1421140183
</p>
<p>
   * @return string
</p>
<p>
   */
</p>
<p>
  function getToken() {
</p>
<p>
  	$apiData = [
</p>
<p>
  		&#8216;appid&#8217; =&gt; &#8216;wx56e3e3d75414b3d0&#8217;,
</p>
<p>
  		&#8216;secret&#8217; =&gt; &#8216;f8ec8178c6dda48d1cb25c07304eff44&#8217;
</p>
<p>
  	];
</p>
<p>
  	$api = &#8216;https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&amp;&#8217;.http_build_query($apiData);
</p>
<p>
  	$data = httpRequest($api);
</p>
<p>
  	return $data[&#8216;access_token&#8217;];
</p>
<p>
  }
</p>
<h1><a id="post-5587-_Toc475823321"></a>三、微信的自定义菜单</h1>
<h2><a id="post-5587-_Toc475823322"></a>说明</h2>
<p><img loading="lazy" decoding="async" width="906" height="335" src="/wp-content/uploads/2018/05/word-image-5078.png" class="wp-image-5602" srcset="/wp-content/uploads/2018/05/word-image-5078.png 906w, /wp-content/uploads/2018/05/word-image-5078-300x111.png 300w, /wp-content/uploads/2018/05/word-image-5078-768x284.png 768w" sizes="(max-width: 906px) 100vw, 906px" /></p>
<p>
  在微信中，自定义菜单拥有缓存，其生效时间默认为24小时，如果想实时查看到创建或删除效果，我们可以取消关注公众平台并再次关注即可。
</p>
<h2>2、自定义菜单的创建接口</h2>
<h3>接口</h3>
<p><img loading="lazy" decoding="async" width="736" height="439" src="/wp-content/uploads/2018/05/word-image-5079.png" class="wp-image-5603" srcset="/wp-content/uploads/2018/05/word-image-5079.png 736w, /wp-content/uploads/2018/05/word-image-5079-300x179.png 300w" sizes="(max-width: 736px) 100vw, 736px" /><br />
<img loading="lazy" decoding="async" width="799" height="367" src="/wp-content/uploads/2018/05/word-image-5080.png" class="wp-image-5604" srcset="/wp-content/uploads/2018/05/word-image-5080.png 799w, /wp-content/uploads/2018/05/word-image-5080-300x138.png 300w, /wp-content/uploads/2018/05/word-image-5080-768x353.png 768w" sizes="(max-width: 799px) 100vw, 799px" /></p>
<p>
  参数分析
</p>
<p><img loading="lazy" decoding="async" width="765" height="656" src="/wp-content/uploads/2018/05/word-image-5081.png" class="wp-image-5605" srcset="/wp-content/uploads/2018/05/word-image-5081.png 765w, /wp-content/uploads/2018/05/word-image-5081-300x257.png 300w" sizes="(max-width: 765px) 100vw, 765px" /></p>
<h3>2）代码</h3>
<p><img loading="lazy" decoding="async" width="767" height="626" src="/wp-content/uploads/2018/05/word-image-5082.png" class="wp-image-5606" srcset="/wp-content/uploads/2018/05/word-image-5082.png 767w, /wp-content/uploads/2018/05/word-image-5082-300x245.png 300w" sizes="(max-width: 767px) 100vw, 767px" /></p>
<p>
  &lt;?php
</p>
<p>
  //1.定义接口
</p>
<p>
  $api = &#8216;https://api.weixin.qq.com/cgi-bin/menu/create?access_token=&#8217;.getToken();
</p>
<p>
  //2.定义接口数据
</p>
<p>
  $postData = &lt;&lt;&lt;STR
</p>
<p>
   {
</p>
<p>
       &#8220;button&#8221;:[
</p>
<p>
  	     {
</p>
<p>
  	          &#8220;type&#8221;:&#8221;click&#8221;,
</p>
<p>
  	          &#8220;name&#8221;:&#8221;程程&#8221;,
</p>
<p>
  	          &#8220;key&#8221;:&#8221;V1001_TODAY_MUSIC&#8221;
</p>
<p>
  	      },
</p>
<p>
  	      {
</p>
<p>
  	           &#8220;name&#8221;:&#8221;啊第三方&#8221;,
</p>
<p>
  	           &#8220;sub_button&#8221;:[
</p>
<p>
  		           {
</p>
<p>
  		               &#8220;type&#8221;:&#8221;view&#8221;,
</p>
<p>
  		               &#8220;name&#8221;:&#8221;搜索&#8221;,
</p>
<p>
  		               &#8220;url&#8221;:&#8221;http://www.soso.com/&#8221;
</p>
<p>
  		            },
</p>
<p>
  		            {
</p>
<p>
  		               &#8220;type&#8221;:&#8221;click&#8221;,
</p>
<p>
  		               &#8220;name&#8221;:&#8221;赞一下我们&#8221;,
</p>
<p>
  		               &#8220;key&#8221;:&#8221;V1001_GOOD&#8221;
</p>
<p>
  		            }
</p>
<p>
  	       		]
</p>
<p>
  	       }
</p>
<p>
        ]
</p>
<p>
   }
</p>
<p>
  STR;
</p>
<p>
  //3.发送请求
</p>
<p>
  $data = httpRequest($api, $postData);
</p>
<p>
  var_dump($data);
</p>
<p>
  /**
</p>
<p>
   * 获取access_token
</p>
<p>
   * @see https://mp.weixin.qq.com/wiki?t=resource/res_main&amp;id=mp1421140183
</p>
<p>
   * @return string
</p>
<p>
   */
</p>
<p>
  function getToken() {
</p>
<p>
  	$apiData = [
</p>
<p>
  		&#8216;appid&#8217; =&gt; &#8216;wx56e3e3d75414b3d0&#8217;,
</p>
<p>
  		&#8216;secret&#8217; =&gt; &#8216;f8ec8178c6dda48d1cb25c07304eff44&#8217;
</p>
<p>
  	];
</p>
<p>
  	$api = &#8216;https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&amp;&#8217;.http_build_query($apiData);
</p>
<p>
  	$data = httpRequest($api);
</p>
<p>
  	return $data[&#8216;access_token&#8217;];
</p>
<p>
  }
</p>
<p>
  /**
</p>
<p>
   * PHP发送请求
</p>
<p>
   * @param string $api  		接口地址
</p>
<p>
   * @param array  $postData  POST请求数据
</p>
<p>
   */
</p>
<p>
  function httpRequest($api, $postData = array())
</p>
<p>
  {
</p>
<p>
  	//1.初始化
</p>
<p>
  	$ch = curl_init();
</p>
<p>
  	//2.配置
</p>
<p>
  		//2.1设置请求地址
</p>
<p>
  		curl_setopt($ch, CURLOPT_URL, $api);
</p>
<p>
  		//2.2数据流不直接输出
</p>
<p>
  		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
</p>
<p>
  		//2.3POST请求
</p>
<p>
  		if ($postData) {
</p>
<p>
  			curl_setopt($ch, CURLOPT_POST, true);
</p>
<p>
  			curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
</p>
<p>
  		}
</p>
<p>
  		//curl注意事项，如果发送的请求是https，必须要禁止服务器端校检SSL证书
</p>
<p>
  		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
</p>
<p>
  		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
</p>
<p>
  	//3.发送请求
</p>
<p>
  	$data = curl_exec($ch);
</p>
<p>
  	//4.释放资源
</p>
<p>
  	curl_close($ch);
</p>
<p>
  	return json_decode($data, true);
</p>
<p>
  }
</p>
<h2>3、自定义菜单事件推送</h2>
<ul>
<li>
    场景：创建微信自定义菜单，如果type=click点击没反映
  </li>
<li>
    解决：wx.php增加判断
  </li>
<li>
    代码：
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="752" height="416" src="/wp-content/uploads/2018/05/word-image-5083.png" class="wp-image-5607" srcset="/wp-content/uploads/2018/05/word-image-5083.png 752w, /wp-content/uploads/2018/05/word-image-5083-300x166.png 300w" sizes="(max-width: 752px) 100vw, 752px" /><br />
<img loading="lazy" decoding="async" width="926" height="588" src="/wp-content/uploads/2018/05/word-image-5084.png" class="wp-image-5608" srcset="/wp-content/uploads/2018/05/word-image-5084.png 926w, /wp-content/uploads/2018/05/word-image-5084-300x190.png 300w, /wp-content/uploads/2018/05/word-image-5084-768x488.png 768w" sizes="(max-width: 926px) 100vw, 926px" /></p>
<h2>4、自定义菜单删除接口</h2>
<h3>1）接口</h3>
<p><img loading="lazy" decoding="async" width="931" height="515" src="/wp-content/uploads/2018/05/word-image-5085.png" class="wp-image-5609" srcset="/wp-content/uploads/2018/05/word-image-5085.png 931w, /wp-content/uploads/2018/05/word-image-5085-300x166.png 300w, /wp-content/uploads/2018/05/word-image-5085-768x425.png 768w" sizes="(max-width: 931px) 100vw, 931px" /></p>
<h3>2）代码</h3>
<p>
  &lt;?php
</p>
<p>
  //1.定义接口
</p>
<p>
  $api = &#8216;https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=&#8217;.getToken();
</p>
<p>
  //2.发送请求
</p>
<p>
  $data = httpRequest($api);
</p>
<p>
  var_dump($data);
</p>
<p>
  /**
</p>
<p>
   * 获取access_token
</p>
<p>
   * @see https://mp.weixin.qq.com/wiki?t=resource/res_main&amp;id=mp1421140183
</p>
<p>
   * @return string
</p>
<p>
   */
</p>
<p>
  function getToken() {
</p>
<p>
  	$apiData = [
</p>
<p>
  		&#8216;appid&#8217; =&gt; &#8216;wx56e3e3d75414b3d0&#8217;,
</p>
<p>
  		&#8216;secret&#8217; =&gt; &#8216;f8ec8178c6dda48d1cb25c07304eff44&#8217;
</p>
<p>
  	];
</p>
<p>
  	$api = &#8216;https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&amp;&#8217;.http_build_query($apiData);
</p>
<p>
  	$data = httpRequest($api);
</p>
<p>
  	return $data[&#8216;access_token&#8217;];
</p>
<p>
  }
</p>
<p>
  /**
</p>
<p>
   * PHP发送请求
</p>
<p>
   * @param string $api  		接口地址
</p>
<p>
   * @param array  $postData  POST请求数据
</p>
<p>
   */
</p>
<p>
  function httpRequest($api, $postData = array())
</p>
<p>
  {
</p>
<p>
  	//1.初始化
</p>
<p>
  	$ch = curl_init();
</p>
<p>
  	//2.配置
</p>
<p>
  		//2.1设置请求地址
</p>
<p>
  		curl_setopt($ch, CURLOPT_URL, $api);
</p>
<p>
  		//2.2数据流不直接输出
</p>
<p>
  		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
</p>
<p>
  		//2.3POST请求
</p>
<p>
  		if ($postData) {
</p>
<p>
  			curl_setopt($ch, CURLOPT_POST, true);
</p>
<p>
  			curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
</p>
<p>
  		}
</p>
<p>
  		//curl注意事项，如果发送的请求是https，必须要禁止服务器端校检SSL证书
</p>
<p>
  		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
</p>
<p>
  		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
</p>
<p>
  	//3.发送请求
</p>
<p>
  	$data = curl_exec($ch);
</p>
<p>
  	//4.释放资源
</p>
<p>
  	curl_close($ch);
</p>
<p>
  	return json_decode($data, true);
</p>
<p>
  }
</p>
<p>
  删除之后重新关注公众号，发现打开直接是聊天窗口
</p>
<h2>︴wx.php</h2>
<p>
  &lt;?php
</p>
<p>
  /**
</p>
<p>
    * wechat php test
</p>
<p>
    */
</p>
<p>
  //define your token
</p>
<p>
  define(&#8220;TOKEN&#8221;, &#8220;itcast&#8221;);
</p>
<p>
  $wechatObj = new wechatCallbackapiTest();
</p>
<p>
  // $wechatObj-&gt;valid();
</p>
<p>
  $wechatObj-&gt;responseMsg();
</p>
<p>
  class wechatCallbackapiTest
</p>
<p>
  {
</p>
<p>
  	public function valid()
</p>
<p>
      {
</p>
<p>
          $echoStr = $_GET[&#8220;echostr&#8221;];
</p>
<p>
          //valid signature , option
</p>
<p>
          if($this-&gt;checkSignature()){
</p>
<p>
          	echo $echoStr;
</p>
<p>
          	exit;
</p>
<p>
          }
</p>
<p>
      }
</p>
<p>
      public function responseMsg()
</p>
<p>
      {
</p>
<p>
  		//get post data, May be due to the different environments
</p>
<p>
  		$postStr = $GLOBALS[&#8220;HTTP_RAW_POST_DATA&#8221;];
</p>
<p>
        	//extract post data
</p>
<p>
  		if (!empty($postStr)){
</p>
<p>
                  /* libxml_disable_entity_loader is to prevent XML eXternal Entity Injection,
</p>
<p>
                     the best way is to check the validity of xml by yourself */
</p>
<p>
                  libxml_disable_entity_loader(true);
</p>
<p>
                	$postObj = simplexml_load_string($postStr, &#8216;SimpleXMLElement&#8217;, LIBXML_NOCDATA);
</p>
<p>
                  $fromUsername = $postObj-&gt;FromUserName;
</p>
<p>
                  $toUsername = $postObj-&gt;ToUserName;
</p>
<p>
                  $keyword = trim($postObj-&gt;Content);
</p>
<p>
                  $time = time();
</p>
<p>
                 //&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;
</p>
<p>
                  if ($postObj-&gt;MsgType == &#8216;event&#8217;) {
</p>
<p>
                  	if ($postObj-&gt;Event == &#8216;CLICK&#8217;) {
</p>
<p>
                 			$this-&gt;sendText($fromUsername, $toUsername, &#8216;坏蛋，别点我&#8217;);
</p>
<p>
                  	}
</p>
<p>
                  } else {
</p>
<p>
                 		$this-&gt;sendText($fromUsername, $toUsername, &#8216;php12&#8217;);
</p>
<p>
                  }
</p>
<p>
          }else {
</p>
<p>
          	echo &#8220;&#8221;;
</p>
<p>
          	exit;
</p>
<p>
          }
</p>
<p>
      }
</p>
<p>
      /**
</p>
<p>
       * 响应音乐消息
</p>
<p>
       * @param string $fromUsername  接受者
</p>
<p>
       * @param string $toUsername    发送者
</p>
<p>
       * @param string $title         标题
</p>
<p>
       * @param string $desc          描述
</p>
<p>
       * @param string $musicUrl      音乐互联网地址（.mp3）
</p>
<p>
       * @param string $ThumbMediaId  封面
</p>
<p>
       * @param return
</p>
<p>
       */
</p>
<p>
      private function sendMusic($fromUsername, $toUsername, $title=&#8217;摇一摇歌声&#8217;, $desc=&#8217;甜美型，那是骗你的&#8217;, $musicUrl=&#8217;http://47.91.211.137/zxk/music.mp3&#8242;, $ThumbMediaId=&#8217;t96tqk6yOa_patBRMJNme_zrt3mlbKWCSZtXy5LMuSV8CZF58jXG5pRP67Xnciyb&#8217;) {
</p>
<p>
      	$tpl = &#8216;&lt;xml&gt;
</p>
<p>
  			&lt;ToUserName&gt;&lt;![CDATA[%s]]&gt;&lt;/ToUserName&gt;
</p>
<p>
  			&lt;FromUserName&gt;&lt;![CDATA[%s]]&gt;&lt;/FromUserName&gt;
</p>
<p>
  			&lt;CreateTime&gt;%s&lt;/CreateTime&gt;
</p>
<p>
  			&lt;MsgType&gt;&lt;![CDATA[music]]&gt;&lt;/MsgType&gt;
</p>
<p>
  			&lt;Music&gt;
</p>
<p>
  				&lt;Title&gt;&lt;![CDATA[%s]]&gt;&lt;/Title&gt;
</p>
<p>
  				&lt;Description&gt;&lt;![CDATA[%s]]&gt;&lt;/Description&gt;
</p>
<p>
  				&lt;MusicUrl&gt;&lt;![CDATA[%s]]&gt;&lt;/MusicUrl&gt;
</p>
<p>
  				&lt;HQMusicUrl&gt;&lt;![CDATA[%s]]&gt;&lt;/HQMusicUrl&gt;
</p>
<p>
  				&lt;ThumbMediaId&gt;&lt;![CDATA[%s]]&gt;&lt;/ThumbMediaId&gt;
</p>
<p>
  			&lt;/Music&gt;
</p>
<p>
  		&lt;/xml&gt;&#8217;;
</p>
<p>
  		echo sprintf($tpl, $fromUsername, $toUsername, time(), $title, $desc, $musicUrl, $musicUrl, $ThumbMediaId);
</p>
<p>
  		die;
</p>
<p>
      }
</p>
<p>
      /**
</p>
<p>
       * 响应文本消息
</p>
<p>
       * @param string $fromUsername  接受者
</p>
<p>
       * @param string $toUsername    发送者
</p>
<p>
       * @param string $content       发送的内容
</p>
<p>
       * @param return
</p>
<p>
       */
</p>
<p>
      private function sendText($fromUsername, $toUsername, $content) {
</p>
<p>
      	$textTpl = &#8216;&lt;xml&gt;
</p>
<p>
          	&lt;ToUserName&gt;&lt;![CDATA[%s]]&gt;&lt;/ToUserName&gt;
</p>
<p>
          	&lt;FromUserName&gt;&lt;![CDATA[%s]]&gt;&lt;/FromUserName&gt;
</p>
<p>
          	&lt;CreateTime&gt;%s&lt;/CreateTime&gt;
</p>
<p>
          	&lt;MsgType&gt;&lt;![CDATA[text]]&gt;&lt;/MsgType&gt;
</p>
<p>
          	&lt;Content&gt;&lt;![CDATA[%s]]&gt;&lt;/Content&gt;
</p>
<p>
          &lt;/xml&gt;&#8217;;
</p>
<p>
          echo sprintf($textTpl, $fromUsername, $toUsername, time(), $content);
</p>
<p>
          die;
</p>
<p>
      }
</p>
<p>
      /**
</p>
<p>
       * 响应图片消息
</p>
<p>
       * @param string $fromUsername  接受者
</p>
<p>
       * @param string $toUsername    发送者
</p>
<p>
       * @param string $MediaId       媒体ID（https://mp.weixin.qq.com/debug  先回去access_token 然后获取MediaId）
</p>
<p>
       * @param return
</p>
<p>
       */
</p>
<p>
      private function sendImage($fromUsername, $toUsername, $MediaId = &#8216;G3P8hP2UXqozqUrOpt6rkfC2LEykkeD4OGTPBUyjVFgrGy0-C1yOR3Bvg0vSalic&#8217;)
</p>
<p>
      {
</p>
<p>
      	 //响应图片的xml报文
</p>
<p>
    	    $tpl = &#8216;&lt;xml&gt;
</p>
<p>
    	    	&lt;ToUserName&gt;&lt;![CDATA[%s]]&gt;&lt;/ToUserName&gt;
</p>
<p>
    	    	&lt;FromUserName&gt;&lt;![CDATA[%s]]&gt;&lt;/FromUserName&gt;
</p>
<p>
    	    	&lt;CreateTime&gt;%s&lt;/CreateTime&gt;
</p>
<p>
    	    	&lt;MsgType&gt;&lt;![CDATA[image]]&gt;&lt;/MsgType&gt;
</p>
<p>
    	    	&lt;Image&gt;&lt;MediaId&gt;&lt;![CDATA[%s]]&gt;&lt;/MediaId&gt;&lt;/Image&gt;
</p>
<p>
    	    &lt;/xml&gt;&#8217;;
</p>
<p>
    	    //脚下留心：MediaId是需要通过接口获取的，明天详细讲解，今天通过工具获取
</p>
<p>
    	    //https://mp.weixin.qq.com/debug 查看MediaId（G3P8hP2UXqozqUrOpt6rkfC2LEykkeD4OGTPBUyjVFgrGy0-C1yOR3Bvg0vSalic）
</p>
<p>
    	    echo sprintf($tpl, $fromUsername, $toUsername, time(), $MediaId);
</p>
<p>
       	die;
</p>
<p>
      }
</p>
<p>
  	/**
</p>
<p>
       * 响应视频消息
</p>
<p>
       * @param string $fromUsername  接受者
</p>
<p>
       * @param string $toUsername    发送者
</p>
<p>
       * @param string $MediaId       媒体ID（https://mp.weixin.qq.com/debug  先回去access_token 然后获取MediaId）
</p>
<p>
       * @param return
</p>
<p>
       */
</p>
<p>
      private function sendVideo($fromUsername, $toUsername, $MediaId = &#8216;8pudm18nSyQ5vBO8fCKQ_ucHm9BKTUtTDjfoLNYfoev_B1JY-hJ-E1mk5BncLCtm&#8217;)
</p>
<p>
      {
</p>
<p>
      	$tpl = &#8216;&lt;xml&gt;
</p>
<p>
  		&lt;ToUserName&gt;&lt;![CDATA[%s]]&gt;&lt;/ToUserName&gt;
</p>
<p>
  		&lt;FromUserName&gt;&lt;![CDATA[%s]]&gt;&lt;/FromUserName&gt;
</p>
<p>
  		&lt;CreateTime&gt;%s&lt;/CreateTime&gt;
</p>
<p>
  		&lt;MsgType&gt;&lt;![CDATA]&gt;&lt;/MsgType&gt;
</p>
<p>
  		&lt;Video&gt;
</p>
<p>
  			&lt;MediaId&gt;&lt;![CDATA[%s]]&gt;&lt;/MediaId&gt;
</p>
<p>
  			&lt;Title&gt;&lt;![CDATA[%s]]&gt;&lt;/Title&gt;
</p>
<p>
  			&lt;Description&gt;&lt;![CDATA[%s]]&gt;&lt;/Description&gt;
</p>
<p>
  		&lt;/Video&gt;
</p>
<p>
  		&lt;/xml&gt;&#8217;;
</p>
<p>
  		echo sprintf($tpl, $fromUsername, $toUsername, time(), $MediaId, &#8216;陈恒那些事&#8217;, &#8216;大战三百回合&#8217;);
</p>
<p>
      }
</p>
</p>
<p>
  	private function checkSignature()
</p>
<p>
  	{
</p>
<p>
          // you must define TOKEN by yourself
</p>
<p>
          if (!defined(&#8220;TOKEN&#8221;)) {
</p>
<p>
              throw new Exception(&#8216;TOKEN is not defined!&#8217;);
</p>
<p>
          }
</p>
</p>
<p>
          $signature = $_GET[&#8220;signature&#8221;];
</p>
<p>
          $timestamp = $_GET[&#8220;timestamp&#8221;];
</p>
<p>
          $nonce = $_GET[&#8220;nonce&#8221;];
</p>
</p>
<p>
  		$token = TOKEN;
</p>
<p>
  		$tmpArr = array($token, $timestamp, $nonce);
</p>
<p>
          // use SORT_STRING rule
</p>
<p>
  		sort($tmpArr, SORT_STRING);
</p>
<p>
  		$tmpStr = implode( $tmpArr );
</p>
<p>
  		$tmpStr = sha1( $tmpStr );
</p>
</p>
<p>
  		if( $tmpStr == $signature ){
</p>
<p>
  			return true;
</p>
<p>
  		}else{
</p>
<p>
  			return false;
</p>
<p>
  		}
</p>
<p>
  	}
</p>
<p>
  }
</p>
<p>
  ?&gt;
</p>
<h1><a id="post-5587-_Toc475823328"></a>四、多媒体文件上传接口</h1>
<h2><a id="post-5587-_Toc475823329"></a>1、为什么需要多媒体文件上传接口</h2>
<p>
  回顾回复消息接口，图片回复接口、语音回复接口、视频回复接口，这三个接口在开发时都需要提供一个参数MediaId，在应用中，如果想获取MediaId就必须使用多媒体文件上传接口。
</p>
<h2><a id="post-5587-_Toc475823330"></a>2、分析多媒体文件上传接口</h2>
<p><img loading="lazy" decoding="async" width="847" height="596" src="/wp-content/uploads/2018/05/word-image-5086.png" class="wp-image-5610" srcset="/wp-content/uploads/2018/05/word-image-5086.png 847w, /wp-content/uploads/2018/05/word-image-5086-300x211.png 300w, /wp-content/uploads/2018/05/word-image-5086-768x540.png 768w" sizes="(max-width: 847px) 100vw, 847px" /><br />
<img loading="lazy" decoding="async" width="843" height="425" src="/wp-content/uploads/2018/05/word-image-5087.png" class="wp-image-5611" srcset="/wp-content/uploads/2018/05/word-image-5087.png 843w, /wp-content/uploads/2018/05/word-image-5087-300x151.png 300w, /wp-content/uploads/2018/05/word-image-5087-768x387.png 768w" sizes="(max-width: 843px) 100vw, 843px" /></p>
<h2><a id="post-5587-_Toc475823331"></a>3、编写php代码，实现素材上传</h2>
<p><img loading="lazy" decoding="async" width="943" height="368" src="/wp-content/uploads/2018/05/word-image-5088.png" class="wp-image-5612" srcset="/wp-content/uploads/2018/05/word-image-5088.png 943w, /wp-content/uploads/2018/05/word-image-5088-300x117.png 300w, /wp-content/uploads/2018/05/word-image-5088-768x300.png 768w" sizes="(max-width: 943px) 100vw, 943px" /></p>
<p>
  &lt;?php
</p>
<p>
  //1.定义接口
</p>
<p>
  $apiData = array(
</p>
<p>
  	&#8216;access_token&#8217;=&gt;getToken(),
</p>
<p>
  	&#8216;type&#8217;=&gt;&#8217;image&#8217;
</p>
<p>
  );
</p>
<p>
  $api = &#8216;https://api.weixin.qq.com/cgi-bin/media/upload?&#8217;.http_build_query($apiData);
</p>
<p>
  //2.发送请求
</p>
<p>
  $filePath = dirname(__FILE__) . DIRECTORY_SEPARATOR .&#8217;zhujiao.jpg&#8217;; //脚下留心：window不区分\/但linux只支持 /
</p>
<p>
  //$postData = array(&#8216;media&#8217; =&gt; &#8216;@&#8217;.$filePath);		   //脚下留心：PHP版本低于5.5
</p>
<p>
  $postData = array(&#8216;media&#8217; =&gt; new Curlfile($filePath)); //脚下留心：PHP版本高于5.5
</p>
<p>
  $data = httpRequest($api, $postData);
</p>
<p>
  var_dump($data);
</p>
<p>
  /**
</p>
<p>
   * 获取access_token
</p>
<p>
   * @see https://mp.weixin.qq.com/wiki?t=resource/res_main&amp;id=mp1421140183
</p>
<p>
   * @return string
</p>
<p>
   */
</p>
<p>
  function getToken() {
</p>
<p>
  	$apiData = array(
</p>
<p>
  		&#8216;appid&#8217; =&gt; &#8216;wx56e3e3d75414b3d0&#8217;,
</p>
<p>
  		&#8216;secret&#8217; =&gt; &#8216;f8ec8178c6dda48d1cb25c07304eff44&#8217;
</p>
<p>
  	);
</p>
<p>
  	$api = &#8216;https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&amp;&#8217;.http_build_query($apiData);
</p>
<p>
  	$data = httpRequest($api);
</p>
<p>
  	return $data[&#8216;access_token&#8217;];
</p>
<p>
  }
</p>
<p>
  /**
</p>
<p>
   * PHP发送请求
</p>
<p>
   * @param string $api  		接口地址
</p>
<p>
   * @param array  $postData  POST请求数据
</p>
<p>
   */
</p>
<p>
  function httpRequest($api, $postData = array())
</p>
<p>
  {
</p>
<p>
  	//1.初始化
</p>
<p>
  	$ch = curl_init();
</p>
<p>
  	//2.配置
</p>
<p>
  		//2.1设置请求地址
</p>
<p>
  		curl_setopt($ch, CURLOPT_URL, $api);
</p>
<p>
  		//2.2数据流不直接输出
</p>
<p>
  		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
</p>
<p>
  		//2.3POST请求
</p>
<p>
  		if ($postData) {
</p>
<p>
  			curl_setopt($ch, CURLOPT_POST, true);
</p>
<p>
  			curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
</p>
<p>
  		}
</p>
<p>
  		//curl注意事项，如果发送的请求是https，必须要禁止服务器端校检SSL证书
</p>
<p>
  		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
</p>
<p>
  		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
</p>
<p>
  	//3.发送请求
</p>
<p>
  	$data = curl_exec($ch);
</p>
<p>
  	//4.释放资源
</p>
<p>
  	curl_close($ch);
</p>
<p>
  	return json_decode($data, true);
</p>
<p>
  }
</p>
<h2>︴封装</h2>
<p><img loading="lazy" decoding="async" width="984" height="413" src="/wp-content/uploads/2018/05/word-image-5089.png" class="wp-image-5613" srcset="/wp-content/uploads/2018/05/word-image-5089.png 984w, /wp-content/uploads/2018/05/word-image-5089-300x126.png 300w, /wp-content/uploads/2018/05/word-image-5089-768x322.png 768w" sizes="(max-width: 984px) 100vw, 984px" /></p>
<p>
  function getMediaId($filePath) {
</p>
<p>
  	//1.定义接口
</p>
<p>
  	$apiData = array(
</p>
<p>
  		&#8216;access_token&#8217; =&gt; getToken(),
</p>
<p>
  		&#8216;type&#8217;=&gt;&#8217;image&#8217;
</p>
<p>
  	);
</p>
<p>
  	$api = &#8216;https://api.weixin.qq.com/cgi-bin/media/upload?&#8217;.http_build_query($apiData);
</p>
<p>
  	//2.发送请求
</p>
<p>
  	//$filePath = dirname(__FILE__) . DIRECTORY_SEPARATOR .&#8217;zhujiao.jpg&#8217;; //脚下留心：window不区分\/但linux只支持 /
</p>
<p>
  	if(version_compare(PHP_VERSION,&#8217;5.5.0&#8242;,'&lt;&#8216;))  {
</p>
<p>
  		//脚下留心：PHP版本低于5.5
</p>
<p>
  		$postData = array(&#8216;media&#8217; =&gt; &#8216;@&#8217;.$filePath);
</p>
<p>
  	} else {
</p>
<p>
  		//脚下留心：PHP版本高于5.5
</p>
<p>
  		$postData = array(&#8216;media&#8217; =&gt; new Curlfile($filePath));
</p>
<p>
  	}
</p>
<p>
  	$data = httpRequest($api, $postData);
</p>
<p>
  	return $data[&#8216;media_id&#8217;];
</p>
<p>
  	// var_dump($data);
</p>
<p>
  }
</p>
<h1><a id="post-5587-_Toc475823332"></a>五、封装Wechat.class.php类文件</h1>
<h2><a id="post-5587-_Toc475823333"></a>1、为什么需要Wechat.class.php类文件</h2>
<p>
  答：随着时间的推移，wx.php中的功能也越来越复杂，为了简化wx.php（微信官方SDK）中的相关操作，我们可以把一些常用的功能如获取access_token/curl库封装在一个类中。
</p>
<h2><a id="post-5587-_Toc475823334"></a>2、封装Wechat.class.php类文件</h2>
<p>
  &lt;?php
</p>
<p>
  define(&#8216;APPID&#8217;, &#8216;wx56e3e3d75414b3d0&#8217;);
</p>
<p>
  define(&#8216;APPSECRET&#8217;, &#8216;f8ec8178c6dda48d1cb25c07304eff44&#8217;);
</p>
<p>
  class Wechat
</p>
<p>
  {
</p>
<p>
      /**
</p>
<p>
       * 获取access_token
</p>
<p>
       * @see https://mp.weixin.qq.com/wiki?t=resource/res_main&amp;id=mp1421140183
</p>
<p>
       * @return string
</p>
<p>
       */
</p>
<p>
      protected function getToken()
</p>
<p>
      {
</p>
<p>
          $apiData = array(
</p>
<p>
              &#8216;appid&#8217; =&gt; APPID,
</p>
<p>
              &#8216;secret&#8217; =&gt; APPSECRET
</p>
<p>
          );
</p>
<p>
          $api = &#8216;https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&amp;&#8217;.http_build_query($apiData);
</p>
<p>
          $data = $this-&gt;httpRequest($api);
</p>
<p>
          return $data[&#8216;access_token&#8217;];
</p>
<p>
      }
</p>
<p>
      /**
</p>
<p>
       * 上传媒体文件
</p>
<p>
       * @see https://mp.weixin.qq.com/wiki?t=resource/res_main&amp;id=mp1444738726
</p>
<p>
       * @return string
</p>
<p>
       * 注：
</p>
<p>
       * 图片（image）: 2M，支持PNG\JPEG\JPG\GIF格式
</p>
<p>
       * 语音（voice）：2M，播放长度不超过60s，支持AMR\MP3格式
</p>
<p>
       * 视频（video）：10MB，支持MP4格式
</p>
<p>
       * 缩略图（thumb）：64KB，支持JPG格式
</p>
<p>
       */
</p>
<p>
      protected function getMediaId($filePath)
</p>
<p>
      {
</p>
<p>
          //1.定义接口
</p>
<p>
          $apiData = array(
</p>
<p>
              &#8216;access_token&#8217; =&gt; $this-&gt;getToken(),
</p>
<p>
              &#8216;type&#8217;=&gt;&#8217;image&#8217;
</p>
<p>
          );
</p>
<p>
          $api = &#8216;https://api.weixin.qq.com/cgi-bin/media/upload?&#8217;.http_build_query($apiData);
</p>
<p>
          //2.发送请求
</p>
<p>
          //$filePath = dirname(__FILE__) . DIRECTORY_SEPARATOR .&#8217;zhujiao.jpg&#8217;; //脚下留心：window不区分\/但linux只支持 /
</p>
<p>
          if(version_compare(PHP_VERSION,&#8217;5.5.0&#8242;,'&lt;&#8216;))  {
</p>
<p>
              //脚下留心：PHP版本低于5.5
</p>
<p>
              $postData = array(&#8216;media&#8217; =&gt; &#8216;@&#8217;.$filePath);
</p>
<p>
          } else {
</p>
<p>
              //脚下留心：PHP版本高于5.5
</p>
<p>
              $postData = array(&#8216;media&#8217; =&gt; new Curlfile($filePath));
</p>
<p>
          }
</p>
<p>
          $data = $this-&gt;httpRequest($api, $postData);
</p>
<p>
          return $data[&#8216;media_id&#8217;];
</p>
<p>
          // var_dump($data);
</p>
<p>
      }
</p>
<p>
      /**
</p>
<p>
       * PHP发送请求
</p>
<p>
       * @param string $api       接口地址
</p>
<p>
       * @param array  $postData  POST请求数据
</p>
<p>
       */
</p>
<p>
      private function httpRequest($api, $postData = array())
</p>
<p>
      {
</p>
<p>
          //1.初始化
</p>
<p>
          $ch = curl_init();
</p>
<p>
          //2.配置
</p>
<p>
              //2.1设置请求地址
</p>
<p>
              curl_setopt($ch, CURLOPT_URL, $api);
</p>
<p>
              //2.2数据流不直接输出
</p>
<p>
              curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
</p>
<p>
              //2.3POST请求
</p>
<p>
              if ($postData) {
</p>
<p>
                  curl_setopt($ch, CURLOPT_POST, true);
</p>
<p>
                  curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
</p>
<p>
              }
</p>
<p>
              //curl注意事项，如果发送的请求是https，必须要禁止服务器端校检SSL证书
</p>
<p>
              curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
</p>
<p>
              curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
</p>
<p>
          //3.发送请求
</p>
<p>
          $data = curl_exec($ch);
</p>
<p>
          //4.释放资源
</p>
<p>
          curl_close($ch);
</p>
<p>
          return json_decode($data, true);
</p>
<p>
      }
</p>
<p>
  	/**
</p>
<p>
       * 响应音乐消息
</p>
<p>
       * @param string $fromUsername  接受者
</p>
<p>
       * @param string $toUsername    发送者
</p>
<p>
       * @param string $title         标题
</p>
<p>
       * @param string $desc          描述
</p>
<p>
       * @param string $musicUrl      音乐互联网地址（.mp3）
</p>
<p>
       * @param string $ThumbMediaId  封面
</p>
<p>
       * @param return
</p>
<p>
       */
</p>
<p>
      protected function sendMusic($fromUsername, $toUsername, $title=&#8217;摇一摇歌声&#8217;, $desc=&#8217;甜美型，那是骗你的&#8217;, $musicUrl=&#8217;http://47.91.211.137/zxk/music.mp3&#8242;, $ThumbMediaId=&#8217;t96tqk6yOa_patBRMJNme_zrt3mlbKWCSZtXy5LMuSV8CZF58jXG5pRP67Xnciyb&#8217;) {
</p>
<p>
      	$tpl = &#8216;&lt;xml&gt;
</p>
<p>
  			&lt;ToUserName&gt;&lt;![CDATA[%s]]&gt;&lt;/ToUserName&gt;
</p>
<p>
  			&lt;FromUserName&gt;&lt;![CDATA[%s]]&gt;&lt;/FromUserName&gt;
</p>
<p>
  			&lt;CreateTime&gt;%s&lt;/CreateTime&gt;
</p>
<p>
  			&lt;MsgType&gt;&lt;![CDATA[music]]&gt;&lt;/MsgType&gt;
</p>
<p>
  			&lt;Music&gt;
</p>
<p>
  				&lt;Title&gt;&lt;![CDATA[%s]]&gt;&lt;/Title&gt;
</p>
<p>
  				&lt;Description&gt;&lt;![CDATA[%s]]&gt;&lt;/Description&gt;
</p>
<p>
  				&lt;MusicUrl&gt;&lt;![CDATA[%s]]&gt;&lt;/MusicUrl&gt;
</p>
<p>
  				&lt;HQMusicUrl&gt;&lt;![CDATA[%s]]&gt;&lt;/HQMusicUrl&gt;
</p>
<p>
  				&lt;ThumbMediaId&gt;&lt;![CDATA[%s]]&gt;&lt;/ThumbMediaId&gt;
</p>
<p>
  			&lt;/Music&gt;
</p>
<p>
  		&lt;/xml&gt;&#8217;;
</p>
<p>
  		echo sprintf($tpl, $fromUsername, $toUsername, time(), $title, $desc, $musicUrl, $musicUrl, $ThumbMediaId);
</p>
<p>
  		die;
</p>
<p>
      }
</p>
<p>
      /**
</p>
<p>
       * 响应文本消息
</p>
<p>
       * @param string $fromUsername  接受者
</p>
<p>
       * @param string $toUsername    发送者
</p>
<p>
       * @param string $content       发送的内容
</p>
<p>
       * @param return
</p>
<p>
       */
</p>
<p>
      protected function sendText($fromUsername, $toUsername, $content) {
</p>
<p>
      	$textTpl = &#8216;&lt;xml&gt;
</p>
<p>
          	&lt;ToUserName&gt;&lt;![CDATA[%s]]&gt;&lt;/ToUserName&gt;
</p>
<p>
          	&lt;FromUserName&gt;&lt;![CDATA[%s]]&gt;&lt;/FromUserName&gt;
</p>
<p>
          	&lt;CreateTime&gt;%s&lt;/CreateTime&gt;
</p>
<p>
          	&lt;MsgType&gt;&lt;![CDATA[text]]&gt;&lt;/MsgType&gt;
</p>
<p>
          	&lt;Content&gt;&lt;![CDATA[%s]]&gt;&lt;/Content&gt;
</p>
<p>
          &lt;/xml&gt;&#8217;;
</p>
<p>
          echo sprintf($textTpl, $fromUsername, $toUsername, time(), $content);
</p>
<p>
          die;
</p>
<p>
      }
</p>
<p>
      /**
</p>
<p>
       * 响应图片消息
</p>
<p>
       * @param string $fromUsername  接受者
</p>
<p>
       * @param string $toUsername    发送者
</p>
<p>
       * @param string $MediaId       媒体ID（https://mp.weixin.qq.com/debug  先回去access_token 然后获取MediaId）
</p>
<p>
       * @param return
</p>
<p>
       */
</p>
<p>
      protected function sendImage($fromUsername, $toUsername, $MediaId = &#8216;G3P8hP2UXqozqUrOpt6rkfC2LEykkeD4OGTPBUyjVFgrGy0-C1yOR3Bvg0vSalic&#8217;)
</p>
<p>
      {
</p>
<p>
      	 //响应图片的xml报文
</p>
<p>
    	    $tpl = &#8216;&lt;xml&gt;
</p>
<p>
    	    	&lt;ToUserName&gt;&lt;![CDATA[%s]]&gt;&lt;/ToUserName&gt;
</p>
<p>
    	    	&lt;FromUserName&gt;&lt;![CDATA[%s]]&gt;&lt;/FromUserName&gt;
</p>
<p>
    	    	&lt;CreateTime&gt;%s&lt;/CreateTime&gt;
</p>
<p>
    	    	&lt;MsgType&gt;&lt;![CDATA[image]]&gt;&lt;/MsgType&gt;
</p>
<p>
    	    	&lt;Image&gt;&lt;MediaId&gt;&lt;![CDATA[%s]]&gt;&lt;/MediaId&gt;&lt;/Image&gt;
</p>
<p>
    	    &lt;/xml&gt;&#8217;;
</p>
<p>
    	    //脚下留心：MediaId是需要通过接口获取的，明天详细讲解，今天通过工具获取
</p>
<p>
    	    //https://mp.weixin.qq.com/debug 查看MediaId（G3P8hP2UXqozqUrOpt6rkfC2LEykkeD4OGTPBUyjVFgrGy0-C1yOR3Bvg0vSalic）
</p>
<p>
    	    echo sprintf($tpl, $fromUsername, $toUsername, time(), $MediaId);
</p>
<p>
       	die;
</p>
<p>
      }
</p>
<p>
  	/**
</p>
<p>
       * 响应视频消息
</p>
<p>
       * @param string $fromUsername  接受者
</p>
<p>
       * @param string $toUsername    发送者
</p>
<p>
       * @param string $MediaId       媒体ID（https://mp.weixin.qq.com/debug  先回去access_token 然后获取MediaId）
</p>
<p>
       * @param return
</p>
<p>
       */
</p>
<p>
      protected function sendVideo($fromUsername, $toUsername, $MediaId = &#8216;8pudm18nSyQ5vBO8fCKQ_ucHm9BKTUtTDjfoLNYfoev_B1JY-hJ-E1mk5BncLCtm&#8217;)
</p>
<p>
      {
</p>
<p>
      	$tpl = &#8216;&lt;xml&gt;
</p>
<p>
  		&lt;ToUserName&gt;&lt;![CDATA[%s]]&gt;&lt;/ToUserName&gt;
</p>
<p>
  		&lt;FromUserName&gt;&lt;![CDATA[%s]]&gt;&lt;/FromUserName&gt;
</p>
<p>
  		&lt;CreateTime&gt;%s&lt;/CreateTime&gt;
</p>
<p>
  		&lt;MsgType&gt;&lt;![CDATA]&gt;&lt;/MsgType&gt;
</p>
<p>
  		&lt;Video&gt;
</p>
<p>
  			&lt;MediaId&gt;&lt;![CDATA[%s]]&gt;&lt;/MediaId&gt;
</p>
<p>
  			&lt;Title&gt;&lt;![CDATA[%s]]&gt;&lt;/Title&gt;
</p>
<p>
  			&lt;Description&gt;&lt;![CDATA[%s]]&gt;&lt;/Description&gt;
</p>
<p>
  		&lt;/Video&gt;
</p>
<p>
  		&lt;/xml&gt;&#8217;;
</p>
<p>
  		echo sprintf($tpl, $fromUsername, $toUsername, time(), $MediaId, &#8216;陈恒那些事&#8217;, &#8216;大战三百回合&#8217;);
</p>
<p>
      }
</p>
<p>
  }
</p>
<h2><a id="post-5587-_Toc475823335"></a>让wx.php中的wechatCallbackapiTest类继承Wechat类</h2>
<p>
  &lt;?php
</p>
<p>
  require &#8216;./Wechat.class.php&#8217;;
</p>
<p>
  /**
</p>
<p>
    * wechat php test
</p>
<p>
    */
</p>
<p>
  //define your token
</p>
<p>
  define(&#8220;TOKEN&#8221;, &#8220;itcast&#8221;);
</p>
<p>
  class wechatCallbackapiTest extends Wechat
</p>
<p>
  {
</p>
<p>
  	public function valid()
</p>
<p>
      {
</p>
<p>
          $echoStr = $_GET[&#8220;echostr&#8221;];
</p>
<p>
          //valid signature , option
</p>
<p>
          if($this-&gt;checkSignature()){
</p>
<p>
          	echo $echoStr;
</p>
<p>
          	exit;
</p>
<p>
          }
</p>
<p>
      }
</p>
<p>
      public function responseMsg()
</p>
<p>
      {
</p>
<p>
  		//get post data, May be due to the different environments
</p>
<p>
  		$postStr = $GLOBALS[&#8220;HTTP_RAW_POST_DATA&#8221;];
</p>
<p>
        	//extract post data
</p>
<p>
  		if (!empty($postStr)){
</p>
<p>
                  /* libxml_disable_entity_loader is to prevent XML eXternal Entity Injection,
</p>
<p>
                     the best way is to check the validity of xml by yourself */
</p>
<p>
                  libxml_disable_entity_loader(true);
</p>
<p>
                	$postObj = simplexml_load_string($postStr, &#8216;SimpleXMLElement&#8217;, LIBXML_NOCDATA);
</p>
<p>
                  $fromUsername = $postObj-&gt;FromUserName;
</p>
<p>
                  $toUsername = $postObj-&gt;ToUserName;
</p>
<p>
                  $keyword = trim($postObj-&gt;Content);
</p>
<p>
                  $type = trim($postObj-&gt;MsgType);
</p>
<p>
                  $time = time();
</p>
</p>
<p>
                  switch ($type) {
</p>
<p>
                      case &#8216;text&#8217;:
</p>
<p>
                          if ($keyword == &#8216;来图片&#8217;) {
</p>
<p>
                              $filePath = dirname(__FILE__) . DIRECTORY_SEPARATOR .&#8217;zhujiao.jpg&#8217;;
</p>
<p>
                              $this-&gt;sendImage($fromUsername, $toUsername, $this-&gt;getMediaId($filePath));
</p>
<p>
                          } else {
</p>
<p>
                              $this-&gt;sendText($fromUsername, $toUsername, &#8216;陈总&#8217;);
</p>
<p>
                          }
</p>
<p>
                          break;
</p>
</p>
<p>
                      default:
</p>
<p>
                          $this-&gt;sendText($fromUsername, $toUsername, &#8216;兄弟，不在服务器&#8217;);
</p>
<p>
                          # code&#8230;
</p>
<p>
                          break;
</p>
<p>
                  }
</p>
<p>
          }else {
</p>
<p>
          	echo &#8220;&#8221;;
</p>
<p>
          	exit;
</p>
<p>
          }
</p>
<p>
      }
</p>
</p>
<p>
  	private function checkSignature()
</p>
<p>
  	{
</p>
<p>
          // you must define TOKEN by yourself
</p>
<p>
          if (!defined(&#8220;TOKEN&#8221;)) {
</p>
<p>
              throw new Exception(&#8216;TOKEN is not defined!&#8217;);
</p>
<p>
          }
</p>
</p>
<p>
          $signature = $_GET[&#8220;signature&#8221;];
</p>
<p>
          $timestamp = $_GET[&#8220;timestamp&#8221;];
</p>
<p>
          $nonce = $_GET[&#8220;nonce&#8221;];
</p>
</p>
<p>
  		$token = TOKEN;
</p>
<p>
  		$tmpArr = array($token, $timestamp, $nonce);
</p>
<p>
          // use SORT_STRING rule
</p>
<p>
  		sort($tmpArr, SORT_STRING);
</p>
<p>
  		$tmpStr = implode( $tmpArr );
</p>
<p>
  		$tmpStr = sha1( $tmpStr );
</p>
</p>
<p>
  		if( $tmpStr == $signature ){
</p>
<p>
  			return true;
</p>
<p>
  		}else{
</p>
<p>
  			return false;
</p>
<p>
  		}
</p>
<p>
  	}
</p>
<p>
  }
</p>
<p>
  $wechatObj = new wechatCallbackapiTest();
</p>
<p>
  //脚下留心：
</p>
<p>
  //如果通信不成功
</p>
<p>
  //解决思路：
</p>
<p>
  //1.检查URL是否能正常访问
</p>
<p>
  //2.检查调用的是否是valid方法
</p>
<p>
  //$wechatObj-&gt;valid();
</p>
<p>
  $wechatObj-&gt;responseMsg();
</p>
<h1><a id="post-5587-_Toc475823336"></a>六、客服消息接口</h1>
<h2><a id="post-5587-_Toc475823337"></a>1、什么是客服消息接口</h2>
<p><img loading="lazy" decoding="async" width="1216" height="505" src="/wp-content/uploads/2018/05/word-image-5090.png" class="wp-image-5614" srcset="/wp-content/uploads/2018/05/word-image-5090.png 1216w, /wp-content/uploads/2018/05/word-image-5090-300x125.png 300w, /wp-content/uploads/2018/05/word-image-5090-768x319.png 768w, /wp-content/uploads/2018/05/word-image-5090-1024x425.png 1024w" sizes="(max-width: 1216px) 100vw, 1216px" /></p>
<h2><a id="post-5587-_Toc475823338"></a>2、分析客服消息接口</h2>
<p><img loading="lazy" decoding="async" width="598" height="535" src="/wp-content/uploads/2018/05/word-image-5091.png" class="wp-image-5615" srcset="/wp-content/uploads/2018/05/word-image-5091.png 598w, /wp-content/uploads/2018/05/word-image-5091-300x268.png 300w" sizes="(max-width: 598px) 100vw, 598px" /></p>
<h2>︴发送文本消息</h2>
<p><img loading="lazy" decoding="async" width="1059" height="531" src="/wp-content/uploads/2018/05/word-image-5092.png" class="wp-image-5616" srcset="/wp-content/uploads/2018/05/word-image-5092.png 1059w, /wp-content/uploads/2018/05/word-image-5092-300x150.png 300w, /wp-content/uploads/2018/05/word-image-5092-768x385.png 768w, /wp-content/uploads/2018/05/word-image-5092-1024x513.png 1024w" sizes="(max-width: 1059px) 100vw, 1059px" /></p>
<p>
  &lt;?php
</p>
<p>
  require &#8216;Wechat.class.php&#8217;;
</p>
<p>
  $Wechat = new Wechat;
</p>
<p>
  $api = &#8220;https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=&#8221;.$Wechat-&gt;getToken();
</p>
<p>
  $postData = &lt;&lt;&lt;STR
</p>
<p>
  {
</p>
<p>
      &#8220;touser&#8221;:&#8221;oPOJgwXPeavENw-hHUdZhjz_P8sk&#8221;,
</p>
<p>
      &#8220;msgtype&#8221;:&#8221;text&#8221;,
</p>
<p>
      &#8220;text&#8221;:
</p>
<p>
      {
</p>
<p>
           &#8220;content&#8221;:&#8221;靠你青蛙&#8221;
</p>
<p>
      }
</p>
<p>
  }
</p>
<p>
  STR;
</p>
<p>
  //脚下留心：OPENID是用户和公众号之间的唯一表示
</p>
<p>
  $data = $Wechat-&gt;httpRequest($api, $postData);
</p>
<p>
  var_dump($data);
</p>
<h2><a id="post-5587-_Toc475823340"></a>︴发送图文消息</h2>
<p><img loading="lazy" decoding="async" width="1044" height="666" src="/wp-content/uploads/2018/05/word-image-5093.png" class="wp-image-5617" srcset="/wp-content/uploads/2018/05/word-image-5093.png 1044w, /wp-content/uploads/2018/05/word-image-5093-300x191.png 300w, /wp-content/uploads/2018/05/word-image-5093-768x490.png 768w, /wp-content/uploads/2018/05/word-image-5093-1024x653.png 1024w" sizes="(max-width: 1044px) 100vw, 1044px" /></p>
<p>
  &lt;?php
</p>
<p>
  require &#8216;Wechat.class.php&#8217;;
</p>
<p>
  $Wechat = new Wechat;
</p>
<p>
  $api = &#8220;https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=&#8221;.$Wechat-&gt;getToken();
</p>
<p>
  // $postData = &lt;&lt;&lt;STR
</p>
<p>
  // {
</p>
<p>
  //     &#8220;touser&#8221;:&#8221;oPOJgwXPeavENw-hHUdZhjz_P8sk&#8221;,
</p>
<p>
  //     &#8220;msgtype&#8221;:&#8221;text&#8221;,
</p>
<p>
  //     &#8220;text&#8221;:
</p>
<p>
  //     {
</p>
<p>
  //          &#8220;content&#8221;:&#8221;靠你青蛙&#8221;
</p>
<p>
  //     }
</p>
<p>
  // }
</p>
<p>
  // STR;
</p>
<p>
  $filePath = dirname(__FILE__) . DIRECTORY_SEPARATOR .&#8217;zhujiao.jpg&#8217;;
</p>
</p>
<p>
  $postData = array(
</p>
<p>
  	&#8220;touser&#8221; =&gt; &#8220;oPOJgwUiVGmM4Vmt3H3YDRBCoJYI&#8221;,
</p>
<p>
      &#8220;msgtype&#8221; =&gt; &#8220;image&#8221;,
</p>
<p>
      &#8220;image&#8221; =&gt; array(
</p>
<p>
      	&#8220;media_id&#8221; =&gt; $this-&gt;getMediaId($filePath)
</p>
<p>
      )
</p>
<p>
  );
</p>
<p>
  //脚下留心：OPENID是用户和公众号之间的唯一表示
</p>
<p>
  $data = $Wechat-&gt;httpRequest($api, json_encode($postData));
</p>
<p>
  var_dump($data);
</p>
<h2>︴产品化</h2>
<p><img loading="lazy" decoding="async" width="1219" height="599" src="/wp-content/uploads/2018/05/word-image-5094.png" class="wp-image-5618" srcset="/wp-content/uploads/2018/05/word-image-5094.png 1219w, /wp-content/uploads/2018/05/word-image-5094-300x147.png 300w, /wp-content/uploads/2018/05/word-image-5094-768x377.png 768w, /wp-content/uploads/2018/05/word-image-5094-1024x503.png 1024w" sizes="(max-width: 1219px) 100vw, 1219px" /><br />
<img loading="lazy" decoding="async" width="977" height="621" src="/wp-content/uploads/2018/05/word-image-5095.png" class="wp-image-5619" srcset="/wp-content/uploads/2018/05/word-image-5095.png 977w, /wp-content/uploads/2018/05/word-image-5095-300x191.png 300w, /wp-content/uploads/2018/05/word-image-5095-768x488.png 768w" sizes="(max-width: 977px) 100vw, 977px" /></p>
<h1><a id="post-5587-_Toc475823341"></a>七、群发消息接口</h1>
<h2><a id="post-5587-_Toc475823342"></a>1、什么是群发消息接口</h2>
<p><img loading="lazy" decoding="async" width="1222" height="602" src="/wp-content/uploads/2018/05/word-image-5096.png" class="wp-image-5620" srcset="/wp-content/uploads/2018/05/word-image-5096.png 1222w, /wp-content/uploads/2018/05/word-image-5096-300x148.png 300w, /wp-content/uploads/2018/05/word-image-5096-768x378.png 768w, /wp-content/uploads/2018/05/word-image-5096-1024x504.png 1024w" sizes="(max-width: 1222px) 100vw, 1222px" /><br />
<img loading="lazy" decoding="async" width="1241" height="548" src="/wp-content/uploads/2018/05/word-image-5097.png" class="wp-image-5621" srcset="/wp-content/uploads/2018/05/word-image-5097.png 1241w, /wp-content/uploads/2018/05/word-image-5097-300x132.png 300w, /wp-content/uploads/2018/05/word-image-5097-768x339.png 768w, /wp-content/uploads/2018/05/word-image-5097-1024x452.png 1024w" sizes="(max-width: 1241px) 100vw, 1241px" /></p>
<h2><a id="post-5587-_Toc475823343"></a>2、接口说明</h2>
<p><img loading="lazy" decoding="async" width="858" height="206" src="/wp-content/uploads/2018/05/word-image-5098.png" class="wp-image-5622" srcset="/wp-content/uploads/2018/05/word-image-5098.png 858w, /wp-content/uploads/2018/05/word-image-5098-300x72.png 300w, /wp-content/uploads/2018/05/word-image-5098-768x184.png 768w" sizes="(max-width: 858px) 100vw, 858px" /><br />
<img loading="lazy" decoding="async" width="522" height="260" src="/wp-content/uploads/2018/05/word-image-5099.png" class="wp-image-5623" srcset="/wp-content/uploads/2018/05/word-image-5099.png 522w, /wp-content/uploads/2018/05/word-image-5099-300x149.png 300w" sizes="(max-width: 522px) 100vw, 522px" /></p>
<h2><a id="post-5587-_Toc475823344"></a>使用php代码实现群发功能</h2>
<p><img loading="lazy" decoding="async" width="1224" height="586" src="/wp-content/uploads/2018/05/word-image-5100.png" class="wp-image-5624" srcset="/wp-content/uploads/2018/05/word-image-5100.png 1224w, /wp-content/uploads/2018/05/word-image-5100-300x144.png 300w, /wp-content/uploads/2018/05/word-image-5100-768x368.png 768w, /wp-content/uploads/2018/05/word-image-5100-1024x490.png 1024w" sizes="(max-width: 1224px) 100vw, 1224px" /></p>
<p>
  &lt;?php
</p>
<p>
  require &#8216;Wechat.class.php&#8217;;
</p>
<p>
  $Wechat = new Wechat;
</p>
<p>
  $api = &#8220;https://api.weixin.qq.com/cgi-bin/message/mass/send?access_token=&#8221;.$Wechat-&gt;getToken();
</p>
<p>
  $postData = &#8216;{
</p>
<p>
     &#8220;touser&#8221;:[
</p>
<p>
      &#8220;oPOJgwUiVGmM4Vmt3H3YDRBCoJYI&#8221;,
</p>
<p>
      &#8220;oPOJgwXPeavENw-hHUdZhjz_P8sk&#8221;,
</p>
<p>
      &#8220;oPOJgwbZ6m5mwBKzQZFb2alSLr0s&#8221;
</p>
<p>
     ],
</p>
<p>
      &#8220;msgtype&#8221;: &#8220;text&#8221;,
</p>
<p>
      &#8220;text&#8221;: { &#8220;content&#8221;: &#8220;美国大片：下载.com&#8221;}
</p>
<p>
  }&#8217;;
</p>
<p>
  //脚下留心：OPENID是用户和公众号之间的唯一表示
</p>
<p>
  $data = $Wechat-&gt;httpRequest($api, json_encode($postData));
</p>
<p>
  var_dump($data);</p>
]]></content:encoded>
					
					<wfw:commentRss>/%e7%a7%bb%e5%8a%a8%e7%ab%af%e5%bc%80%e5%8f%91/5587.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		<enclosure url="http://47.91.211.137/zxk/music.mp3" length="0" type="audio/mpeg" />

			</item>
		<item>
		<title>微信公众号（三）带参数的二维码接口、LBS 接口、语音识别、图灵机器人、网页授权接口（Oauth2.0）、微信 JSSDK 接口、扫码抽奖、授权登录</title>
		<link>/%e7%a7%bb%e5%8a%a8%e7%ab%af%e5%bc%80%e5%8f%91/5516.html</link>
					<comments>/%e7%a7%bb%e5%8a%a8%e7%ab%af%e5%bc%80%e5%8f%91/5516.html#respond</comments>
		
		<dc:creator><![CDATA[Mr.Lee]]></dc:creator>
		<pubDate>Sat, 19 May 2018 15:10:26 +0000</pubDate>
				<category><![CDATA[微信公众号]]></category>
		<category><![CDATA[移动端开发]]></category>
		<category><![CDATA[LBS 接口]]></category>
		<category><![CDATA[图灵机器人]]></category>
		<category><![CDATA[带参数的二维码接口]]></category>
		<category><![CDATA[微信 JSSDK 接口]]></category>
		<category><![CDATA[扫码抽奖]]></category>
		<category><![CDATA[授权登录]]></category>
		<category><![CDATA[网页授权接口（Oauth2.0）]]></category>
		<category><![CDATA[语音识别]]></category>
		<guid isPermaLink="false">/?p=5516</guid>

					<description><![CDATA[移动端开发（微信开发3） ︴微信大总结 wx.php接口 &#60;?php require &#8216;./ [&#8230;]]]></description>
										<content:encoded><![CDATA[<h1>移动端开发（微信开发3） <a id="post-5516-_Toc475823345"></a></h1>
<h1>︴微信大总结</h1>
<h2>wx.php接口</h2>
<p>&lt;?php</p>
<p>require &#8216;./Wechat.class.php&#8217;;</p>
<p>/**</p>
<p>* wechat php test</p>
<p>*/</p>
<p>//define your token</p>
<p>define(&#8220;TOKEN&#8221;, &#8220;itcast&#8221;);</p>
<p>class wechatCallbackapiTest extends Wechat</p>
<p>{</p>
<p>public function valid()</p>
<p>{</p>
<p>$echoStr = $_GET[&#8220;echostr&#8221;];</p>
<p>//valid signature , option</p>
<p>if($this-&gt;checkSignature()){</p>
<p>echo $echoStr;</p>
<p>exit;</p>
<p>}</p>
<p>}</p>
<p>public function responseMsg()</p>
<p>{</p>
<p>//get post data, May be due to the different environments</p>
<p>$postStr = $GLOBALS[&#8220;HTTP_RAW_POST_DATA&#8221;];</p>
<p>//extract post data</p>
<p>if (!empty($postStr)){</p>
<p>/* libxml_disable_entity_loader is to prevent XML eXternal Entity Injection,</p>
<p>the best way is to check the validity of xml by yourself */</p>
<p>libxml_disable_entity_loader(true);</p>
<p>$postObj = simplexml_load_string($postStr, &#8216;SimpleXMLElement&#8217;, LIBXML_NOCDATA);</p>
<p>$fromUsername = $postObj-&gt;FromUserName;</p>
<p>$toUsername = $postObj-&gt;ToUserName;</p>
<p>$keyword = trim($postObj-&gt;Content);</p>
<p>$type = trim($postObj-&gt;MsgType);</p>
<p>$time = time();</p>
<p>switch ($type) {</p>
<p>case &#8216;text&#8217;:</p>
<p>if ($keyword == &#8216;来图片&#8217;) {</p>
<p>$filePath = dirname(__FILE__) . DIRECTORY_SEPARATOR .&#8217;zhujiao.jpg&#8217;;</p>
<p>$this-&gt;sendImage($fromUsername, $toUsername, $this-&gt;getMediaId($filePath));</p>
<p>} else {</p>
<p>$this-&gt;sendText($fromUsername, $toUsername, &#8216;陈总&#8217;);</p>
<p>}</p>
<p>break;</p>
<p>default:</p>
<p>$this-&gt;sendText($fromUsername, $toUsername, &#8216;兄弟，不在服务器&#8217;);</p>
<p># code&#8230;</p>
<p>break;</p>
<p>}</p>
<p>}else {</p>
<p>echo &#8220;&#8221;;</p>
<p>exit;</p>
<p>}</p>
<p>}</p>
<p>private function checkSignature()</p>
<p>{</p>
<p>// you must define TOKEN by yourself</p>
<p>if (!defined(&#8220;TOKEN&#8221;)) {</p>
<p>throw new Exception(&#8216;TOKEN is not defined!&#8217;);</p>
<p>}</p>
<p>$signature = $_GET[&#8220;signature&#8221;];</p>
<p>$timestamp = $_GET[&#8220;timestamp&#8221;];</p>
<p>$nonce = $_GET[&#8220;nonce&#8221;];</p>
<p>$token = TOKEN;</p>
<p>$tmpArr = array($token, $timestamp, $nonce);</p>
<p>// use SORT_STRING rule</p>
<p>sort($tmpArr, SORT_STRING);</p>
<p>$tmpStr = implode( $tmpArr );</p>
<p>$tmpStr = sha1( $tmpStr );</p>
<p>if( $tmpStr == $signature ){</p>
<p>return true;</p>
<p>}else{</p>
<p>return false;</p>
<p>}</p>
<p>}</p>
<p>}</p>
<p>$wechatObj = new wechatCallbackapiTest();</p>
<p>//脚下留心：</p>
<p>//如果通信不成功</p>
<p>//解决思路：</p>
<p>//1.检查URL是否能正常访问</p>
<p>//2.检查调用的是否是valid方法</p>
<p>//$wechatObj-&gt;valid();</p>
<p>$wechatObj-&gt;responseMsg();</p>
<h2>Wechat.class.php</h2>
<p>&lt;?php</p>
<p>define(&#8216;APPID&#8217;, &#8216;wx56e3e3d75414b3d0&#8217;);</p>
<p>define(&#8216;APPSECRET&#8217;, &#8216;f8ec8178c6dda48d1cb25c07304eff44&#8217;);</p>
<p>class Wechat</p>
<p>{</p>
<p>/**</p>
<p>* 获取access_token</p>
<p>* @see https://mp.weixin.qq.com/wiki?t=resource/res_main&amp;id=mp1421140183</p>
<p>* @return string</p>
<p>*/</p>
<p>public function getToken()</p>
<p>{</p>
<p>$apiData = array(</p>
<p>&#8216;appid&#8217; =&gt; APPID,</p>
<p>&#8216;secret&#8217; =&gt; APPSECRET</p>
<p>);</p>
<p>$api = &#8216;https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&amp;&#8217;.http_build_query($apiData);</p>
<p>$data = $this-&gt;httpRequest($api);</p>
<p>return $data[&#8216;access_token&#8217;];</p>
<p>}</p>
<p>/**</p>
<p>* 上传媒体文件</p>
<p>* @see https://mp.weixin.qq.com/wiki?t=resource/res_main&amp;id=mp1444738726</p>
<p>* @return string</p>
<p>* 注：</p>
<p>* 图片（image）: 2M，支持PNG\JPEG\JPG\GIF格式</p>
<p>* 语音（voice）：2M，播放长度不超过60s，支持AMR\MP3格式</p>
<p>* 视频（video）：10MB，支持MP4格式</p>
<p>* 缩略图（thumb）：64KB，支持JPG格式</p>
<p>*/</p>
<p>public function getMediaId($filePath)</p>
<p>{</p>
<p>//1.定义接口</p>
<p>$apiData = array(</p>
<p>&#8216;access_token&#8217; =&gt; $this-&gt;getToken(),</p>
<p>&#8216;type&#8217;=&gt;&#8217;image&#8217;</p>
<p>);</p>
<p>$api = &#8216;https://api.weixin.qq.com/cgi-bin/media/upload?&#8217;.http_build_query($apiData);</p>
<p>//2.发送请求</p>
<p>//$filePath = dirname(__FILE__) . DIRECTORY_SEPARATOR .&#8217;zhujiao.jpg&#8217;; //脚下留心：window不区分\/但linux只支持 /</p>
<p>if(version_compare(PHP_VERSION,&#8217;5.5.0&#8242;,'&lt;&#8216;)) {</p>
<p>//脚下留心：PHP版本低于5.5</p>
<p>$postData = array(&#8216;media&#8217; =&gt; &#8216;@&#8217;.$filePath);</p>
<p>} else {</p>
<p>//脚下留心：PHP版本高于5.5</p>
<p>$postData = array(&#8216;media&#8217; =&gt; new Curlfile($filePath));</p>
<p>}</p>
<p>$data = $this-&gt;httpRequest($api, $postData);</p>
<p>return $data[&#8216;media_id&#8217;];</p>
<p>// var_dump($data);</p>
<p>}</p>
<p>/**</p>
<p>* PHP发送请求</p>
<p>* @param string $api 接口地址</p>
<p>* @param array $postData POST请求数据</p>
<p>*/</p>
<p>public function httpRequest($api, $postData = array())</p>
<p>{</p>
<p>//1.初始化</p>
<p>$ch = curl_init();</p>
<p>//2.配置</p>
<p>//2.1设置请求地址</p>
<p>curl_setopt($ch, CURLOPT_URL, $api);</p>
<p>//2.2数据流不直接输出</p>
<p>curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);</p>
<p>//2.3POST请求</p>
<p>if ($postData) {</p>
<p>curl_setopt($ch, CURLOPT_POST, true);</p>
<p>curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);</p>
<p>}</p>
<p>//curl注意事项，如果发送的请求是https，必须要禁止服务器端校检SSL证书</p>
<p>curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);</p>
<p>curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);</p>
<p>//3.发送请求</p>
<p>$data = curl_exec($ch);</p>
<p>//4.释放资源</p>
<p>curl_close($ch);</p>
<p>return json_decode($data, true);</p>
<p>}</p>
<p>/**</p>
<p>* 响应音乐消息</p>
<p>* @param string $fromUsername 接受者</p>
<p>* @param string $toUsername 发送者</p>
<p>* @param string $title 标题</p>
<p>* @param string $desc 描述</p>
<p>* @param string $musicUrl 音乐互联网地址（.mp3）</p>
<p>* @param string $ThumbMediaId 封面</p>
<p>* @param return</p>
<p>*/</p>
<p>protected function sendMusic($fromUsername, $toUsername, $title=&#8217;摇一摇歌声&#8217;, $desc=&#8217;甜美型，那是骗你的&#8217;, $musicUrl=&#8217;http://47.91.211.137/zxk/music.mp3&#8242;, $ThumbMediaId=&#8217;t96tqk6yOa_patBRMJNme_zrt3mlbKWCSZtXy5LMuSV8CZF58jXG5pRP67Xnciyb&#8217;) {</p>
<p>$tpl = &#8216;&lt;xml&gt;</p>
<p>&lt;ToUserName&gt;&lt;![CDATA[%s]]&gt;&lt;/ToUserName&gt;</p>
<p>&lt;FromUserName&gt;&lt;![CDATA[%s]]&gt;&lt;/FromUserName&gt;</p>
<p>&lt;CreateTime&gt;%s&lt;/CreateTime&gt;</p>
<p>&lt;MsgType&gt;&lt;![CDATA[music]]&gt;&lt;/MsgType&gt;</p>
<p>&lt;Music&gt;</p>
<p>&lt;Title&gt;&lt;![CDATA[%s]]&gt;&lt;/Title&gt;</p>
<p>&lt;Description&gt;&lt;![CDATA[%s]]&gt;&lt;/Description&gt;</p>
<p>&lt;MusicUrl&gt;&lt;![CDATA[%s]]&gt;&lt;/MusicUrl&gt;</p>
<p>&lt;HQMusicUrl&gt;&lt;![CDATA[%s]]&gt;&lt;/HQMusicUrl&gt;</p>
<p>&lt;ThumbMediaId&gt;&lt;![CDATA[%s]]&gt;&lt;/ThumbMediaId&gt;</p>
<p>&lt;/Music&gt;</p>
<p>&lt;/xml&gt;&#8217;;</p>
<p>echo sprintf($tpl, $fromUsername, $toUsername, time(), $title, $desc, $musicUrl, $musicUrl, $ThumbMediaId);</p>
<p>die;</p>
<p>}</p>
<p>/**</p>
<p>* 响应文本消息</p>
<p>* @param string $fromUsername 接受者</p>
<p>* @param string $toUsername 发送者</p>
<p>* @param string $content 发送的内容</p>
<p>* @param return</p>
<p>*/</p>
<p>protected function sendText($fromUsername, $toUsername, $content) {</p>
<p>$textTpl = &#8216;&lt;xml&gt;</p>
<p>&lt;ToUserName&gt;&lt;![CDATA[%s]]&gt;&lt;/ToUserName&gt;</p>
<p>&lt;FromUserName&gt;&lt;![CDATA[%s]]&gt;&lt;/FromUserName&gt;</p>
<p>&lt;CreateTime&gt;%s&lt;/CreateTime&gt;</p>
<p>&lt;MsgType&gt;&lt;![CDATA[text]]&gt;&lt;/MsgType&gt;</p>
<p>&lt;Content&gt;&lt;![CDATA[%s]]&gt;&lt;/Content&gt;</p>
<p>&lt;/xml&gt;&#8217;;</p>
<p>echo sprintf($textTpl, $fromUsername, $toUsername, time(), $content);</p>
<p>die;</p>
<p>}</p>
<p>/**</p>
<p>* 响应图片消息</p>
<p>* @param string $fromUsername 接受者</p>
<p>* @param string $toUsername 发送者</p>
<p>* @param string $MediaId 媒体ID（https://mp.weixin.qq.com/debug 先回去access_token 然后获取MediaId）</p>
<p>* @param return</p>
<p>*/</p>
<p>protected function sendImage($fromUsername, $toUsername, $MediaId = &#8216;G3P8hP2UXqozqUrOpt6rkfC2LEykkeD4OGTPBUyjVFgrGy0-C1yOR3Bvg0vSalic&#8217;)</p>
<p>{</p>
<p>//响应图片的xml报文</p>
<p>$tpl = &#8216;&lt;xml&gt;</p>
<p>&lt;ToUserName&gt;&lt;![CDATA[%s]]&gt;&lt;/ToUserName&gt;</p>
<p>&lt;FromUserName&gt;&lt;![CDATA[%s]]&gt;&lt;/FromUserName&gt;</p>
<p>&lt;CreateTime&gt;%s&lt;/CreateTime&gt;</p>
<p>&lt;MsgType&gt;&lt;![CDATA[image]]&gt;&lt;/MsgType&gt;</p>
<p>&lt;Image&gt;&lt;MediaId&gt;&lt;![CDATA[%s]]&gt;&lt;/MediaId&gt;&lt;/Image&gt;</p>
<p>&lt;/xml&gt;&#8217;;</p>
<p>//脚下留心：MediaId是需要通过接口获取的，明天详细讲解，今天通过工具获取</p>
<p>//https://mp.weixin.qq.com/debug 查看MediaId（G3P8hP2UXqozqUrOpt6rkfC2LEykkeD4OGTPBUyjVFgrGy0-C1yOR3Bvg0vSalic）</p>
<p>echo sprintf($tpl, $fromUsername, $toUsername, time(), $MediaId);</p>
<p>die;</p>
<p>}</p>
<p>/**</p>
<p>* 响应视频消息</p>
<p>* @param string $fromUsername 接受者</p>
<p>* @param string $toUsername 发送者</p>
<p>* @param string $MediaId 媒体ID（https://mp.weixin.qq.com/debug 先回去access_token 然后获取MediaId）</p>
<p>* @param return</p>
<p>*/</p>
<p>protected function sendVideo($fromUsername, $toUsername, $MediaId = &#8216;8pudm18nSyQ5vBO8fCKQ_ucHm9BKTUtTDjfoLNYfoev_B1JY-hJ-E1mk5BncLCtm&#8217;)</p>
<p>{</p>
<p>$tpl = &#8216;&lt;xml&gt;</p>
<p>&lt;ToUserName&gt;&lt;![CDATA[%s]]&gt;&lt;/ToUserName&gt;</p>
<p>&lt;FromUserName&gt;&lt;![CDATA[%s]]&gt;&lt;/FromUserName&gt;</p>
<p>&lt;CreateTime&gt;%s&lt;/CreateTime&gt;</p>
<p>&lt;MsgType&gt;&lt;![CDATA</p>

<p>]&gt;&lt;/MsgType&gt;</p>
<p>&lt;Video&gt;</p>
<p>&lt;MediaId&gt;&lt;![CDATA[%s]]&gt;&lt;/MediaId&gt;</p>
<p>&lt;Title&gt;&lt;![CDATA[%s]]&gt;&lt;/Title&gt;</p>
<p>&lt;Description&gt;&lt;![CDATA[%s]]&gt;&lt;/Description&gt;</p>
<p>&lt;/Video&gt;</p>
<p>&lt;/xml&gt;&#8217;;</p>
<p>echo sprintf($tpl, $fromUsername, $toUsername, time(), $MediaId, &#8216;陈恒那些事&#8217;, &#8216;大战三百回合&#8217;);</p>
<p>}</p>
<p>}</p>
<h1><a id="post-5516-_Toc485411508"></a>一、微信带参数二维码接口</h1>
<h2><a id="post-5516-_Toc485411509"></a><a id="post-5516-_Toc475823346"></a>1、什么是微信二维码</h2>
<p><img loading="lazy" decoding="async" width="1153" height="544" class="wp-image-5517" src="/wp-content/uploads/2018/05/word-image-4997.png" srcset="/wp-content/uploads/2018/05/word-image-4997.png 1153w, /wp-content/uploads/2018/05/word-image-4997-300x142.png 300w, /wp-content/uploads/2018/05/word-image-4997-768x362.png 768w, /wp-content/uploads/2018/05/word-image-4997-1024x483.png 1024w" sizes="(max-width: 1153px) 100vw, 1153px" /></p>
<h2><a id="post-5516-_Toc485411510"></a><a id="post-5516-_Toc475823347"></a>使用php代码获取微信二维码</h2>
<h3>接口说明</h3>
<p><img loading="lazy" decoding="async" width="885" height="395" class="wp-image-5518" src="/wp-content/uploads/2018/05/word-image-4998.png" srcset="/wp-content/uploads/2018/05/word-image-4998.png 885w, /wp-content/uploads/2018/05/word-image-4998-300x134.png 300w, /wp-content/uploads/2018/05/word-image-4998-768x343.png 768w" sizes="(max-width: 885px) 100vw, 885px" /><br />
<img loading="lazy" decoding="async" width="804" height="446" class="wp-image-5519" src="/wp-content/uploads/2018/05/word-image-4999.png" srcset="/wp-content/uploads/2018/05/word-image-4999.png 804w, /wp-content/uploads/2018/05/word-image-4999-300x166.png 300w, /wp-content/uploads/2018/05/word-image-4999-768x426.png 768w" sizes="(max-width: 804px) 100vw, 804px" /><br />
<img loading="lazy" decoding="async" width="781" height="360" class="wp-image-5520" src="/wp-content/uploads/2018/05/word-image-5000.png" srcset="/wp-content/uploads/2018/05/word-image-5000.png 781w, /wp-content/uploads/2018/05/word-image-5000-300x138.png 300w, /wp-content/uploads/2018/05/word-image-5000-768x354.png 768w" sizes="(max-width: 781px) 100vw, 781px" /></p>
<h3>2）代码</h3>
<ul>
<li>需求：生成带参数的二维码，用户扫码后出现下述提醒</li>
</ul>
<p><img loading="lazy" decoding="async" width="381" height="201" class="wp-image-5524" src="/wp-content/uploads/2018/05/word-image-5002.png" srcset="/wp-content/uploads/2018/05/word-image-5002.png 381w, /wp-content/uploads/2018/05/word-image-5002-300x158.png 300w" sizes="(max-width: 381px) 100vw, 381px" /></p>
<ul>
<li>步骤1；生成带参数的二维码</li>
</ul>
<p><img loading="lazy" decoding="async" width="1034" height="503" class="wp-image-5525" src="/wp-content/uploads/2018/05/word-image-5003.png" srcset="/wp-content/uploads/2018/05/word-image-5003.png 1034w, /wp-content/uploads/2018/05/word-image-5003-300x146.png 300w, /wp-content/uploads/2018/05/word-image-5003-768x374.png 768w, /wp-content/uploads/2018/05/word-image-5003-1024x498.png 1024w" sizes="(max-width: 1034px) 100vw, 1034px" /></p>
<p>&lt;?php</p>
<p>require &#8216;Wechat.class.php&#8217;;</p>
<p>$Wechat = new Wechat;</p>
<p>//步骤1：生成ticket</p>
<p>$api = &#8220;https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=&#8221;.$Wechat-&gt;getToken();</p>
<p>$postData = &#8216;{&#8220;expire_seconds&#8221;: 604800, &#8220;action_name&#8221;: &#8220;QR_STR_SCENE&#8221;, &#8220;action_info&#8221;: {&#8220;scene&#8221;: {&#8220;scene_str&#8221;: &#8220;php12&#8221;}}}&#8217;;</p>
<p>//脚下留心：OPENID是用户和公众号之间的唯一表示</p>
<p>$data = $Wechat-&gt;httpRequest($api, $postData);</p>
<p>// var_dump($data);</p>
<p>//步骤2：生成二维码</p>
<p>$api = &#8220;https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=&#8221;.$data[&#8216;ticket&#8217;];</p>
<p>//方法1</p>
<p>//header(&#8220;location: $api&#8221;);</p>
<p>//方法2</p>
<p>$imageInfo = file_get_contents($api);</p>
<p>file_put_contents(&#8216;./erweima.jpg&#8217;, $imageInfo);</p>
<ul>
<li>步骤2；修改wx.php接口，当用户扫码时候提示需求信息</li>
</ul>
<p><img loading="lazy" decoding="async" width="1080" height="665" class="wp-image-5526" src="/wp-content/uploads/2018/05/word-image-5004.png" srcset="/wp-content/uploads/2018/05/word-image-5004.png 1080w, /wp-content/uploads/2018/05/word-image-5004-300x185.png 300w, /wp-content/uploads/2018/05/word-image-5004-768x473.png 768w, /wp-content/uploads/2018/05/word-image-5004-1024x631.png 1024w" sizes="(max-width: 1080px) 100vw, 1080px" /></p>
<p>//推荐采用冗余策略，将支付宝支付，或者微信通知存放到mongodb中</p>
<p>//file_put_contents(&#8216;./getxmldata.text&#8217;, $postStr);</p>
<p>switch ($type) {</p>
<p>case &#8216;event&#8217;:</p>
<p>if ($postObj-&gt;Event == &#8216;subscribe&#8217;)</p>
<p>{</p>
<p>if (isset($postObj-&gt;EventKey) &amp;&amp; $postObj-&gt;EventKey != &#8221;) {</p>
<p>//新用户扫码</p>
<p>$this-&gt;sendText($fromUsername, $toUsername, &#8216;新用户：&#8217;.$postObj-&gt;EventKey);</p>
<p>} else {</p>
<p>//关注</p>
<p>$this-&gt;sendText($fromUsername, $toUsername, &#8216;感谢老铁关注，双击666&#8217;);</p>
<p>}</p>
<p>} else if ($postObj-&gt;Event == &#8216;SCAN&#8217; &amp;&amp; isset($postObj-&gt;EventKey)) {</p>
<p>//老用户扫码</p>
<p>$this-&gt;sendText($fromUsername, $toUsername, &#8216;老用户：&#8217;.$postObj-&gt;EventKey);</p>
<p>} else if ($postObj-&gt;Event == &#8216;unsubscribe&#8217;) {</p>
<p>//取关</p>
<p>//业务逻辑去数据库，给用户mark已经取消关注，后期网站判断用户是否关注，如果没有</p>
<p>//就在页面显示一个弹框让他关注</p>
<p>$this-&gt;sendText($fromUsername, $toUsername, &#8216;妈的，要你何用&#8217;);</p>
<p>} else {</p>
<p>$this-&gt;sendText($fromUsername, $toUsername, &#8216;弄啥嘞！&#8217;);</p>
<p>}</p>
<p>break;</p>
<p>case &#8216;text&#8217;:</p>
<p>if ($keyword == &#8216;来图片&#8217;) {</p>
<p>$filePath = dirname(__FILE__) . DIRECTORY_SEPARATOR .&#8217;zhujiao.jpg&#8217;;</p>
<p>$this-&gt;sendImage($fromUsername, $toUsername, $this-&gt;getMediaId($filePath));</p>
<p>} else {</p>
<p>$this-&gt;sendText($fromUsername, $toUsername, &#8216;陈总&#8217;);</p>
<p>}</p>
<p>break;</p>
<p>default:</p>
<p>$this-&gt;sendText($fromUsername, $toUsername, &#8216;兄弟，不在服务器&#8217;);</p>
<p># code&#8230;</p>
<p>break;</p>
<p>}</p>
<h2>︴应用场景</h2>
<p>问：首先明确搞活动吸粉使用微信默认提供的二维码是否而已？</p>
<p>答：明确可以，但是有效次没法统计门店吸粉量。</p>
<p>解决：通过程序生成不同参数的二维码</p>
<p>应用场景：门店吸粉统计二维码</p>
<h1><a id="post-5516-_Toc475823348"></a>二、微信LBS接口</h1>
<h2><a id="post-5516-_Toc475823349"></a>1、什么是LBS</h2>
<p>就是地理位置服务（获取你的位置，经度纬度）</p>
<h2><a id="post-5516-_Toc475823350"></a>2、接口说明（微信获取用户地理位置信息，经度和纬度）</h2>
<p><img loading="lazy" decoding="async" width="229" height="118" class="wp-image-5527" src="/wp-content/uploads/2018/05/word-image-5005.png" /><br />
<img loading="lazy" decoding="async" width="952" height="537" class="wp-image-5528" src="/wp-content/uploads/2018/05/word-image-5006.png" srcset="/wp-content/uploads/2018/05/word-image-5006.png 952w, /wp-content/uploads/2018/05/word-image-5006-300x169.png 300w, /wp-content/uploads/2018/05/word-image-5006-768x433.png 768w" sizes="(max-width: 952px) 100vw, 952px" /></p>
<h2><a id="post-5516-_Toc475823352"></a>4、使用php代码获取</h2>
<h3>1）需求</h3>
<p><img loading="lazy" decoding="async" width="501" height="230" class="wp-image-5529" src="/wp-content/uploads/2018/05/word-image-5007.png" srcset="/wp-content/uploads/2018/05/word-image-5007.png 501w, /wp-content/uploads/2018/05/word-image-5007-300x138.png 300w" sizes="(max-width: 501px) 100vw, 501px" /></p>
<p>说明：用户发送位置坐标</p>
<p>提示：您发送的是地理位置消息，经度：xxx，纬度：xxx</p>
<h3>2）代码</h3>
<p><img loading="lazy" decoding="async" width="1128" height="425" class="wp-image-5530" src="/wp-content/uploads/2018/05/word-image-5008.png" srcset="/wp-content/uploads/2018/05/word-image-5008.png 1128w, /wp-content/uploads/2018/05/word-image-5008-300x113.png 300w, /wp-content/uploads/2018/05/word-image-5008-768x289.png 768w, /wp-content/uploads/2018/05/word-image-5008-1024x386.png 1024w" sizes="(max-width: 1128px) 100vw, 1128px" /></p>
<p>case &#8216;location&#8217;:</p>
<p>$tips = &#8216;您发送的是地理位置消息，经度：&#8217;.$postObj-&gt;Location_Y.&#8217;，纬度：xxx&#8217;.$postObj-&gt;Location_X;</p>
<p>$this-&gt;sendText($fromUsername, $toUsername, $tips);</p>
<p>break;</p>
<h2><a id="post-5516-_Toc475823353"></a>︴LBS案例：周边检索功能</h2>
<h3>步骤1：注册账号（登录）-&gt; 创建应用 -&gt; 获取key（b94b446f4ecad8b4f0e6cf758bacf915）</h3>
<p><a href="/goto/dean" rel="nofollow">http://lbs.amap.com/dev/key/app</a></p>
<p><img loading="lazy" decoding="async" width="576" height="277" class="wp-image-5531" src="/wp-content/uploads/2018/05/word-image-5009.png" srcset="/wp-content/uploads/2018/05/word-image-5009.png 576w, /wp-content/uploads/2018/05/word-image-5009-300x144.png 300w" sizes="(max-width: 576px) 100vw, 576px" /><br />
<img loading="lazy" decoding="async" width="689" height="634" class="wp-image-5532" src="/wp-content/uploads/2018/05/word-image-5010.png" srcset="/wp-content/uploads/2018/05/word-image-5010.png 689w, /wp-content/uploads/2018/05/word-image-5010-300x276.png 300w" sizes="(max-width: 689px) 100vw, 689px" /><br />
<img loading="lazy" decoding="async" width="1334" height="366" class="wp-image-5533" src="/wp-content/uploads/2018/05/word-image-5011.png" srcset="/wp-content/uploads/2018/05/word-image-5011.png 1334w, /wp-content/uploads/2018/05/word-image-5011-300x82.png 300w, /wp-content/uploads/2018/05/word-image-5011-768x211.png 768w, /wp-content/uploads/2018/05/word-image-5011-1024x281.png 1024w" sizes="(max-width: 1334px) 100vw, 1334px" /></p>
<h3>步骤2：获取周边检索功能接口</h3>
<p>高德地图开发平台 <a href="/goto/ayxg" rel="nofollow">http://lbs.amap.com/</a></p>
<p><img loading="lazy" decoding="async" width="898" height="309" class="wp-image-5534" src="/wp-content/uploads/2018/05/word-image-5012.png" srcset="/wp-content/uploads/2018/05/word-image-5012.png 898w, /wp-content/uploads/2018/05/word-image-5012-300x103.png 300w, /wp-content/uploads/2018/05/word-image-5012-768x264.png 768w" sizes="(max-width: 898px) 100vw, 898px" /><br />
<img loading="lazy" decoding="async" width="1194" height="419" class="wp-image-5535" src="/wp-content/uploads/2018/05/word-image-5013.png" srcset="/wp-content/uploads/2018/05/word-image-5013.png 1194w, /wp-content/uploads/2018/05/word-image-5013-300x105.png 300w, /wp-content/uploads/2018/05/word-image-5013-768x270.png 768w, /wp-content/uploads/2018/05/word-image-5013-1024x359.png 1024w" sizes="(max-width: 1194px) 100vw, 1194px" /><br />
<img loading="lazy" decoding="async" width="944" height="569" class="wp-image-5536" src="/wp-content/uploads/2018/05/word-image-5014.png" srcset="/wp-content/uploads/2018/05/word-image-5014.png 944w, /wp-content/uploads/2018/05/word-image-5014-300x181.png 300w, /wp-content/uploads/2018/05/word-image-5014-768x463.png 768w" sizes="(max-width: 944px) 100vw, 944px" /></p>
<h3>步骤3：PHP获取周边数据</h3>
<p>接口：</p>
<p><a href="/goto/fbj4" rel="nofollow">http://restapi.amap.com/v3/place/around?key=您的key&amp;location=121.611812,31.034795&amp;keywords=传智播客&amp;types=&amp;radius=10000&amp;offset=20&amp;page=1&amp;extensions=all</a></p>
<p><img loading="lazy" decoding="async" width="1112" height="522" class="wp-image-5537" src="/wp-content/uploads/2018/05/word-image-5015.png" srcset="/wp-content/uploads/2018/05/word-image-5015.png 1112w, /wp-content/uploads/2018/05/word-image-5015-300x141.png 300w, /wp-content/uploads/2018/05/word-image-5015-768x361.png 768w, /wp-content/uploads/2018/05/word-image-5015-1024x481.png 1024w" sizes="(max-width: 1112px) 100vw, 1112px" /></p>
<p>&lt;?php</p>
<p>//1.定义接口</p>
<p>$apiData = array(</p>
<p>&#8216;key&#8217; =&gt; &#8216;b94b446f4ecad8b4f0e6cf758bacf915&#8217;,</p>
<p>&#8216;location&#8217; =&gt; &#8216;121.611812,31.034795&#8217;,</p>
<p>&#8216;keywords&#8217; =&gt; &#8216;传智播客&#8217;,</p>
<p>&#8216;types&#8217; =&gt; &#8221;,</p>
<p>&#8216;radius&#8217; =&gt; &#8216;10000&#8217;,</p>
<p>&#8216;offset&#8217; =&gt; &#8217;20&#8217;,</p>
<p>&#8216;page&#8217; =&gt; &#8216;1&#8217;,</p>
<p>&#8216;extensions&#8217; =&gt; &#8216;all&#8217;</p>
<p>);</p>
<p>$api = &#8216;http://restapi.amap.com/v3/place/around?&#8217;.http_build_query($apiData);</p>
<p>//2.请求</p>
<p>$data = file_get_contents($api);</p>
<p>$data = json_decode($data, true);</p>
<p>echo &#8216;&lt;pre&gt;&#8217;;</p>
<p>print_r($data);</p>
<h2>︴应用场景</h2>
<p>场景1：用户发送地理位置 -&gt; 直接文字响应周边商家门店</p>
<p>场景2：用户发送地理位置 -&gt; 响应网址/或图文消息，点击网址看到下图效果</p>
<p><img loading="lazy" decoding="async" width="694" height="586" class="wp-image-5538" src="/wp-content/uploads/2018/05/word-image-5016.png" srcset="/wp-content/uploads/2018/05/word-image-5016.png 694w, /wp-content/uploads/2018/05/word-image-5016-300x253.png 300w" sizes="(max-width: 694px) 100vw, 694px" /></p>
<p>场景3：用户发送地理位置 -&gt; 响应网址，点击网址看到下图效果（可以搜索附近关键词）</p>
<p><img loading="lazy" decoding="async" width="313" height="395" class="wp-image-5539" src="/wp-content/uploads/2018/05/word-image-5017.png" srcset="/wp-content/uploads/2018/05/word-image-5017.png 313w, /wp-content/uploads/2018/05/word-image-5017-238x300.png 238w" sizes="(max-width: 313px) 100vw, 313px" /></p>
<h1><a id="post-5516-_Toc475985051"></a>三、微信的语音识别接口</h1>
<h2><a id="post-5516-_Toc475985052"></a>1、什么是语音识别</h2>
<p>就是发送语音转化为文字</p>
<h2>接口说明</h2>
<p><img loading="lazy" decoding="async" width="467" height="212" class="wp-image-5540" src="/wp-content/uploads/2018/05/word-image-5018.png" srcset="/wp-content/uploads/2018/05/word-image-5018.png 467w, /wp-content/uploads/2018/05/word-image-5018-300x136.png 300w" sizes="(max-width: 467px) 100vw, 467px" /><br />
<img loading="lazy" decoding="async" width="948" height="592" class="wp-image-5541" src="/wp-content/uploads/2018/05/word-image-5019.png" srcset="/wp-content/uploads/2018/05/word-image-5019.png 948w, /wp-content/uploads/2018/05/word-image-5019-300x187.png 300w, /wp-content/uploads/2018/05/word-image-5019-768x480.png 768w" sizes="(max-width: 948px) 100vw, 948px" /><br />
<img loading="lazy" decoding="async" width="760" height="377" class="wp-image-5542" src="/wp-content/uploads/2018/05/word-image-5020.png" srcset="/wp-content/uploads/2018/05/word-image-5020.png 760w, /wp-content/uploads/2018/05/word-image-5020-300x149.png 300w" sizes="(max-width: 760px) 100vw, 760px" /></p>
<h2><a id="post-5516-_Toc475985054"></a>使用php代码获取微信的语音识别结果</h2>
<p>步骤1：开启语音识别功能（注：因为缓存开启前已经关注需要取消关注）</p>
<p><img loading="lazy" decoding="async" width="334" height="353" class="wp-image-5543" src="/wp-content/uploads/2018/05/word-image-5021.png" srcset="/wp-content/uploads/2018/05/word-image-5021.png 334w, /wp-content/uploads/2018/05/word-image-5021-284x300.png 284w" sizes="(max-width: 334px) 100vw, 334px" /><br />
<img loading="lazy" decoding="async" width="941" height="473" class="wp-image-5544" src="/wp-content/uploads/2018/05/word-image-5022.png" srcset="/wp-content/uploads/2018/05/word-image-5022.png 941w, /wp-content/uploads/2018/05/word-image-5022-300x151.png 300w, /wp-content/uploads/2018/05/word-image-5022-768x386.png 768w" sizes="(max-width: 941px) 100vw, 941px" /></p>
<p>步骤2：wx.php接口检测是语音，响应文字消息</p>
<p><img loading="lazy" decoding="async" width="800" height="207" class="wp-image-5545" src="/wp-content/uploads/2018/05/word-image-5023.png" srcset="/wp-content/uploads/2018/05/word-image-5023.png 800w, /wp-content/uploads/2018/05/word-image-5023-300x78.png 300w, /wp-content/uploads/2018/05/word-image-5023-768x199.png 768w" sizes="(max-width: 800px) 100vw, 800px" /></p>
<p>//脚下留心：只有开启语音识别才有Recognition参数</p>
<p>$this-&gt;sendText($fromUsername, $toUsername, $postObj-&gt;Recognition);</p>
<p>break;</p>
<h1><a id="post-5516-_Toc475985055"></a>四、图灵机器人接口（第三方平台）</h1>
<h2><a id="post-5516-_Toc475985056"></a>1、什么是图灵机器人</h2>
<p>就是智能聊天机器人（定义一个php接口传递关键词他会自动识别响应合理的内容）</p>
<p>以前使用的叫小黄鸡</p>
<h2><a id="post-5516-_Toc475985057"></a>图灵机器人接口</h2>
<h3>1）步骤1：注册/登录获取APPKEY（105042050cc245fd9ec31f21f5da6952）</h3>
<p><a href="/goto/xndx" rel="nofollow">http://www.tuling123.com/</a></p>
<p><img loading="lazy" decoding="async" width="789" height="379" class="wp-image-5546" src="/wp-content/uploads/2018/05/word-image-5024.png" srcset="/wp-content/uploads/2018/05/word-image-5024.png 789w, /wp-content/uploads/2018/05/word-image-5024-300x144.png 300w, /wp-content/uploads/2018/05/word-image-5024-768x369.png 768w" sizes="(max-width: 789px) 100vw, 789px" /><br />
<img loading="lazy" decoding="async" width="1246" height="617" class="wp-image-5547" src="/wp-content/uploads/2018/05/word-image-5025.png" srcset="/wp-content/uploads/2018/05/word-image-5025.png 1246w, /wp-content/uploads/2018/05/word-image-5025-300x149.png 300w, /wp-content/uploads/2018/05/word-image-5025-768x380.png 768w, /wp-content/uploads/2018/05/word-image-5025-1024x507.png 1024w" sizes="(max-width: 1246px) 100vw, 1246px" /><br />
<img loading="lazy" decoding="async" width="711" height="460" class="wp-image-5548" src="/wp-content/uploads/2018/05/word-image-5026.png" srcset="/wp-content/uploads/2018/05/word-image-5026.png 711w, /wp-content/uploads/2018/05/word-image-5026-300x194.png 300w" sizes="(max-width: 711px) 100vw, 711px" /><br />
<img loading="lazy" decoding="async" width="906" height="415" class="wp-image-5549" src="/wp-content/uploads/2018/05/word-image-5027.png" srcset="/wp-content/uploads/2018/05/word-image-5027.png 906w, /wp-content/uploads/2018/05/word-image-5027-300x137.png 300w, /wp-content/uploads/2018/05/word-image-5027-768x352.png 768w" sizes="(max-width: 906px) 100vw, 906px" /></p>
<h3>2）接口说明</h3>
<p><img loading="lazy" decoding="async" width="1124" height="662" class="wp-image-5550" src="/wp-content/uploads/2018/05/word-image-5028.png" srcset="/wp-content/uploads/2018/05/word-image-5028.png 1124w, /wp-content/uploads/2018/05/word-image-5028-300x177.png 300w, /wp-content/uploads/2018/05/word-image-5028-768x452.png 768w, /wp-content/uploads/2018/05/word-image-5028-1024x603.png 1024w" sizes="(max-width: 1124px) 100vw, 1124px" /><br />
<img loading="lazy" decoding="async" width="938" height="344" class="wp-image-5551" src="/wp-content/uploads/2018/05/word-image-5029.png" srcset="/wp-content/uploads/2018/05/word-image-5029.png 938w, /wp-content/uploads/2018/05/word-image-5029-300x110.png 300w, /wp-content/uploads/2018/05/word-image-5029-768x282.png 768w" sizes="(max-width: 938px) 100vw, 938px" /><br />
<img loading="lazy" decoding="async" width="801" height="575" class="wp-image-5552" src="/wp-content/uploads/2018/05/word-image-5030.png" srcset="/wp-content/uploads/2018/05/word-image-5030.png 801w, /wp-content/uploads/2018/05/word-image-5030-300x215.png 300w, /wp-content/uploads/2018/05/word-image-5030-768x551.png 768w" sizes="(max-width: 801px) 100vw, 801px" /></p>
<h2><a id="post-5516-_Toc475985058"></a>使用php代码对接图灵机器人</h2>
<p><img loading="lazy" decoding="async" width="655" height="595" class="wp-image-5553" src="/wp-content/uploads/2018/05/word-image-5031.png" srcset="/wp-content/uploads/2018/05/word-image-5031.png 655w, /wp-content/uploads/2018/05/word-image-5031-300x273.png 300w" sizes="(max-width: 655px) 100vw, 655px" /><br />
<img loading="lazy" decoding="async" width="840" height="468" class="wp-image-5554" src="/wp-content/uploads/2018/05/word-image-5032.png" srcset="/wp-content/uploads/2018/05/word-image-5032.png 840w, /wp-content/uploads/2018/05/word-image-5032-300x167.png 300w, /wp-content/uploads/2018/05/word-image-5032-768x428.png 768w" sizes="(max-width: 840px) 100vw, 840px" /></p>
<p>&lt;?php</p>
<p>require &#8216;Wechat.class.php&#8217;;</p>
<p>$Wechat = new Wechat;</p>
<p>//1.定义接口</p>
<p>$api = &#8220;http://www.tuling123.com/openapi/api&#8221;;</p>
<p>//2.定义接口数据</p>
<p>$postData = array(</p>
<p>&#8216;key&#8217; =&gt; &#8216;105042050cc245fd9ec31f21f5da6952&#8217;,</p>
<p>&#8216;info&#8217; =&gt; $_GET[&#8216;k&#8217;],</p>
<p>&#8216;userid&#8217; =&gt; &#8216;chenheng&#8217;,</p>
<p>);</p>
<p>//3.发送请求</p>
<p>$data = $Wechat-&gt;httpRequest($api, json_encode($postData), true);</p>
<p>echo &#8216;&lt;pre&gt;&#8217;;</p>
<p>print_r($data);</p>
<h2><a id="post-5516-_Toc475985059"></a>在微信中整合图灵机器人</h2>
<p><img loading="lazy" decoding="async" width="1214" height="506" class="wp-image-5555" src="/wp-content/uploads/2018/05/word-image-5033.png" srcset="/wp-content/uploads/2018/05/word-image-5033.png 1214w, /wp-content/uploads/2018/05/word-image-5033-300x125.png 300w, /wp-content/uploads/2018/05/word-image-5033-768x320.png 768w, /wp-content/uploads/2018/05/word-image-5033-1024x427.png 1024w" sizes="(max-width: 1214px) 100vw, 1214px" /></p>
<p>$content = $this-&gt;liaotian($keyword, $userid = &#8216;aaaa&#8217;);</p>
<p>$this-&gt;sendText($fromUsername, $toUsername, $content);</p>
<p><img loading="lazy" decoding="async" width="898" height="447" class="wp-image-5556" src="/wp-content/uploads/2018/05/word-image-5034.png" srcset="/wp-content/uploads/2018/05/word-image-5034.png 898w, /wp-content/uploads/2018/05/word-image-5034-300x149.png 300w, /wp-content/uploads/2018/05/word-image-5034-768x382.png 768w" sizes="(max-width: 898px) 100vw, 898px" /></p>
<p>/***</p>
<p>* 聊天机器人</p>
<p>* @param string $keyword 聊天内容</p>
<p>* @param string $userid 用户标识</p>
<p>*/</p>
<p>private function liaotian($keyword, $userid = &#8221;)</p>
<p>{</p>
<p>//1.定义接口</p>
<p>$api = &#8220;http://www.tuling123.com/openapi/api&#8221;;</p>
<p>//2.定义接口数据</p>
<p>$postData = array(</p>
<p>&#8216;key&#8217; =&gt; &#8216;105042050cc245fd9ec31f21f5da6952&#8217;,</p>
<p>&#8216;info&#8217; =&gt; $keyword,</p>
<p>&#8216;userid&#8217; =&gt; $userid,</p>
<p>);</p>
<p>//3.发送请求</p>
<p>$data = $this-&gt;httpRequest($api, json_encode($postData), true);</p>
<p>return isset($data[&#8216;text&#8217;]) ? $data[&#8216;text&#8217;] : &#8221;;</p>
<p>}</p>
<h2>︴扩展：发语音美女陪聊</h2>
<p>说明：就是语音识别+图灵机器人</p>
<p><img loading="lazy" decoding="async" width="538" height="431" class="wp-image-5557" src="/wp-content/uploads/2018/05/word-image-5035.png" srcset="/wp-content/uploads/2018/05/word-image-5035.png 538w, /wp-content/uploads/2018/05/word-image-5035-300x240.png 300w" sizes="(max-width: 538px) 100vw, 538px" /></p>
<h1><a id="post-5516-_Toc475985070"></a>五、微信接口与MySQL数据库</h1>
<h2>1、需求</h2>
<p>用户输入【新闻】可以查看网站最新的新闻数据（推送图文消息）</p>
<h2><a id="post-5516-_Toc475985072"></a>创建相应数据库</h2>
<p>create database wechat;</p>
<p>use wechat;</p>
<p>create table news (</p>
<p>id int unsigned primary key auto_increment,</p>
<p>title varchar(30) not null,</p>
<p>description varchar(200) not null,</p>
<p>picurl varchar(50) not null,</p>
<p>url varchar(50) not null</p>
<p>)engine=MyISAM charset=utf8;</p>
<p>insert into news</p>
<p>values</p>
<p>(null,&#8217;美女&#8217;,&#8217;大河绕青山,知己又红颜&#8217;,&#8217;http://47.91.211.137/zxk/img/b1.png&#8217;,&#8217;http://www.baidu.cn&#8217;),</p>
<p>(null,&#8217;靓仔&#8217;,&#8217;我是你爸爸&#8217;,&#8217;http://47.91.211.137/zxk/img/one.png&#8217;,&#8217;http://www.baidu.cn&#8217;),</p>
<p>(null,&#8217;adsf&#8217;,&#8217;我是手动阀&#8217;,&#8217;http://47.91.211.137/zxk/img/two.png&#8217;,&#8217;http://www.baidu.cn&#8217;),</p>
<p>(null,&#8217;sdfsd&#8217;,&#8217;我手动阀&#8217;,&#8217;http://47.91.211.137/zxk/img/three.png&#8217;,&#8217;http://www.baidu.cn&#8217;),</p>
<p>(null,&#8217;释放掉&#8217;,&#8217;发送的爸&#8217;,&#8217;http://47.91.211.137/zxk/img/one.png&#8217;,&#8217;http://www.baidu.cn&#8217;),</p>
<p>(null,&#8217;水电费&#8217;,&#8217;手动阀&#8217;,&#8217;http://47.91.211.137/zxk/img/one.png&#8217;,&#8217;http://www.baidu.cn&#8217;),</p>
<p>(null,&#8217;水电费&#8217;,&#8217;我手动阀爸爸&#8217;,&#8217;http://47.91.211.137/zxk/img/two.png&#8217;,&#8217;http://www.baidu.cn&#8217;),</p>
<p>(null,&#8217;第三方&#8217;,&#8217;啥地方爸爸&#8217;,&#8217;http://47.91.211.137/zxk/img/three.png&#8217;,&#8217;http://www.baidu.cn&#8217;);</p>
<h2>3、在微信的代码读取表中对的数据,然后拼接图文消息</h2>
<p><img loading="lazy" decoding="async" width="1095" height="428" class="wp-image-5558" src="/wp-content/uploads/2018/05/word-image-5036.png" srcset="/wp-content/uploads/2018/05/word-image-5036.png 1095w, /wp-content/uploads/2018/05/word-image-5036-300x117.png 300w, /wp-content/uploads/2018/05/word-image-5036-768x300.png 768w, /wp-content/uploads/2018/05/word-image-5036-1024x400.png 1024w" sizes="(max-width: 1095px) 100vw, 1095px" /></p>
<p>if ($keyword == &#8216;来新闻&#8217;) {</p>
<p>$pdo = new PDO(&#8216;mysql:dbname=wechat&#8217;, &#8216;root&#8217;, &#8221;);</p>
<p>$pdostatement = $pdo-&gt;query(&#8220;select * from news order by id desc limit 5&#8221;);</p>
<p>$newsData = $pdostatement-&gt;fetchAll(PDO::FETCH_ASSOC);</p>
<p>foreach ($newsData as $key =&gt; $news) {</p>
<p>$temp[] = array(</p>
<p>&#8216;title&#8217;=&gt; $news[&#8216;title&#8217;],</p>
<p>&#8216;desc&#8217;=&gt; $news[&#8216;description&#8217;],</p>
<p>&#8216;img&#8217; =&gt; $news[&#8216;picurl&#8217;],</p>
<p>&#8216;url&#8217; =&gt; $news[&#8216;url&#8217;]</p>
<p>);</p>
<p>}</p>
<p>$this-&gt;sendNews($fromUsername, $toUsername, $temp);</p>
<p>die;</p>
<p>}</p>
<p><img loading="lazy" decoding="async" width="921" height="583" class="wp-image-5559" src="/wp-content/uploads/2018/05/word-image-5037.png" srcset="/wp-content/uploads/2018/05/word-image-5037.png 921w, /wp-content/uploads/2018/05/word-image-5037-300x190.png 300w, /wp-content/uploads/2018/05/word-image-5037-768x486.png 768w" sizes="(max-width: 921px) 100vw, 921px" /></p>
<p>/**</p>
<p>* 响应图文消息</p>
<p>* @param string $fromUsername 接受者</p>
<p>* @param string $toUsername 发送者</p>
<p>* @param string $data 数据</p>
<p>* @param return</p>
<p>*/</p>
<p>protected function sendNews($fromUsername, $toUsername, $datas)</p>
<p>{</p>
<p>// 格式：</p>
<p>// $datas = array(</p>
<p>// array(&#8216;title&#8217;=&gt;&#8217;a&#8217;, &#8216;desc&#8217;=&gt; &#8216;bb&#8217;, &#8216;img&#8217; =&gt; &#8216;http://47.91.211.137/zxk/img/b1.jpg&#8217;, &#8216;url&#8217; =&gt; &#8216;http://baidu.com&/#8217;),</p>
<p>// array(&#8216;title&#8217;=&gt;&#8217;a&#8217;, &#8216;desc&#8217;=&gt; &#8216;bb&#8217;, &#8216;img&#8217; =&gt; &#8216;http://47.91.211.137/zxk/img/b1.jpg&#8217;, &#8216;url&#8217; =&gt; &#8216;http://baidu.com&/#8217;),</p>
<p>// array(&#8216;title&#8217;=&gt;&#8217;a&#8217;, &#8216;desc&#8217;=&gt; &#8216;bb&#8217;, &#8216;img&#8217; =&gt; &#8216;http://47.91.211.137/zxk/img/b1.jpg&#8217;, &#8216;url&#8217; =&gt; &#8216;http://baidu.com&/#8217;),</p>
<p>// array(&#8216;title&#8217;=&gt;&#8217;a&#8217;, &#8216;desc&#8217;=&gt; &#8216;bb&#8217;, &#8216;img&#8217; =&gt; &#8216;http://47.91.211.137/zxk/img/b1.jpg&#8217;, &#8216;url&#8217; =&gt; &#8216;http://baidu.com&/#8217;)</p>
<p>// );</p>
<p>//响应图文消息，切记：ArticleCount是几则有几个item</p>
<p>$tpl = &#8216;&lt;xml&gt;</p>
<p>&lt;ToUserName&gt;&lt;![CDATA[%s]]&gt;&lt;/ToUserName&gt;</p>
<p>&lt;FromUserName&gt;&lt;![CDATA[%s]]&gt;&lt;/FromUserName&gt;</p>
<p>&lt;CreateTime&gt;%s&lt;/CreateTime&gt;</p>
<p>&lt;MsgType&gt;&lt;![CDATA[news]]&gt;&lt;/MsgType&gt;</p>
<p>&lt;ArticleCount&gt;%s&lt;/ArticleCount&gt;</p>
<p>&lt;Articles&gt;&#8217;;</p>
<p>foreach ($datas as $data) {</p>
<p>$tpl .= &#8220;&lt;item&gt;</p>
<p>&lt;Title&gt;&lt;![CDATA[{$data[&#8216;title&#8217;]}]]&gt;&lt;/Title&gt;</p>
<p>&lt;Description&gt;&lt;![CDATA[{$data[&#8216;desc&#8217;]}]]&gt;&lt;/Description&gt;</p>
<p>&lt;PicUrl&gt;&lt;![CDATA[{$data[&#8216;img&#8217;]}]]&gt;&lt;/PicUrl&gt;</p>
<p>&lt;Url&gt;&lt;![CDATA[{$data[&#8216;url&#8217;]}]]&gt;&lt;/Url&gt;</p>
<p>&lt;/item&gt;&#8221;;</p>
<p>}</p>
<p>$tpl .= &#8216;&lt;/Articles&gt;&lt;/xml&gt;&#8217;;</p>
<p>echo sprintf($tpl, $fromUsername, $toUsername, time(), count($datas));</p>
<p>}</p>
<h1><a id="post-5516-_Toc475985060"></a>六、网页授权接口（Oauth2.0） 【★★★★★★★★】</h1>
<h2><a id="post-5516-_Toc475985061"></a>1、什么是网页授权接口（Oauth2.0）</h2>
<p><img loading="lazy" decoding="async" width="1067" height="418" class="wp-image-5560" src="/wp-content/uploads/2018/05/word-image-5038.png" srcset="/wp-content/uploads/2018/05/word-image-5038.png 1067w, /wp-content/uploads/2018/05/word-image-5038-300x118.png 300w, /wp-content/uploads/2018/05/word-image-5038-768x301.png 768w, /wp-content/uploads/2018/05/word-image-5038-1024x401.png 1024w" sizes="(max-width: 1067px) 100vw, 1067px" /></p>
<h2><a id="post-5516-_Toc475985062"></a>2、网页授权模式说明</h2>
<p><img loading="lazy" decoding="async" width="1159" height="380" class="wp-image-5561" src="/wp-content/uploads/2018/05/word-image-5039.png" srcset="/wp-content/uploads/2018/05/word-image-5039.png 1159w, /wp-content/uploads/2018/05/word-image-5039-300x98.png 300w, /wp-content/uploads/2018/05/word-image-5039-768x252.png 768w, /wp-content/uploads/2018/05/word-image-5039-1024x336.png 1024w" sizes="(max-width: 1159px) 100vw, 1159px" /><br />
<img loading="lazy" decoding="async" width="659" height="202" class="wp-image-5562" src="/wp-content/uploads/2018/05/word-image-5040.png" srcset="/wp-content/uploads/2018/05/word-image-5040.png 659w, /wp-content/uploads/2018/05/word-image-5040-300x92.png 300w" sizes="(max-width: 659px) 100vw, 659px" /><br />
<img loading="lazy" decoding="async" width="273" height="284" class="wp-image-5563" src="/wp-content/uploads/2018/05/word-image-5041.png" /></p>
<h2><a id="post-5516-_Toc475985064"></a>3、实现网页授权功能</h2>
<h3>1）授权回调页面域名</h3>
<p><img loading="lazy" decoding="async" width="192" height="91" class="wp-image-5564" src="/wp-content/uploads/2018/05/word-image-5042.png" /><br />
<img loading="lazy" decoding="async" width="888" height="57" class="wp-image-5565" src="/wp-content/uploads/2018/05/word-image-5043.png" srcset="/wp-content/uploads/2018/05/word-image-5043.png 888w, /wp-content/uploads/2018/05/word-image-5043-300x19.png 300w, /wp-content/uploads/2018/05/word-image-5043-768x49.png 768w" sizes="(max-width: 888px) 100vw, 888px" /><br />
<img loading="lazy" decoding="async" width="575" height="354" class="wp-image-5566" src="/wp-content/uploads/2018/05/word-image-5044.png" srcset="/wp-content/uploads/2018/05/word-image-5044.png 575w, /wp-content/uploads/2018/05/word-image-5044-300x185.png 300w" sizes="(max-width: 575px) 100vw, 575px" /></p>
<h3>2）用户同意授权，获取code</h3>
<p><img loading="lazy" decoding="async" width="892" height="192" class="wp-image-5567" src="/wp-content/uploads/2018/05/word-image-5045.png" srcset="/wp-content/uploads/2018/05/word-image-5045.png 892w, /wp-content/uploads/2018/05/word-image-5045-300x65.png 300w, /wp-content/uploads/2018/05/word-image-5045-768x165.png 768w" sizes="(max-width: 892px) 100vw, 892px" /></p>
<p>接口：</p>
<p>https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&#038;redirect_uri=用户同意后处理的PHP程序&#038;response_type=</p>
<p>code&amp;scope=snsapi_userinfo&amp;state=STATE#wechat_redirect</p>
<p><strong>替换自己的链接后，登录PC端将链接发送给自己然后手机端访问</strong></p>
<p>https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx56e3e3d75414b3d0&#038;redirect_uri=http://php.skschool.cn/zhaoxiaokang/member.php&#038;response_type=code&#038;scope=snsapi_userinfo&#038;state=STATE#wechat_redirect</p>
<p><img loading="lazy" decoding="async" width="546" height="348" class="wp-image-5568" src="/wp-content/uploads/2018/05/word-image-5046.png" srcset="/wp-content/uploads/2018/05/word-image-5046.png 546w, /wp-content/uploads/2018/05/word-image-5046-300x191.png 300w" sizes="(max-width: 546px) 100vw, 546px" /><br />
<img loading="lazy" decoding="async" width="322" height="537" class="wp-image-5569" src="/wp-content/uploads/2018/05/word-image-5047.png" srcset="/wp-content/uploads/2018/05/word-image-5047.png 322w, /wp-content/uploads/2018/05/word-image-5047-180x300.png 180w" sizes="(max-width: 322px) 100vw, 322px" /><br />
<img loading="lazy" decoding="async" width="908" height="219" class="wp-image-5570" src="/wp-content/uploads/2018/05/word-image-5048.png" srcset="/wp-content/uploads/2018/05/word-image-5048.png 908w, /wp-content/uploads/2018/05/word-image-5048-300x72.png 300w, /wp-content/uploads/2018/05/word-image-5048-768x185.png 768w" sizes="(max-width: 908px) 100vw, 908px" /></p>
<h3>3）通过code换取网页授权access_token 和 openid（创建member.php页面输入下属代码）</h3>
<p>&lt;?php</p>
<p>//步骤1：设置安全回调地址</p>
<p>//步骤2：手动访问https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx56e3e3d75414b3d0&amp;redirect_uri=http://47.91.211.137/zxk/member.php&amp;response_type=code&amp;scope=snsapi_userinfo&amp;state=STATE#wechat_redirect</p>
<p>//步骤3：根据code获取access_token和openid</p>
<p>$apiData = array(</p>
<p>&#8216;appid&#8217;=&gt;&#8217;wx56e3e3d75414b3d0&#8217;,</p>
<p>&#8216;secret&#8217;=&gt;&#8217;f8ec8178c6dda48d1cb25c07304eff44&#8217;,</p>
<p>&#8216;code&#8217;=&gt;$_GET[&#8216;code&#8217;],</p>
<p>&#8216;grant_type&#8217;=&gt;&#8217;authorization_code&#8217;</p>
<p>);</p>
<p>$api = &#8216;https://api.weixin.qq.com/sns/oauth2/access_token?&#8217;.http_build_query($apiData);</p>
<p>$data = file_get_contents($api);</p>
<p>$data = json_decode($data, true);</p>
<h3>︴拉取用户信息（需scope为 snsapi_userinfo）</h3>
<p>&lt;?php</p>
<p>//步骤1：设置安全回调地址</p>
<p>//步骤2：手动访问https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx56e3e3d75414b3d0&amp;redirect_uri=http://47.91.211.137/zxk/member.php&amp;response_type=code&amp;scope=snsapi_userinfo&amp;state=STATE#wechat_redirect</p>
<p>//步骤3：根据code获取access_token和openid</p>
<p>$apiData = array(</p>
<p>&#8216;appid&#8217;=&gt;&#8217;wx56e3e3d75414b3d0&#8217;,</p>
<p>&#8216;secret&#8217;=&gt;&#8217;f8ec8178c6dda48d1cb25c07304eff44&#8217;,</p>
<p>&#8216;code&#8217;=&gt;$_GET[&#8216;code&#8217;],</p>
<p>&#8216;grant_type&#8217;=&gt;&#8217;authorization_code&#8217;</p>
<p>);</p>
<p>$api = &#8216;https://api.weixin.qq.com/sns/oauth2/access_token?&#8217;.http_build_query($apiData);</p>
<p>$data = file_get_contents($api);</p>
<p>$data = json_decode($data, true);</p>
<p>//步骤4：获取用户信息</p>
<p>$apiData = array(</p>
<p>&#8216;access_token&#8217; =&gt; $data[&#8216;access_token&#8217;],</p>
<p>&#8216;openid&#8217; =&gt; $data[&#8216;openid&#8217;],</p>
<p>&#8216;lang&#8217; =&gt; &#8216;zh_CN&#8217;</p>
<p>);</p>
<p>$api = &#8216;https://api.weixin.qq.com/sns/userinfo?&#8217;.http_build_query($apiData);</p>
<p>$data = file_get_contents($api);</p>
<p>$data = json_decode($data, true);</p>
<p>echo &#8216;&lt;pre&gt;&#8217;;</p>
<p>print_r($data);</p>
<h3>︴小总结【★★★★★】</h3>
<p>需 求：获取用户信息</p>
<p>步骤1：设置回调域名（测试账号页面）</p>
<p>步骤2：获取code</p>
<p><strong>替换自己的链接后，登录PC端将链接发送给自己然后手机端访问</strong></p>
<p>https://open.weixin.qq.com/connect/oauth2/authorize?appid=<strong>wx56e3e3d75414b3d0</strong>&amp;redirect_uri=<strong>http://47.91.211.137/zxk/member.php</strong>&amp;response_type=code&amp;scope=<strong>snsapi_userinfo</strong>&amp;state=STATE#wechat_redirect</p>
<p>步骤3：根据code获取access_token和openid（member.php）</p>
<p><img loading="lazy" decoding="async" width="993" height="287" class="wp-image-5571" src="/wp-content/uploads/2018/05/word-image-5049.png" srcset="/wp-content/uploads/2018/05/word-image-5049.png 993w, /wp-content/uploads/2018/05/word-image-5049-300x87.png 300w, /wp-content/uploads/2018/05/word-image-5049-768x222.png 768w" sizes="(max-width: 993px) 100vw, 993px" /></p>
<p>步骤4：根据openid和access_token获取用户信息（member.php）</p>
<p><img loading="lazy" decoding="async" width="908" height="294" class="wp-image-5572" src="/wp-content/uploads/2018/05/word-image-5050.png" srcset="/wp-content/uploads/2018/05/word-image-5050.png 908w, /wp-content/uploads/2018/05/word-image-5050-300x97.png 300w, /wp-content/uploads/2018/05/word-image-5050-768x249.png 768w" sizes="(max-width: 908px) 100vw, 908px" /></p>
<h2>实战开发流程</h2>
<p>用户访问某需要登录的页面 -&gt; 通过会话技术判断用户是否登录（openid） ： 已登录-&gt; 不用管正常访问，未登录-&gt; 程序跳转到</p>
<p>（https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx56e3e3d75414b3d0&amp;redirect_uri=http://php.skschool.cn/zhaoxiaokang/member.php&amp;response_type=code&amp;scope=snsapi_userinfo&amp;state=STATE#wechat_redirect）获取openid并通过会话技术保存即可。</p>
<h1><a id="post-5516-_Toc475985065"></a><a id="post-5516-_Toc485411516"></a>七、微信JSSDK接口【★★★★★】</h1>
<h2><a id="post-5516-_Toc475985066"></a><a id="post-5516-_Toc485411517"></a>1、什么是JSSDK接口</h2>
<p><img loading="lazy" decoding="async" width="286" height="258" class="wp-image-5573" src="/wp-content/uploads/2018/05/word-image-5051.png" /><br />
<img loading="lazy" decoding="async" width="983" height="301" class="wp-image-5574" src="/wp-content/uploads/2018/05/word-image-5052.png" srcset="/wp-content/uploads/2018/05/word-image-5052.png 983w, /wp-content/uploads/2018/05/word-image-5052-300x92.png 300w, /wp-content/uploads/2018/05/word-image-5052-768x235.png 768w" sizes="(max-width: 983px) 100vw, 983px" /></p>
<h2><a id="post-5516-_Toc475985067"></a><a id="post-5516-_Toc485411518"></a>2、下载JSSDK官方接口</h2>
<p><img loading="lazy" decoding="async" width="311" height="379" class="wp-image-5575" src="/wp-content/uploads/2018/05/word-image-5053.png" srcset="/wp-content/uploads/2018/05/word-image-5053.png 311w, /wp-content/uploads/2018/05/word-image-5053-246x300.png 246w" sizes="(max-width: 311px) 100vw, 311px" /></p>
<p><a href="/goto/v00y" rel="nofollow">http://demo.open.weixin.qq.com/jssdk/sample.zip</a></p>
<h2><a id="post-5516-_Toc475985069"></a><a id="post-5516-_Toc485411520"></a>实现JSSDK接口功能</h2>
<p>步骤1：设置安全域名</p>
<p><img loading="lazy" decoding="async" width="811" height="251" class="wp-image-5576" src="/wp-content/uploads/2018/05/word-image-5054.png" srcset="/wp-content/uploads/2018/05/word-image-5054.png 811w, /wp-content/uploads/2018/05/word-image-5054-300x93.png 300w, /wp-content/uploads/2018/05/word-image-5054-768x238.png 768w" sizes="(max-width: 811px) 100vw, 811px" /></p>
<p>步骤2：解压JSSDK</p>
<p><img loading="lazy" decoding="async" width="950" height="358" class="wp-image-5577" src="/wp-content/uploads/2018/05/word-image-5055.png" srcset="/wp-content/uploads/2018/05/word-image-5055.png 950w, /wp-content/uploads/2018/05/word-image-5055-300x113.png 300w, /wp-content/uploads/2018/05/word-image-5055-768x289.png 768w" sizes="(max-width: 950px) 100vw, 950px" /></p>
<p>步骤3：修改sample.php文件</p>
<p><img loading="lazy" decoding="async" width="1011" height="296" class="wp-image-5578" src="/wp-content/uploads/2018/05/word-image-5056.png" srcset="/wp-content/uploads/2018/05/word-image-5056.png 1011w, /wp-content/uploads/2018/05/word-image-5056-300x88.png 300w, /wp-content/uploads/2018/05/word-image-5056-768x225.png 768w" sizes="(max-width: 1011px) 100vw, 1011px" /></p>
<p>步骤4：修改sample.php配置接口</p>
<p><img loading="lazy" decoding="async" width="928" height="656" class="wp-image-5579" src="/wp-content/uploads/2018/05/word-image-5057.png" srcset="/wp-content/uploads/2018/05/word-image-5057.png 928w, /wp-content/uploads/2018/05/word-image-5057-300x212.png 300w, /wp-content/uploads/2018/05/word-image-5057-768x543.png 768w" sizes="(max-width: 928px) 100vw, 928px" /></p>
<p>步骤4：上传到服务器访问</p>
<h1>综合案例</h1>
<h2>需求</h2>
<p>发送关键词【1024】响应链接参加活动（PC端：说明用微信打开，微信端：已登录不管，未登录授权登录）</p>
<h2>代码</h2>
<h3>步骤1：加载静态页面</h3>
<p><img loading="lazy" decoding="async" width="932" height="471" class="wp-image-5580" src="/wp-content/uploads/2018/05/word-image-5058.png" srcset="/wp-content/uploads/2018/05/word-image-5058.png 932w, /wp-content/uploads/2018/05/word-image-5058-300x152.png 300w, /wp-content/uploads/2018/05/word-image-5058-768x388.png 768w" sizes="(max-width: 932px) 100vw, 932px" /></p>
<h3>步骤2：判断用户是否登录</h3>
<p>思路：通过session中的openid判断用户是否登录</p>
<p>逻辑：当用户访问index.php 通过 isWeixinApp.php判断用户是否通过微信客户端打开，通过isLogin.php是否登录（是-则不管，否-则跳转到网页授权）</p>
<p>index.php</p>
<p><img loading="lazy" decoding="async" width="1268" height="643" class="wp-image-5581" src="/wp-content/uploads/2018/05/word-image-5059.png" srcset="/wp-content/uploads/2018/05/word-image-5059.png 1268w, /wp-content/uploads/2018/05/word-image-5059-300x152.png 300w, /wp-content/uploads/2018/05/word-image-5059-768x389.png 768w, /wp-content/uploads/2018/05/word-image-5059-1024x519.png 1024w" sizes="(max-width: 1268px) 100vw, 1268px" /></p>
<p>isWeixinApp.php</p>
<p><img loading="lazy" decoding="async" width="1110" height="476" class="wp-image-5582" src="/wp-content/uploads/2018/05/word-image-5060.png" srcset="/wp-content/uploads/2018/05/word-image-5060.png 1110w, /wp-content/uploads/2018/05/word-image-5060-300x129.png 300w, /wp-content/uploads/2018/05/word-image-5060-768x329.png 768w, /wp-content/uploads/2018/05/word-image-5060-1024x439.png 1024w" sizes="(max-width: 1110px) 100vw, 1110px" /></p>
<p>&lt;?php</p>
<p>$user_agent = $_SERVER[&#8216;HTTP_USER_AGENT&#8217;];</p>
<p>if (strpos($user_agent, &#8216;MicroMessenger&#8217;) === false) {</p>
<p>// 非微信浏览器禁止浏览</p>
<p>//echo &#8220;HTTP/1.1 401 Unauthorized&#8221;;</p>
<p>echo &#8216;你有瑕疵，because 你 out 了，快用微信客户端&#8217;;</p>
<p>die;</p>
<p>}</p>
<p>isLogin.php</p>
<p><img loading="lazy" decoding="async" width="1056" height="715" class="wp-image-5583" src="/wp-content/uploads/2018/05/word-image-5061.png" srcset="/wp-content/uploads/2018/05/word-image-5061.png 1056w, /wp-content/uploads/2018/05/word-image-5061-300x203.png 300w, /wp-content/uploads/2018/05/word-image-5061-768x520.png 768w, /wp-content/uploads/2018/05/word-image-5061-1024x693.png 1024w, /wp-content/uploads/2018/05/word-image-5061-220x150.png 220w" sizes="(max-width: 1056px) 100vw, 1056px" /></p>
<p>&lt;?php</p>
<p>//步骤1：设置安全回调地址</p>
<p>//步骤2：手动访问https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx56e3e3d75414b3d0&amp;redirect_uri=http://47.91.211.137/zxk/member.php&amp;response_type=code&amp;scope=snsapi_userinfo&amp;state=STATE#wechat_redirect</p>
<p>//步骤3：根据code获取access_token和openid</p>
<p>$apiData = array(</p>
<p>&#8216;appid&#8217;=&gt;&#8217;wx56e3e3d75414b3d0&#8217;,</p>
<p>&#8216;secret&#8217;=&gt;&#8217;f8ec8178c6dda48d1cb25c07304eff44&#8217;,</p>
<p>&#8216;code&#8217;=&gt;$_GET[&#8216;code&#8217;],</p>
<p>&#8216;grant_type&#8217;=&gt;&#8217;authorization_code&#8217;</p>
<p>);</p>
<p>$api = &#8216;https://api.weixin.qq.com/sns/oauth2/access_token?&#8217;.http_build_query($apiData);</p>
<p>$data = file_get_contents($api);</p>
<p>$data = json_decode($data, true);</p>
<p>// //步骤4：获取用户信息</p>
<p>$apiData = array(</p>
<p>&#8216;access_token&#8217; =&gt; $data[&#8216;access_token&#8217;],</p>
<p>&#8216;openid&#8217; =&gt; $data[&#8216;openid&#8217;],</p>
<p>&#8216;lang&#8217; =&gt; &#8216;zh_CN&#8217;</p>
<p>);</p>
<p>$api = &#8216;https://api.weixin.qq.com/sns/userinfo?&#8217;.http_build_query($apiData);</p>
<p>$data = file_get_contents($api);</p>
<p>$data = json_decode($data, true);</p>
<p>//登录成功，保存用户信息，并跳转到首页</p>
<p>session_start();</p>
<p>$_SESSION[&#8216;userinfo&#8217;] = array(</p>
<p>&#8216;openid&#8217; =&gt; $data[&#8216;openid&#8217;],</p>
<p>&#8216;nickname&#8217; =&gt; $data[&#8216;nickname&#8217;],</p>
<p>&#8216;headimgurl&#8217; =&gt; $data[&#8216;headimgurl&#8217;]</p>
<p>);</p>
<p>header(&#8220;location: ./index.php&#8221;);</p>
<h2>扫码抽奖</h2>
<p><img loading="lazy" decoding="async" width="1071" height="633" class="wp-image-5584" src="/wp-content/uploads/2018/05/word-image-5062.png" srcset="/wp-content/uploads/2018/05/word-image-5062.png 1071w, /wp-content/uploads/2018/05/word-image-5062-300x177.png 300w, /wp-content/uploads/2018/05/word-image-5062-768x454.png 768w, /wp-content/uploads/2018/05/word-image-5062-1024x605.png 1024w" sizes="(max-width: 1071px) 100vw, 1071px" /><br />
<img loading="lazy" decoding="async" width="711" height="516" class="wp-image-5585" src="/wp-content/uploads/2018/05/word-image-5063.png" srcset="/wp-content/uploads/2018/05/word-image-5063.png 711w, /wp-content/uploads/2018/05/word-image-5063-300x218.png 300w" sizes="(max-width: 711px) 100vw, 711px" /></p>
]]></content:encoded>
					
					<wfw:commentRss>/%e7%a7%bb%e5%8a%a8%e7%ab%af%e5%bc%80%e5%8f%91/5516.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		<enclosure url="http://47.91.211.137/zxk/music.mp3" length="0" type="audio/mpeg" />

			</item>
		<item>
		<title>混合APP （一）HyBrid App AUICSS、ApiCloud、Sublime真机同居、前端页面</title>
		<link>/%e7%a7%bb%e5%8a%a8%e7%ab%af%e5%bc%80%e5%8f%91/5470.html</link>
					<comments>/%e7%a7%bb%e5%8a%a8%e7%ab%af%e5%bc%80%e5%8f%91/5470.html#respond</comments>
		
		<dc:creator><![CDATA[Mr.Lee]]></dc:creator>
		<pubDate>Sat, 19 May 2018 15:02:15 +0000</pubDate>
				<category><![CDATA[混合APP]]></category>
		<category><![CDATA[移动端开发]]></category>
		<category><![CDATA[ApiCloud]]></category>
		<category><![CDATA[AUICSS]]></category>
		<category><![CDATA[Sublime真机同居]]></category>
		<category><![CDATA[前端页面]]></category>
		<guid isPermaLink="false">/?p=5470</guid>

					<description><![CDATA[移动端开发（HyBrid App） 一、App开发概述 1、什么是APP 就是苹果、安卓手机上装的软件/应用， [&#8230;]]]></description>
										<content:encoded><![CDATA[<h1>移动端开发（HyBrid App）</h1>
<h1>一、App开发概述</h1>
<h2>1、什么是APP</h2>
<p>
  就是苹果、安卓手机上装的软件/应用，如：微信、QQ、陌陌、王者荣耀等
</p>
<h2>2、手机软件开发的3种模式</h2>
<h3>1）Web App</h3>
<p>
  说明：内嵌浏览器，打开指定网页
</p>
<p>
  优点：快
</p>
<p>
  缺点：用户体验度低，功能少
</p>
<h3>2）Native App（原生开发）</h3>
<p>
  说明：就是安卓攻城狮开发安装应用，ios攻城狮开发苹果应用
</p>
<p>
  优点：用户体验度高，可以使用n多功能
</p>
<p>
  缺点：成本大，耗时间
</p>
<h3>3）Hybrid App（混合模式移动应用）</h3>
<p>
  说明：就是直接写html + css + js就可以同时开发安卓和苹果APP
</p>
<p>
  优点：成本低 + 功能强大
</p>
<h2>︴效果（广场舞）</h2>
<p><img loading="lazy" decoding="async" width="899" height="299" src="/wp-content/uploads/2018/05/word-image-4953.png" class="wp-image-5471" srcset="/wp-content/uploads/2018/05/word-image-4953.png 899w, /wp-content/uploads/2018/05/word-image-4953-300x100.png 300w, /wp-content/uploads/2018/05/word-image-4953-768x255.png 768w" sizes="(max-width: 899px) 100vw, 899px" /></p>
<h1><a id="post-5470-_Toc467080677"></a>二、使用APICloud框架开发HyBrid App前期准备</h1>
<h2><a id="post-5470-_Toc467080678"></a>1、APICloud介绍</h2>
<ul>
<li>
    说明：APICloud就是开发移动app平台
  </li>
<li>
    特点：
  </li>
</ul>
<ol>
<li>
  写一套代码，可以同时在 苹果 和 安卓手机上使用
</li>
<li>
  使用js代码就可以轻松调用手机功能，如：摄像头、手机灯等功能。
</li>
</ol>
<h2>2、注册APICloud平台</h2>
<p><img loading="lazy" decoding="async" width="1266" height="617" src="/wp-content/uploads/2018/05/word-image-4954.png" class="wp-image-5472" srcset="/wp-content/uploads/2018/05/word-image-4954.png 1266w, /wp-content/uploads/2018/05/word-image-4954-300x146.png 300w, /wp-content/uploads/2018/05/word-image-4954-768x374.png 768w, /wp-content/uploads/2018/05/word-image-4954-1024x499.png 1024w" sizes="(max-width: 1266px) 100vw, 1266px" /></p>
<h2>注册完毕后登录，进入开发控制台</h2>
<p><img loading="lazy" decoding="async" width="1363" height="557" src="/wp-content/uploads/2018/05/word-image-4955.png" class="wp-image-5473" srcset="/wp-content/uploads/2018/05/word-image-4955.png 1363w, /wp-content/uploads/2018/05/word-image-4955-300x123.png 300w, /wp-content/uploads/2018/05/word-image-4955-768x314.png 768w, /wp-content/uploads/2018/05/word-image-4955-1024x418.png 1024w" sizes="(max-width: 1363px) 100vw, 1363px" /></p>
<h2>创建应用（app）</h2>
<p><img loading="lazy" decoding="async" width="957" height="575" src="/wp-content/uploads/2018/05/word-image-4956.png" class="wp-image-5474" srcset="/wp-content/uploads/2018/05/word-image-4956.png 957w, /wp-content/uploads/2018/05/word-image-4956-300x180.png 300w, /wp-content/uploads/2018/05/word-image-4956-768x461.png 768w" sizes="(max-width: 957px) 100vw, 957px" /><br />
<img loading="lazy" decoding="async" width="1176" height="513" src="/wp-content/uploads/2018/05/word-image-4957.png" class="wp-image-5475" srcset="/wp-content/uploads/2018/05/word-image-4957.png 1176w, /wp-content/uploads/2018/05/word-image-4957-300x131.png 300w, /wp-content/uploads/2018/05/word-image-4957-768x335.png 768w, /wp-content/uploads/2018/05/word-image-4957-1024x447.png 1024w" sizes="(max-width: 1176px) 100vw, 1176px" /></p>
<h2>5、使用svn获取代码</h2>
<ul>
<li>
    步骤1：在桌面创建一个【广场舞】文件夹
  </li>
<li>
    步骤2：进入【广场舞】文件夹右击检出
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="571" height="497" src="/wp-content/uploads/2018/05/word-image-4958.png" class="wp-image-5476" srcset="/wp-content/uploads/2018/05/word-image-4958.png 571w, /wp-content/uploads/2018/05/word-image-4958-300x261.png 300w" sizes="(max-width: 571px) 100vw, 571px" /><br />
<img loading="lazy" decoding="async" width="1087" height="480" src="/wp-content/uploads/2018/05/word-image-4959.png" class="wp-image-5477" srcset="/wp-content/uploads/2018/05/word-image-4959.png 1087w, /wp-content/uploads/2018/05/word-image-4959-300x132.png 300w, /wp-content/uploads/2018/05/word-image-4959-768x339.png 768w, /wp-content/uploads/2018/05/word-image-4959-1024x452.png 1024w" sizes="(max-width: 1087px) 100vw, 1087px" /><br />
<img loading="lazy" decoding="async" width="936" height="443" src="/wp-content/uploads/2018/05/word-image-4960.png" class="wp-image-5478" srcset="/wp-content/uploads/2018/05/word-image-4960.png 936w, /wp-content/uploads/2018/05/word-image-4960-300x142.png 300w, /wp-content/uploads/2018/05/word-image-4960-768x363.png 768w" sizes="(max-width: 936px) 100vw, 936px" /><br />
<img loading="lazy" decoding="async" width="472" height="332" src="/wp-content/uploads/2018/05/word-image-4961.png" class="wp-image-5479" srcset="/wp-content/uploads/2018/05/word-image-4961.png 472w, /wp-content/uploads/2018/05/word-image-4961-300x211.png 300w" sizes="(max-width: 472px) 100vw, 472px" /></p>
<h1>三、【预览】安装海马玩/天天模拟器软件，用于模拟安卓手机，随时看到开发效果</h1>
<h2>1、下载</h2>
<ul>
<li>
    下载地址：http://droid4x.haimawan.com/，
  </li>
<li>
    下载地址：http://www.ttmnq.com/
  </li>
</ul>
<h2>安装（双击下一步安装）</h2>
<p><img loading="lazy" decoding="async" width="565" height="281" src="/wp-content/uploads/2018/05/word-image-4962.png" class="wp-image-5480" srcset="/wp-content/uploads/2018/05/word-image-4962.png 565w, /wp-content/uploads/2018/05/word-image-4962-300x149.png 300w" sizes="(max-width: 565px) 100vw, 565px" /></p>
<h2>开发完毕生成app软件</h2>
<p><img loading="lazy" decoding="async" width="809" height="667" src="/wp-content/uploads/2018/05/word-image-4963.png" class="wp-image-5481" srcset="/wp-content/uploads/2018/05/word-image-4963.png 809w, /wp-content/uploads/2018/05/word-image-4963-300x247.png 300w, /wp-content/uploads/2018/05/word-image-4963-768x633.png 768w" sizes="(max-width: 809px) 100vw, 809px" /></p>
<h2>海马模拟器安装app软件并预览</h2>
<p><img loading="lazy" decoding="async" width="1174" height="665" src="/wp-content/uploads/2018/05/word-image-4964.png" class="wp-image-5482" srcset="/wp-content/uploads/2018/05/word-image-4964.png 1174w, /wp-content/uploads/2018/05/word-image-4964-300x170.png 300w, /wp-content/uploads/2018/05/word-image-4964-768x435.png 768w, /wp-content/uploads/2018/05/word-image-4964-1024x580.png 1024w" sizes="(max-width: 1174px) 100vw, 1174px" /><br />
<img loading="lazy" decoding="async" width="434" height="678" src="/wp-content/uploads/2018/05/word-image-4965.png" class="wp-image-5483" srcset="/wp-content/uploads/2018/05/word-image-4965.png 434w, /wp-content/uploads/2018/05/word-image-4965-192x300.png 192w" sizes="(max-width: 434px) 100vw, 434px" /></p>
<h2>更新app后重新编译安装</h2>
<ul>
<li>
    需求：将标题更新为【php@itcast】
  </li>
<li>
    操作：
  </li>
</ul>
<p>
  步骤1：打开【C:\Users\赵小康\Desktop\广场舞\html\main.html】文件进行开发
</p>
<p>
  步骤2：提交apicloud平台
</p>
<p>
  步骤3：云编译（打包）
</p>
<p>
  步骤4：下载到本地安装
</p>
<h1>四、【预览】配置开发工具与模拟器</h1>
<h2><a id="post-5470-_Toc467080684"></a>1、安装Sublime text3（傻瓜式下一步安装）</h2>
<p>
  下载Sublime Text3，下载地址：<a href="http://www.sublimetext.com/3">http://www.sublimetext.com/3</a>
</p>
<p><img loading="lazy" decoding="async" width="288" height="75" src="/wp-content/uploads/2018/05/word-image-4966.png" class="wp-image-5484" /></p>
<p>
  &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-
</p>
<p>
  创建桌面快捷方式
</p>
<p><img loading="lazy" decoding="async" width="562" height="394" src="/wp-content/uploads/2018/05/word-image-4967.png" class="wp-image-5485" srcset="/wp-content/uploads/2018/05/word-image-4967.png 562w, /wp-content/uploads/2018/05/word-image-4967-300x210.png 300w" sizes="(max-width: 562px) 100vw, 562px" /></p>
<h2>2、汉化Sublime text3</h2>
<p><img loading="lazy" decoding="async" width="939" height="579" src="/wp-content/uploads/2018/05/word-image-4968.png" class="wp-image-5486" srcset="/wp-content/uploads/2018/05/word-image-4968.png 939w, /wp-content/uploads/2018/05/word-image-4968-300x185.png 300w, /wp-content/uploads/2018/05/word-image-4968-768x474.png 768w" sizes="(max-width: 939px) 100vw, 939px" /></p>
<h2><a id="post-5470-_Toc467080685"></a>3、Sublime集成预览功能</h2>
<h3>1）获取APICloud插件</h3>
<p><img loading="lazy" decoding="async" width="655" height="389" src="/wp-content/uploads/2018/05/word-image-4969.png" class="wp-image-5487" srcset="/wp-content/uploads/2018/05/word-image-4969.png 655w, /wp-content/uploads/2018/05/word-image-4969-300x178.png 300w" sizes="(max-width: 655px) 100vw, 655px" /><br />
<img loading="lazy" decoding="async" width="1031" height="552" src="/wp-content/uploads/2018/05/word-image-4970.png" class="wp-image-5488" srcset="/wp-content/uploads/2018/05/word-image-4970.png 1031w, /wp-content/uploads/2018/05/word-image-4970-300x161.png 300w, /wp-content/uploads/2018/05/word-image-4970-768x411.png 768w, /wp-content/uploads/2018/05/word-image-4970-1024x548.png 1024w" sizes="(max-width: 1031px) 100vw, 1031px" /></p>
<h3><a id="post-5470-_Toc467080686"></a>2）配置Sublime Text3</h3>
<p><img loading="lazy" decoding="async" width="1110" height="534" src="/wp-content/uploads/2018/05/word-image-4971.png" class="wp-image-5489" srcset="/wp-content/uploads/2018/05/word-image-4971.png 1110w, /wp-content/uploads/2018/05/word-image-4971-300x144.png 300w, /wp-content/uploads/2018/05/word-image-4971-768x369.png 768w, /wp-content/uploads/2018/05/word-image-4971-1024x493.png 1024w" sizes="(max-width: 1110px) 100vw, 1110px" /></p>
<p>
  &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-
</p>
<p>
  如何检测是否配置成功，看下图打开项目鼠标右击查看是否有（真机运行选项）
</p>
<h3><a id="post-5470-_Toc467080687"></a>3）打开app项目（注：svn检出目录）</h3>
<p><img loading="lazy" decoding="async" width="741" height="509" src="/wp-content/uploads/2018/05/word-image-4972.png" class="wp-image-5490" srcset="/wp-content/uploads/2018/05/word-image-4972.png 741w, /wp-content/uploads/2018/05/word-image-4972-300x206.png 300w, /wp-content/uploads/2018/05/word-image-4972-220x150.png 220w" sizes="(max-width: 741px) 100vw, 741px" /><br />
<img loading="lazy" decoding="async" width="481" height="428" src="/wp-content/uploads/2018/05/word-image-4973.png" class="wp-image-5491" srcset="/wp-content/uploads/2018/05/word-image-4973.png 481w, /wp-content/uploads/2018/05/word-image-4973-300x267.png 300w" sizes="(max-width: 481px) 100vw, 481px" /></p>
<h3><a id="post-5470-_Toc467080689"></a>4）使用Sublime+模拟器+真机同步显示App</h3>
<p><img loading="lazy" decoding="async" width="1126" height="502" src="/wp-content/uploads/2018/05/word-image-4974.png" class="wp-image-5492" srcset="/wp-content/uploads/2018/05/word-image-4974.png 1126w, /wp-content/uploads/2018/05/word-image-4974-300x134.png 300w, /wp-content/uploads/2018/05/word-image-4974-768x342.png 768w, /wp-content/uploads/2018/05/word-image-4974-1024x457.png 1024w" sizes="(max-width: 1126px) 100vw, 1126px" /></p>
<h3>︴验证：真机同步（更新app同步预览）</h3>
<p>
  步骤1：打开index.php修改内容
</p>
<p>
  步骤2：右击真机同步即可查看效果（注：不需要提交代码）
</p>
<p><img loading="lazy" decoding="async" width="1219" height="474" src="/wp-content/uploads/2018/05/word-image-4975.png" class="wp-image-5493" srcset="/wp-content/uploads/2018/05/word-image-4975.png 1219w, /wp-content/uploads/2018/05/word-image-4975-300x117.png 300w, /wp-content/uploads/2018/05/word-image-4975-768x299.png 768w, /wp-content/uploads/2018/05/word-image-4975-1024x398.png 1024w" sizes="(max-width: 1219px) 100vw, 1219px" /></p>
<h1>五、手机App前端界面设计</h1>
<h2>Logo与引导页的设计（云端）</h2>
<p><img loading="lazy" decoding="async" width="638" height="685" src="/wp-content/uploads/2018/05/word-image-4976.png" class="wp-image-5494" srcset="/wp-content/uploads/2018/05/word-image-4976.png 638w, /wp-content/uploads/2018/05/word-image-4976-279x300.png 279w" sizes="(max-width: 638px) 100vw, 638px" /></p>
<h2><a id="post-5470-_Toc467080698"></a>使用自定义loader实现真机同步</h2>
<p><a href="http://docs.apicloud.com/" class="broken_link">http://docs.apicloud.com/</a>
</p>
<h3>1）上传本地的代码的到云端</h3>
<p><img loading="lazy" decoding="async" width="940" height="379" src="/wp-content/uploads/2018/05/word-image-4977.png" class="wp-image-5495" srcset="/wp-content/uploads/2018/05/word-image-4977.png 940w, /wp-content/uploads/2018/05/word-image-4977-300x121.png 300w, /wp-content/uploads/2018/05/word-image-4977-768x310.png 768w" sizes="(max-width: 940px) 100vw, 940px" /></p>
<h3>2）编译Android自定义loader</h3>
<p><img loading="lazy" decoding="async" width="890" height="624" src="/wp-content/uploads/2018/05/word-image-4978.png" class="wp-image-5496" srcset="/wp-content/uploads/2018/05/word-image-4978.png 890w, /wp-content/uploads/2018/05/word-image-4978-300x210.png 300w, /wp-content/uploads/2018/05/word-image-4978-768x538.png 768w" sizes="(max-width: 890px) 100vw, 890px" /></p>
<h3>3）下载并重命名</h3>
<p>
  步骤1：下载
</p>
<p><img loading="lazy" decoding="async" width="1051" height="274" src="/wp-content/uploads/2018/05/word-image-4979.png" class="wp-image-5497" srcset="/wp-content/uploads/2018/05/word-image-4979.png 1051w, /wp-content/uploads/2018/05/word-image-4979-300x78.png 300w, /wp-content/uploads/2018/05/word-image-4979-768x200.png 768w, /wp-content/uploads/2018/05/word-image-4979-1024x267.png 1024w" sizes="(max-width: 1051px) 100vw, 1051px" /></p>
<p>
  步骤2：更名
</p>
<p><img loading="lazy" decoding="async" width="94" height="107" src="/wp-content/uploads/2018/05/word-image-4980.png" class="wp-image-5498" /></p>
<h3>4）移动到指定目录中</h3>
<p><strong>步骤1：创建文件夹</strong>
</p>
<p><img loading="lazy" decoding="async" width="1350" height="545" src="/wp-content/uploads/2018/05/word-image-4981.png" class="wp-image-5499" srcset="/wp-content/uploads/2018/05/word-image-4981.png 1350w, /wp-content/uploads/2018/05/word-image-4981-300x121.png 300w, /wp-content/uploads/2018/05/word-image-4981-768x310.png 768w, /wp-content/uploads/2018/05/word-image-4981-1024x413.png 1024w" sizes="(max-width: 1350px) 100vw, 1350px" /></p>
<p><strong>步骤2：移动</strong>
</p>
<p><img loading="lazy" decoding="async" width="677" height="180" src="/wp-content/uploads/2018/05/word-image-4982.png" class="wp-image-5500" srcset="/wp-content/uploads/2018/05/word-image-4982.png 677w, /wp-content/uploads/2018/05/word-image-4982-300x80.png 300w" sizes="(max-width: 677px) 100vw, 677px" /></p>
<h3>5）创建配置文件</h3>
<p><strong>步骤1：创建文件</strong>
</p>
<p><img loading="lazy" decoding="async" width="753" height="183" src="/wp-content/uploads/2018/05/word-image-4983.png" class="wp-image-5501" srcset="/wp-content/uploads/2018/05/word-image-4983.png 753w, /wp-content/uploads/2018/05/word-image-4983-300x73.png 300w" sizes="(max-width: 753px) 100vw, 753px" /></p>
<p><strong>步骤2：写入固定格式数据</strong>
</p>
<p><img loading="lazy" decoding="async" width="964" height="692" src="/wp-content/uploads/2018/05/word-image-4984.png" class="wp-image-5502" srcset="/wp-content/uploads/2018/05/word-image-4984.png 964w, /wp-content/uploads/2018/05/word-image-4984-300x215.png 300w, /wp-content/uploads/2018/05/word-image-4984-768x551.png 768w" sizes="(max-width: 964px) 100vw, 964px" /><br />
<img loading="lazy" decoding="async" width="859" height="677" src="/wp-content/uploads/2018/05/word-image-4985.png" class="wp-image-5503" srcset="/wp-content/uploads/2018/05/word-image-4985.png 859w, /wp-content/uploads/2018/05/word-image-4985-300x236.png 300w, /wp-content/uploads/2018/05/word-image-4985-768x605.png 768w" sizes="(max-width: 859px) 100vw, 859px" /></p>
<h3>6）真机同步测试</h3>
<p><img loading="lazy" decoding="async" width="423" height="267" src="/wp-content/uploads/2018/05/word-image-4986.png" class="wp-image-5504" srcset="/wp-content/uploads/2018/05/word-image-4986.png 423w, /wp-content/uploads/2018/05/word-image-4986-300x189.png 300w" sizes="(max-width: 423px) 100vw, 423px" /><br />
<img loading="lazy" decoding="async" width="980" height="655" src="/wp-content/uploads/2018/05/word-image-4987.png" class="wp-image-5505" srcset="/wp-content/uploads/2018/05/word-image-4987.png 980w, /wp-content/uploads/2018/05/word-image-4987-300x201.png 300w, /wp-content/uploads/2018/05/word-image-4987-768x513.png 768w" sizes="(max-width: 980px) 100vw, 980px" /></p>
<h1>六、APP框架分析</h1>
<h2><a id="post-5470-_Toc467080691"></a>1、目录结构分析</h2>
<p><img loading="lazy" decoding="async" width="432" height="355" src="/wp-content/uploads/2018/05/word-image-4988.png" class="wp-image-5506" srcset="/wp-content/uploads/2018/05/word-image-4988.png 432w, /wp-content/uploads/2018/05/word-image-4988-300x247.png 300w" sizes="(max-width: 432px) 100vw, 432px" /></p>
<h2><a id="post-5470-_Toc467080692"></a>2、App代码分析（从index.html入手）</h2>
<p><img loading="lazy" decoding="async" width="943" height="70" src="/wp-content/uploads/2018/05/word-image-4989.png" class="wp-image-5507" srcset="/wp-content/uploads/2018/05/word-image-4989.png 943w, /wp-content/uploads/2018/05/word-image-4989-300x22.png 300w, /wp-content/uploads/2018/05/word-image-4989-768x57.png 768w" sizes="(max-width: 943px) 100vw, 943px" /></p>
<p>
  &lt;meta name=&#8221;viewport&#8221; content=&#8221;maximum-scale=1.0,minimum-scale=1.0,user-scalable=0,initial-scale=1.0,width=device-width&#8221;/&gt;
</p>
<p>
  width &#8211; viewport的宽度 height &#8211; viewport的高度
</p>
<p>
  initial-scale &#8211; 初始的缩放比例
</p>
<p>
  minimum-scale &#8211; 允许用户缩放到的最小比例
</p>
<p>
  maximum-scale &#8211; 允许用户缩放到的最大比例
</p>
<p>
  user-scalable &#8211; 用户是否可以手动缩放
</p>
<p><img loading="lazy" decoding="async" width="617" height="60" src="/wp-content/uploads/2018/05/word-image-4990.png" class="wp-image-5508" srcset="/wp-content/uploads/2018/05/word-image-4990.png 617w, /wp-content/uploads/2018/05/word-image-4990-300x29.png 300w" sizes="(max-width: 617px) 100vw, 617px" /></p>
<p>
  &lt;meta name=&#8221;format-detection&#8221; content=&#8221;telephone=no,email=no,date=no,address=no&#8221;&gt;
</p>
<p>
  让手机设备不直接识别手机号码、邮箱、日期以及address地址，也就是说不会直接有下划线
</p>
<h2><a id="post-5470-_Toc467080693"></a>3、核心代码分析（针对Javascript）</h2>
<p><img loading="lazy" decoding="async" width="995" height="694" src="/wp-content/uploads/2018/05/word-image-4991.png" class="wp-image-5509" srcset="/wp-content/uploads/2018/05/word-image-4991.png 995w, /wp-content/uploads/2018/05/word-image-4991-300x209.png 300w, /wp-content/uploads/2018/05/word-image-4991-768x536.png 768w" sizes="(max-width: 995px) 100vw, 995px" /></p>
<h2>4、App整体框架原理图</h2>
<h2><a id="post-5470-_Toc467080695"></a>5、分析html/main.html核心代码</h2>
<p><img loading="lazy" decoding="async" width="565" height="576" src="/wp-content/uploads/2018/05/word-image-4992.png" class="wp-image-5510" srcset="/wp-content/uploads/2018/05/word-image-4992.png 565w, /wp-content/uploads/2018/05/word-image-4992-294x300.png 294w" sizes="(max-width: 565px) 100vw, 565px" /></p>
<h1>七、移动前段框架（AUICSS）</h1>
<h2><a id="post-5470-_Toc448936972"></a><a id="post-5470-_Toc475719111"></a><a id="post-5470-_Toc469586779"></a><a id="post-5470-_Toc477793833"></a><a id="post-5470-_Toc481941130"></a><a id="post-5470-_Toc467854958"></a><a id="post-5470-_Toc485569116"></a><a id="post-5470-_Toc483754602"></a><a id="post-5470-_Toc471313624"></a>1、什么是AUICSS</h2>
<p>
  就是前段框架，专门为apicloud而生，同bootstrap框架只要复制其规定的带css或者js的div就可以快速搭建一个网站。
</p>
<h2>下载AUICSS</h2>
<p>
  网址：<a href="http://www.auicss.com/">http://www.auicss.com/</a>
</p>
<p><img loading="lazy" decoding="async" width="1131" height="638" src="/wp-content/uploads/2018/05/word-image-4993.png" class="wp-image-5511" srcset="/wp-content/uploads/2018/05/word-image-4993.png 1131w, /wp-content/uploads/2018/05/word-image-4993-300x169.png 300w, /wp-content/uploads/2018/05/word-image-4993-768x433.png 768w, /wp-content/uploads/2018/05/word-image-4993-1024x578.png 1024w" sizes="(max-width: 1131px) 100vw, 1131px" /></p>
<h2>3、使用AUICSS框架（前端框架）</h2>
<p>
  步骤1：打开auicss框架拖拽【css】【js】【html】【image】文件夹到本地的广场舞文件中
</p>
<p>
  步骤2：替换入口文件
</p>
<p><img loading="lazy" decoding="async" width="750" height="405" src="/wp-content/uploads/2018/05/word-image-4994.png" class="wp-image-5512" srcset="/wp-content/uploads/2018/05/word-image-4994.png 750w, /wp-content/uploads/2018/05/word-image-4994-300x162.png 300w" sizes="(max-width: 750px) 100vw, 750px" /></p>
<p>
  步骤3：打开sublime右击真机同步
</p>
<p><img loading="lazy" decoding="async" width="352" height="305" src="/wp-content/uploads/2018/05/word-image-4995.png" class="wp-image-5513" srcset="/wp-content/uploads/2018/05/word-image-4995.png 352w, /wp-content/uploads/2018/05/word-image-4995-300x260.png 300w" sizes="(max-width: 352px) 100vw, 352px" /></p>
<h2>4、卡片列表</h2>
<h3>1）效果</h3>
<p><img loading="lazy" decoding="async" width="303" height="300" src="/wp-content/uploads/2018/05/word-image-4996.png" class="wp-image-5514" srcset="/wp-content/uploads/2018/05/word-image-4996.png 303w, /wp-content/uploads/2018/05/word-image-4996-150x150.png 150w, /wp-content/uploads/2018/05/word-image-4996-300x297.png 300w" sizes="(max-width: 303px) 100vw, 303px" /></p>
<h3>2）index.html</h3>
<p>
  &lt;!doctype html&gt;
</p>
<p>
  &lt;html&gt;
</p>
<p>
  &lt;head&gt;
</p>
<p>
      &lt;meta charset=&#8221;utf-8&#8243;&gt;
</p>
<p>
      &lt;meta name=&#8221;viewport&#8221; content=&#8221;maximum-scale=1.0,minimum-scale=1.0,user-scalable=0,width=device-width,initial-scale=1.0&#8243;/&gt;
</p>
<p>
      &lt;meta name=&#8221;format-detection&#8221; content=&#8221;telephone=no,email=no,date=no,address=no&#8221;&gt;
</p>
<p>
      &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;./css/aui.css&#8221; /&gt;
</p>
<p>
  &lt;/head&gt;
</p>
<p>
  &lt;body&gt;
</p>
<p>
      哈啊哈哈哈哈
</p>
<p>
  &lt;/body&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;./script/api.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221;&gt;
</p>
<p>
      apiready = function(){
</p>
<p>
          api.openWin({
</p>
<p>
              name: &#8216;随意你开心就好&#8217;,
</p>
<p>
              url: &#8216;./html/1.html&#8217;,
</p>
<p>
              pageParam: {
</p>
<p>
                  name: &#8216;test&#8217;
</p>
<p>
              }
</p>
<p>
          });
</p>
<p>
      }
</p>
<p>
  &lt;/script&gt;
</p>
<p>
  &lt;/html&gt;
</p>
<h3>3）1.html</h3>
<p>
  &lt;!DOCTYPE HTML&gt;
</p>
<p>
  &lt;html&gt;
</p>
<p>
  &lt;head&gt;
</p>
<p>
      &lt;meta charset=&#8221;utf-8&#8243;&gt;
</p>
<p>
      &lt;meta name=&#8221;viewport&#8221; content=&#8221;maximum-scale=1.0,minimum-scale=1.0,user-scalable=0,width=device-width,initial-scale=1.0&#8243;/&gt;
</p>
<p>
      &lt;meta name=&#8221;format-detection&#8221; content=&#8221;telephone=no,email=no,date=no,address=no&#8221;&gt;
</p>
<p>
      &lt;title&gt;&lt;/title&gt;
</p>
<p>
      &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;../css/aui.css&#8221; /&gt;
</p>
<p>
  &lt;/head&gt;
</p>
<p>
  &lt;body&gt;
</p>
<p>
  	&lt;section class=&#8221;aui-content&#8221;&gt;
</p>
<p>
  	    &lt;div class=&#8221;aui-card-list&#8221;&gt;
</p>
<p>
  	        &lt;div class=&#8221;aui-card-list-header aui-card-list-user aui-border-b&#8221;&gt;
</p>
<p>
  	            &lt;div class=&#8221;aui-card-list-user-avatar&#8221;&gt;
</p>
<p>
  	                &lt;img src=&#8221;../image/demo4.png&#8221; class=&#8221;aui-img-round&#8221; /&gt;
</p>
<p>
  	            &lt;/div&gt;
</p>
<p>
  	            &lt;div class=&#8221;aui-card-list-user-name&#8221;&gt;
</p>
<p>
  	                &lt;div&gt;AUI&lt;/div&gt;
</p>
<p>
  	                &lt;small&gt;1天前&lt;/small&gt;
</p>
<p>
  	            &lt;/div&gt;
</p>
<p>
  	            &lt;div class=&#8221;aui-card-list-user-info&#8221;&gt;北京朝阳&lt;/div&gt;
</p>
<p>
  	        &lt;/div&gt;
</p>
<p>
  	        &lt;div class=&#8221;aui-card-list-content-padded&#8221;&gt;
</p>
<p>
  	            &lt;img src=&#8221;../image/l2.png&#8221; /&gt;
</p>
<p>
  	        &lt;/div&gt;
</p>
<p>
  	        &lt;div class=&#8221;aui-card-list-footer aui-border-t&#8221;&gt;
</p>
<p>
  	            &lt;div&gt;&lt;i class=&#8221;aui-iconfont aui-icon-note&#8221;&gt;&lt;/i&gt; 666&lt;/div&gt;
</p>
<p>
  	            &lt;div&gt;&lt;i class=&#8221;aui-iconfont aui-icon-laud&#8221;&gt;&lt;/i&gt; 888&lt;/div&gt;
</p>
<p>
  	            &lt;div&gt;&lt;i class=&#8221;aui-iconfont aui-icon-star&#8221;&gt;&lt;/i&gt; 888&lt;/div&gt;
</p>
<p>
  	        &lt;/div&gt;
</p>
<p>
  	        &lt;div class=&#8221;aui-card-list-header aui-card-list-user aui-border-b&#8221;&gt;
</p>
<p>
  	            &lt;div class=&#8221;aui-card-list-user-avatar&#8221;&gt;
</p>
<p>
  	                &lt;img src=&#8221;../image/demo4.png&#8221; class=&#8221;aui-img-round&#8221; /&gt;
</p>
<p>
  	            &lt;/div&gt;
</p>
<p>
  	            &lt;div class=&#8221;aui-card-list-user-name&#8221;&gt;
</p>
<p>
  	                &lt;div&gt;AUI&lt;/div&gt;
</p>
<p>
  	                &lt;small&gt;1天前&lt;/small&gt;
</p>
<p>
  	            &lt;/div&gt;
</p>
<p>
  	            &lt;div class=&#8221;aui-card-list-user-info&#8221;&gt;北京朝阳&lt;/div&gt;
</p>
<p>
  	        &lt;/div&gt;
</p>
<p>
  	        &lt;div class=&#8221;aui-card-list-content-padded&#8221;&gt;
</p>
<p>
  	            &lt;img src=&#8221;../image/l2.png&#8221; /&gt;
</p>
<p>
  	        &lt;/div&gt;
</p>
<p>
  	        &lt;div class=&#8221;aui-card-list-footer aui-border-t&#8221;&gt;
</p>
<p>
  	            &lt;div&gt;&lt;i class=&#8221;aui-iconfont aui-icon-note&#8221;&gt;&lt;/i&gt; 666&lt;/div&gt;
</p>
<p>
  	            &lt;div&gt;&lt;i class=&#8221;aui-iconfont aui-icon-laud&#8221;&gt;&lt;/i&gt; 888&lt;/div&gt;
</p>
<p>
  	            &lt;div&gt;&lt;i class=&#8221;aui-iconfont aui-icon-star&#8221;&gt;&lt;/i&gt; 888&lt;/div&gt;
</p>
<p>
  	        &lt;/div&gt;
</p>
</p>
<p>
  	        &lt;div class=&#8221;aui-card-list-header aui-card-list-user aui-border-b&#8221;&gt;
</p>
<p>
  	            &lt;div class=&#8221;aui-card-list-user-avatar&#8221;&gt;
</p>
<p>
  	                &lt;img src=&#8221;../image/demo4.png&#8221; class=&#8221;aui-img-round&#8221; /&gt;
</p>
<p>
  	            &lt;/div&gt;
</p>
<p>
  	            &lt;div class=&#8221;aui-card-list-user-name&#8221;&gt;
</p>
<p>
  	                &lt;div&gt;AUI&lt;/div&gt;
</p>
<p>
  	                &lt;small&gt;1天前&lt;/small&gt;
</p>
<p>
  	            &lt;/div&gt;
</p>
<p>
  	            &lt;div class=&#8221;aui-card-list-user-info&#8221;&gt;北京朝阳&lt;/div&gt;
</p>
<p>
  	        &lt;/div&gt;
</p>
<p>
  	        &lt;div class=&#8221;aui-card-list-content-padded&#8221;&gt;
</p>
<p>
  	            &lt;img src=&#8221;../image/l2.png&#8221; /&gt;
</p>
<p>
  	        &lt;/div&gt;
</p>
<p>
  	        &lt;div class=&#8221;aui-card-list-footer aui-border-t&#8221;&gt;
</p>
<p>
  	            &lt;div&gt;&lt;i class=&#8221;aui-iconfont aui-icon-note&#8221;&gt;&lt;/i&gt; 666&lt;/div&gt;
</p>
<p>
  	            &lt;div&gt;&lt;i class=&#8221;aui-iconfont aui-icon-laud&#8221;&gt;&lt;/i&gt; 888&lt;/div&gt;
</p>
<p>
  	            &lt;div&gt;&lt;i class=&#8221;aui-iconfont aui-icon-star&#8221;&gt;&lt;/i&gt; 888&lt;/div&gt;
</p>
<p>
  	        &lt;/div&gt;
</p>
</p>
<p>
  	    &lt;/div&gt;
</p>
<p>
  	&lt;/section&gt;
</p>
<p>
  &lt;/body&gt;
</p>
<p>
  &lt;/html&gt;
</p>
<h1><a id="post-5470-_Toc481941129"></a><a id="post-5470-_Toc483754601"></a><a id="post-5470-_Toc485569115"></a><a id="post-5470-_Toc475719110"></a><a id="post-5470-_Toc477793832"></a>八、实战案例之广场舞App静态页面</h1>
]]></content:encoded>
					
					<wfw:commentRss>/%e7%a7%bb%e5%8a%a8%e7%ab%af%e5%bc%80%e5%8f%91/5470.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>混合APP （二）HyBrid App Vue.JS、页面、TP后台、下拉刷新、模块使用</title>
		<link>/%e7%a7%bb%e5%8a%a8%e7%ab%af%e5%bc%80%e5%8f%91/5431.html</link>
					<comments>/%e7%a7%bb%e5%8a%a8%e7%ab%af%e5%bc%80%e5%8f%91/5431.html#respond</comments>
		
		<dc:creator><![CDATA[Mr.Lee]]></dc:creator>
		<pubDate>Sat, 19 May 2018 14:58:52 +0000</pubDate>
				<category><![CDATA[混合APP]]></category>
		<category><![CDATA[移动端开发]]></category>
		<category><![CDATA[TP后台]]></category>
		<category><![CDATA[Vue.JS]]></category>
		<category><![CDATA[下拉刷新]]></category>
		<category><![CDATA[模块使用]]></category>
		<category><![CDATA[页面]]></category>
		<guid isPermaLink="false">/?p=5431</guid>

					<description><![CDATA[移动端开发（HyBrid App） 复习 什么是APP：就是安卓或者苹果上的软件 APP开发多种模式： web [&#8230;]]]></description>
										<content:encoded><![CDATA[<h1>移动端开发（HyBrid App）</h1>
<h1>复习</h1>
<p>
  什么是APP：就是安卓或者苹果上的软件
</p>
<p>
  APP开发多种模式：
</p>
<ol>
<li>
  web app ： 内嵌浏览器，好处（开发快）瑕疵（用户体验差，功能不够强大）
</li>
<li>
  原生开发：就是安卓开发安卓app 、ios开发苹果app    好处：用户体验度高，瑕疵：成本大
</li>
<li>
  混合app：使用html + css + js 就可以开发app并且一套代码就可以搞定安卓和苹果app
</li>
</ol>
<p>
  注册apicloud账号并且创建app应用
</p>
<p>
  安装模拟器
</p>
<p>
  sublime 配合模拟器开发使用
</p>
<p>
  设置APP的logo和引导页
</p>
<p>
  实战广场舞app静态页面
</p>
<h1>■ 实战案例之广场舞App静态页面</h1>
<h2>1、顶部导航栏的制作</h2>
<h3>1）效果图</h3>
<p><img loading="lazy" decoding="async" width="368" height="207" src="/wp-content/uploads/2018/05/word-image-4917.png" class="wp-image-5432" srcset="/wp-content/uploads/2018/05/word-image-4917.png 368w, /wp-content/uploads/2018/05/word-image-4917-300x169.png 300w" sizes="(max-width: 368px) 100vw, 368px" /></p>
<h3>代码</h3>
<ul>
<li>
    步骤1：将auicss2的css、script、image文件夹拖拽到框架中
  </li>
<li>
    步骤2：头部代码
  </li>
</ul>
<p>
  &lt;!doctype html&gt;
</p>
<p>
  &lt;html&gt;
</p>
<p>
  &lt;head&gt;
</p>
<p>
      &lt;meta charset=&#8221;utf-8&#8243;&gt;
</p>
<p>
      &lt;meta name=&#8221;viewport&#8221; content=&#8221;maximum-scale=1.0,minimum-scale=1.0,user-scalable=0,initial-scale=1.0,width=device-width&#8221;/&gt;
</p>
<p>
      &lt;meta name=&#8221;format-detection&#8221; content=&#8221;telephone=no,email=no,date=no,address=no&#8221;&gt;
</p>
<p>
      &lt;title&gt;Hello APP&lt;/title&gt;
</p>
<p>
      &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;./css/api.css&#8221; /&gt;
</p>
<p>
      &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;./css/aui.css&#8221; /&gt;
</p>
<p>
      &lt;style type=&#8221;text/css&#8221;&gt;
</p>
<p>
          .aui-bar-nav { background: #FD4E56; }
</p>
<p>
      &lt;/style&gt;
</p>
<p>
  &lt;/head&gt;
</p>
<p>
  &lt;body&gt;
</p>
<p>
      &lt;div id=&#8221;wrap&#8221;&gt;
</p>
<p>
          &lt;div id=&#8221;header&#8221;&gt;
</p>
<p>
              &lt;header class=&#8221;aui-bar aui-bar-nav&#8221;&gt;热门&lt;/header&gt;
</p>
<p>
          &lt;/div&gt;
</p>
<p>
          &lt;div id=&#8221;main&#8221;&gt;
</p>
<p>
                  哈哈
</p>
<p>
          &lt;/div&gt;
</p>
<p>
          &lt;div id=&#8221;footer&#8221;&gt;
</p>
<p>
          &lt;/div&gt;
</p>
<p>
      &lt;/div&gt;
</p>
<p>
  &lt;/body&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;./script/api.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221;&gt;
</p>
<p>
      apiready = function(){
</p>
</p>
<p>
      };
</p>
<p>
  &lt;/script&gt;
</p>
<p>
  &lt;/html&gt;
</p>
<h2>2、底部导航栏的切换</h2>
<h3>1）效果图</h3>
<p><img loading="lazy" decoding="async" width="351" height="157" src="/wp-content/uploads/2018/05/word-image-4918.png" class="wp-image-5433" srcset="/wp-content/uploads/2018/05/word-image-4918.png 351w, /wp-content/uploads/2018/05/word-image-4918-300x134.png 300w" sizes="(max-width: 351px) 100vw, 351px" /></p>
<h3>2）代码</h3>
<p>
  &lt;!doctype html&gt;
</p>
<p>
  &lt;html&gt;
</p>
<p>
  &lt;head&gt;
</p>
<p>
      &lt;meta charset=&#8221;utf-8&#8243;&gt;
</p>
<p>
      &lt;meta name=&#8221;viewport&#8221; content=&#8221;maximum-scale=1.0,minimum-scale=1.0,user-scalable=0,initial-scale=1.0,width=device-width&#8221;/&gt;
</p>
<p>
      &lt;meta name=&#8221;format-detection&#8221; content=&#8221;telephone=no,email=no,date=no,address=no&#8221;&gt;
</p>
<p>
      &lt;title&gt;Hello APP&lt;/title&gt;
</p>
<p>
      &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;./css/api.css&#8221; /&gt;
</p>
<p>
      &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;./css/aui.css&#8221; /&gt;
</p>
<p>
      &lt;style type=&#8221;text/css&#8221;&gt;
</p>
<p>
          .aui-bar-nav { background: #FD4E56; }
</p>
<p>
      &lt;/style&gt;
</p>
<p>
      &lt;style type=&#8221;text/css&#8221;&gt;
</p>
<p>
          #demo {
</p>
<p>
              width: 4rem;
</p>
<p>
              height: 4rem;
</p>
<p>
              position: absolute;
</p>
<p>
              left: 50%;
</p>
<p>
              top: 50%;
</p>
<p>
              margin-left: -2rem;
</p>
<p>
              margin-top: -2rem;
</p>
<p>
              background-color: #e0e0e0;
</p>
<p>
              border-radius: 50%;
</p>
<p>
              line-height: 4rem;
</p>
<p>
              text-align: center;
</p>
<p>
              color: #212121;
</p>
<p>
              font-size: 1.2rem;
</p>
<p>
          }
</p>
<p>
      &lt;/style&gt;
</p>
<p>
  &lt;/head&gt;
</p>
<p>
  &lt;body&gt;
</p>
<p>
      &lt;div id=&#8221;wrap&#8221;&gt;
</p>
<p>
          &lt;div id=&#8221;header&#8221;&gt;
</p>
<p>
              &lt;header class=&#8221;aui-bar aui-bar-nav&#8221; id=&#8221;title&#8221;&gt;热门&lt;/header&gt;
</p>
<p>
          &lt;/div&gt;
</p>
<p>
          &lt;div id=&#8221;main&#8221;&gt;
</p>
<p>
          &lt;/div&gt;
</p>
<p>
          &lt;footer class=&#8221;aui-bar aui-bar-tab&#8221;  id=&#8221;footer&#8221;&gt;
</p>
<p>
              &lt;div class=&#8221;aui-bar-tab-item aui-active&#8221; tapmode&gt;
</p>
<p>
                  &lt;i class=&#8221;aui-iconfont aui-icon-home&#8221;&gt;&lt;/i&gt;
</p>
<p>
                  &lt;div class=&#8221;aui-bar-tab-label&#8221;&gt;热门&lt;/div&gt;
</p>
<p>
              &lt;/div&gt;
</p>
<p>
              &lt;div class=&#8221;aui-bar-tab-item&#8221; tapmode&gt;
</p>
<p>
                  &lt;i class=&#8221;aui-iconfont aui-icon-star&#8221;&gt;&lt;/i&gt;
</p>
<p>
                  &lt;div class=&#8221;aui-bar-tab-label&#8221;&gt;广场&lt;/div&gt;
</p>
<p>
              &lt;/div&gt;
</p>
<p>
              &lt;div class=&#8221;aui-bar-tab-item&#8221; tapmode&gt;
</p>
<p>
              &lt;i class=&#8221;aui-iconfont aui-icon-wechat-circle&#8221;&gt;&lt;/i&gt;
</p>
<p>
                  &lt;div class=&#8221;aui-bar-tab-label&#8221;&gt;动态&lt;/div&gt;
</p>
<p>
              &lt;/div&gt;
</p>
<p>
              &lt;div class=&#8221;aui-bar-tab-item&#8221; tapmode&gt;
</p>
<p>
                  &lt;div class=&#8221;aui-dot&#8221;&gt;&lt;/div&gt;
</p>
<p>
                  &lt;i class=&#8221;aui-iconfont aui-icon-my&#8221;&gt;&lt;/i&gt;
</p>
<p>
                  &lt;div class=&#8221;aui-bar-tab-label&#8221;&gt;关于&lt;/div&gt;
</p>
<p>
              &lt;/div&gt;
</p>
<p>
          &lt;/footer&gt;
</p>
<p>
      &lt;/div&gt;
</p>
<p>
  &lt;/body&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;./script/api.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;./script/aui-tab.js&#8221; &gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221;&gt;
</p>
<p>
      apiready = function(){
</p>
<p>
          api.parseTapmode();
</p>
<p>
          //默认打开热门页面
</p>
<p>
          openPage(&#8216;hot&#8217;, &#8216;热门&#8217;);
</p>
<p>
      }
</p>
<p>
      var tab = new auiTab({
</p>
<p>
          element:document.getElementById(&#8220;footer&#8221;)
</p>
<p>
      },function(ret){
</p>
<p>
          console.log(ret);
</p>
<p>
          if(ret){
</p>
<p>
              //document.getElementById(&#8220;demo&#8221;).textContent = ret.index;
</p>
<p>
              switch (ret.index) {
</p>
<p>
                  case 1:
</p>
<p>
                      openPage(&#8216;hot&#8217;, &#8216;热门&#8217;);
</p>
<p>
                      break;
</p>
<p>
                  case 2:
</p>
<p>
                      openPage(&#8216;guangchang&#8217;, &#8216;广场&#8217;);
</p>
<p>
                      break;
</p>
<p>
                  case 3:
</p>
<p>
                      openPage(&#8216;action&#8217;, &#8216;动态&#8217;);
</p>
<p>
                      break;
</p>
<p>
                  case 4:
</p>
<p>
                      openPage(&#8216;about&#8217;, &#8216;关于我们&#8217;);
</p>
<p>
                      break;
</p>
<p>
                  default:
</p>
<p>
                      openPage(&#8216;hot&#8217;, &#8216;热门&#8217;);
</p>
<p>
                      break;
</p>
<p>
              }
</p>
<p>
          }
</p>
<p>
      });
</p>
<p>
      //打开页面方法
</p>
<p>
      function openPage(pageName, title) {
</p>
<p>
          var header = $api.byId(&#8216;header&#8217;);
</p>
<p>
          //适配iOS7+，Android4.4+状态栏沉浸式效果，详见config文档statusBarAppearance字段
</p>
<p>
          $api.fixStatusBar(header);
</p>
<p>
          //动态计算header的高度，因iOS7+和Android4.4+上支持沉浸式效果，
</p>
<p>
          //因此header的实际高度可能为css样式中声明的44px加上设备状态栏高度
</p>
<p>
          //其中，IOS状态栏高度为20px，Android为25px
</p>
<p>
          var headerH = $api.offset(header).h;
</p>
<p>
          //footer高度为css样式中声明的30px
</p>
<p>
          var footerH = 50;
</p>
<p>
          //frame的高度为当前window高度减去header和footer的高度
</p>
<p>
          var frameH = api.winHeight &#8211; headerH &#8211; footerH;
</p>
<p>
          api.openFrame({
</p>
<p>
              name: &#8216;main&#8217;,
</p>
<p>
              url: &#8216;html/&#8217;+pageName+&#8217;.html&#8217;,
</p>
<p>
              bounces: true,
</p>
<p>
              rect: {
</p>
<p>
                  x: 0,
</p>
<p>
                  y: headerH,
</p>
<p>
                  w: &#8216;auto&#8217;,
</p>
<p>
                  h: frameH
</p>
<p>
              }
</p>
<p>
          });
</p>
<p>
          //切换头部标题
</p>
<p>
          $api.byId(&#8216;title&#8217;).innerHTML = title;
</p>
<p>
      }
</p>
<p>
  &lt;/script&gt;
</p>
<p>
  &lt;/html&gt;
</p>
<h2><a id="post-5431-_Toc467854965"></a><a id="post-5431-_Toc477793840"></a><a id="post-5431-_Toc481941137"></a><a id="post-5431-_Toc485569123"></a><a id="post-5431-_Toc469586786"></a><a id="post-5431-_Toc475889837"></a><a id="post-5431-_Toc483754609"></a><a id="post-5431-_Toc471313633"></a>热门页（frame_host.html）</h2>
<h3>1）效果图</h3>
<p><img loading="lazy" decoding="async" width="360" height="596" src="/wp-content/uploads/2018/05/word-image-4919.png" class="wp-image-5434" srcset="/wp-content/uploads/2018/05/word-image-4919.png 360w, /wp-content/uploads/2018/05/word-image-4919-181x300.png 181w" sizes="(max-width: 360px) 100vw, 360px" /></p>
<h3>2）代码</h3>
<p>
  &lt;!DOCTYPE HTML&gt;
</p>
<p>
  &lt;html&gt;
</p>
<p>
  &lt;head&gt;
</p>
<p>
      &lt;meta charset=&#8221;utf-8&#8243;&gt;
</p>
<p>
      &lt;meta name=&#8221;viewport&#8221; content=&#8221;maximum-scale=1.0,minimum-scale=1.0,user-scalable=0,width=device-width,initial-scale=1.0&#8243;/&gt;
</p>
<p>
      &lt;meta name=&#8221;format-detection&#8221; content=&#8221;telephone=no,email=no,date=no,aItemress=no&#8221;&gt;
</p>
<p>
      &lt;title&gt;热门&lt;/title&gt;
</p>
<p>
      &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;../css/aui.css&#8221; /&gt;
</p>
<p>
      &lt;style type=&#8221;text/css&#8221;&gt;
</p>
<p>
          .aui-content { padding: 0 8px; }
</p>
<p>
          .aui-content .aui-card-list { padding: 0px 6px; }
</p>
<p>
          .aui-content .aui-card-list-footer { padding: 0px; }
</p>
<p>
      &lt;/style&gt;
</p>
<p>
  &lt;/head&gt;
</p>
<p>
  &lt;body&gt;
</p>
<p>
      &lt;section class=&#8221;aui-content&#8221;&gt;
</p>
<p>
          &lt;div class=&#8221;aui-card-list&#8221;&gt;
</p>
<p>
              &lt;div class=&#8221;aui-card-list-content&#8221;&gt;
</p>
<p>
                  &lt;img src=&#8221;../image/demo.png&#8221; /&gt;
</p>
<p>
              &lt;/div&gt;
</p>
<p>
              &lt;div class=&#8221;aui-card-list-footer&#8221;&gt;
</p>
<p>
                  是打发斯蒂芬
</p>
<p>
              &lt;/div&gt;
</p>
<p>
          &lt;/div&gt;
</p>
<p>
          &lt;div class=&#8221;aui-card-list&#8221;&gt;
</p>
<p>
              &lt;div class=&#8221;aui-card-list-content&#8221;&gt;
</p>
<p>
                  &lt;img src=&#8221;../image/demo.png&#8221; /&gt;
</p>
<p>
              &lt;/div&gt;
</p>
<p>
              &lt;div class=&#8221;aui-card-list-footer&#8221;&gt;
</p>
<p>
                  是打发斯蒂芬
</p>
<p>
              &lt;/div&gt;
</p>
<p>
          &lt;/div&gt;
</p>
<p>
          &lt;div class=&#8221;aui-card-list&#8221;&gt;
</p>
<p>
              &lt;div class=&#8221;aui-card-list-content&#8221;&gt;
</p>
<p>
                  &lt;img src=&#8221;../image/demo.png&#8221; /&gt;
</p>
<p>
              &lt;/div&gt;
</p>
<p>
              &lt;div class=&#8221;aui-card-list-footer&#8221;&gt;
</p>
<p>
                  是打发斯蒂芬
</p>
<p>
              &lt;/div&gt;
</p>
<p>
          &lt;/div&gt;
</p>
<p>
      &lt;/section&gt;
</p>
<p>
  &lt;/body&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;../script/api.js&#8221; &gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221;&gt;
</p>
<p>
      apiready = function(){
</p>
<p>
          api.parseTapmode();
</p>
<p>
      }
</p>
<p>
  &lt;/script&gt;
</p>
<p>
  &lt;/html&gt;
</p>
<h2>广场页（frame_square.html）</h2>
<h3>1）效果图</h3>
<p><img loading="lazy" decoding="async" width="367" height="632" src="/wp-content/uploads/2018/05/word-image-4920.png" class="wp-image-5435" srcset="/wp-content/uploads/2018/05/word-image-4920.png 367w, /wp-content/uploads/2018/05/word-image-4920-174x300.png 174w" sizes="(max-width: 367px) 100vw, 367px" /></p>
<h3>2）代码</h3>
<p>
  &lt;!DOCTYPE HTML&gt;
</p>
<p>
  &lt;html&gt;
</p>
<p>
  &lt;head&gt;
</p>
<p>
      &lt;meta charset=&#8221;utf-8&#8243;&gt;
</p>
<p>
      &lt;meta name=&#8221;viewport&#8221; content=&#8221;maximum-scale=1.0,minimum-scale=1.0,user-scalable=0,width=device-width,initial-scale=1.0&#8243;/&gt;
</p>
<p>
      &lt;meta name=&#8221;format-detection&#8221; content=&#8221;telephone=no,email=no,date=no,aItemress=no&#8221;&gt;
</p>
<p>
      &lt;title&gt;AUI快速完成布局&lt;/title&gt;
</p>
<p>
      &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;../css/aui.css&#8221; /&gt;
</p>
<p>
      &lt;style type=&#8221;text/css&#8221;&gt;
</p>
<p>
      /*大层*/
</p>
<p>
      .container{margin: 0 auto;}
</p>
<p>
      /*瀑布流层*/
</p>
<p>
      .waterfall{
</p>
<p>
           -moz-column-count:2; /* Firefox */
</p>
<p>
           -webkit-column-count:2; /* Safari 和 Chrome */
</p>
<p>
           column-count:2;
</p>
<p>
           -moz-column-gap: 1em;-webkit-column-gap: 1em;column-gap: 1em;}
</p>
<p>
      /*一个内容层*/
</p>
<p>
      .item{ padding: 1em;margin: 0 0 1em 0;-moz-page-break-inside: avoid;-webkit-column-break-inside: avoid;break-inside: avoid;/*border: 1px solid #000;*/ background: #fff;}
</p>
<p>
      .item img{ width: 100%;margin-bottom:10px;}
</p>
<p>
      &lt;/style&gt;
</p>
<p>
  &lt;/head&gt;
</p>
<p>
  &lt;body&gt;
</p>
<p>
      &lt;div class=&#8221;container&#8221;&gt;
</p>
<p>
          &lt;div class=&#8221;waterfall&#8221;&gt;
</p>
<p>
              &lt;div class=&#8221;item&#8221;&gt;
</p>
<p>
                  &lt;img src=&#8221;../image/1.png&#8221;&gt;
</p>
<p>
                  &lt;p&gt;瀑布流效果&lt;/p&gt;
</p>
<p>
              &lt;/div&gt;
</p>
<p>
              &lt;div class=&#8221;item&#8221;&gt;
</p>
<p>
                  &lt;img src=&#8221;../image/5.png&#8221;&gt;
</p>
<p>
                  &lt;p&gt;瀑布流效果&lt;/p&gt;
</p>
<p>
              &lt;/div&gt;
</p>
<p>
              &lt;div class=&#8221;item&#8221;&gt;
</p>
<p>
                  &lt;img src=&#8221;../image/2.png&#8221;&gt;
</p>
<p>
                  &lt;p&gt;瀑布流效果&lt;/p&gt;
</p>
<p>
              &lt;/div&gt;
</p>
<p>
              &lt;div class=&#8221;item&#8221;&gt;
</p>
<p>
                  &lt;img src=&#8221;../image/3.png&#8221;&gt;
</p>
<p>
                  &lt;p&gt;瀑布流效果&lt;/p&gt;
</p>
<p>
              &lt;/div&gt;
</p>
<p>
              &lt;div class=&#8221;item&#8221;&gt;
</p>
<p>
                  &lt;img src=&#8221;../image/4.png&#8221;&gt;
</p>
<p>
                  &lt;p&gt;瀑布流效果&lt;/p&gt;
</p>
<p>
              &lt;/div&gt;
</p>
<p>
              &lt;div class=&#8221;item&#8221;&gt;
</p>
<p>
                  &lt;img src=&#8221;../image/1.png&#8221;&gt;
</p>
<p>
                  &lt;p&gt;瀑布流效果&lt;/p&gt;
</p>
<p>
              &lt;/div&gt;
</p>
<p>
              &lt;div class=&#8221;item&#8221;&gt;
</p>
<p>
                  &lt;img src=&#8221;../image/5.png&#8221;&gt;
</p>
<p>
                  &lt;p&gt;瀑布流效果&lt;/p&gt;
</p>
<p>
              &lt;/div&gt;
</p>
<p>
              &lt;div class=&#8221;item&#8221;&gt;
</p>
<p>
                  &lt;img src=&#8221;../image/4.png&#8221;&gt;
</p>
<p>
                  &lt;p&gt;瀑布流效果&lt;/p&gt;
</p>
<p>
              &lt;/div&gt;
</p>
<p>
          &lt;/div&gt;
</p>
<p>
      &lt;/div&gt;
</p>
<p>
  &lt;/body&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;../script/api.js&#8221; &gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221;&gt;
</p>
<p>
      apiready = function(){
</p>
<p>
          api.parseTapmode();
</p>
<p>
      }
</p>
<p>
  &lt;/script&gt;
</p>
<p>
  &lt;/html&gt;
</p>
<h2>动态页（frame_news.html）</h2>
<h3>1）效果图</h3>
<p><img loading="lazy" decoding="async" width="363" height="615" src="/wp-content/uploads/2018/05/word-image-4921.png" class="wp-image-5436" srcset="/wp-content/uploads/2018/05/word-image-4921.png 363w, /wp-content/uploads/2018/05/word-image-4921-177x300.png 177w" sizes="(max-width: 363px) 100vw, 363px" /></p>
<h3>2）代码</h3>
<p>
  &lt;!DOCTYPE HTML&gt;
</p>
<p>
  &lt;html&gt;
</p>
<p>
  &lt;head&gt;
</p>
<p>
      &lt;meta charset=&#8221;utf-8&#8243;&gt;
</p>
<p>
      &lt;meta name=&#8221;viewport&#8221; content=&#8221;maximum-scale=1.0,minimum-scale=1.0,user-scalable=0,width=device-width,initial-scale=1.0&#8243;/&gt;
</p>
<p>
      &lt;meta name=&#8221;format-detection&#8221; content=&#8221;telephone=no,email=no,date=no,address=no&#8221;&gt;
</p>
<p>
      &lt;title&gt;AUI快速完成布局&lt;/title&gt;
</p>
<p>
      &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;../css/aui.css&#8221; /&gt;
</p>
<p>
  &lt;/head&gt;
</p>
<p>
  &lt;body&gt;
</p>
<p>
      &lt;div class=&#8221;aui-content aui-margin-b-15&#8243;&gt;
</p>
<p>
          &lt;ul class=&#8221;aui-list aui-media-list&#8221;&gt;
</p>
<p>
              &lt;li class=&#8221;aui-list-item aui-list-item-middle&#8221;&gt;
</p>
<p>
                  &lt;div class=&#8221;aui-media-list-item-inner&#8221;&gt;
</p>
<p>
                      &lt;div class=&#8221;aui-list-item-media wechat-avatar&#8221;&gt;
</p>
<p>
                          &lt;img src=&#8221;../image/m1.png&#8221; /&gt;
</p>
<p>
                      &lt;/div&gt;
</p>
<p>
                      &lt;div class=&#8221;aui-list-item-inner&#8221;&gt;
</p>
<p>
                          &lt;div class=&#8221;aui-list-item-text&#8221;&gt;
</p>
<p>
                              &lt;div class=&#8221;aui-list-item-title&#8221;&gt;张三&lt;/div&gt;
</p>
<p>
                              &lt;div class=&#8221;aui-list-item-right&#8221;&gt;》》&lt;/div&gt;
</p>
<p>
                          &lt;/div&gt;
</p>
<p>
                          &lt;div class=&#8221;aui-list-item-text aui-font-size-12&#8243;&gt;
</p>
<p>
                              Hello AUI 2.0!
</p>
<p>
                          &lt;/div&gt;
</p>
<p>
                      &lt;/div&gt;
</p>
<p>
                  &lt;/div&gt;
</p>
<p>
              &lt;/li&gt;
</p>
<p>
              &lt;li class=&#8221;aui-list-item aui-list-item-middle&#8221;&gt;
</p>
<p>
                  &lt;div class=&#8221;aui-media-list-item-inner&#8221;&gt;
</p>
<p>
                      &lt;div class=&#8221;aui-list-item-media wechat-avatar&#8221;&gt;
</p>
<p>
                          &lt;img src=&#8221;../image/m2.png&#8221; /&gt;
</p>
<p>
                      &lt;/div&gt;
</p>
<p>
                      &lt;div class=&#8221;aui-list-item-inner&#8221;&gt;
</p>
<p>
                          &lt;div class=&#8221;aui-list-item-text&#8221;&gt;
</p>
<p>
                              &lt;div class=&#8221;aui-list-item-title&#8221;&gt;张三&lt;/div&gt;
</p>
<p>
                              &lt;div class=&#8221;aui-list-item-right&#8221;&gt;》》&lt;/div&gt;
</p>
<p>
                          &lt;/div&gt;
</p>
<p>
                          &lt;div class=&#8221;aui-list-item-text aui-font-size-12&#8243;&gt;
</p>
<p>
                              Hello AUI 2.0!
</p>
<p>
                          &lt;/div&gt;
</p>
<p>
                      &lt;/div&gt;
</p>
<p>
                  &lt;/div&gt;
</p>
<p>
              &lt;/li&gt;
</p>
<p>
              &lt;li class=&#8221;aui-list-item aui-list-item-middle&#8221;&gt;
</p>
<p>
                  &lt;div class=&#8221;aui-media-list-item-inner&#8221;&gt;
</p>
<p>
                      &lt;div class=&#8221;aui-list-item-media wechat-avatar&#8221;&gt;
</p>
<p>
                          &lt;img src=&#8221;../image/m3.png&#8221; /&gt;
</p>
<p>
                      &lt;/div&gt;
</p>
<p>
                      &lt;div class=&#8221;aui-list-item-inner&#8221;&gt;
</p>
<p>
                          &lt;div class=&#8221;aui-list-item-text&#8221;&gt;
</p>
<p>
                              &lt;div class=&#8221;aui-list-item-title&#8221;&gt;张三&lt;/div&gt;
</p>
<p>
                              &lt;div class=&#8221;aui-list-item-right&#8221;&gt;》》&lt;/div&gt;
</p>
<p>
                          &lt;/div&gt;
</p>
<p>
                          &lt;div class=&#8221;aui-list-item-text aui-font-size-12&#8243;&gt;
</p>
<p>
                              Hello AUI 2.0!
</p>
<p>
                          &lt;/div&gt;
</p>
<p>
                      &lt;/div&gt;
</p>
<p>
                  &lt;/div&gt;
</p>
<p>
              &lt;/li&gt;
</p>
<p>
              &lt;li class=&#8221;aui-list-item aui-list-item-middle&#8221;&gt;
</p>
<p>
                  &lt;div class=&#8221;aui-media-list-item-inner&#8221;&gt;
</p>
<p>
                      &lt;div class=&#8221;aui-list-item-media wechat-avatar&#8221;&gt;
</p>
<p>
                          &lt;img src=&#8221;../image/m4.png&#8221; /&gt;
</p>
<p>
                      &lt;/div&gt;
</p>
<p>
                      &lt;div class=&#8221;aui-list-item-inner&#8221;&gt;
</p>
<p>
                          &lt;div class=&#8221;aui-list-item-text&#8221;&gt;
</p>
<p>
                              &lt;div class=&#8221;aui-list-item-title&#8221;&gt;张三&lt;/div&gt;
</p>
<p>
                              &lt;div class=&#8221;aui-list-item-right&#8221;&gt;》》&lt;/div&gt;
</p>
<p>
                          &lt;/div&gt;
</p>
<p>
                          &lt;div class=&#8221;aui-list-item-text aui-font-size-12&#8243;&gt;
</p>
<p>
                              Hello AUI 2.0!
</p>
<p>
                          &lt;/div&gt;
</p>
<p>
                      &lt;/div&gt;
</p>
<p>
                  &lt;/div&gt;
</p>
<p>
              &lt;/li&gt;
</p>
<p>
          &lt;/ul&gt;
</p>
<p>
      &lt;/div&gt;
</p>
<p>
  &lt;/body&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;../script/api.js&#8221; &gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221;&gt;
</p>
<p>
  &lt;/script&gt;
</p>
<p>
  &lt;/html&gt;
</p>
<h2>关于页（frame_about.html）</h2>
<h3>1）效果图</h3>
<p><img loading="lazy" decoding="async" width="363" height="621" src="/wp-content/uploads/2018/05/word-image-4922.png" class="wp-image-5437" srcset="/wp-content/uploads/2018/05/word-image-4922.png 363w, /wp-content/uploads/2018/05/word-image-4922-175x300.png 175w" sizes="(max-width: 363px) 100vw, 363px" /></p>
<h3>2）代码</h3>
<p>
  &lt;!DOCTYPE HTML&gt;
</p>
<p>
  &lt;html&gt;
</p>
<p>
  &lt;head&gt;
</p>
<p>
      &lt;meta charset=&#8221;utf-8&#8243;&gt;
</p>
<p>
      &lt;meta name=&#8221;viewport&#8221; content=&#8221;maximum-scale=1.0,minimum-scale=1.0,user-scalable=0,width=device-width,initial-scale=1.0&#8243;/&gt;
</p>
<p>
      &lt;meta name=&#8221;format-detection&#8221; content=&#8221;telephone=no,email=no,date=no,address=no&#8221;&gt;
</p>
<p>
      &lt;title&gt;AUI快速完成布局&lt;/title&gt;
</p>
<p>
      &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;../css/aui.css&#8221; /&gt;
</p>
<p>
  &lt;/head&gt;
</p>
<p>
  &lt;body&gt;
</p>
<p>
      &lt;div class=&#8221;aui-content aui-margin-b-15&#8243;&gt;
</p>
<p>
          &lt;ul class=&#8221;aui-list aui-media-list&#8221;&gt;
</p>
<p>
              &lt;li class=&#8221;aui-list-item aui-list-item-middle&#8221; onclick=&#8221;openMusic()&#8221;&gt;
</p>
<p>
                  &lt;div class=&#8221;aui-media-list-item-inner&#8221;&gt;
</p>
<p>
                      &lt;div class=&#8221;aui-list-item-media wechat-avatar&#8221;&gt;
</p>
<p>
                          &lt;img src=&#8221;../image/m1.png&#8221; /&gt;
</p>
<p>
                      &lt;/div&gt;
</p>
<p>
                      &lt;div class=&#8221;aui-list-item-inner&#8221;&gt;
</p>
<p>
                          &lt;div class=&#8221;aui-list-item-text&#8221;&gt;
</p>
<p>
                              &lt;div class=&#8221;aui-list-item-title&#8221;&gt;张三&lt;/div&gt;
</p>
<p>
                              &lt;div class=&#8221;aui-list-item-right&#8221;&gt;》》&lt;/div&gt;
</p>
<p>
                          &lt;/div&gt;
</p>
<p>
                          &lt;div class=&#8221;aui-list-item-text aui-font-size-12&#8243;&gt;
</p>
<p>
                              Hello AUI 2.0!
</p>
<p>
                          &lt;/div&gt;
</p>
<p>
                      &lt;/div&gt;
</p>
<p>
                  &lt;/div&gt;
</p>
<p>
              &lt;/li&gt;
</p>
<p>
              &lt;li class=&#8221;aui-list-item aui-list-item-middle&#8221; onclick=&#8221;openMusic()&#8221;&gt;
</p>
<p>
                  &lt;div class=&#8221;aui-media-list-item-inner&#8221;&gt;
</p>
<p>
                      &lt;div class=&#8221;aui-list-item-media wechat-avatar&#8221;&gt;
</p>
<p>
                          &lt;img src=&#8221;../image/m2.png&#8221; /&gt;
</p>
<p>
                      &lt;/div&gt;
</p>
<p>
                      &lt;div class=&#8221;aui-list-item-inner&#8221;&gt;
</p>
<p>
                          &lt;div class=&#8221;aui-list-item-text&#8221;&gt;
</p>
<p>
                              &lt;div class=&#8221;aui-list-item-title&#8221;&gt;张三&lt;/div&gt;
</p>
<p>
                              &lt;div class=&#8221;aui-list-item-right&#8221;&gt;》》&lt;/div&gt;
</p>
<p>
                          &lt;/div&gt;
</p>
<p>
                          &lt;div class=&#8221;aui-list-item-text aui-font-size-12&#8243;&gt;
</p>
<p>
                              Hello AUI 2.0!
</p>
<p>
                          &lt;/div&gt;
</p>
<p>
                      &lt;/div&gt;
</p>
<p>
                  &lt;/div&gt;
</p>
<p>
              &lt;/li&gt;
</p>
<p>
              &lt;li class=&#8221;aui-list-item aui-list-item-middle&#8221; onclick=&#8221;openMusic()&#8221;&gt;
</p>
<p>
                  &lt;div class=&#8221;aui-media-list-item-inner&#8221;&gt;
</p>
<p>
                      &lt;div class=&#8221;aui-list-item-media wechat-avatar&#8221;&gt;
</p>
<p>
                          &lt;img src=&#8221;../image/m3.png&#8221; /&gt;
</p>
<p>
                      &lt;/div&gt;
</p>
<p>
                      &lt;div class=&#8221;aui-list-item-inner&#8221;&gt;
</p>
<p>
                          &lt;div class=&#8221;aui-list-item-text&#8221;&gt;
</p>
<p>
                              &lt;div class=&#8221;aui-list-item-title&#8221;&gt;张三&lt;/div&gt;
</p>
<p>
                              &lt;div class=&#8221;aui-list-item-right&#8221;&gt;》》&lt;/div&gt;
</p>
<p>
                          &lt;/div&gt;
</p>
<p>
                          &lt;div class=&#8221;aui-list-item-text aui-font-size-12&#8243;&gt;
</p>
<p>
                              Hello AUI 2.0!
</p>
<p>
                          &lt;/div&gt;
</p>
<p>
                      &lt;/div&gt;
</p>
<p>
                  &lt;/div&gt;
</p>
<p>
              &lt;/li&gt;
</p>
<p>
              &lt;li class=&#8221;aui-list-item aui-list-item-middle&#8221; onclick=&#8221;openMusic()&#8221;&gt;
</p>
<p>
                  &lt;div class=&#8221;aui-media-list-item-inner&#8221;&gt;
</p>
<p>
                      &lt;div class=&#8221;aui-list-item-media wechat-avatar&#8221;&gt;
</p>
<p>
                          &lt;img src=&#8221;../image/m4.png&#8221; /&gt;
</p>
<p>
                      &lt;/div&gt;
</p>
<p>
                      &lt;div class=&#8221;aui-list-item-inner&#8221;&gt;
</p>
<p>
                          &lt;div class=&#8221;aui-list-item-text&#8221;&gt;
</p>
<p>
                              &lt;div class=&#8221;aui-list-item-title&#8221;&gt;张三&lt;/div&gt;
</p>
<p>
                              &lt;div class=&#8221;aui-list-item-right&#8221;&gt;》》&lt;/div&gt;
</p>
<p>
                          &lt;/div&gt;
</p>
<p>
                          &lt;div class=&#8221;aui-list-item-text aui-font-size-12&#8243;&gt;
</p>
<p>
                              Hello AUI 2.0!
</p>
<p>
                          &lt;/div&gt;
</p>
<p>
                      &lt;/div&gt;
</p>
<p>
                  &lt;/div&gt;
</p>
<p>
              &lt;/li&gt;
</p>
<p>
          &lt;/ul&gt;
</p>
<p>
      &lt;/div&gt;
</p>
<p>
  &lt;/body&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;../script/api.js&#8221; &gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221;&gt;
</p>
<p>
  function openMusic () {
</p>
<p>
      api.openFrame({
</p>
<p>
              name: &#8216;frame_music&#8217;,
</p>
<p>
              url: &#8216;./music.html&#8217;,
</p>
<p>
              bounces: true,
</p>
<p>
              rect: {
</p>
<p>
                  x: 0,
</p>
<p>
                  y: 0,
</p>
<p>
                  w: &#8216;auto&#8217;,
</p>
<p>
                  h: &#8216;auto&#8217;
</p>
<p>
              }
</p>
<p>
          });
</p>
<p>
  }
</p>
<p>
  &lt;/script&gt;
</p>
<p>
  &lt;/html&gt;
</p>
<h2>音乐详情页（frame_music.html）</h2>
<h3>1）效果图</h3>
<p><img loading="lazy" decoding="async" width="362" height="627" src="/wp-content/uploads/2018/05/word-image-4923.png" class="wp-image-5438" srcset="/wp-content/uploads/2018/05/word-image-4923.png 362w, /wp-content/uploads/2018/05/word-image-4923-173x300.png 173w" sizes="(max-width: 362px) 100vw, 362px" /></p>
<h3>2）代码</h3>
<p>
  &lt;!doctype html&gt;
</p>
<p>
  &lt;html&gt;
</p>
<p>
  &lt;head&gt;
</p>
<p>
      &lt;meta charset=&#8221;utf-8&#8243;&gt;
</p>
<p>
      &lt;meta name=&#8221;viewport&#8221; content=&#8221;maximum-scale=1.0,minimum-scale=1.0,user-scalable=0,initial-scale=1.0,width=device-width&#8221;/&gt;
</p>
<p>
      &lt;meta name=&#8221;format-detection&#8221; content=&#8221;telephone=no,email=no,date=no,address=no&#8221;&gt;
</p>
<p>
      &lt;title&gt;甜椒广场舞&lt;/title&gt;
</p>
<p>
      &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;../css/api.css&#8221; /&gt;
</p>
<p>
      &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;../css/aui.css&#8221; /&gt;
</p>
<p>
      &lt;style type=&#8221;text/css&#8221;&gt;
</p>
<p>
      .aui-bar-dark {background-color:#E65A65;}
</p>
<p>
      #music {padding:50px 0; text-align:center;}
</p>
<p>
      #music img {margin: auto; border-radius:100px; width:200px; height:200px;}
</p>
<p>
      #title {text-align:center; margin: 10px 0px;}
</p>
<p>
      .aui-range { width: 100%;}
</p>
<p>
      /*.aui-range input[type=&#8217;range&#8217;] { background-color: #E65A65; }*/
</p>
<p>
      .aui-range input[type=&#8217;range&#8217;]::-webkit-slider-thumb { background-color: #E65A65; }
</p>
<p>
      &lt;/style&gt;
</p>
<p>
  &lt;/head&gt;
</p>
<p>
  &lt;body&gt;
</p>
<p>
      &lt;header id=&#8221;aui-header&#8221; class=&#8221;aui-bar aui-bar-nav aui-bar-dark&#8221;&gt;
</p>
<p>
          &lt;a class=&#8221;aui-pull-left aui-btn&#8221; onclick=&#8221;closeWin()&#8221;&gt;
</p>
<p>
              &lt;span class=&#8221;aui-iconfont aui-icon-left&#8221;&gt;&lt;/span&gt;
</p>
<p>
          &lt;/a&gt;
</p>
<p>
          &lt;div class=&#8221;aui-title&#8221;&gt;甜椒广场舞&lt;/div&gt;
</p>
<p>
      &lt;/header&gt;
</p>
<p>
      &lt;div id=&#8217;music&#8217;&gt;
</p>
<p>
          &lt;img src=&#8217;../image/music.png&#8217; /&gt;
</p>
<p>
      &lt;/div&gt;
</p>
<p>
      &lt;h5 id=&#8217;title&#8217;&gt;买买买 &#8211; By2&lt;/h5&gt;
</p>
<p>
      &lt;br /&gt;
</p>
<p>
      &lt;div class=&#8221;aui-list-item-input&#8221;&gt;
</p>
<p>
          &lt;div class=&#8221;aui-range&#8221;&gt;
</p>
<p>
              &lt;input type=&#8221;range&#8221; class=&#8221;aui-range&#8221; value=&#8221;0&#8243; max=&#8221;100&#8243; min=&#8221;1&#8243; step=&#8221;1&#8243; id=&#8221;range&#8221;&gt;
</p>
<p>
              &lt;div class=&#8221;aui-range-tip aui-hide&#8221;&gt;0&lt;/div&gt;
</p>
<p>
          &lt;/div&gt;
</p>
<p>
      &lt;/div&gt;
</p>
<p>
      &lt;br /&gt;
</p>
<p>
      &lt;p&gt;&lt;div class=&#8221;aui-btn aui-btn-danger aui-btn-block&#8221;&gt;播放音乐(start)&lt;/div&gt;&lt;/p&gt;
</p>
<p>
      &lt;br /&gt;
</p>
<p>
      &lt;p&gt;&lt;div class=&#8221;aui-btn aui-btn-danger aui-btn-block&#8221;&gt;停止播放(pause)&lt;/div&gt;&lt;/p&gt;
</p>
<p>
  &lt;/body&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;../script/api.js&#8221; &gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;../script/aui-range.js&#8221; &gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221;&gt;
</p>
<p>
      var range = new auiRange({
</p>
<p>
          element:document.getElementById(&#8220;range&#8221;)
</p>
<p>
      },function(ret){
</p>
<p>
      })
</p>
<p>
      apiready = function(){
</p>
<p>
          api.parseTapmode();
</p>
<p>
      }
</p>
<p>
      function closeWin() {
</p>
<p>
          api.closeFrame({
</p>
<p>
              name: &#8216;frame_music&#8217;
</p>
<p>
          });
</p>
<p>
      }
</p>
<p>
  &lt;/script&gt;
</p>
<p>
  &lt;/html&gt;
</p>
<h1>一、使用TP完成APP后台</h1>
<h2>1、需求</h2>
<p>
  后台可以动态添加、显示音乐数据
</p>
<h2>实现</h2>
<p>
  见tools
</p>
<h1><a id="post-5431-_Toc467340740"></a>App与TP框架整合（App接口）</h1>
<h2><a id="post-5431-_Toc467340741"></a>1、App接口请求/运行原理图</h2>
<p><img loading="lazy" decoding="async" width="742" height="254" src="/wp-content/uploads/2018/05/word-image-4924.png" class="wp-image-5439" srcset="/wp-content/uploads/2018/05/word-image-4924.png 742w, /wp-content/uploads/2018/05/word-image-4924-300x103.png 300w" sizes="(max-width: 742px) 100vw, 742px" /></p>
<h2>使用TP框架开发App接口</h2>
<p><img loading="lazy" decoding="async" width="1296" height="561" src="/wp-content/uploads/2018/05/word-image-4925.png" class="wp-image-5440" srcset="/wp-content/uploads/2018/05/word-image-4925.png 1296w, /wp-content/uploads/2018/05/word-image-4925-300x130.png 300w, /wp-content/uploads/2018/05/word-image-4925-768x332.png 768w, /wp-content/uploads/2018/05/word-image-4925-1024x443.png 1024w" sizes="(max-width: 1296px) 100vw, 1296px" /></p>
<p>
  &lt;?php
</p>
<p>
  namespace Api\Controller;
</p>
<p>
  use Think\Controller;
</p>
<p>
  class MusicController extends Controller
</p>
<p>
  {
</p>
<p>
      public function index()
</p>
<p>
      {
</p>
<p>
      	$offset =  I(&#8216;post.offset&#8217;); // 相当于 $_POST[&#8216;id&#8217;]
</p>
<p>
      	$limit = I(&#8216;post.limit&#8217;); // 相当于 $_POST[&#8216;id&#8217;]
</p>
<p>
      	//步骤1：从数据库获取数据
</p>
<p>
      	$musicData = M(&#8216;music&#8217;)-&gt;order(&#8216;id desc&#8217;)-&gt;limit($offset, $limit)-&gt;select();
</p>
<p>
      	//步骤2：数据过滤
</p>
<p>
      	foreach ($musicData as $key =&gt; $value) {
</p>
<p>
      		$musicData[$key][&#8216;logo&#8217;] = &#8216;http://192.168.72.56/tp32_app_guangchangwu/Public/Uploads/&#8217; . $musicData[$key][&#8216;logo&#8217;];
</p>
<p>
      	}
</p>
<p>
      	//步骤3：响应json数据
</p>
<p>
      	echo json_encode($musicData);
</p>
<p>
      }
</p>
<p>
  }
</p>
<h2>在App中使用api.ajax调用App接口</h2>
<p>
  接口
</p>
<p><img loading="lazy" decoding="async" width="863" height="601" src="/wp-content/uploads/2018/05/word-image-4926.png" class="wp-image-5441" srcset="/wp-content/uploads/2018/05/word-image-4926.png 863w, /wp-content/uploads/2018/05/word-image-4926-300x209.png 300w, /wp-content/uploads/2018/05/word-image-4926-768x535.png 768w" sizes="(max-width: 863px) 100vw, 863px" /><br />
<img loading="lazy" decoding="async" width="426" height="433" src="/wp-content/uploads/2018/05/word-image-4927.png" class="wp-image-5442" srcset="/wp-content/uploads/2018/05/word-image-4927.png 426w, /wp-content/uploads/2018/05/word-image-4927-295x300.png 295w" sizes="(max-width: 426px) 100vw, 426px" /></p>
<h2>4、JQ遍历显示数据</h2>
<p>
  &lt;!DOCTYPE HTML&gt;
</p>
<p>
  &lt;html&gt;
</p>
<p>
  &lt;head&gt;
</p>
<p>
      &lt;meta charset=&#8221;utf-8&#8243;&gt;
</p>
<p>
      &lt;meta name=&#8221;viewport&#8221; content=&#8221;maximum-scale=1.0,minimum-scale=1.0,user-scalable=0,width=device-width,initial-scale=1.0&#8243;/&gt;
</p>
<p>
      &lt;meta name=&#8221;format-detection&#8221; content=&#8221;telephone=no,email=no,date=no,address=no&#8221;&gt;
</p>
<p>
      &lt;title&gt;AUI快速完成布局&lt;/title&gt;
</p>
<p>
      &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;../css/aui.css&#8221; /&gt;
</p>
<p>
  &lt;/head&gt;
</p>
<p>
  &lt;body&gt;
</p>
<p>
      &lt;div class=&#8221;aui-content aui-margin-b-15&#8243;&gt;
</p>
<p>
          &lt;ul class=&#8221;aui-list aui-media-list&#8221;&gt;&lt;!&#8211;
</p>
<p>
              &lt;li class=&#8221;aui-list-item aui-list-item-middle&#8221; onclick=&#8221;openMusic()&#8221;&gt;
</p>
<p>
                  &lt;div class=&#8221;aui-media-list-item-inner&#8221;&gt;
</p>
<p>
                      &lt;div class=&#8221;aui-list-item-media wechat-avatar&#8221;&gt;
</p>
<p>
                          &lt;img src=&#8221;../image/m1.png&#8221; /&gt;
</p>
<p>
                      &lt;/div&gt;
</p>
<p>
                      &lt;div class=&#8221;aui-list-item-inner&#8221;&gt;
</p>
<p>
                          &lt;div class=&#8221;aui-list-item-text&#8221;&gt;
</p>
<p>
                              &lt;div class=&#8221;aui-list-item-title&#8221;&gt;张三&lt;/div&gt;
</p>
<p>
                              &lt;div class=&#8221;aui-list-item-right&#8221;&gt;》》&lt;/div&gt;
</p>
<p>
                          &lt;/div&gt;
</p>
<p>
                          &lt;div class=&#8221;aui-list-item-text aui-font-size-12&#8243;&gt;
</p>
<p>
                              Hello AUI 2.0!
</p>
<p>
                          &lt;/div&gt;
</p>
<p>
                      &lt;/div&gt;
</p>
<p>
                  &lt;/div&gt;
</p>
<p>
              &lt;/li&gt; &#8211;&gt;
</p>
<p>
          &lt;/ul&gt;
</p>
<p>
      &lt;/div&gt;
</p>
<p>
  &lt;/body&gt;
</p>
<p>
  &lt;script src=&#8221;https://cdn.bootcss.com/jquery/1.8.3/jquery.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;../script/api.js&#8221; &gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221;&gt;
</p>
<p>
  apiready = function(){
</p>
<p>
      <strong>//脚下留心：必须写本机的ip  因为模拟器也是一个单独的操作系统</strong>
</p>
<p><strong>    api.ajax({</strong>
</p>
<p><strong>        url: &#8216;http://192.168.72.56/tp32_app_guangchangwu/index.php/api/music/index&#8217;,</strong>
</p>
<p><strong>        method: &#8216;post&#8217;,</strong>
</p>
<p><strong>        data: {</strong>
</p>
<p><strong>            values: {</strong>
</p>
<p><strong>                offset: 0,</strong>
</p>
<p><strong>                limit: 2,</strong>
</p>
<p><strong>            }</strong>
</p>
<p><strong>        }</strong>
</p>
<p><strong>    }, function(ret, err) {</strong>
</p>
<p><strong>        if (ret) {</strong>
</p>
<p><strong>            //api.alert({ msg: JSON.stringify(ret) });</strong>
</p>
<p><strong>            var html = &#8221;;</strong>
</p>
<p><strong>            $.each(ret, function(i, itemObj) {</strong>
</p>
<p><strong>                html += &#8216;&lt;li class=&#8221;aui-list-item aui-list-item-middle&#8221; onclick=&#8221;openMusic()&#8221;&gt;&#8217; + </strong>
</p>
<p><strong>                    &#8216;&lt;div class=&#8221;aui-media-list-item-inner&#8221;&gt;&#8217; + </strong>
</p>
<p><strong>                        &#8216;&lt;div class=&#8221;aui-list-item-media wechat-avatar&#8221;&gt;&#8217; + </strong>
</p>
<p><strong>                            &#8216;&lt;img src=&#8221;&#8216;+itemObj.logo+'&#8221; /&gt;&#8217; + </strong>
</p>
<p><strong>                        &#8216;&lt;/div&gt;&#8217; + </strong>
</p>
<p><strong>                        &#8216;&lt;div class=&#8221;aui-list-item-inner&#8221;&gt;&#8217; + </strong>
</p>
<p><strong>                            &#8216;&lt;div class=&#8221;aui-list-item-text&#8221;&gt;&#8217; + </strong>
</p>
<p><strong>                                &#8216;&lt;div class=&#8221;aui-list-item-title&#8221;&gt;&#8217;+itemObj.title+'&lt;/div&gt;&#8217; + </strong>
</p>
<p><strong>                                &#8216;&lt;div class=&#8221;aui-list-item-right&#8221;&gt;》》&lt;/div&gt;&#8217; + </strong>
</p>
<p><strong>                            &#8216;&lt;/div&gt;&#8217; + </strong>
</p>
<p><strong>                            &#8216;&lt;div class=&#8221;aui-list-item-text aui-font-size-12&#8243;&gt;&#8217; + </strong>
</p>
<p><strong>                               itemObj.author + &#8216;&lt;/div&gt;&#8217; + </strong>
</p>
<p><strong>                        &#8216;&lt;/div&gt;&#8217; + </strong>
</p>
<p><strong>                    &#8216;&lt;/div&gt;&#8217; + </strong>
</p>
<p><strong>                &#8216;&lt;/li&gt;&#8217;;</strong>
</p>
<p><strong>            });</strong>
</p>
<p><strong>            //拼接最终在页面显示</strong>
</p>
<p><strong>            $(&#8220;ul&#8221;).html(html);</strong>
</p>
<p><strong>        } else {</strong>
</p>
<p><strong>            api.alert({ msg: JSON.stringify(err) });</strong>
</p>
<p><strong>        }</strong>
</p>
<p><strong>    });</strong>
</p>
<p>
  }
</p>
<p>
  function openMusic () {
</p>
<p>
      api.openFrame({
</p>
<p>
          name: &#8216;frame_music&#8217;,
</p>
<p>
          url: &#8216;./music.html&#8217;,
</p>
<p>
          bounces: true,
</p>
<p>
          rect: {
</p>
<p>
              x: 0,
</p>
<p>
              y: 0,
</p>
<p>
              w: &#8216;auto&#8217;,
</p>
<p>
              h: &#8216;auto&#8217;
</p>
<p>
          }
</p>
<p>
      });
</p>
<p>
  }
</p>
<p>
  &lt;/script&gt;
</p>
<p>
  &lt;/html&gt;
</p>
</p>
<h1> 实现下拉的刷新</h1>
<h2>什么是下拉刷新</h2>
<p><img loading="lazy" decoding="async" width="367" height="338" src="/wp-content/uploads/2018/05/word-image-4928.png" class="wp-image-5443" srcset="/wp-content/uploads/2018/05/word-image-4928.png 367w, /wp-content/uploads/2018/05/word-image-4928-300x276.png 300w" sizes="(max-width: 367px) 100vw, 367px" /></p>
<p>
  &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;
</p>
<p><img loading="lazy" decoding="async" width="376" height="347" src="/wp-content/uploads/2018/05/word-image-4929.png" class="wp-image-5444" srcset="/wp-content/uploads/2018/05/word-image-4929.png 376w, /wp-content/uploads/2018/05/word-image-4929-300x277.png 300w" sizes="(max-width: 376px) 100vw, 376px" /></p>
<h2>下拉刷新接口</h2>
<p><img loading="lazy" decoding="async" width="712" height="563" src="/wp-content/uploads/2018/05/word-image-4930.png" class="wp-image-5445" srcset="/wp-content/uploads/2018/05/word-image-4930.png 712w, /wp-content/uploads/2018/05/word-image-4930-300x237.png 300w" sizes="(max-width: 712px) 100vw, 712px" /><br />
<img loading="lazy" decoding="async" width="698" height="318" src="/wp-content/uploads/2018/05/word-image-4931.png" class="wp-image-5446" srcset="/wp-content/uploads/2018/05/word-image-4931.png 698w, /wp-content/uploads/2018/05/word-image-4931-300x137.png 300w" sizes="(max-width: 698px) 100vw, 698px" /></p>
<p>
  api.setRefreshHeaderInfo({
</p>
<p>
      loadingImg: &#8216;widget://image/refresh.png&#8217;,
</p>
<p>
      bgColor: &#8216;#ccc&#8217;,
</p>
<p>
      textColor: &#8216;#fff&#8217;,
</p>
<p>
      textDown: &#8216;下拉刷新&#8230;&#8217;,
</p>
<p>
      textUp: &#8216;松开刷新&#8230;&#8217;
</p>
<p>
  }, function(ret, err) {
</p>
<p>
      //在这里从服务器加载数据，加载完成后调用api.refreshHeaderLoadDone()方法恢复组件到默认状态
</p>
<p>
  });
</p>
<h2>使用下拉刷新获取数据</h2>
<p>
  &lt;!DOCTYPE HTML&gt;
</p>
<p>
  &lt;html&gt;
</p>
<p>
  &lt;head&gt;
</p>
<p>
      &lt;meta charset=&#8221;utf-8&#8243;&gt;
</p>
<p>
      &lt;meta name=&#8221;viewport&#8221; content=&#8221;maximum-scale=1.0,minimum-scale=1.0,user-scalable=0,width=device-width,initial-scale=1.0&#8243;/&gt;
</p>
<p>
      &lt;meta name=&#8221;format-detection&#8221; content=&#8221;telephone=no,email=no,date=no,address=no&#8221;&gt;
</p>
<p>
      &lt;title&gt;AUI快速完成布局&lt;/title&gt;
</p>
<p>
      &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;../css/aui.css&#8221; /&gt;
</p>
<p>
  &lt;/head&gt;
</p>
<p>
  &lt;body&gt;
</p>
<p>
      &lt;div class=&#8221;aui-content aui-margin-b-15&#8243;&gt;
</p>
<p>
          &lt;ul class=&#8221;aui-list aui-media-list&#8221;&gt;&lt;!&#8211;
</p>
<p>
              &lt;li class=&#8221;aui-list-item aui-list-item-middle&#8221; onclick=&#8221;openMusic()&#8221;&gt;
</p>
<p>
                  &lt;div class=&#8221;aui-media-list-item-inner&#8221;&gt;
</p>
<p>
                      &lt;div class=&#8221;aui-list-item-media wechat-avatar&#8221;&gt;
</p>
<p>
                          &lt;img src=&#8221;../image/m1.png&#8221; /&gt;
</p>
<p>
                      &lt;/div&gt;
</p>
<p>
                      &lt;div class=&#8221;aui-list-item-inner&#8221;&gt;
</p>
<p>
                          &lt;div class=&#8221;aui-list-item-text&#8221;&gt;
</p>
<p>
                              &lt;div class=&#8221;aui-list-item-title&#8221;&gt;张三&lt;/div&gt;
</p>
<p>
                              &lt;div class=&#8221;aui-list-item-right&#8221;&gt;》》&lt;/div&gt;
</p>
<p>
                          &lt;/div&gt;
</p>
<p>
                          &lt;div class=&#8221;aui-list-item-text aui-font-size-12&#8243;&gt;
</p>
<p>
                              Hello AUI 2.0!
</p>
<p>
                          &lt;/div&gt;
</p>
<p>
                      &lt;/div&gt;
</p>
<p>
                  &lt;/div&gt;
</p>
<p>
              &lt;/li&gt; &#8211;&gt;
</p>
<p>
          &lt;/ul&gt;
</p>
<p>
      &lt;/div&gt;
</p>
<p>
  &lt;/body&gt;
</p>
<p>
  &lt;script src=&#8221;https://cdn.bootcss.com/jquery/1.8.3/jquery.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;../script/api.js&#8221; &gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221;&gt;
</p>
<p>
  apiready = function(){
</p>
<p>
     <strong> //默认点击动态，发送请求，显示第一页数据</strong>
</p>
<p><strong>    getData(0);</strong>
</p>
<p>
      <strong>api.setRefreshHeaderInfo({</strong>
</p>
<p><strong>        loadingImg: &#8216;widget://image/refresh.png&#8217;,</strong>
</p>
<p><strong>        bgColor: &#8216;#ccc&#8217;,</strong>
</p>
<p><strong>        textColor: &#8216;#fff&#8217;,</strong>
</p>
<p><strong>        textDown: &#8216;下拉刷新&#8230;&#8217;,</strong>
</p>
<p><strong>        textUp: &#8216;松开刷新&#8230;&#8217;</strong>
</p>
<p><strong>    }, function(ret, err) {</strong>
</p>
<p><strong>        //在这里从服务器加载数据，加载完成后调用api.refreshHeaderLoadDone()方法恢复组件到默认状态</strong>
</p>
<p><strong>        getData(1);</strong>
</p>
<p><strong>        api.refreshHeaderLoadDone();</strong>
</p>
<p><strong>    });</strong>
</p>
<p>
  }
</p>
<p>
  function openMusic () {
</p>
<p>
      api.openFrame({
</p>
<p>
          name: &#8216;frame_music&#8217;,
</p>
<p>
          url: &#8216;./music.html&#8217;,
</p>
<p>
          bounces: true,
</p>
<p>
          rect: {
</p>
<p>
              x: 0,
</p>
<p>
              y: 0,
</p>
<p>
              w: &#8216;auto&#8217;,
</p>
<p>
              h: &#8216;auto&#8217;
</p>
<p>
          }
</p>
<p>
      });
</p>
<p>
  }
</p>
<p><strong>//全局变量起始位置</strong>
</p>
<p><strong>var offset = 0;</strong>
</p>
<p><strong>function getData(isAdd) {</strong>
</p>
<p><strong>    if (isAdd) offset+=2;</strong>
</p>
<p><strong>    //脚下留心：必须写本机的ip  因为模拟器也是一个单独的操作系统</strong>
</p>
<p><strong>    api.ajax({</strong>
</p>
<p><strong>        url: &#8216;http://192.168.72.56/tp32_app_guangchangwu/index.php/api/music/index&#8217;,</strong>
</p>
<p><strong>        method: &#8216;post&#8217;,</strong>
</p>
<p><strong>        data: {</strong>
</p>
<p><strong>            values: {</strong>
</p>
<p><strong>                offset: offset,</strong>
</p>
<p><strong>                limit: 2,</strong>
</p>
<p><strong>            }</strong>
</p>
<p><strong>        }</strong>
</p>
<p><strong>    }, function(ret, err) {</strong>
</p>
<p><strong>       </strong>
</p>
<p><strong>        //将json对象数据转化为字符串</strong>
</p>
<p><strong>        if (ret &amp;&amp; JSON.stringify(ret) !== &#8216;[]&#8217;) {</strong>
</p>
<p><strong>            //api.alert({ msg: JSON.stringify(ret) });</strong>
</p>
<p><strong>            var html = &#8221;;</strong>
</p>
<p><strong>            $.each(ret, function(i, itemObj) {</strong>
</p>
<p><strong>                html += &#8216;&lt;li class=&#8221;aui-list-item aui-list-item-middle&#8221; onclick=&#8221;openMusic()&#8221;&gt;&#8217; + </strong>
</p>
<p><strong>                    &#8216;&lt;div class=&#8221;aui-media-list-item-inner&#8221;&gt;&#8217; + </strong>
</p>
<p><strong>                        &#8216;&lt;div class=&#8221;aui-list-item-media wechat-avatar&#8221;&gt;&#8217; + </strong>
</p>
<p><strong>                            &#8216;&lt;img src=&#8221;&#8216;+itemObj.logo+'&#8221; /&gt;&#8217; + </strong>
</p>
<p><strong>                        &#8216;&lt;/div&gt;&#8217; + </strong>
</p>
<p><strong>                        &#8216;&lt;div class=&#8221;aui-list-item-inner&#8221;&gt;&#8217; + </strong>
</p>
<p><strong>                            &#8216;&lt;div class=&#8221;aui-list-item-text&#8221;&gt;&#8217; + </strong>
</p>
<p><strong>                                &#8216;&lt;div class=&#8221;aui-list-item-title&#8221;&gt;&#8217;+itemObj.title+'&lt;/div&gt;&#8217; + </strong>
</p>
<p><strong>                                &#8216;&lt;div class=&#8221;aui-list-item-right&#8221;&gt;》》&lt;/div&gt;&#8217; + </strong>
</p>
<p><strong>                            &#8216;&lt;/div&gt;&#8217; + </strong>
</p>
<p><strong>                            &#8216;&lt;div class=&#8221;aui-list-item-text aui-font-size-12&#8243;&gt;&#8217; + </strong>
</p>
<p><strong>                               itemObj.author + &#8216;&lt;/div&gt;&#8217; + </strong>
</p>
<p><strong>                        &#8216;&lt;/div&gt;&#8217; + </strong>
</p>
<p><strong>                    &#8216;&lt;/div&gt;&#8217; + </strong>
</p>
<p><strong>                &#8216;&lt;/li&gt;&#8217;;</strong>
</p>
<p><strong>            });</strong>
</p>
<p><strong>            //拼接最终在页面显示</strong>
</p>
<p><strong>            //$(&#8220;ul&#8221;).html(html);</strong>
</p>
<p><strong>            //append();   后面追加</strong>
</p>
<p><strong>            //prepend()   前面追加</strong>
</p>
<p><strong>            $(&#8216;ul&#8217;).prepend(html);</strong>
</p>
<p><strong>        } else {</strong>
</p>
<p><strong>            alert(&#8216;没有更多数据&#8217;);</strong>
</p>
<p><strong>            // api.alert({ msg: JSON.stringify(err) });</strong>
</p>
<p><strong>        }</strong>
</p>
<p><strong>    });</strong>
</p>
<p><strong>}</strong>
</p>
<p>
  &lt;/script&gt;
</p>
<p>
  &lt;/html&gt;
</p>
<h1>四、使用APICloud中的模块让音乐响起来</h1>
<h2>1、音乐详情页CD旋转</h2>
<ul>
<li>
    步骤1：广场舞文件夹引入旋转jq插件
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="961" height="509" src="/wp-content/uploads/2018/05/word-image-4932.png" class="wp-image-5447" srcset="/wp-content/uploads/2018/05/word-image-4932.png 961w, /wp-content/uploads/2018/05/word-image-4932-300x159.png 300w, /wp-content/uploads/2018/05/word-image-4932-768x407.png 768w" sizes="(max-width: 961px) 100vw, 961px" /></p>
<ul>
<li>
    music页面引入jquery并且让cd转动起来
  </li>
</ul>
<p>
  &lt;!doctype html&gt;
</p>
<p>
  &lt;html&gt;
</p>
<p>
  &lt;head&gt;
</p>
<p>
      &lt;meta charset=&#8221;utf-8&#8243;&gt;
</p>
<p>
      &lt;meta name=&#8221;viewport&#8221; content=&#8221;maximum-scale=1.0,minimum-scale=1.0,user-scalable=0,initial-scale=1.0,width=device-width&#8221;/&gt;
</p>
<p>
      &lt;meta name=&#8221;format-detection&#8221; content=&#8221;telephone=no,email=no,date=no,address=no&#8221;&gt;
</p>
<p>
      &lt;title&gt;甜椒广场舞&lt;/title&gt;
</p>
<p>
      &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;../css/api.css&#8221; /&gt;
</p>
<p>
      &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;../css/aui.css&#8221; /&gt;
</p>
<p>
      &lt;style type=&#8221;text/css&#8221;&gt;
</p>
<p>
      .aui-bar-dark {background-color:#E65A65;}
</p>
<p>
      #music {padding:50px 0; text-align:center;}
</p>
<p>
      #music img {margin: auto; border-radius:100px; width:200px; height:200px;}
</p>
<p>
      #title {text-align:center; margin: 10px 0px;}
</p>
<p>
      .aui-range { width: 100%;}
</p>
<p>
      /*.aui-range input[type=&#8217;range&#8217;] { background-color: #E65A65; }*/
</p>
<p>
      .aui-range input[type=&#8217;range&#8217;]::-webkit-slider-thumb { background-color: #E65A65; }
</p>
<p>
      &lt;/style&gt;
</p>
<p>
  &lt;/head&gt;
</p>
<p>
  &lt;body&gt;
</p>
<p>
      &lt;header id=&#8221;aui-header&#8221; class=&#8221;aui-bar aui-bar-nav aui-bar-dark&#8221;&gt;
</p>
<p>
          &lt;a class=&#8221;aui-pull-left aui-btn&#8221; onclick=&#8221;closeWin()&#8221;&gt;
</p>
<p>
              &lt;span class=&#8221;aui-iconfont aui-icon-left&#8221;&gt;&lt;/span&gt;
</p>
<p>
          &lt;/a&gt;
</p>
<p>
          &lt;div class=&#8221;aui-title&#8221;&gt;甜椒广场舞&lt;/div&gt;
</p>
<p>
      &lt;/header&gt;
</p>
<p>
      &lt;div id=&#8217;music&#8217;&gt;
</p>
<p>
          &lt;img src=&#8217;../image/music.png&#8217; /&gt;
</p>
<p>
      &lt;/div&gt;
</p>
<p>
      &lt;h5 id=&#8217;title&#8217;&gt;买买买 &#8211; By2&lt;/h5&gt;
</p>
<p>
      &lt;br /&gt;
</p>
<p>
      &lt;div class=&#8221;aui-list-item-input&#8221;&gt;
</p>
<p>
          &lt;div class=&#8221;aui-range&#8221;&gt;
</p>
<p>
              &lt;input type=&#8221;range&#8221; class=&#8221;aui-range&#8221; value=&#8221;0&#8243; max=&#8221;100&#8243; min=&#8221;1&#8243; step=&#8221;1&#8243; id=&#8221;range&#8221;&gt;
</p>
<p>
              &lt;div class=&#8221;aui-range-tip aui-hide&#8221;&gt;0&lt;/div&gt;
</p>
<p>
          &lt;/div&gt;
</p>
<p>
      &lt;/div&gt;
</p>
<p>
      &lt;br /&gt;
</p>
<p>
      &lt;p&gt;&lt;div class=&#8221;aui-btn aui-btn-danger aui-btn-block&#8221;&gt;播放音乐(start)&lt;/div&gt;&lt;/p&gt;
</p>
<p>
      &lt;br /&gt;
</p>
<p>
      &lt;p&gt;&lt;div class=&#8221;aui-btn aui-btn-danger aui-btn-block&#8221;&gt;停止播放(pause)&lt;/div&gt;&lt;/p&gt;
</p>
<p>
  &lt;/body&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;../script/api.js&#8221; &gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;../script/aui-range.js&#8221; &gt;&lt;/script&gt;
</p>
<p><strong>&lt;script type=&#8221;text/javascript&#8221; src=&#8221;../script/jquery.min.js&#8221; &gt;&lt;/script&gt;</strong>
</p>
<p><strong>&lt;script type=&#8221;text/javascript&#8221; src=&#8221;../script/jquery.rotate.min.js&#8221; &gt;&lt;/script&gt;</strong>
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221;&gt;
</p>
<p>
      apiready = function(){
</p>
<p>
          api.parseTapmode();
</p>
<p><strong>        //默认打开旋转</strong>
</p>
<p><strong>        startMusic();</strong>
</p>
<p>
      }
</p>
<p>
      //进度条拖拽
</p>
<p>
      var range = new auiRange({
</p>
<p>
          element:document.getElementById(&#8220;range&#8221;)
</p>
<p>
      },function(ret){
</p>
<p>
      })
</p>
<p>
      //关闭当前窗口，返回动态列表页
</p>
<p>
      function closeWin() {
</p>
<p>
          api.closeFrame({
</p>
<p>
              name: &#8216;frame_music&#8217;
</p>
<p>
          });
</p>
<p>
      }
</p>
<p>
      <strong>/*光盘旋转*/</strong>
</p>
<p><strong>    var angle = 0;</strong>
</p>
<p><strong>    var timer;</strong>
</p>
<p><strong>    function startMusic() {</strong>
</p>
<p><strong>        //清除已存在的定时器</strong>
</p>
<p><strong>        clearInterval(timer);</strong>
</p>
<p><strong>        timer = setInterval(function(){</strong>
</p>
<p><strong>            angle+=3;</strong>
</p>
<p><strong>            $(&#8220;#music img&#8221;).rotate(angle);</strong>
</p>
<p><strong>        },50);</strong>
</p>
<p><strong>    }</strong>
</p>
<p><strong>    //清除旋转</strong>
</p>
<p><strong>    function stopMusic() {</strong>
</p>
<p><strong>        clearInterval(timer);</strong>
</p>
<p><strong>    }</strong>
</p>
<p>
  &lt;/script&gt;
</p>
<p>
  &lt;/html&gt;
</p>
<h2>音乐播放功能</h2>
<h3>1）添加模块</h3>
<p><img loading="lazy" decoding="async" width="1293" height="454" src="/wp-content/uploads/2018/05/word-image-4933.png" class="wp-image-5448" srcset="/wp-content/uploads/2018/05/word-image-4933.png 1293w, /wp-content/uploads/2018/05/word-image-4933-300x105.png 300w, /wp-content/uploads/2018/05/word-image-4933-768x270.png 768w, /wp-content/uploads/2018/05/word-image-4933-1024x360.png 1024w" sizes="(max-width: 1293px) 100vw, 1293px" /><br />
<img loading="lazy" decoding="async" width="1234" height="382" src="/wp-content/uploads/2018/05/word-image-4934.png" class="wp-image-5449" srcset="/wp-content/uploads/2018/05/word-image-4934.png 1234w, /wp-content/uploads/2018/05/word-image-4934-300x93.png 300w, /wp-content/uploads/2018/05/word-image-4934-768x238.png 768w, /wp-content/uploads/2018/05/word-image-4934-1024x317.png 1024w" sizes="(max-width: 1234px) 100vw, 1234px" /><br />
<img loading="lazy" decoding="async" width="1277" height="451" src="/wp-content/uploads/2018/05/word-image-4935.png" class="wp-image-5450" srcset="/wp-content/uploads/2018/05/word-image-4935.png 1277w, /wp-content/uploads/2018/05/word-image-4935-300x106.png 300w, /wp-content/uploads/2018/05/word-image-4935-768x271.png 768w, /wp-content/uploads/2018/05/word-image-4935-1024x362.png 1024w" sizes="(max-width: 1277px) 100vw, 1277px" /><br />
<img loading="lazy" decoding="async" width="1311" height="544" src="/wp-content/uploads/2018/05/word-image-4936.png" class="wp-image-5451" srcset="/wp-content/uploads/2018/05/word-image-4936.png 1311w, /wp-content/uploads/2018/05/word-image-4936-300x124.png 300w, /wp-content/uploads/2018/05/word-image-4936-768x319.png 768w, /wp-content/uploads/2018/05/word-image-4936-1024x425.png 1024w" sizes="(max-width: 1311px) 100vw, 1311px" /></p>
<h3>让本地支持模块调试</h3>
<p><img loading="lazy" decoding="async" width="1087" height="697" src="/wp-content/uploads/2018/05/word-image-4937.png" class="wp-image-5452" srcset="/wp-content/uploads/2018/05/word-image-4937.png 1087w, /wp-content/uploads/2018/05/word-image-4937-300x192.png 300w, /wp-content/uploads/2018/05/word-image-4937-768x492.png 768w, /wp-content/uploads/2018/05/word-image-4937-1024x657.png 1024w" sizes="(max-width: 1087px) 100vw, 1087px" /><br />
<img loading="lazy" decoding="async" width="1048" height="400" src="/wp-content/uploads/2018/05/word-image-4938.png" class="wp-image-5453" srcset="/wp-content/uploads/2018/05/word-image-4938.png 1048w, /wp-content/uploads/2018/05/word-image-4938-300x115.png 300w, /wp-content/uploads/2018/05/word-image-4938-768x293.png 768w, /wp-content/uploads/2018/05/word-image-4938-1024x391.png 1024w" sizes="(max-width: 1048px) 100vw, 1048px" /></p>
<h2>3、查看netAudio手册，让音乐响起来（播放/停止按钮）</h2>
<h3>1）播放</h3>
<ul>
<li>
    接口
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="874" height="514" src="/wp-content/uploads/2018/05/word-image-4939.png" class="wp-image-5454" srcset="/wp-content/uploads/2018/05/word-image-4939.png 874w, /wp-content/uploads/2018/05/word-image-4939-300x176.png 300w, /wp-content/uploads/2018/05/word-image-4939-768x452.png 768w" sizes="(max-width: 874px) 100vw, 874px" /><br />
<img loading="lazy" decoding="async" width="731" height="545" src="/wp-content/uploads/2018/05/word-image-4940.png" class="wp-image-5455" srcset="/wp-content/uploads/2018/05/word-image-4940.png 731w, /wp-content/uploads/2018/05/word-image-4940-300x224.png 300w" sizes="(max-width: 731px) 100vw, 731px" /><br />
<img loading="lazy" decoding="async" width="1115" height="473" src="/wp-content/uploads/2018/05/word-image-4941.png" class="wp-image-5456" srcset="/wp-content/uploads/2018/05/word-image-4941.png 1115w, /wp-content/uploads/2018/05/word-image-4941-300x127.png 300w, /wp-content/uploads/2018/05/word-image-4941-768x326.png 768w, /wp-content/uploads/2018/05/word-image-4941-1024x434.png 1024w" sizes="(max-width: 1115px) 100vw, 1115px" /><br />
<img loading="lazy" decoding="async" width="803" height="328" src="/wp-content/uploads/2018/05/word-image-4942.png" class="wp-image-5457" srcset="/wp-content/uploads/2018/05/word-image-4942.png 803w, /wp-content/uploads/2018/05/word-image-4942-300x123.png 300w, /wp-content/uploads/2018/05/word-image-4942-768x314.png 768w" sizes="(max-width: 803px) 100vw, 803px" /></p>
<h3>2）停止</h3>
<ul>
<li>
    接口
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="962" height="374" src="/wp-content/uploads/2018/05/word-image-4943.png" class="wp-image-5458" srcset="/wp-content/uploads/2018/05/word-image-4943.png 962w, /wp-content/uploads/2018/05/word-image-4943-300x117.png 300w, /wp-content/uploads/2018/05/word-image-4943-768x299.png 768w" sizes="(max-width: 962px) 100vw, 962px" /><br />
<img loading="lazy" decoding="async" width="362" height="246" src="/wp-content/uploads/2018/05/word-image-4944.png" class="wp-image-5459" srcset="/wp-content/uploads/2018/05/word-image-4944.png 362w, /wp-content/uploads/2018/05/word-image-4944-300x204.png 300w, /wp-content/uploads/2018/05/word-image-4944-220x150.png 220w" sizes="(max-width: 362px) 100vw, 362px" /></p>
<h3>完整代码</h3>
<p>
  action.html
</p>
<p><img loading="lazy" decoding="async" width="1202" height="595" src="/wp-content/uploads/2018/05/word-image-4945.png" class="wp-image-5460" srcset="/wp-content/uploads/2018/05/word-image-4945.png 1202w, /wp-content/uploads/2018/05/word-image-4945-300x149.png 300w, /wp-content/uploads/2018/05/word-image-4945-768x380.png 768w, /wp-content/uploads/2018/05/word-image-4945-1024x507.png 1024w" sizes="(max-width: 1202px) 100vw, 1202px" /><br />
<img loading="lazy" decoding="async" width="646" height="520" src="/wp-content/uploads/2018/05/word-image-4946.png" class="wp-image-5461" srcset="/wp-content/uploads/2018/05/word-image-4946.png 646w, /wp-content/uploads/2018/05/word-image-4946-300x241.png 300w" sizes="(max-width: 646px) 100vw, 646px" /></p>
<p>
  music.html
</p>
<p>
  &lt;!doctype html&gt;
</p>
<p>
  &lt;html&gt;
</p>
<p>
  &lt;head&gt;
</p>
<p>
      &lt;meta charset=&#8221;utf-8&#8243;&gt;
</p>
<p>
      &lt;meta name=&#8221;viewport&#8221; content=&#8221;maximum-scale=1.0,minimum-scale=1.0,user-scalable=0,initial-scale=1.0,width=device-width&#8221;/&gt;
</p>
<p>
      &lt;meta name=&#8221;format-detection&#8221; content=&#8221;telephone=no,email=no,date=no,address=no&#8221;&gt;
</p>
<p>
      &lt;title&gt;甜椒广场舞&lt;/title&gt;
</p>
<p>
      &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;../css/api.css&#8221; /&gt;
</p>
<p>
      &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;../css/aui.css&#8221; /&gt;
</p>
<p>
      &lt;style type=&#8221;text/css&#8221;&gt;
</p>
<p>
      .aui-bar-dark {background-color:#E65A65;}
</p>
<p>
      #music {padding:50px 0; text-align:center;}
</p>
<p>
      #music img {margin: auto; border-radius:100px; width:200px; height:200px;}
</p>
<p>
      #title {text-align:center; margin: 10px 0px;}
</p>
<p>
      .aui-range { width: 100%;}
</p>
<p>
      /*.aui-range input[type=&#8217;range&#8217;] { background-color: #E65A65; }*/
</p>
<p>
      .aui-range input[type=&#8217;range&#8217;]::-webkit-slider-thumb { background-color: #E65A65; }
</p>
<p>
      &lt;/style&gt;
</p>
<p>
  &lt;/head&gt;
</p>
<p>
  &lt;body&gt;
</p>
<p>
      &lt;header id=&#8221;aui-header&#8221; class=&#8221;aui-bar aui-bar-nav aui-bar-dark&#8221;&gt;
</p>
<p>
          &lt;a class=&#8221;aui-pull-left aui-btn&#8221; onclick=&#8221;closeWin()&#8221;&gt;
</p>
<p>
              &lt;span class=&#8221;aui-iconfont aui-icon-left&#8221;&gt;&lt;/span&gt;
</p>
<p>
          &lt;/a&gt;
</p>
<p>
          &lt;div class=&#8221;aui-title&#8221;&gt;甜椒广场舞&lt;/div&gt;
</p>
<p>
      &lt;/header&gt;
</p>
<p>
      &lt;div id=&#8217;music&#8217;&gt;
</p>
<p>
          &lt;img src=&#8217;../image/music.png&#8217; /&gt;
</p>
<p>
      &lt;/div&gt;
</p>
<p>
      &lt;h5 id=&#8217;title&#8217;&gt;买买买 &#8211; By2&lt;/h5&gt;
</p>
<p>
      &lt;br /&gt;
</p>
<p>
      &lt;div class=&#8221;aui-list-item-input&#8221;&gt;
</p>
<p>
          &lt;div class=&#8221;aui-range&#8221;&gt;
</p>
<p>
              &lt;input type=&#8221;range&#8221; class=&#8221;aui-range&#8221; value=&#8221;0&#8243; max=&#8221;100&#8243; min=&#8221;1&#8243; step=&#8221;1&#8243; id=&#8221;range&#8221;&gt;
</p>
<p>
              &lt;div class=&#8221;aui-range-tip aui-hide&#8221;&gt;0&lt;/div&gt;
</p>
<p>
          &lt;/div&gt;
</p>
<p>
      &lt;/div&gt;
</p>
<p>
      &lt;br /&gt;
</p>
<p>
      &lt;p&gt;&lt;div class=&#8221;aui-btn aui-btn-danger aui-btn-block&#8221; <strong>onclick=&#8221;startMusic()&#8221;</strong>&gt;播放音乐(start)&lt;/div&gt;&lt;/p&gt;
</p>
<p>
      &lt;br /&gt;
</p>
<p>
      &lt;p&gt;&lt;div class=&#8221;aui-btn aui-btn-danger aui-btn-block&#8221; <strong>onclick=&#8221;stopMusic();&#8221;</strong>&gt;停止播放(pause)&lt;/div&gt;&lt;/p&gt;
</p>
<p>
  &lt;/body&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;../script/api.js&#8221; &gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;../script/aui-range.js&#8221; &gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;../script/jquery.min.js&#8221; &gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;../script/jquery.rotate.min.js&#8221; &gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221;&gt;
</p>
<p>
      apiready = function(){
</p>
<p>
          api.parseTapmode();
</p>
<p>
          //默认打开旋转+播放
</p>
<p>
          startMusic();
</p>
<p>
      }
</p>
<p>
      //进度条拖拽
</p>
<p>
      var range = new auiRange({
</p>
<p>
          element:document.getElementById(&#8220;range&#8221;)
</p>
<p>
      },function(ret){
</p>
<p>
      })
</p>
<p>
      //关闭当前窗口，返回动态列表页
</p>
<p>
      function closeWin() {
</p>
<p>
          api.closeFrame({
</p>
<p>
              name: &#8216;frame_music&#8217;
</p>
<p>
          });
</p>
<p>
      }
</p>
<p>
      /*光盘旋转*/
</p>
<p>
      var angle = 0;
</p>
<p>
      var timer;
</p>
<p>
      function startMusic() {
</p>
<p>
          //清除已存在的定时器
</p>
<p>
          clearInterval(timer);
</p>
<p>
          timer = setInterval(function(){
</p>
<p>
              angle+=3;
</p>
<p>
              $(&#8220;#music img&#8221;).rotate(angle);
</p>
<p>
          },50);
</p>
<p>
          <strong>//播放</strong>
</p>
<p><strong>        var netAudio = api.require(&#8216;netAudio&#8217;);</strong>
</p>
<p><strong>        netAudio.play({</strong>
</p>
<p><strong>            // path: &#8216;http://7xisq1.com1.z0.glb.clouddn.com/apicloud/0d0b81b8bd5ab81bda9ca54267eb9b98.mp3&#8217;</strong>
</p>
<p><strong>            path: api.pageParam.musicUrl</strong>
</p>
<p><strong>        }, function(ret, err) {</strong>
</p>
<p><strong>            if (ret) {</strong>
</p>
<p><strong>                //alert(JSON.stringify(ret));</strong>
</p>
<p><strong>                //当前已经播放 ret.current  </strong>
</p>
<p><strong>                //总时间       ret.duraion   单位：秒</strong>
</p>
<p><strong>                // alert(ret.current / ret.duration * 100);</strong>
</p>
<p><strong>                $(&#8216;.aui-range input&#8217;).val(ret.current / ret.duration * 100);</strong>
</p>
<p><strong>            } else {</strong>
</p>
<p><strong>                alert(JSON.stringify(err));</strong>
</p>
<p><strong>            }</strong>
</p>
<p><strong>        });</strong>
</p>
<p>
      }
</p>
<p>
      //清除旋转
</p>
<p>
      function stopMusic() {
</p>
<p>
          //暂停旋转
</p>
<p>
          clearInterval(timer);
</p>
<p><strong>        //暂停播放</strong>
</p>
<p><strong>        var netAudio = api.require(&#8216;netAudio&#8217;);</strong>
</p>
<p><strong>        netAudio.pause();</strong>
</p>
<p>
      }
</p>
<p>
  &lt;/script&gt;
</p>
<p>
  &lt;/html&gt;
</p>
<h2>4、拖动播放进度（拖动滑块到某一个位置时，让歌曲也在相应的位置播放）</h2>
<p><img loading="lazy" decoding="async" width="749" height="355" src="/wp-content/uploads/2018/05/word-image-4947.png" class="wp-image-5462" srcset="/wp-content/uploads/2018/05/word-image-4947.png 749w, /wp-content/uploads/2018/05/word-image-4947-300x142.png 300w" sizes="(max-width: 749px) 100vw, 749px" /><br />
<img loading="lazy" decoding="async" width="456" height="512" src="/wp-content/uploads/2018/05/word-image-4948.png" class="wp-image-5463" srcset="/wp-content/uploads/2018/05/word-image-4948.png 456w, /wp-content/uploads/2018/05/word-image-4948-267x300.png 267w" sizes="(max-width: 456px) 100vw, 456px" /><br />
<img loading="lazy" decoding="async" width="888" height="430" src="/wp-content/uploads/2018/05/word-image-4949.png" class="wp-image-5464" srcset="/wp-content/uploads/2018/05/word-image-4949.png 888w, /wp-content/uploads/2018/05/word-image-4949-300x145.png 300w, /wp-content/uploads/2018/05/word-image-4949-768x372.png 768w" sizes="(max-width: 888px) 100vw, 888px" /></p>
<p>
  //检测是否拖动，说明：只要是表单标签设置值，统一用jq的val方法
</p>
<p>
  //点击用onclick
</p>
<p>
  //点击之后让用户选择用：onchange
</p>
<p>
  $(&#8216;.aui-range input&#8217;).change(function(){
</p>
<p>
      //获取拖拽的进度
</p>
<p>
      var bofangjindu = $(&#8216;.aui-range-tip&#8217;).html();
</p>
<p>
      //设置播放进去
</p>
<p>
      var netAudio = api.require(&#8216;netAudio&#8217;);
</p>
<p>
      netAudio.setProgress({
</p>
<p>
          progress: bofangjindu
</p>
<p>
      });
</p>
<p>
  });
</p>
<h1><a id="post-5431-_Toc467340744"></a>五、Vuejs框架</h1>
<h2>1、什么是vue</h2>
<p>
  vue是用js写的一个web框架，它提供数据和视图的绑定。修改数据，视图自动更新。
</p>
<h2>2、vue.js的下载</h2>
<p>
  下载地址：<a href="https://v1.vuejs.org/guide/installation.html">https://v1.vuejs.org/guide/installation.html</a>
</p>
<h2>vue.js初体验</h2>
<h3>1）渲染数据</h3>
<p>
  &lt;!DOCTYPE html&gt;
</p>
<p>
  &lt;html&gt;
</p>
<p>
  &lt;head&gt;
</p>
<p>
  	&lt;title&gt;测试&lt;/title&gt;
</p>
<p>
  &lt;/head&gt;
</p>
<p>
  &lt;body&gt;
</p>
<p>
  	&lt;div id=&#8221;app&#8221;&gt;
</p>
<p>
  		{{ message }}
</p>
<p>
  		{{ data1 }}
</p>
<p>
  		{{ abc }}
</p>
<p>
  	&lt;/div&gt;
</p>
<p>
  	&lt;script type=&#8221;text/javascript&#8221; src=&#8221;./vue.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  	&lt;script type=&#8221;text/javascript&#8221;&gt;
</p>
<p>
  		new Vue({
</p>
<p>
  			el: &#8216;#app&#8217;, //那个元素对象
</p>
<p>
  			data: {
</p>
<p>
  				message: &#8216;今天喜洋洋&#8217;,
</p>
<p>
  				data1: &#8216;今天喜洋洋2&#8217;,
</p>
<p>
  				abc: &#8216;打发斯蒂芬&#8217;,
</p>
<p>
  			}
</p>
<p>
  		});
</p>
<p>
  	&lt;/script&gt;
</p>
<p>
  &lt;/body&gt;
</p>
<p>
  &lt;/html&gt;
</p>
<h3>2）双向绑定</h3>
<p>
  &lt;!DOCTYPE html&gt;
</p>
<p>
  &lt;html&gt;
</p>
<p>
  &lt;head&gt;
</p>
<p>
  	&lt;title&gt;测试&lt;/title&gt;
</p>
<p>
  &lt;/head&gt;
</p>
<p>
  &lt;body&gt;
</p>
<p>
  	&lt;div id=&#8221;app&#8221;&gt;
</p>
<p>
  		{{ message }}
</p>
<p>
  		{{ data1 }}
</p>
<p>
  		{{ abc }}
</p>
<p>
  		&lt;input type=&#8221;text&#8221; name=&#8221;&#8221; v-model=&#8221;message&#8221;&gt;
</p>
<p>
  		&lt;input type=&#8221;text&#8221; name=&#8221;&#8221; v-model=&#8221;data1&#8243;&gt;
</p>
<p>
  	&lt;/div&gt;
</p>
<p>
  	&lt;script type=&#8221;text/javascript&#8221; src=&#8221;./vue.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  	&lt;script type=&#8221;text/javascript&#8221;&gt;
</p>
<p>
  		new Vue({
</p>
<p>
  			el: &#8216;#app&#8217;, //那个元素对象
</p>
<p>
  			data: {
</p>
<p>
  				message: &#8216;今天喜洋洋&#8217;,
</p>
<p>
  				data1: &#8216;今天喜洋洋2&#8217;,
</p>
<p>
  				abc: &#8216;打发斯蒂芬&#8217;,
</p>
<p>
  			}
</p>
<p>
  		});
</p>
<p>
  	&lt;/script&gt;
</p>
<p>
  &lt;/body&gt;
</p>
<p>
  &lt;/html&gt;
</p>
<h3>3）渲染列表</h3>
<p>
  &lt;!DOCTYPE html&gt;
</p>
<p>
  &lt;html&gt;
</p>
<p>
  &lt;head&gt;
</p>
<p>
  	&lt;title&gt;测试&lt;/title&gt;
</p>
<p>
  &lt;/head&gt;
</p>
<p>
  &lt;body&gt;
</p>
<p>
  	&lt;div id=&#8221;app&#8221;&gt;
</p>
<p>
  		&lt;ul&gt;
</p>
<p>
  			&lt;li v-for=&#8221;music in musicList&#8221;&gt;{{ music.name }}&lt;/li&gt;
</p>
<p>
  		&lt;/ul&gt;
</p>
<p>
  	&lt;/div&gt;
</p>
<p>
  	&lt;script type=&#8221;text/javascript&#8221; src=&#8221;./vue.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  	&lt;script type=&#8221;text/javascript&#8221;&gt;
</p>
<p>
  		new Vue({
</p>
<p>
  			el: &#8216;#app&#8217;,
</p>
<p>
  			data: {
</p>
<p>
  				musicList: [
</p>
<p>
  					{&#8216;name&#8217;:&#8217;哈1&#8242;, &#8216;author&#8217;: &#8216;成大1&#8217;},
</p>
<p>
  					{&#8216;name&#8217;:&#8217;哈11&#8242;, &#8216;author&#8217;: &#8216;成大2&#8217;},
</p>
<p>
  					{&#8216;name&#8217;:&#8217;哈111&#8242;, &#8216;author&#8217;: &#8216;成大3&#8217;},
</p>
<p>
  					{&#8216;name&#8217;:&#8217;哈1111&#8242;, &#8216;author&#8217;: &#8216;成大4&#8217;}
</p>
<p>
  				]
</p>
<p>
  			}
</p>
<p>
  		});
</p>
<p>
  	&lt;/script&gt;
</p>
<p>
  &lt;/body&gt;
</p>
<p>
  &lt;/html&gt;
</p>
<h2>4、使用Vuejs遍历音乐替换JQ</h2>
<p>
  步骤1：action.html引入vue
</p>
<p><img loading="lazy" decoding="async" width="448" height="526" src="/wp-content/uploads/2018/05/word-image-4950.png" class="wp-image-5465" srcset="/wp-content/uploads/2018/05/word-image-4950.png 448w, /wp-content/uploads/2018/05/word-image-4950-256x300.png 256w" sizes="(max-width: 448px) 100vw, 448px" /><br />
<img loading="lazy" decoding="async" width="938" height="478" src="/wp-content/uploads/2018/05/word-image-4951.png" class="wp-image-5466" srcset="/wp-content/uploads/2018/05/word-image-4951.png 938w, /wp-content/uploads/2018/05/word-image-4951-300x153.png 300w, /wp-content/uploads/2018/05/word-image-4951-768x391.png 768w" sizes="(max-width: 938px) 100vw, 938px" /></p>
<p>
  步骤2：在页面new Vue显示数据
</p>
<h1>︴扩展：视频播放</h1>
<p>
   步骤1：安装模块，然后自定义loader
</p>
<p><img loading="lazy" decoding="async" width="1259" height="406" src="/wp-content/uploads/2018/05/word-image-4952.png" class="wp-image-5467" srcset="/wp-content/uploads/2018/05/word-image-4952.png 1259w, /wp-content/uploads/2018/05/word-image-4952-300x97.png 300w, /wp-content/uploads/2018/05/word-image-4952-768x248.png 768w, /wp-content/uploads/2018/05/word-image-4952-1024x330.png 1024w" sizes="(max-width: 1259px) 100vw, 1259px" /></p>
<p>
  步骤2：查看手册，调用播放器
</p>
<p>
  var moviePlayer = api.require(&#8216;moviePlayer&#8217;);
</p>
<p>
  moviePlayer.open({
</p>
<p>
            rect:{
</p>
<p>
            x: 0,
</p>
<p>
            y: 0,
</p>
<p>
            w:api.frameWidth,
</p>
<p>
            h:300
</p>
<p>
            },
</p>
<p>
            styles:{
</p>
<p>
            head:{
</p>
<p>
            bg: &#8216;rgba(161,161,161,0.5)&#8217;,
</p>
<p>
            height: 44,
</p>
<p>
            y:20,
</p>
<p>
            title:{
</p>
<p>
            size:20,
</p>
<p>
            color:&#8217;#fff&#8217;,
</p>
<p>
            width:40,
</p>
<p>
            leftMargin:10
</p>
<p>
            },
</p>
<p>
            backSize: 30,
</p>
<p>
            backImg:&#8217;widget://image/back.png&#8217;,
</p>
<p>
            customButtons:[{
</p>
<p>
            w:30,
</p>
<p>
            h:30,
</p>
<p>
            rightMagin:10,
</p>
<p>
            img:&#8217;widget://image/image/collect.png&#8217;,
</p>
<p>
            imgSelected:&#8217;fs://image/collectSelected.png&#8217;,
</p>
<p>
            }]},
</p>
<p>
            foot:{
</p>
<p>
            bg: &#8216;rgba(0,0,0,0.5)&#8217;,
</p>
<p>
            height: 44,
</p>
<p>
            palyBtn:{
</p>
<p>
            size: 20,
</p>
<p>
            playImg:&#8217;widget://image/play.png&#8217;,
</p>
<p>
            pauseImg:&#8217;widget://image/pause.png&#8217;,
</p>
<p>
            marginLeft:5
</p>
<p>
            },
</p>
<p>
            currentTimeLabel:{
</p>
<p>
            textSize:14,
</p>
<p>
            textColor:&#8221;#FFF&#8221;,
</p>
<p>
            textWidth: 43,
</p>
<p>
            marginLeft:5
</p>
<p>
            },
</p>
<p>
            seekBar:{
</p>
<p>
            sliderImg:&#8217;widget://image/circle.png&#8217;,
</p>
<p>
            sliderW : 20,
</p>
<p>
            sliderH : 20,
</p>
<p>
            progressColor: &#8216;#696969&#8217;,
</p>
<p>
            progressSelected: &#8216;#76EE00&#8217;,
</p>
<p>
            marginLeft:10,
</p>
<p>
            marginRight:10
</p>
<p>
            },
</p>
<p>
            totalTimeLabel:{
</p>
<p>
            textSize:14,
</p>
<p>
            textColor:&#8221;#FFF&#8221;,
</p>
<p>
            textWidth: 43,
</p>
<p>
            marginRight:5
</p>
<p>
            },
</p>
<p>
            fullscreenBtn:{
</p>
<p>
            size:20,
</p>
<p>
            verticalImg:&#8217;widget://image/vertical.png&#8217;,
</p>
<p>
            horizontalImg:&#8217;widget://image/horizontal.png&#8217;,
</p>
<p>
            }
</p>
<p>
            } },
</p>
<p>
             path:&#8217;http://baobab.wdjcdn.com/1455782903700jy.mp4&#8242;,
</p>
<p>
             autoPlay: true
</p>
<p>
              },function(ret, err){
</p>
<p>
                  if(ret){
</p>
<p>
                      // alert(JSON.stringify(ret));
</p>
<p>
                  // } else {
</p>
<p>
                      // alert(JSON.stringify(err));
</p>
<p>
                  }
</p>
<p>
  });</p>
]]></content:encoded>
					
					<wfw:commentRss>/%e7%a7%bb%e5%8a%a8%e7%ab%af%e5%bc%80%e5%8f%91/5431.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		<enclosure url="http://7xisq1.com1.z0.glb.clouddn.com/apicloud/0d0b81b8bd5ab81bda9ca54267eb9b98.mp3" length="2031926" type="audio/mpeg" />

			</item>
	</channel>
</rss>
