微信开发

微信开发

前提:

​ 一台云服务器

分类:

服务号 | 订阅号 | 企业号 | 小程序(Vuejs封装)

​ 订阅号 –账号主体:个人(仅仅文章,发说说)(推送一天一条消息)

​ –账号主体:公司

​ 服务号 –单独一个聊天框 , 不在订阅号标签内(推送一个月四条)

​ 企业号 –内部管理沟通的平台

两个接口

​ 微信支付接口 , 微信登录接口

后台: mp.weixin.qq.com

开发:

百度搜索

微信开放平台 微信登陆相关接口

微信公众平台 微信开发

​ 认证 - 300/年

​ 微信测试号(不认证测试开发)(一年有效期)

功能:

​ 1.自定义菜单

​ 2.自动回复

 3.展示页面

高级接口:

​ 语音识别: 微信对外开放了语音识别的接口

​ 客服接口: 可在12小时内持续对发消息用户沟通

​ 网页授权: 可使用qq,微信登录

​ 生成参数二维码: 分析用于来源或用户绑定

​ 获取用户基本信息: openid 获取用户头像,名称,性别等

​ 获取关注者列表: 获取所有关注者

​ 用户分组接口: 为关注者分组

​ 上传下载文件: 可将内容在自己的服务器中上传下载

环境搭建

​ 打通自己的云服务器和微信接口平台的通道

​ token:可以表明自己身份的令牌(同一个服务器同时支持多个微信平台)

​ 为保障安全,使用的是https协议

第三方网络服务:

​ 百度bae , 新浪sae , 腾讯云 , 各种云服务器 , 租用虚拟主机 , 自己传服务器

​ 应用引擎(一键创建应用环境)

​ 版本控制(SVN/Git)

测试号管理:

​ 测试号信息:id+pass

​ 接口配置: 服务器url + 令牌验证token

PHP编辑开发:

1
2
3
4
5
6
7
8
9
10
数据交换:  
get/post使用的是XML/json格式
xml优势:既可以存数据,又可以存格式;可做数据交换(各种语言均可以解析)
PHP函数:
simplexml_load_string() 函数
作用: 将XML数据转成PHP对象
simplexml_load_string('xml字符串','对象名','参数')
simlpexml_load_string($str,'SimpleXMLElement',LIBXML_NOCDATA)
--第三个参数为了解析传过来的xml对象数据,全部是包裹在<!CDATA[]>中

1
2
3
4
5
6
7
8
信息格式(msgtype):
文本--text
语音--voice
视频--video
图片--image
位置--location
链接--link

1
2
3
4
5
6
7
8
1.上传接口代码到自己的服务器
代码:
定义了tokenchangliang
将三个参数字典排序拼接为一个字符串,sha1加密,之后与第四个参数对比
返回结果给请求方
2.完成接口配置
3.消息管理

客服消息

php curl (在PHP中模拟浏览器发起http请求–get/post)

手册–聚合代码 代码:curl_setopt方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
function https_request(url,data=null)
{
//初始化
//判断get/post
//执行
}
用处:模拟登陆|爬取数据
//获取access_token(全局唯一接口调用凭据)
$turl = '';()接口文档模板
$tres = https_request($turl);

//提取返回的json数据
$data = json_decode($tres,true);
$access_token = $data['access_token'];

客服发消息接口
$url = '';
$data={
'touser':'OPENID',
'msgtype':'text',
'text':{
'content':'内容'
}
}
$res=https_request($url,$data);

API数据:聚合科技(www.juhe.cn)

模板消息

1
2
3
4
5
6
7
1.设置模板
{{first.DATA}}
商品名:{{keword1.DATA}}
价格:{{keword2.DATA}}
订单日期:{{keword3.DATA}}
{{remark.DATA}}
2.修改模板程序,填写参数

自定义菜单

3个以及菜单 , 每个一级菜单最多包含5个二级菜单 , 4 - 7 个汉字

点击事件: click

跳转url: view

扫码: scancode_push scancode_waitmsg

发送图片: pic_sysphoto

拍照/本地发送: pic_phpoto_or_album

pic_weixin

弹出地理位置: location_select

发送消息: media_id

跳转图文消息: view_limited

作业:

聚合->查快递, 天气

token 提取出来

ps:代码资料

1.验证token

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
//define your token
define("TOKEN", "s86"); // 定义常量
$wechatObj = new wechatCallbackapiTest();
$wechatObj->valid();

class wechatCallbackapiTest
{
public function valid()
{
$echoStr = $_GET["echostr"];

//valid signature , option
if($this->checkSignature()){
echo $echoStr;
exit;
}
}

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

//extract post data
if (!empty($postStr)){
/* libxml_disable_entity_loader is to prevent XML eXternal Entity Injection,
the best way is to check the validity of xml by yourself */
libxml_disable_entity_loader(true); // xml 保护模式开启
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
$fromUsername = $postObj->FromUserName;
$toUsername = $postObj->ToUserName;
$keyword = trim($postObj->Content);
$time = time();
$textTpl = "<xml>
<ToUserName><![ CDATA[%s] ]></ToUserName>
<FromUserName><![ CDATA[%s] ]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![ CDATA[%s] ]></MsgType>
<Content><![ CDATA[%s] ]></Content>
<FuncFlag>0</FuncFlag>
</xml>";
if(!empty( $keyword ))
{
$msgType = "text";
$contentStr = "Welcome to wechat world!";
$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
echo $resultStr;
}else{
echo "Input something...";
}

}else {
echo "";
exit;
}
}

private function checkSignature()
{
// you must define TOKEN by yourself
if (!defined("TOKEN")) {
throw new Exception('TOKEN is not defined!');
}

$signature = $_GET["signature"];
$timestamp = $_GET["timestamp"];
$nonce = $_GET["nonce"];

$token = TOKEN;

// 加密/校验流程如下:

// 1)将token、timestamp、nonce三个参数进行字典序排序
// 2)将三个参数字符串拼接成一个字符串进行sha1加密
// 3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
$tmpArr = array($token, $timestamp, $nonce);
// use SORT_STRING rule
sort($tmpArr, SORT_STRING);
$tmpStr = implode( $tmpArr );
$tmpStr = sha1( $tmpStr );

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

2.接受数据/回复数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
// 全局接收 psot数据  一般情况 禁用 因为不安全
// $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];

// 使用 php://input
$postStr = file_get_contents('php://input');

// 把微信请求到的数据 poststr
// 存入文件
file_put_contents('./s.txt', $postStr);

libxml_disable_entity_loader(true); // xml 保护模式开启
// 把xml 转为对象
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
$fromUsername = $postObj->FromUserName; // 用户id
$toUsername = $postObj->ToUserName; // 商户id
$keyword = trim($postObj->Content); // 内容
$time = time();


// 根据用户 不同的点击菜单 进行不同的回复
// 是事件
// 判断是 哪一个key

$evevnt = $postObj->Event;
$eventKey = $postObj->EventKey;

if ( $event == 'CLICK' ) {
switch (variable) {
case 'value':
# code...
break;

default:
# code...
break;
}

echo $tpl;
}

微信开发原理

1566817418172

环境搭建 :

​ - 服务器

​ sae(新浪云应用) - 权限受限

​ bae(百度云应用)

​ -虚拟主机+域名解析(Apache-.vhost/Nginx-whereis nginx)

​ sftp(sublime插件 , 服务器即时代码变化)

日志记录:

​ 1. 查看服务器传入内容 - wwwlog

  1. 创建日志记录 file_put_content(‘log.txt’,$str);

    动态查看日志tail -F log.txt