“亲,来一个”使用Yii2实现微信发红包解决方法 - EasyWechat版本

1,312 阅读4分钟

话说上一篇我们讲了“企业付款到零钱”的实现方案(传送门),有人肯定要说,直接打款是不是太不友好了,过个年节的你公司就不能给每人发个红包啥的么?

放心好啦,微信支付同样提供了发红包的接口,现在北哥就给你讲讲如何将发红包的功能纳入到我大Yii2旗下。

先说下本文会涉及的知识点

  • Yii2 Framework
  • EasyWeChat
  • 微信红包接口

这个发红包功能初期被很多三级分销和微商系统使用,现在被禁止的很厉害,不过如果利用好了,对于公众号的推广还是相当相当的。

另外这也一个需要开通的功能😟😟😟,进入到微信支付平台。

先开通

对于通过此模块产生的红包,均会通过此商户关联的公众号推送给客户。

一个疑问

你问:但是如果我没有关注公众账号那?

我答:那你一样可以收到,不过不是公众号推送的,而是微信自己的服务通知推送的,反正关不关注钱💰都收到了。给你看看流程图

没有关注对应公众号收红包流程

下面的情景均为已关注公众号后的收红包情况。

准备工作

微信支付的发红包功能也分为支付后台直接发放和通过接口方法,这里讲接口方法。(直接发放传送门

企业付款到零钱一样,发红包也是一个商户将自己余额的钱拿出来,因此在配置上很多雷同。

同样需要配置3个参数和2个证书文件。

  • appId & mchid & key (参数可以在公众号后台找到)
  • cert & key 证书 (微信支付平台 ➭ 账户中心 ➭ API安全 ➭ 下载证书)
  • 商户余额必须有钱

这些配置和企业付款到零钱一模一样~~~~

开始编码

微信接口发红包有两种

  • 普通红包
  • 裂变红包

为避免重复造轮子,在本文我们依然使用EasyWeChat来实现它们。

无论是什么形式的红包,配置参数是必须要的,和企业付款到零钱一样。我们配置yii2的 config/web.php

// 配置文件conf/params.php
return [
    'WECHAT'=>[
        /**
         * Debug 模式,bool 值:true/false
         *
         * 当值为 false 时,所有的日志都不会记录
         */
        'debug'  => true,

        /**
         * 账号基本信息,请从微信公众平台/开放平台获取
         */
        'app_id'  => '必须要',        // AppID
        'secret'  => '不是必须的',        // AppSecret
        'token'   => '不是必须的',        // Token
        'aes_key' => '',
        ...

        'payment' => [
            'merchant_id'        => '必须要',
            'key'                => '必须要',
            'cert_path'          => 'path/to/your/cert.pem'//必须
            'key_path'           => 'path/to/your/key'//必须
        ],
    ],
];

发普通红包

这个比较简单,就是直接给一个openid发一个固定金额的红包,先看效果图吧。

发普通红包

// 发红包的action
namesapce app\controllers;

use yii\web\Controller;
use EasyWeChat\Foundation\Application;
use Yii;

class UserController extends Controller {
    public function actionRed($id,$money)){
        $user = User::findOne($id);

        //    配置支付参数
        $conf = Yii::$app->params['WECHAT'];        
        $wxApp = new Application($config);
        $luckyMoney = $wxApp->lucky_money;

        $luckyMoneyData = [
            'mch_billno'       => str_random(16),
            'send_name'        => '红包发送者名称',
            're_openid'        => $user->open_id,
            'total_num'        => 1,  //固定为1,可不传
            'total_amount'     => $money*100,  //单位为分,不小于100
            'wishing'          => '祝福语',
            'act_name'           => '活动名称',
            'remark'           => $remark,
        ];
        $result = $luckyMoney->sendNormal($luckyMoneyData);
    }
}

这样微信就将红包发了指定openId的会员。

发裂变红包

就是说我先将一组红包(N个)发给了小明,然后小明领取一个,并且他有权利将剩余的N-1个红包发给他的朋友。

聚变红包

你看到了,图1的人收到后可以转发给好友,他的朋友图2收到红包领取后,但是图2并没有转发好友的功能,所以叫裂变,否则就是聚变了。

看看代码实现

// 发红包的action
namesapce app\controllers;

use yii\web\Controller;
use EasyWeChat\Foundation\Application;
use Yii;

class UserController extends Controller {
    public function actionRed($id,$money)){
        $user = User::findOne($id);

        //    配置支付参数
        $conf = Yii::$app->params['WECHAT'];        
        $wxApp = new Application($config);
        $luckyMoney = $wxApp->lucky_money;

        $luckyMoneyData = [
            'mch_billno'       => str_random(16),
            'send_name'        => '红包发送者名称',
            're_openid'        => $user->open_id,
            'total_num'        => 3,  
            'total_amount'     => $money*100,  //单位为分,不小于300
            'wishing'          => '祝福语',
            'act_name'           => '活动名称',
            'remark'           => $remark,
            'amt_type'         => 'ALL_RAND',  //可不传
        ];
        $result = $luckyMoney->sendGroup($luckyMoneyData);
    }
}

总结下

上面就是通过微信支付的接口来发红包,当然这也有很多限制,比如每天的限额,包括上面的代码我只写了必填项,还有哪些元素的,望诸君自行查看文档,字段都是一样的。

另外就是红包结果返回和查询红包记录的实现也相对比较简单,不再重复,本文目的是顺出发红包的流程以及一些关键点的预防(比如没有关注公众号怎么办,比如什么是裂变等)

接口发红包官方接口连接:pay.weixin.qq.com/wiki/doc/ap…

还有一个好消息,北哥在segmentfault上下周二(6月27)有直播,主讲yii2和微信支付,掘金社区初来驾到,特给咱社区留10个免费码,对yii2集成微信支付不太明白的兄弟可以用下,就不用10.24元的直播费了。

地址 segmentfault.com/l/150000000…

(完)