GithubHelp home page GithubHelp logo

hanson / laravel-admin-wechat Goto Github PK

View Code? Open in Web Editor NEW
234.0 8.0 47.0 87 KB

laravel admin 的微信扩展包,支持多公众号、多小程序、多微信支付,包含基础接口与后台

License: MIT License

PHP 84.74% Blade 15.26%

laravel-admin-wechat's Introduction

Laravel-admin-wechat

Laravel admin 的微信扩展、支持多公众号、多小程序、多微信支付的后台管理,并提供小程序、微信支付的基础接口,在此基础上通过事件、继承等形式完成自定义。

本扩展使用了 EasyWeChat,微信实例使用可移步到 EasyWeChat 文档

3@6ZH77BL2I_PKOASD~6T2T.png

H__`P5CEM2W5KK_HJ_R2_3D.png

~IOO_9`PNP__04333MJ1_97.png

关联项目

TO DO LIST

  • 公众号与小程序配置
  • 公众号用户
    • 列表用户
    • 同步用户
    • 备注用户
    • 用户标签
  • 公众号菜单
  • 小程序用户
  • 微信支付配置
  • 公众号卡券
    • 卡券列表
    • 同步卡券
    • 创建卡券
    • 投放卡券
  • 微信支付
    • 微信支付配置
    • js sdk 生成
    • 微信支付订单
    • 微信支付退款
    • 微信支付红包
  • 公众号授权
    • 公众号登录
    • 自动保存用户
    • 中间件
  • 公众号门店
  • 公众号模板消息
  • 公众号素材
  • 公众号客服
  • 开放平台
  • 小程序其他解密接口

安装

安装依赖

composer require hanson/laravel-admin-wechat -vvv

安装

php artisan wechat:install -m

此命令将:

  • 发布 WeChat 所需资源
  • 生成微信相关后台菜单
  • 创建各个微信相关数据表
  • 创建路由文件 routes/wechat_adminroutes/wechat_api
  • 创建 database/migrations 的相关微信数据库(可自行根据需求做对应修改,可以加字段,不建议删减字段)
  • 执行 migrate 操作(去掉 -m 可不执行)

生成 jwt secret

php artisan jwt:secret

配置

修改 config/auth.php (用于小程序登录等接口,如果不需要可以不加)

<?php

return [
    'guards' => [
        // ...
        'mini' => [
            'driver' => 'jwt',
            'provider' => 'wechat_user',
        ]
    ],
    'providers' => [
        // ...
        'wechat_user' => [
            'driver' => 'eloquent',
            'model' => Hanson\LaravelAdminWechat\Models\WechatUser::class, // 你也可以自己继承此 model 后修改为自己的 model
        ],
    ]
];

接口

对于本人来说, laravel-admin-wechat 另一个有价值的点在于自带的接口,尽管内容不多,但因为做项目比较多经常要新建用户表,写登录逻辑,但实际上代码基本都一样,这也是为什么会提供基础的接口

  • post api/wechat/mini/check-token 检查token是否过期

  • post api/wechat/mini/login 使用 code 登录

参数 备注
app_id 小程序的 app id
code 登录的 code
  • post api/wechat/mini/decrypt-mobile 解密手机号码

  • post api/wechat/mini/decrypt-user-info 解密用户信息

参数 备注
app_id 小程序的 app id
iv 微信参数
encrypted_data 微信参数

高级

此扩展只提供了最基础的业务,但很多情况下企业需要更多样化的业务需求,laravel-admin-wechat 同样提供了十分灵活的自定义方案。

自定义后台

后台路由在 routes/wechat_admin.php 中,你可以自由修改

当你需要对进行细微调整时,可以通过 php artisan admin:controller 自行创建控制器,并修改其继承的类为原来的类,覆盖方法做调整

通用方法

laravel-admin-wechat 的通用函数均在 Hanson\LaravelAdminWechat\Services 内,并提供 Facade 方式进行调用

<?php
use \Hanson\LaravelAdminWechat\Facades\ConfigService;
use \Hanson\LaravelAdminWechat\Facades\MerchantService;
use \Hanson\LaravelAdminWechat\Facades\OrderService;

// ConfigService 可获取 公众号/小程序 实例
ConfigService::getCurrent(); // 获取后台操作中的 WechatConfig 对象
ConfigService::getAdminCurrentApp(); // 获取后台操作中的微信实例
ConfigService::getInstanceByAppId('app id'); // 根据 appid 获取微信实例

// MerchantService 可获取 微信支付实例
MerchantService::getInstanceByMchId('mch id'); // 根据 mch id 获取微信支付实例

// OrderService 订单相关服务
OrderService::unify('mch id', 'JSAPI', array $data); // 统一下单并创建微信订单 data 为统一下单参数,与微信支付文档一致
OrderService::jsConfig('mch id', 'JSAPI', array $data); // 返回 js sdk 所需参数(其中包括统一下单,创建订单)

事件

为了能够实现基础业务外,也能更好的适应各种自定义需求,本扩展使用了事件去实现自定义

在你的 app/Providers/ServiceProvider.php

<?php

protected $listen = [
    \Hanson\LaravelAdminWechat\Events\DecryptUserInfo::class => [
        'App\Listeners\AfterSaveUserInfo',
    ],
    \Hanson\LaravelAdminWechat\Events\DecryptMobile::class => [
        'App\Listeners\SaveMobile',        
    ],
    \Hanson\LaravelAdminWechat\Events\OrderPaid::class => [
        'App\Listeners\ChangeOrderStatus',
    ]
];
<?php
use \Hanson\LaravelAdminWechat\Events\DecryptMobile;

class SaveMobile 
{
    public function handle(DecryptMobile $event)
    {
        $event->wechatUser->user()->update([
            'phone' => $event->decryptedData['purePhoneNumber'],
            'country_code' => $event->decryptedData['countryCode'],
        ]);
    }
}
<?php
use \Hanson\LaravelAdminWechat\Events\DecryptUserInfo;

class AfterSaveUserInfo 
{
    public function handle(DecryptUserInfo $event)
    {
        // 你的业务
        $event->decryptedData['nickname'];
        $event->wechatUser;
    }
}
<?php
use \Hanson\LaravelAdminWechat\Events\OrderPaid;

class AfterSaveUserInfo 
{
    public function handle(OrderPaid $event)
    {
        // 你的业务
        $wechatOrder = $event->order;
        
        $order = $wechatOrder->order()->update(['status' => 'paid']);
        
        $openId = $wechatOrder->openid;
    }
}

微信支付

laravel-admin-wechat 提供了微信订单表、创建订单以及生成 js 参数等方法,但并没有相关业务参数 地址商品 等,建议自身生成 orders 表并关联 wechat_orders

// 支付接口示例
<?php

class OrderController extends Controller
{
    public function pay()
    {
        // some validate
        
        $data = [
            'body' => '商品标题', 
            'total_fee' => 100,
            'openid' => auth('mini')->user()->openid,
            // 'out_trade_no' => 'xxx', 选填,如不填写时会自动创建一个订单号
        ];
        
        /**
        * $result['config'] jssdk 所需参数
        * $result['order'] WechatOrder 的 model 对象
        * $result['unify'] unify 接口返回的结果
        */
        $result = \Hanson\LaravelAdminWechat\Facades\OrderService::jsConfig('mch id', 'JSAPI', $data);
        
        App\Models\Order::create([
            'wechat_order_id' => $result['order']->id,
            'status' => 'not paid',
            'goods_id' => '...',
            'address_id' => '...',
        ]);
        
        return $result;
    }
}

异常捕捉

不但在此项目,在其他项目也建议你对 app/Exceptions/Handler 进行修改,因为对于接口的请求,laravel 默认在错误的情况会返回页面,这不是任何一个开发者所期望的情况

// app/Exceptions/Handler.php
<?php

public function render($request, Exception $exception)
{
    if ($request->acceptsJson()) {
        if ($exception instanceof AuthenticationException) {
            return Response::json(['err_code' => 401, 'err_msg' => 'Unauthenticated'], 401);
        }
        return fail($exception->getMessage());
    }
    return parent::render($request, $exception);
}

本扩展封装了函数 failok 两个接口返回的基础结构,可以使用这两个函数去定义你所有的接口返回

特别鸣谢

EasyWeChat 微信开发包

yisonli/wxmenu 微信菜单的代码来源

定制

如需找我定制,可加我微信 524291355

laravel-admin-wechat's People

Contributors

hanson avatar qbhy 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

laravel-admin-wechat's Issues

ImportUserJob

在wechat user填充到数据库的时候,Carbon::parse($user['subscribe_time'])->toDateTimeString() 这个函数好像要报错,我换成'subscribed_at' => $user['subscribe'] ? date('Y-m-d H:i:s', $user['subscribe_time']): null好像就没有问题了,您可以确认一下

关于使用开箱小程序登录接口的问题

原谅我是新手。

按教程配置下来,调用 /api/wechat/mini/login 正确返回 token 了。
但使用 token 调用 /api/wechat/mini/decrypt-user-info 接口时一直失败。

尝试了以下方法:
1、Header 带 authorization 参数,放上 token
2、post 带 token 参数,放上 token 去掉 bearer 前缀
3、queryString 带 token 参数,放上 token 去掉 bearer 前缀

期间遇到了各种各样的问题,如:
1、服务器 500 错误
2、无法找到 login 路由
3、Argument 3 passed to Lcobucci\JWT\Signer\Hmac::doVerify() must be an instance of Lcobucci\JWT\Signer\Key

花了几天时间调试,最后还是在第三个错误信息里面找到解决办法。

调试+翻看 https://github.com/tymondesigns/jwt-auth 的文档。

最终确定了原因:JWT 模块缺少配置。

复制 jwt-auth 模块下的 config/config.php 文件到项目的 config/jwt.php ,并且运行 php artisan jwt:secret 命令生成 JWT_SECRET 并写入 .env 文件。

配置完成后重新调用 /api/wechat/mini/login/api/wechat/mini/decrypt-user-info 发现已经正确跑起来了。

need try catch $result = $app->auth->session($code);

namespace Hanson\LaravelAdminWechat\Services;


use Illuminate\Support\Facades\Cache;

class MiniService
{
    /**
     * 通过 code 获取 session 信息
     *
     * @param string $appId
     * @param string $code
     * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string
     * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException
     */
    public function session(string $appId, string $code)
    {
        $app = \Hanson\LaravelAdminWechat\Facades\ConfigService::getInstanceByAppId($appId);

        
        $result = $app->auth->session($code);

        Cache::forever($this->getSessionKey($result['openid']), $result['session_key']);

        return $result;
    }

在同步用户数据的时候出现问题

查看了一下,先用cgi/user/get获取用户list,再用batchget去获取详细信息,但是batchget一次只能拉100,所以需要对前面的list进行处理

Deprecation Notice: Class

Deprecation Notice: Class Hanson\LaravelAdminWechat\Http\Controllers\Api\Mini\OrderController located in ./vendor/hanson/laravel-admin-wechat/src/Http/Controllers/Api/Payment/OrderController.php does not comply with psr-4 autoloading standard. It will not autoload anymore in Composer v2.0. in phar:///usr/local/bin/composer/src/Composer/Autoload/ClassMapGenerator.php:201
Stack trace:
 phar:///usr/local/bin/composer/src/Composer/Autoload/ClassMapGenerator.php:116
 phar:///usr/local/bin/composer/src/Composer/Autoload/AutoloadGenerator.php:355
 phar:///usr/local/bin/composer/src/Composer/Autoload/AutoloadGenerator.php:341
 phar:///usr/local/bin/composer/src/Composer/Autoload/AutoloadGenerator.php:264
 phar:///usr/local/bin/composer/src/Composer/Installer.php:307
 phar:///usr/local/bin/composer/src/Composer/Command/RequireCommand.php:248
 phar:///usr/local/bin/composer/src/Composer/Command/RequireCommand.php:205
 phar:///usr/local/bin/composer/vendor/symfony/console/Command/Command.php:245
 phar:///usr/local/bin/composer/vendor/symfony/console/Application.php:835
 phar:///usr/local/bin/composer/vendor/symfony/console/Application.php:185
 phar:///usr/local/bin/composer/src/Composer/Console/Application.php:281
 phar:///usr/local/bin/composer/vendor/symfony/console/Application.php:117
 phar:///usr/local/bin/composer/src/Composer/Console/Application.php:113
 phar:///usr/local/bin/composer/bin/composer:61
 /usr/local/bin/composer:24

Illuminate\Database\QueryException

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'json not null comment '商品信息', `date_info` json not null comment '使用' at line 1 (SQL: create table `wechat_cards` (`id` bigint unsigned not null auto_increment primary key, `app_id` varchar(255) not null, `card_type` varchar(255) not null comment '类型', `card_id` varchar(255) not null comment '微信卡券id', `logo_url` varchar(128) not null comment '卡券的商户logo', `code_type` varchar(16) not null comment '码型', `brand_name` varchar(255) not null comment '商户名字', `title` varchar(255) not null comment '卡券名', `color` varchar(16) not null comment '券颜色', `notice` varchar(255) not null comment '卡券使用提醒', `description` varchar(255) not null comment '卡券使用说明', `sku` json not null comment '商品信息', `date_info` json not null comment '使用日期', `created_at` timestamp null, `updated_at` timestamp null) default character set utf8mb4 collate 'utf8mb4_unicode_ci')

Identifier "menu" is not defined.

Pimple\Exception\UnknownIdentifierException
Identifier "menu" is not defined.

"encore/laravel-admin": "^1.8",
"hanson/laravel-admin-wechat": "^1.0",
"laravel/framework": "^6.2",

安装依赖完成

composer require hanson/laravel-admin-wechat -vvv

安装完成

php artisan wechat:install -m

公众号的菜单管理就出现这个错误Identifier "menu" is not defined.

创建菜单出错

创建公众号菜单,提示修改成功,点击提交以后,没有报错,没有提示,再次刷新后发现没有保存住

用了一段时间突然报错。求大佬指导

报错内容:
Method [detail] does not exist on [Hanson\LaravelAdminWechat\Http\Controllers\Admin\ConfigController]. {"exception":"[object] (BadMethodCallException(code: 0): Method [detail] does not exist on [Hanson\\LaravelAdminWechat\\Http\\Controllers\\Admin\\ConfigController].

还有就是公众号点同步用户会提示在后台同步用户中。。。之后页面刷新。但是不会有任何的变化。但是从微信公众平台看确实是有新增的用户。拉取不下来。也没有任何异常报错。

Laravel 5.5,Laravel-Admin 1.7.14

文件命名空间错误

文件名:laravel-admin-wechat/src/Http/Controllers/Api/Payment/OrderController.php /

namespace Hanson\LaravelAdminWechat\Http\Controllers\Api\Mini;

namespace Hanson\LaravelAdminWechat\Http\Controllers\Api\Payment;

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.