文档章节

EasyWeChat初体验

NateHuang
 NateHuang
发布于 2016/08/23 15:58
字数 2593
阅读 9121
收藏 6

环境需求

  • PHP >= 5.5.9
  • openssl 拓展
  • fileinfo 拓展(素材管理模块需要用到)

安装

使用 composer(注意:他会自动检索该目录下的composer.json,请确认好安装目录):

$ composer require overtrue/wechat:~3.1 -vvv

在框架中使用

EasyWeChat 是一个通用的 Composer 包,所以不需要对框架单独做修改,只要支持 Composer 就能直接使用,当然了,为了更方便的使用,我们收集了以下框架单独提供的拓展包:

Laravel

Symfony

我这里使用的是laravel,安装好后路径是这样的

配置

use EasyWeChat\Foundation\Application;
$options = [
   // ...
];
$app = new Application($options);

下面这里是配置的完整列表:

<?php
return [
    /**
     * Debug 模式,bool 值:true/false
     *
     * 当值为 false 时,所有的日志都不会记录
     */
    'debug'  => true,
    /**
     * 账号基本信息,请从微信公众平台/开放平台获取
     */
    'app_id'  => 'your-app-id',         // AppID
    'secret'  => 'your-app-secret',     // AppSecret
    'token'   => 'your-token',          // Token
    'aes_key' => '',                    // EncodingAESKey,安全模式下请一定要填写!!!
    /**
     * 日志配置
     *
     * level: 日志级别, 可选为:
     *         debug/info/notice/warning/error/critical/alert/emergency
     * file:日志文件位置(绝对路径!!!),要求可写权限
     */
    'log' => [
        'level' => 'debug',
        'file'  => '/tmp/easywechat.log',
    ],
    /**
     * OAuth 配置
     *
     * scopes:公众平台(snsapi_userinfo / snsapi_base),开放平台:snsapi_login
     * callback:OAuth授权完成后的回调页地址
     */
    'oauth' => [
        'scopes'   => ['snsapi_userinfo'],
        'callback' => '/examples/oauth_callback.php',
    ],
    /**
     * 微信支付
     */
    'payment' => [
        'merchant_id'        => 'your-mch-id',
        'key'                => 'key-for-signature',
        'cert_path'          => 'path/to/your/cert.pem', // XXX: 绝对路径!!!!
        'key_path'           => 'path/to/your/key',      // XXX: 绝对路径!!!!
        // 'device_info'     => '013467007045764',
        // 'sub_app_id'      => '',
        // 'sub_merchant_id' => '',
        // ...
    ],
    /**
     * Guzzle 全局设置
     *
     * 更多请参考: http://docs.guzzlephp.org/en/latest/request-options.html
     */
    'guzzle' => [
        'timeout' => 3.0, // 超时时间(秒)
        //'verify' => false, // 关掉 SSL 认证(强烈不建议!!!)
    ],
];

经常出现的一些问题(如CA认证):

在微信公众平台开发的道路上,遍布着各种大大小小的坑,有的人掉坑里,几经折腾又爬出来了,然后拍拍屁股走人。然而坑还在那里,还会继续有后来人掉进去……

这,是我们不愿看到的。

所以在这里,我们将陆续将微信开发中可能遇到的各种疑难问题进行汇总,并给出对应的解决办法。一般情况下,这些问题都可以对号入座,轻松地解决。但也不排除特殊情况,这时候你遇到的问题与文中某一个症状一致,但文中所给的解决方案并不凑效,这种情况下就需要发挥你自己的智慧,去……折腾了……

我们期待这一版块为各位的开发带来便利,同时也希望各位本着开源、分享的精神对其进行补充和完善,将各种坑一一填小、填平,让微信开发变得不那么痛苦,甚至,变成一件快乐的事……

一些服务器基本设施问题:

curl: (60) SSL certificate problem: unable to get local issuer certificate

这是 SSL 证书问题所致,在使用 SDK 调用微信支付等相关的操作时可能会遇到报 “SSL certificate problem: unable to get local issuer certificate” 的错误。

微信公众平台提供的文档中建议对部分较敏感的操作接口使用 https 协议进行访问,例如微信支付和红包等接口中涉及到操作商户资金的一些操作。
wechat SDK 遵循了官方建议,所以在调用这些接口时,除了按照官方文档设置操作证书文件外,还需要保证服务器正确安装了 CA 证书。

  1. 下载 CA 证书

    你可以从 http://curl.haxx.se/ca/cacert.pem 下载 或者 使用微信官方提供的证书中的 CA 证书 rootca.pem 也是同样的效果。

  2. 在 php.ini 中配置 CA 证书

    只需要将上面下载好的 CA 证书放置到您的服务器上某个位置,然后修改 php.ini 的 curl.cainfo 为该路径(绝对路径!),重启 php-fpm 服务即可。

    curl.cainfo = /path/to/downloaded/cacert.pem

    注意证书文件路径为绝对路径!以自己实际情况为准。

    其它修改 HTTP 类源文件的方式是不允许的。

cURL error 56: SSLRead() return error -9806

目前在 OSX 下,发现使用 HomeBrew 装的 PHP 7.0 有这个问题,解决方案是重新 brew 安装 PHP:

$ brew install homebrew/php/php70 --with-homebrew-openssl --with-homebrew-curl --without-snmp -vvv

验证:

$ php -i | grep 'OpenSSL support'

OpenSSL support => enabled

OpenSSL support => enabled

这是由于微信支付授权目录未正确配置引起的。此时开发者应该登录微信公众平台,进入【微信支付】->【开发设置】进行设置。支付失败!当前页面的 URL 未注册

  1. 公众号可添加3个支付授权目录,满足不同应用使用同一个公众号进行支付的业务需求。

  2. 正确的【支付授权目录】应以 http:// 或 https:// 开头,并以正斜杠 / 结尾,授权目录所包含的域名必须经过 ICP 备案

  3. 支付授权目录需细化至二级或三级目录

  4. 所有实际调起微信支付请求的页面都必须要所配置的支付授权目录之下

  5. 在开发过程中,也可以使用测试授权目录进行开发测试,此时还应该将参与测试的个人微信号添加到测试白名单中,否则将出现对应的错误提示……

配置前请先理解页面目录URL 以及域名等几个基本概念,并对自己所使用的框架的路由机制有一个大致了解。这样你才会知道自己正在配置的参数是个啥玩意儿,有什么卵用…… 

redirect_url 参数错误

这是由于程序使用了网页授权而公众号没有正确配置【网页授权域名】所致。此时你需要登录微信公众平台,在【开发】->【接口权限】页面找到网页授权获取用户基本信息进行配置并保存。

  1. 网页授权域名应该为通过 ICP 备案的有效域名,否则保存时无法通过安全监测。

  2. 网页授权域名即程序完成授权获得授权 code 后跳转到的页面的域名,一般情况下为你的业务域名。

  3. 网页授权域名配置成功后会立即生效。

  4. 公众号的网页授权域名只可配置一个,请合理规划你的业务,否则你会发现……授权域名不够用哈。

[JSAPI] config: invalid url domain

在使用 JS-SDK 进行开发时,每个页面都需要调用 wx.config() 方法配置 JSPAI 参数。如果没有正确配置 JSAPI 安全域名并且开启了调试模式,此时就报此错误。遇到这个问题时,开发者需要登录微信公众平台,进入【公众号设置】->【功能设置】页面,将项目所使用的域名添加至 【JSAPI 安全域名】列表中。

  1. 一个公众号同时最多可绑定三个安全域名,并且这些域名必须为通过 ICP 备案一级或一级以上的有效域名。

  2. JSAPI 安全域名每个月限修改三次,修改任何一个都算,所以,请谨慎操作。

  3. 如果需要使用 JSAPI 调起支付功能,则支付目录必须也在所配置的安全域名之下,并且需要将支付目录添加至支付授权目录

token验证失败、向公众号发送消息无任何反应

相信对接公众号一般是微信开发者进行开发过程中最先进行的工作,而在这看似简单的配置操作中,也可能会掉坑里。
最常见的两种情况就如下:

  1. 确认你 “启用” 了开发模式, token 验证通过不代表启用,保存后也不代表启用。看到红色 “停用” 才真正的是启用了。

  2. 配置好URL(服务器地址)以及Token(令牌)后,点击保存时提示token验证失败,出现这种情况的原因有多种,其中之一便是网络不稳定,所以可尝试多次保存,若始终无法通过再排查其它可能因素。

  3. 配置保存成功之后,向公众号发送消息无任何反应,自己的消息处理程序也没有被调用的记录(无对应日志)。这种情况下如果你尝试反复停用和启用服务器配置,可能突然间惊奇地了现,问题莫名其妙的解决了。

  4. 使用在线调试工具的消息接口,http://mp.weixin.qq.com/debug/, 只要返回绿色的“请求成功”,就代表你的代码没有问题,请重复上面第4项再测试。

  5. 如果你在用什么本地开发工具,或者什么 ngrok 代理到本机这样的开发方式,那么失败就很正常了,微信服务器到你机器的网络延迟太大(还是用服务器开发吧)。

请开发者理解服务器 TOKEN 验证原理(官方文档有说明)并谨记服务器验证时使用 GET 方式访问,而公众平台向你的服务器发送消息/数据则使用 POST 方式,所以服务器验证成功之后,在某些启用了 CSRF 验证的框架里,接收消息时可能还会遇到 CSRF 相关的问题,请根据自己项目实际情况进行排查。
另外有的朋友的 Laravel 里使用了 laravel-debugbar,这个组件的原理是在页面输出时在后面添加 HTML 来实现的,所以它会改变我们返回给微信的内容,此时要么卸载,要么禁用掉它。

Maximum function nesting level of ‘100’ reached, aborting!

在使用了 Xdebug 的环境下可能出现这个问题。这是由于 Xdebug 限制函数嵌套的最大层级数(默认为100),当嵌套次数达到该值便会触发 Xdebug 跳出嵌套并报此错误。

为避免这个问题,可以将 Xdebug 的 max_nesting_level 参数适当设置大一些,通常设置为200就可以了(当然可根据自己实际情况设置为更大的值)。

如下,修改 php.ini 配置文件后,重启 Apache 或 php-fpm 服务即可。

xdebug.max_nesting_level=200

 

© 著作权归作者所有

NateHuang
粉丝 19
博文 67
码字总数 31407
作品 0
深圳
后端工程师
私信 提问
加载中

评论(1)

支先生
支先生
您好 请教一个问题 根据easyWeChat文档中的代码进行 服务器认证的时候 token设置跟 微信公众平台后台配置的token不一致 但是仍然可以验证成功 不知道这是为什么
利用 EasyWeChat 和 ChatterBot 简单搭建一个公众号「自动回复机器人」

自从公众号列表页改版以来,很多人都说会弱化公众号菜单的作用。 而且,对于个人号来说,开发模式下是不能操作菜单开发的。 所以我们索性「放弃菜单」,制作「自动回复」来替代菜单功能。 开...

叶梅树
2018/07/04
0
0
EasyWeChat 3.0 发布,优雅的微信公众平台 PHP SDK

EasyWeChat 是一个开源的 微信 非官方 SDK。 EasyWeChat 的安装非常简单,因为它是一个标准的 Composer 包。 3.0 的发布带来了以下的变化: 全新的架构,更清晰的模块拆分 Debug 优化,便于快...

安正超
2016/02/18
10.2K
3
web 开发者常用网站(持续更新)

工具类 开源中国在线工具(含文档,在线转码,时间戳工具等) 站长工具(编码转化等常用工具) 百度脑图(思维导图) 开发文档类 web开发英文版文档 web开发中文版文档 微信公众号开发文档 ...

JNG
2016/12/26
6
0
后台管理系统 - lemocms

项目介绍 lemocms(又名 lemocms 后台管理系统)是完全开源的项目,基于 ThinkPHP6 最新版,layui+easywechat 框架开发的,易于功能扩展,代码维护,方便二次开发。 帮助开发者简单高效降低二次...

lemocms
10/17
4.2K
3
一个基于Yii2高级框架的快速开发应用引擎 - RageFrame

RageFrame 2.0 重量级全栖框架,为二次开发而生 前言 这是一款现代化、快速、高效、便捷、灵活、方便扩展的应用开发骨架。 RageFrame 创建于 2016 年 4 月 16 日,一个基于 Yii2 高级框架的快...

简言Personal
2017/08/01
2.9K
10

没有更多内容

加载失败,请刷新页面

加载更多

如何有效地计算JavaScript中对象的键/属性数量?

计算对象的键/属性数的最快方法是什么? 是否可以在不迭代对象的情况下执行此操作? 即不做 var count = 0;for (k in myobj) if (myobj.hasOwnProperty(k)) count++; (Firefox确实提供了一...

技术盛宴
35分钟前
4
0
百度网址安全中心拦截解除的办法分享

临近2019年底,客户的公司网站被百度网址安全中心拦截了,公司网站彻底打不开了,影响范围很大,于是通过朋友介绍找到我们SINE安全公司寻求帮忙解封,关于如何解除百度的安全拦截提示,下面就...

网站安全
47分钟前
7
0
Tomcat8源码分析-启动流程-start方法

上一篇:Tomcat8源码分析-启动流程-load方法 前面讲了启动流程中的Catalina.load,进一步调用绝大部分组建的init操作,主要完成对server.xml解析,并根据解析的结果结合设置的Rule(规则)构造...

特拉仔
55分钟前
7
0
Xamarin.FormsShell基础教程(7)Shell项目关于页面的介绍

Xamarin.FormsShell基础教程(7)Shell项目关于页面的介绍 轻拍标签栏中的About标签,进入关于页面,如图1.8和图1.9所示。它是对应用程序介绍的页面。 该页面源自Views文件夹中的AboutPage.x...

大学霸
今天
4
0
一步一步理解Impala query profile(一)

很多Impala用户不知道如何阅读Impala query profile来了解一个查询背后正在执行的操作,从而在此基础上对查询进行调优以充分发挥查询的性能。因此我想写一篇简单的文章来分享我的经验,并希望...

九州暮云
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部