EasyWeChat、微信公众平台实现带参数二维码、微信事件处理以及微信详细用户信息获取

微信小程序请求网络API 400错误的解决方法 在v0.14.140900版本的wechat小程序开发工具中做网络请求,直接使用微信的网络请求代码debug过程中发生了400 (Bad request)错误。wx.request({ url: 'test.php', //仅为示例,并非真实的接口地址 data: { x: '' , y: '' }, header: { 'content-type': 阅读详情

一、生成带参数的二维码

为了满足用户渠道推广分析和用户帐号绑定等场景的需要,公众平台提供了生成带参数二维码的接口。使用该接口可以获得多个带不同场景值的二维码,用户扫描后,公众号可以接收到事件推送。

目前有2种类型的二维码:

1、临时二维码,是有过期时间的,最长可以设置为在二维码生成后的30天(即2592000秒)后过期,但能够生成较多数量。临时二维码主要用于帐号绑定等不要求二维码永久保存的业务场景
2、永久二维码,是无过期时间的,但数量较少(目前为最多10万个)。永久二维码主要用于适用于帐号绑定、用户来源统计等场景。

用户扫描带场景值二维码时,可能推送以下两种事件:

如果用户还未关注公众号,则用户可以关注公众号,关注后微信会将带场景值关注事件推送给开发者。

如果用户已经关注公众号,在用户扫描后会自动进入会话,微信也会将带场景值扫描事件推送给开发者。

获取带参数的二维码的过程包括两步,首先创建二维码ticket,然后凭借ticket到指定URL换取二维码。

创建二维码ticket

每次创建二维码ticket需要提供一个开发者自行设定的参数(scene_id),分别介绍临时二维码和永久二维码的创建二维码ticket过程。

临时二维码请求说明

http请求方式: POST
URL: https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=TOKENPOST数据格式:json
POST数据例子:{"expire_seconds": 604800, "action_name": "QR_SCENE", "action_info": {"scene": {"scene_id": 123}}}


或者也可以使用以下POST数据创建字符串形式的二维码参数:
{"expire_seconds": 604800, "action_name": "QR_STR_SCENE", "action_info": {"scene": {"scene_str": "test"}}}

永久二维码请求说明

http请求方式: POST
URL: https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=TOKENPOST数据格式:json
POST数据例子:{"action_name": "QR_LIMIT_SCENE", "action_info": {"scene": {"scene_id": 123}}}

或者也可以使用以下POST数据创建字符串形式的二维码参数:
{"action_name": "QR_LIMIT_STR_SCENE", "action_info": {"scene": {"scene_str": "test"}}}

参数说明

参数 说明
expire_seconds 该二维码有效时间,以秒为单位。 最大不超过2592000(即30天),此字段如果不填,则默认有效期为30秒。
action_name 二维码类型,QR_SCENE为临时的整型参数值,QR_STR_SCENE为临时的字符串参数值,QR_LIMIT_SCENE为永久的整型参数值,QR_LIMIT_STR_SCENE为永久的字符串参数值
action_info 二维码详细信息
scene_id 场景值ID,临时二维码时为32位非0整型,永久二维码时最大值为100000(目前参数只支持1--100000)
scene_str 场景值ID(字符串形式的ID),字符串类型,长度限制为1到64  


返回说明

正确的Json返回结果:

{"ticket":"gQH47joAAAAAAAAAASxodHRwOi8vd2VpeGluLnFxLmNvbS9xL2taZ2Z3TVRtNzJXV1Brb3ZhYmJJAAIEZ23sUwMEmm

3sUw==","expire_seconds":60,"url":"http:\/\/weixin.qq.com\/q\/kZgfwMTm72WWPkovabbI"}


参数 说明
ticket 获取的二维码ticket,凭借此ticket可以在有效时间内换取二维码。
expire_seconds 该二维码有效时间,以秒为单位。 最大不超过2592000(即30天)。
url 二维码图片解析后的地址,开发者可根据该地址自行生成需要的二维码图片

通过ticket换取二维码

获取二维码ticket后,开发者可用ticket换取二维码图片。请注意,本接口无须登录态即可调用。

请求说明

HTTP GET请求(请使用https协议)https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=TICKET提醒:TICKET记得进行UrlEncode

返回说明

ticket正确情况下,http 返回码是200,是一张图片,可以直接展示或者下载。

HTTP头(示例)如下:
Accept-Ranges:bytes
Cache-control:max-age=604800
Connection:keep-alive
Content-Length:28026
Content-Type:image/jpg
Date:Wed, 16 Oct 2013 06:37:10 GMT
Expires:Wed, 23 Oct 2013 14:37:10 +0800
Server:nginx/1.4.1

错误情况下(如ticket非法)返回HTTP错误码404

二、获取微信用户详细信息

用户信息的获取是微信开发中比较常用的一个功能了,以下所有的用户信息的获取与更新,都是基于微信的 openid的,并且是已关注当前账号的,其它情况可能无法正常使用。

获取实例

     
<?php
use EasyWeChat\ Foundation\ Application;
// ...
$app = new Application($options);
$userService = $app->user;

API 列表

获取用户信息

     
$userService->get($openId);
$userService->batchGet($openIds);

获取单个:

     
$user = $userService->get($openId);
echo $user->nickname; // or $user['nickname']

获取多个:

     
$users = $userService->batchGet([$openId1, $openId2, ...]);

获取用户列表

     
$userService->lists($nextOpenId = null); // $nextOpenId 可选

example:

     
$users = $userService->lists();
// result
{
"total": 2,
"count": 2,
"data": {
"openid": [
"",
"OPENID1",
"OPENID2"
]
},
"next_openid": "NEXT_OPENID"
}
$users->total; // 2

修改用户备注

     
$userService->remark($openId, $remark); // 成功返回boolean

example:

     
$userService->remark($openId, "僵尸粉");

获取用户所属用户组ID

     
$userService->group($openId);

example:

     
$userGroupId = $userService->group($openId);

获取公众号的黑名单列表

     
$userService->blacklist($beginOpenId = null);

example:

     
$blacklist = $userService->blacklist();

拉黑用户

     
$userService->batchBlock( array $openidList);

example:

     
$userService->batchBlock([ 'openid1', 'openid2', 'openid3', '...']);

取消拉黑用户

     
$userService->batchUnblock( array $openidList);

example:

     
$userService->batchUnblock([ 'openid1', 'openid2', 'openid3', '...']);

其它


三、微信事件处理

我们在入门小教程一节以服务端为例讲解了一个基本的消息的处理,这里就不再讲服务器验证的流程了,请直接参考前面的入门实例即可。

服务端的作用呢,在整个微信开发中主要是负责 接收用户发送过来的消息,还有 用户触发的一系列事件。

首先我们得厘清一下消息与事件的回复,当你收到用户消息后(消息由微信服务器推送到你的服务器),在你对消息进行一些处理后,不管是选择回复一个消息还是什么不都回给用户,你也应该给微信服务器一个 “答复”,如果是选择回复一条消息,就直接返回一个消息xml就好,如果选择不作任何回复,你也得回复一个空字符串或者字符串 SUCCESS(不然用户就会看到 该公众号暂时无法提供服务)。

基本使用

在 SDK 中呢,使用 setMessageHandler(callable $callback) 来设置消息处理函数:

     
<?php
use EasyWeChat\ Foundation\ Application;
// ...
$app = new Application($options);
// 从项目实例中得到服务端应用实例。
$server = $app->server;
$server->setMessageHandler( function ($message) {
// $message->FromUserName // 用户的 openid
// $message->MsgType // 消息类型:event, text....
return "您好!欢迎关注我!";
});
$response = $server->serve();
$response->send(); // Laravel 里请使用:return $response;

这里我们使用 setMessageHandler 传入了一个 闭包(Closure),该闭包接收一个参数 $message 为消息对象(Collection),这里需要注意的时,与 2.0 不同,2.0 当中我们对消息与事件做了区分,还对消息进行了分类(按 MsgType)。在 3.0 后,所有的消息包括事件都会使用 setMessageHandler 来处理,也就是说你可能需要在里面进行一些判断,例如:

     
$server->setMessageHandler( function ($message) {
switch ($message->MsgType) {
case 'event':
return '收到事件消息';
break;
case 'text':
return '收到文字消息';
break;
case 'image':
return '收到图片消息';
break;
case 'voice':
return '收到语音消息';
break;
case 'video':
return '收到视频消息';
break;
case 'location':
return '收到坐标消息';
break;
case 'link':
return '收到链接消息';
break;
// ... 其它消息
default:
return '收到其它消息';
break;
}
// ...
});

当然,因为这里 setMessageHandler 接收一个 callable 的参数,所以你不一定要传入一个 Closure 闭包,你可以选择传入一个函数名,一个 [$class, $method] 或者 Foo::bar 这样的类型。

 注意,默认没有验证是否为微信的请求,部署上线建议关掉 debug 模式。

某些情况,我们需要直接使用 $message 参数,那么怎么在 setMessageHandler 闭包外调用呢?

     
$message = $server->getMessage();

注意:$message 是一个数组类型的数据,使用的时候这样使用:$message['ToUserName']

请求消息的属性

当你接收到用户发来的消息时,可能会提取消息中的相关属性,那么请参考:

请求消息基本属性(以下所有消息都有的基本属性):

$message->ToUserName    接收方帐号(该公众号 ID)
$message->FromUserName  发送方帐号(OpenID, 代表用户的唯一标识)
$message->CreateTime    消息创建时间(时间戳)
$message->MsgId         消息 ID(64位整型)

文本:

$message->MsgType  text
$message->Content  文本消息内容

图片:

$message->MsgType  image
$message->PicUrl   图片链接

语音:

$message->MsgType        voice
$message->MediaId        语音消息媒体id,可以调用多媒体文件下载接口拉取数据。
$message->Format         语音格式,如 amr,speex 等
$message->Recognition * 开通语音识别后才有

> 请注意,开通语音识别后,用户每次发送语音给公众号时,微信会在推送的语音消息XML数据包中,增加一个 `Recongnition` 字段

视频:

$message->MsgType       video
$message->MediaId       视频消息媒体id,可以调用多媒体文件下载接口拉取数据。
$message->ThumbMediaId  视频消息缩略图的媒体id,可以调用多媒体文件下载接口拉取数据。

小视频:

$message->MsgType     shortvideo
$message->MediaId     视频消息媒体id,可以调用多媒体文件下载接口拉取数据。
$message->ThumbMediaId    视频消息缩略图的媒体id,可以调用多媒体文件下载接口拉取数据。

事件:

$message->MsgType     event
$message->Event       事件类型 (如:subscribe(订阅)、unsubscribe(取消订阅) ..., CLICK 等)

# 扫描带参数二维码事件
$message->EventKey    事件KEY值,比如:qrscene_123123,qrscene_为前缀,后面为二维码的参数值
$message->Ticket      二维码的 ticket,可用来换取二维码图片

# 上报地理位置事件
$message->Latitude    23.137466   地理位置纬度
$message->Longitude   113.352425  地理位置经度
$message->Precision   119.385040  地理位置精度

# 自定义菜单事件
$message->EventKey    事件KEY值,与自定义菜单接口中KEY值对应,如:CUSTOM_KEY_001, www.qq.com

地理位置:

$message->MsgType     location
$message->Location_X  地理位置纬度
$message->Location_Y  地理位置经度
$message->Scale       地图缩放大小
$message->Label       地理位置信息

链接:

$message->MsgType      link
$message->Title        消息标题
$message->Description  消息描述
$message->Url          消息链接

回复消息

回复的消息可以为 null,此时 SDK 会返回给微信一个 “SUCCESS”,你也可以回复一个普通字符串,比如:欢迎关注 overtrue.,此时 SDK 会对它进行一个封装,产生一个 EasyWeChat\Message\Text 类型的消息并在最后的 $server->serve(); 时生成对应的消息 XML 格式。

如果你想返回一个自己手动拼的原生 XML 格式消息,请返回一个 EasyWeChat\Message\Raw 实例即可。

MobaXterm远程连接频繁掉线?3个SSH保活设置让你告别断连烦恼 本文针对MobaXterm远程连接频繁掉线问题,提供了3个SSH保活设置方案。从基础的SSH心跳机制到进阶的会话超时调整,再到TCP层保活与代理优化,全方位解决断连烦恼。特别适合需要稳定远程连接的开发者和运维人员,有效提升工作效率。 阅读详情

相关推荐

开放自己本机的mysql允许别人连接

需要在左下角搜索记事本应用,右键以管理员身份运行,之后按照上述地址找到my.ini文件,ctrl+F搜索到[mysqld],修改或添加 bind-address 设置,将其更改为 0.0.0.0 或你的计算机的 IP 地址。打开 MySQL 的配置文件 my.ini。username和密码是第3步创建能从远程地址访问的用户和密码,ip地址是ipconfig查看的地址(前提是能ping通,才能连接该地址对应的数据库)。使用 MySQL 命令行连接到自己的数据库,并创建一个能够从远程地址访问的用户。

m0_74824687的博客 1167

使用easywechat给关注公众号用户发消息

使用easywechat给关注公众号用户发消息 //获取昵称 private function getnickname($openid='') { $nickname=DB::name('member')->where(['openid'=>$openid])->value('member_nickname'); return $nickname; } //获取评论人昵称 $nickname=$this->getnickna

weixin_47164415的博客 2449

IsaacLab 从入门到精通(一) 环境配置和依赖安装

本系列文章将针对机器人操作任务中的强化学习平台IsaacLab提供较为全面的教程

DejaWu33的博客 1万+

微信公众号开发(三)事件推送及关键字回复

这里的回复实际上分成了两种类型:1.关注时马上回复 2.根据关键字来回复 在上一次我们完成的效果是用户发送什么内容就直接回复相同的内容, 所以关键字的话只需要根据用户发送的内容来做相关的判断即可。 关键字回复 代码: /** * 微信消息处理 */ @RequestMapping(value="/intoWechat",method=RequestMethod.POST,...

royal1235的博客 2075

YOLOv8知识蒸馏实战:用BCKD和LD在自制数据集上分别提点1.63%和1.69%的保姆级教程

本文详细介绍了在YOLOv8模型上应用知识蒸馏技术(BCKD和LD方法)的实战教程,通过自制数据集实现性能提升1.63%和1.69%。内容涵盖环境配置、模型选择、BCKD和LD的具体实现及调参技巧,适合目标检测领域的开发者和研究者。

weixin_29082143的博客 245

产品经理-面试题目--持续更新

答:面试官,你好,我叫XXX,来自于XXXX,我系统的学习过软件开发,也主动的积累了不少产品方面的实战经验,在学习期间,我自己独立的完成了2个深度项目,一个是仿抖音的短视频APP全流程设计,另外一个是电商后台系统的模块,通过这些项目,我不仅熟练使用Axure等工具做出高保真原型图和清晰的产品框架,也形成了数据驱动和用户优先的思维习惯,另外,我也注重拓展自己的能力边界,拿到了CAIE人工智能证书,我希望能把AI能力融入到产品场景,提升体验和效率,我非常喜欢产品工作带来的创造性和逻辑性,希望有机会加入贵公司。

m0_63966958的博客 956

laravel easywechat 验证是否关注并发送模板消息

<?php namespace App\Http\Controllers\Api; use App\Http\Controllers\Controller; use Illuminate\Http\Request; use DB; /** * * @author wangmeng * 定时器接口 * */ class DemoController extends Controller { //条数 const PAGESIZE = 500; // ...

qq_32421489的博客 1019

【推荐100个unity插件】Animator 的替代品?—— Animancer Pro插件的使用介绍

Animancer与Unity Animator对比及使用指南 摘要: 本文对比了Animancer与Unity官方Animator的核心差异,分析了Animancer的优势特点。Animancer采用代码驱动模式,相比Animator的状态机系统更灵活高效,支持实时调试、动态混合和深度逻辑集成。文章详细介绍了Animancer的快速使用方法,包括动画播放、切换和触发机制,并区分了免费版与专业版的功能差异。适合需要高效动画开发、复杂交互逻辑的中小项目,为开发者提供了一种现代化的动画解决方案。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 2434

公众号客服回复消息php代码,使用EasyWeChat写客服消息回复的接口

使用EasyWeChat写客服消息回复的接口thinkphp 使用easywechat 写客服回复的接口引入EasyWechat 到框架中使用composer 安装$ composer require overtrue/wechat:~4.0 -vvv微信公众号或小程序的appid 和 secretuse EasyWeChat\Factory;$config = ['app_id' => '...

weixin_32187037的博客 1521

深入详解DICOM医学影像定位线相关知识:理解定位线的概念、定位线的作用以及定位线显示和计算原理

深入详解DICOM医学影像定位线相关知识:理解定位线的概念、定位线的作用以及定位线显示和计算原理

编程技术探索者,分享C/C++、C#、Java、数据库等开发经验,聚焦实战技巧与AI兴趣,助力编程爱好者成长。 2050

手把手教你学simulink(31.17)--双向DCDC电源场景示例:基于simulink 的双向DCDC应用:车载充电器的pi控制

通过引入PI控制器,系统可以更精确地控制电压和电流,确保充电和放电过程的稳定性和高效性。

MHD0815的博客 205

怎么设置微信公众号自动回复内容显示用户昵称

对于微信公众号自动回复内容显示用户昵称,第三方平台微号帮提供了粉丝对话定时推送功能实现,支持公众号设置自动回复消息显示用户昵称,除了可以显示对应用户的昵称,还可以显示用户的头像、openID;用户向公众号发消息后触发功能,支持设置延迟自动回复时间,支持设置触发频率和免打扰时段,避免功能打扰用户。 微信公众号延迟自动回复内容,可以给公众号对话用户自动推送消息,可以设置文字、图片、图文、视频、语音、直播、在线课程、微商城、团购、培训资料、文档文件、文章、问卷表单、美妆信息、美食信息、产品信息、在线刷题等,帮助

dyhgztj的博客 1472

Open3D 点到面的ICP配准算法【2025最新版】

点到面的ICP(python版本)博客长期更新,本文最近一次更新时间为:2025年2月2日,代码已更新至Open3D 0.18.0版本。

点云侠的博客 38万+

easywechat php例子,thinkphp6使用easywechat笔记!

公众号端基本配置image.png公众号端设置image.png域名要备案,文件下载上传至tp6的public目录下image.pngcomposer require overtrue/wechat -vvv微信相关路由配置//微信Route::group('wechat', function () use($version){Route::get('',"{$version}.Wechat/in...

weixin_36125719的博客 2085

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

【EasyWechat】自动回复

author:咔咔 wecaht:fangkangfk 首先我们先打开他的库地址,这个里边就是使用EasyWechat开发公众号的文档 https://www.easywechat.com/docs/master/official-account/tutorial 然后在打开一个地址,是laravel框架使用Easywechat的一个入门 https://github.com/overt...

咔咔博客 7318

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

EasyWeChat4.X用户手动调用微信接口

EasyWeChat4.X用户手动调用微信接口,免去维护Access Token

qq_40088333的博客 734

easywechat6 含参数二维码

easywechat6 含参数二维码

qq_36296358的博客 1236

EasyWeChat生成带参数的小程序码

EasyWeChat生成带参数的小程序码

qq_40088333的博客 1512

EasyWeChat 授权获取用户信息 问题记录 10003

测试账号地址:https://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/index public function token() { $config = [ 'token'=>'reiz',//填写token ...

weixin_30624825的博客 5089

easywechat6获取微信用户信息(基于公众号)

easywechat6获取微信用户信息

quweiie的专栏 1734

easywechat公众号生成参数二维码报错errcode“:40001原因方法

最近发现可能是laravel中的storage/logs目录的权限导致的。chmod -R 777 logs/原因:可能是授权了多个平台,或者使用了key和密钥,其他平台里面也生成了access_token导致了这边失效。

webnoties的专栏 1683

easywechat 扫码事件_基于thinkphp5.1和easyWeChat实现第三方平台扫码授权

1

weixin_39556064的博客 1081

thinkphp6使用EasyWeChat5.x之公众号开发(一)

EasyWeChat是一个基于微信公众号和小程序的PHP SDK,它提供了简单易用的API接口,方便开发者快速开发和集成微信公众号和小程序的功能。2.封装好的业务逻辑有点麻烦,如果要改动会很不利,对于刚开始使用EasyWeChat的人来说增加了学习成本(要开发者对整体微信开发流程有个大致了解,起码要能看得懂微信文档,但微信文档有多费劲相信看到这篇文章的你心中已有自己的判断了...)由于笔者是宝塔面板安装,所以只遇到了fileinfo扩展没安装(宝塔点击安装即可);接着安装thinkphp6的视图。

MrWangisgoodboy的博客 1365

微信网页授权获取并获取用户信息

网页授权和获取用户信息是基本所有开发微信都需要明白的东西,包括easywechat,thinkPHP等 这个系统http://github.crmeb.net/u/long可以帮大家系统了解PHP商城开发 一、网页授权 重定向 //用户授权获取code public function getCode(){ $redirect_uri = urlencode('ht...

不二青春 2162

PHP生成带参数的微信小程序二维码

服务端使用easywechat库来操作微信接口,版本要求4.1.15或更高。 相关文档 微信小程序码:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/qr-code.html easywechat生成小程序码:https://www.easywechat.com/docs/master/mini-pro...

March 1万+

EasyWechat 使用

公众号素材上传,公众号的模板消息,小程序二维码生成,小程序订阅消息

weixin_42581036的博客 1198

easywechat处理ticket通知事件

现在的小程序电商系统一般都会用到第三方开放平台,因为这样可以方便管理小程序,还有一个品牌的标志。当然第三方平台需要开发的代码量也是可观的,这里我个人推荐使用PHP的微信开发SDK。,这个SDK虽然文档写的不完整,但是它的功能基本覆盖了所有微信开发的供能。其中,我用搭建第三方平台的时候遇到的两个处理ticket的url问题。的处理,当然也可以把两个接收事件地址写成一样,统一处理。是我写的一个获取对象的单例,获取配置的暂时还没有用到。官方文档会有两个接收事件的地址。以下是统一处理事件的类。

黄仲新的博客 736
上一篇: Android项目中使用echarts
下一篇: 一种改进的自适应快速AF-DBSCAN聚类算法
dwf_学海无涯
博客等级 码龄10年 42粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值