Giter Site home page Giter Site logo

easywechat's Introduction

📦 一个 PHP 微信开发 SDK,开源 SaaS 平台提供商 微擎 旗下开源产品。

Test Status Lint Status Latest Stable Version Latest Unstable Version Total Downloads License

环境需求

安装

composer require w7corp/easywechat

使用示例

基本使用(以公众号服务端为例):

<?php

use EasyWeChat\OfficialAccount\Application;

$config = [
    'app_id' => 'wx3cf0f39249eb0exxx',
    'secret' => 'f1c242f4f28f735d4687abb469072xxx',
    'aes_key' => 'abcdefghijklmnopqrstuvwxyz0123456789ABCDEFG',
    'token' => 'easywechat',
];

$app = new Application($config);

$server = $app->getServer();

$server->with(fn() => "您好!EasyWeChat!");

$response = $server->serve();

文档和链接

官网 · 讨论 · 更新策略

❤️ 支持我

如果你喜欢我的项目并想支持它,点击这里 ❤️

由 JetBrains 赞助

非常感谢 Jetbrains 为我提供的 IDE 开源许可,让我完成此项目和其他开源项目上的开发工作。

可爱的贡献者们

License

MIT

easywechat's People

Contributors

aa24615 avatar abbotton avatar ac1982 avatar bangbangda avatar caikeal avatar dependabot[bot] avatar hanson avatar her-cat avatar jiangslee avatar jinchun avatar lichunqiang avatar limingxinleo avatar linshuboy avatar lonquan avatar milkmeowo avatar mingyoung avatar nauxliu avatar overtrue avatar pengxuxu avatar reatang avatar ruchengtang avatar scrutinizer-auto-fixer avatar sy-records avatar thisliu avatar tianyong90 avatar wannanbigpig avatar wjfz avatar xiabeifeng avatar xiaoler avatar zhlhuang avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

easywechat's Issues

token验证失败

appId secret token encodingAESKey 4者都填写正常,微信后台还是报“token验证失败。” 能给一个示例么? 谢谢。

获取 refresh_token,access_token

 public function user()
    {
        if ($this->authorizedUser
            || !$this->input->has('state')
            || (!$code = $this->input->get('code')) && $this->input->has('state')) {
            return $this->authorizedUser;
        }
        $permission = $this->getAccessPermission($code);
        if ($permission['scope'] !== 'snsapi_userinfo') {
            $user = new Bag(array('openid' => $permission['openid']));
        } else {
            $user = $this->getUser($permission['openid'], $permission['access_token']);
        }
        return $this->authorizedUser = $user;
    }

您好,当access_token过期时使用accessTokenIsValid时需要access_token和刷新使用refresh_token,而


$user = new Bag(array('openid' => $permission['openid']));

只返回了openid

网页授权一刷新页面就出现40029 不合法的oauth_code

你好 我根据wiki里面的示例 第一次授权可以获得用户信息 但是只要刷新就会出现40029,能帮我分析一下问题吗?

if ($auth->authorized() || Session::get('logged_open_id')) {
    $user = $auth->user();// 获取已经登录后用户信息
    Session::set('logged_open_id', $user['open_id']);

    //code 显示授权后的页面,或者跳转到其它授权才能访问的页面
    //...
} else {
    $to = "http://微信授权完成后跳回你的地址,就是当前代码所在的 URL";
    $auth->redirect($to);
}

卡券的 attachExtension 方法

    public function attachExtension($cardId, array $extension = array())
    {
        $timestamp = time();

        $ext = array(
            'code'      => Arr::get($extension, 'code',''),
            'openid'    => Arr::get($extension, 'openid', Arr::get($extension, 'open_id','')),
            'timestamp' => $timestamp,
            'outer_id'  => Arr::get($extension, 'outer_id',''),
        );

        $ext['signature'] = $this->getSignature(
            $this->getTicket(),
            $timestamp,
            $cardId,
            $ext['code'],
            $ext['openid']
        );

        return array(
            "cardId"  => $cardId,
            "cardExt" => JSON::encode($ext),
        );
    }

之前返回的是 card_id,card_ext 界面显示不出卡券信息,改成cardId,cardExt就可以了

获取素材列表错误

$media = new Media(config('wechat.appId'), config('wechat.secret'));
$news = $media->lists('news', 0, 5);

这样使用有错吗。报错 : [Wechat][40004] 40004 不合法的媒体文件类型

Media::updateNews() 方法与微信API不一致

修改图文信息的方法
https://github.com/overtrue/wechat/blob/master/src/Wechat/Media.php#L179

'articles' => array($article)

对传入的数组又放入了一个新的数组中。

微信API: http://mp.weixin.qq.com/wiki/4/19a59cba020d506e767360ca1be29450.html
示例如下:

{
  "media_id":MEDIA_ID,
  "index":INDEX,
  "articles": {
       "title": TITLE,
       "thumb_media_id": THUMB_MEDIA_ID,
       "author": AUTHOR,
       "digest": DIGEST,
       "show_cover_pic": SHOW_COVER_PIC(0 / 1),
       "content": CONTENT,
       "content_source_url": CONTENT_SOURCE_URL
    }
}

注意articles键的值是一个关联数组。
也就是说发布图文消息时$article的结构是[{},{},{}],在更新时只能根据index更新各项{}。
我因为只需要发单图文信息,直接把[]去掉就可以了。
对于需要编辑多图文的客户端代码,确实有可能忘记提取元素(我一开始也写成发布和更新传入的参数一样,改了以后发现还是不对才去看的源码),感觉这样就可以偷懒了?

$article = isset($article['title']) ? $article : (isset($article[$index]) ? $article[$index] : throw something);

关于API_TOKEN_REFRESH

通过refresh_token重新获取用户access_token,auth.php没做实现吗?

有一种业务场景:
1、用户一个月前网页授权过了,我这也存了用户的性别、昵称等等
2、用户最近更改了微信昵称,他发现我的网站个人信息页面昵称还是以前的
这种情况我想重新获取用户信息,按照auth逻辑,是不是要重新让用户跳转授权页面确认
而不是通过refresh_token重新获取用户access_token,然后自动获取最新的用户信息

关于获取(接收)用户发送消息

$this->wxServer->on('message', function($message) {
return Message::make('text')->content('您好!');
});
如何获取用户发来的信息呢?
比如我记录用户的信息日志
根据信息查询订单数据返回,类似智能回复
$message 这个?
如何能更好的扩展智能回复方案

监听消息 返回Bad Request

Hi,

我在菜单事件时,用的例子里的代码如下:


// 监听所有事件
$server->on('event', function($event) {
     error_log('收到取消关注事件,取消关注者openid: ' . $event['FromUserName']);
});

打印收到的signature,time和nonce正常, xml内容也正常,但是提示异常:

[2015-07-31 04:41:20] local.ERROR: exception 'Overtrue\Wechat\Exception' with message '[Wechat]Bad Request' in /home/workplace/weixin_date/vendor/overtrue/wechat/src/Wechat/Server.php:171

模板消息简单格式无效

"first" => array("恭喜你购买成功!", '#555555'),

类似这样的格式无效,会导致发送的参数为空

[value=>'',color=''] 这样的格式就可以,麻烦看看呢

素材管理 -- 部分图片下载失败

下载图片出现如下错误 :

有的图片能下载,有的图片不能下载的情况。
错误如下:

[2015-05-04 10:47:47] local.ERROR: exception 'ErrorException' with message 'Undefined offset: 1' in /var/www/meishenghuo/web/vendor/overtrue/wechat/src/Wechat/Utils/Http.php:228

我的解决方法如下,但是不知道这样做对不(能解决部分图片不能下载问题)。

Wechat\Utils\Http.php的 request() 方法下 :

$responseSplit = preg_split('/((?:\r?\n){2})/', $response['response']);

正则分割 header和 body的时候出现了 body被拆分成两部分的情况(本该是

$responseSplit = array(0=>"header信息", 1=>"body信息");

结果变成

$responseSplit = array(0=>"header信息", 1=>"body1信息", 2=>"body2信息"); )。

我把正则内的 \r 后面的 ? 问号去掉就能解决问题(不懂为什么)。

$responseSplit = preg_split('/((?:\r\n){2})/', $response['response']);

素材管理 -- 图片下载失败


  1. overtrue\wechat\src\Wechat\Media.php 的 download() 方法返回是空。

    原因在 overtrue\wechat\src\Wechat\Http.php 的 request() 中

    $contents = json_decode($response['data'], true);

    $response['data']并不是json格式,是图片资源。





  2. download()的返回值

    return $filename ? $contents : file_put_contents($filename, $contents);

    要对换下冒号两边的参数 :

    return $filename ? file_put_contents($filename, $contents) : $contents;

微信关注自动回复问题

这个SDK具体如何使用哦? 例如,新用户订阅,自动回复消息,是否有示例?单独用PHP没问题。

2.0版本使用问题

2.0的AppSecret跑哪去了?怎么就变成了encodingAESKey?消息加密的密钥是必须的么?我记得AppSecret这个应用密钥是必须要的啊,1.0版本还有,2.0的版本怎么实例的时候就不用传了?现在用你2.0这类,微信老是未服务,我就纳闷那里奇怪,才发现这里好像有问题。求答复。。

微信公众号绑定的一点问题,请教。

hi ,overtrue,成功使用wechat框架在微信内绑定H5系统内的用户后(用户表存放openid),现在需要在微信内判断如果用户已经绑定过openid,则自动登陆。现在的情况是,H5使用Ajax取值时,初次调用$auth->authorize()会服务端会重定向,导致H5端无法取值,这种情况要怎么处理呢?

[3.0] Tasks

  • URL与 QRCode 合并到一起,命名空间再议
  • 素材管理
  • [ ] 设备管理 -> 3.1
  • 模板消息
  • 支付
  • OAuth
  • [ ] 卡券 -> 3.1
  • 语义理解
  • 数据统计
  • 用户与用户组
  • JS-SDK
  • 服务器端
    • Observer
  • 门店
  • [ ] 小店 -> 3.1
  • 菜单
  • 群发消息
  • 加密解密
  • 核心
  • 缓存
  • 客服
  • 通用工具
  • 错误处理与日志

消息发送后服务器无法正确返回响应

背景:
1、token验证成功
2、菜单创建也可成功
3、发送文本后显示为”该公众好无法提供服务“
代码部分如下

    $token  = '111';

    $encodingAESKey = 'bLRZ3sB3n2wyWnkUXv0nn9a9SvMiokpmjWxwwq6QbLt';

    $server = new Server($appId, $token,$encodingAESKey);

    $server->on('message', function($message) {
        return Message::make('text')->content('您好!');
    });
    $result = $server->serve();

    echo $result;</code>

请问这样判断Mcrypt到底准不准?

通过关注者的微信号发送了一条消息,报错:

[2015-04-30 11:54:44] production.ERROR: exception 'Overtrue\Wechat\Exception' with message '[Wechat]Mcrypt 拓展未安装或未启用 系统繁忙,此时请开发者稍候再试' in /home/wwwroot/laravel/vendor/overtrue/wechat/src/Wechat/Crypt.php:63

打开这个文件看到:

if (extension_loaded('mcrypt')) {
     throw new Exception('Mcrypt 拓展未安装或未启用');
}

通过phpinfo查看服务器信息:
qq20150430-1 2x

js sdk config 建议增加 beta 字段

public function config(array $APIs, $debug = false, $json = true,$beta = false)
{
    $signPackage = $this->getSignaturePackage();

    $config = array_merge(array('debug' => $debug),array('beta' => $beta), $signPackage, array('jsApiList' => $APIs));

    return $json ? JSON::encode($config) : $config;
}

针对设备的 api 中有 beta 这个属性……

Using $this when not in object context

$options = array(
    'appId'          => 'xxxx',
    'secret'         => 'xxxxxx'
    'token'          => 'xxxx',
    'encodingAESKey' => 'xxx'
);



$wechat = Wechat::make($options);
$wechat->on('message', function($message) {
    return Message::make('text')->content('您好!'.$message->FromUserName);
});


$result = $wechat->serve();

echo $result;

我这么写了,可是网页上出现下面这个错误
Fatal error: Using $this when not in object context in /var/www/html/wwhis.com/www/src/Wechat/Wechat.php on line 113

关于Util\HTTP::encode()中的urlencode()/urldecode()成组操作的疑问

其实并不明白加这段代码的作用
https://github.com/overtrue/wechat/blob/master/src/Wechat/Utils/Http.php#L267-276

从结果上说,这使得双引号在Util\JSON::encode()执行期间躲起来了。
一个情景是图文信息是可以使用HTML的,content中的双引号就杯具了QAQ

$src = '""';
var_dump(urlencode($src)); // string '%22%22' (length=6)
var_dump(urldecode(urlencode($src))); // string '""' (length=2)

mcrypt_module_open error

Call to undefined function Overtrue\Wechat\mcrypt_module_open() in ... vendor/overtrue/wechat/src/Wechat/Crypt.php on line 195
这个好奇怪,怎么namespace会调用到Overtrue\Wechat\

composer update 之后报错

PHP Parse error: syntax error, unexpected '{' in /home/wwwroot/weixin.xxx.com/vendor/overtrue/laravel-wechat/src/ServiceProvider.php on line 62

在新浪SAE平台上的部署问题

Fatal error: Uncaught exception 'Overtrue\Wechat\Exception' with message '
[Wechat]读取输入失败,请在 php.ini 中打开 always_populate_raw_post_data=On' 
in /data1/www/htdocs/152/a327/1/third_party/Wechat/Server.php:200 
Stack trace: #0 /data1/www/htdocs/152/a327/1/third_party/Wechat/Server.php(160): 
Overtrue\Wechat\Server->prepareInput() #1 /data1/www/htdocs/152/a327/1/wechat.php(20): 
Overtrue\Wechat\Server->serve() #2 {main} thrown in third_party/Wechat/Server.php on line 200

新浪的SAE下开发有一定限制,不能修改php.ini 想要部署在SAE上有解决的办法么?

事件消息

我把
$this->wxServer->on('message', function($message) {;
$this->msgLog($message->toArray());
return Message::make('text')->content('hello!');
});
$this->wxServer->on('event', function($event) {;

        $this->eventLog($event->toArray());

    });

消息和事件处理写在一个页面,当有事件请求的时候,怎么还进入了消息处理逻辑?

群发功能

个人觉得还是有作用的,有没有点tip,提示一下:如何在已有的SDK基础上修改开发

php 5.6版本下出现错误(5.6以下版本正常)

错误提示如下:
PHP Deprecated: Automatically populating $HTTP_RAW_POST_DATA is deprecated and will be removed in a future version. To avoid this warning set 'always_populate_raw_post_data' to '-1' in php.ini and use the php://input stream instead. in Unknown on line 0

PHP Warning: Cannot modify header information - headers already sent in Unknown on line 0

我换成了php5.5版本后错误消失

$xmlInput = file_get_contents('php://input');貌似在某些版本的PHP有问题还是怎的

[2015-07-13 12:53:59]|http:/xxx:80/listener/weixin/in?signature=09c15103416f24f04beaa890dc86284b7f54f6e3&echostr=4936468427967550941&timestamp=1436763280&nonce=1194775519|140.207.54.79|||wx
signature => 09c15103416f24f04beaa890dc86284b7f54f6e3
echostr => 4936468427967550941
timestamp => 1436763280
nonce => 1194775519


[2015-07-13 12:53:59]|http:/xxx:80/listener/weixin/in?signature=09c15103416f24f04beaa890dc86284b7f54f6e3&echostr=4936468427967550941&timestamp=1436763280&nonce=1194775519|140.207.54.79|||wx2


[2015-07-13 12:53:59]|http://xxx:80/listener/weixin/in?signature=09c15103416f24f04beaa890dc86284b7f54f6e3&echostr=4936468427967550941&timestamp=1436763280&nonce=1194775519|140.207.54.79|||wx3
[false]

第一个是$_GET
第二个是$input = XML::parse($xmlInput);的$input
第三个是$this->input

模板消息notice

建议
将send的返回值,返回全部,不要只是msgid
{
"errcode":0,
"errmsg":"ok",
"msgid":200228332
}
回头方便调用者处理发送过程的结果(不是微信告知用户是否收到)

[建议] 深度结合微信多图文与素材管理

超超我想提个建议,能否在Media类里面加个get方法,
通过media_id从微信获取素材实例,并且它可以当做news_item直接来使用?

例如:

$config = [...];
$media = new Media($config);

$collection = [...];
$items = [];

foreach ($collection as $data) {
    $items[] = $media->get($data->remote_media_id)->toNewsItem();
} 

return Message::send('news')->items($items);

js端查看微信卡券接口 chooseCard

以下为php代码

$config = array(
     'use_alias'    => false,
     'app_id'       => WxPayConfig::APPID,
     'secret'       => WxPayConfig::APPSECRET,
     'token'        => WxPayConfig::APPTOKEN,
     'encoding_key' => WxPayConfig::ENCODING_KEY // 加密模式需要,其它模式不需要
);
$js = new Js($config);
$card = new Card($config);
$timestamp = time();
$nonce_str = $card->getNonce();
$api_ticket = $card->getTicket();
//根据http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=cardsign 来看需要appid和cardType
$signature = $card->getSignature($api_ticket, $timestamp, WxPayConfig::APPID, 'CASH', $nonce_str);

以下为js代码

 wx.config(<?php echo $js->config(array('chooseCard'), true, true) ?>);
 wx.ready(function () {
     document.querySelector('#chooseCard').onclick = function () {
         wx.chooseCard({
             cardType: 'CASH', //需要与卡券签名传入参数保持一致
             timestamp: <?php echo $timestamp ?>, // 卡券签名时间戳
             nonceStr: '<?php echo $nonce_str ?>', // 卡券签名随机串
             cardSign: '<?php echo $signature ?>', // 卡券签名
             success: function (res) {
                 alert(res);
                 var cardList= res.cardList; // 用户选中的卡券列表信息
             }
         });
     }
 });

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.