3章 开始开发
3.1 关注微信号
- 将关注的回复功能移到自己的方法中(后面逻辑也是在此方法中判断)
#index方法如下修改
// 当 $message->MsgType 为 event 时为事件
if ($message->MsgType == 'event' && $message->Event== 'subscribe') {
return $this->guanzhu($message);//调用guanzhu方法,让index不至于累积成堆
}
#guanzhu方法
public function guanzhu($message)
{
$text = new Text();
$text->content = '您好!欢迎关注我!';
return $text;
}
- 将用户信息存入数据库(新建个weixin数据库)
配置.env文件
建立数据库表users的迁移文件(迁移文件有默认的,修改一下)
Schema::create('users', function (Blueprint $table) {
$table->increments('uid');
$table->string('openid',32);
$table->string('name');
$table->boolean('state')->default(1);
$table->integer('subtime');
});
执行迁移文件 php artisan magrate;
删除原有的user的model,重新生成model
//控制台
php artisan make:model User
//user.php
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
protected $primaryKey = 'uid';//指定自增id
public $timestamps = false;//指定不添加默认两种时间
}
写入数据库
use App\User;
.
.
.
/**
*
*用于关注事件
*@param obj $message 关注时提交的信息
*@return string $text 给用户返回的消息
*
*/
public function guanzhu($message)
{
/**
*获取用户信息
*将需要信息放到数据库
*返回回复消息
*/
$user = new User();//实例化model
$openid = $message->FromUserName;//获取关注用户的openid
$fans = $user -> where('openid',$openid) -> first();
//判断之前是否关注
if($fans){
$fans->subtime = time();//关注users表的时间
$fans->state = 1;
$userService = $this->app->user;//得到用户实例
$Tuser = $userService->get($openid);//获取用户信息
$fans->name = $Tuser->nickname;
$fans->save();
}else{
$user->openid = $openid;//对应users表的openid
$user->subtime = time();//关注users表的时间
$userService = $this->app->user;//得到用户实例
$Tuser = $userService->get($openid);//获取用户信息
$user->name = $Tuser->nickname;
$user->save();
}
$text = new Text();
$text->content = '您好!欢迎关注我!';
return $text;
}
注意,这块会报错误,是因为,目前php版本在https请求时,默认需要开启证书,错误日志如下:
查看wechat常见错误:https://easywechat.org/zh-cn/docs/troubleshooting.html 第一条就是解决方法
注意:curl.cainfo好像在5.6以上版本才有
重启apache
测试成功!数据库中添加了一条数据
4 取消关注
#index方法中
···
$server->setMessageHandler(function($message){
elseif($message->MsgType == 'event' && $message->Event== 'unsubscribe'){
$this->unguanzhu($message);//调用取消关注方法
}
}
···
#unguanzhu方法
/**
*
*用于取消关注
*@param $message 取消关注事件传递的信息
*
*/
public function unguanzhu($message)
{
$openid = $message -> FromUserName;
$user = new User();
$fans = $user->where('openid',$openid)->first();
if($fans){
$fans -> state = 0;//修改状态为0
$fans -> save();
}
}
5 为关注用户生成场景二维码
执行artisan命令给users表添加一个字段
//命令 php artisan make:migration add_code_to_users --table=users
修改迁移文件
//up
$table->string('code',100);
//down
$table->dropColumn('code');
#guanzhu方法中在else的save下面添加如下两条demo
//利用uid生成永久性场景二维码,作为用户唯一标示
$user->code = $this->erCode($user->uid);
$user->save();
在控制器中创建如下两个方法
/**
*
*利用uid生成永久性场景二维码,作为用户唯一标示
*@param obj $uid 用户的uid
*@return string $path 二维码路径
*/
public function erCode($uid)
{
$qrcode = $this->app->qrcode;
$result = $qrcode->forever($uid);// 或者 $qrcode->forever("foo");
$ticket = $result->ticket; // 或者 $result['ticket']
$url = $qrcode->url($ticket);//通过url输出内容
$content = file_get_contents($url); // 得到二进制图片内容
$path= $this->mkd() . '/qr_'.$uid.'.jpg';//二维码的路径
file_put_contents(public_path().$path, $content); // 写入文件
return $path;
}
/**
*
*根据年月日创建目录
*@return string $today /Y/m格式
*
*/
protected function mkd() {
$today = date('/Y/m');
if( !is_dir( public_path() . $today ) ) {
mkdir( public_path() . $today , 0777 , true);
}
return $today;
}
删除数据表的所有数据 truncate users;
微信取消关注,再关注,看一下数据表code字段有没有路径,在public下会有对应路径生成的二维码