寇可往,吾亦可往 - 用Yii2实现对决支付宝的“微信企业付款到零钱”解决方案 - EasyWeChat版本

支付宝的企业用户是很方便的,收款后可转到个人支付宝,然后就进入个人卡了。微信支付默认都是需要对公账号,T+x结算,那怎么能像支付宝一样提现到个人卡,满足我们这些小老板那?这就有了"企业付款到零钱"接口,它可能更多是一个策略。

唠点闲篇儿

看看下面的三个图(好不容易让一个草榴网友在国外找到的)

2017年会更多....在小马哥和小龙哥的带领下,微信小伙伴充分发扬龙马精神,尤其支付市场,步步蚕食,好不痛快。

这也是工兵连在讲支付的时候先说微信的原因,好了,不多说废话,毕竟我这是严肃的原创技术文章

啥是“企业付款到零钱”

先贴一个官网说明:“企业付款提供由商户直接付钱至用户微信零钱的能力,支持平台操作及接口调用两种方式,资金到账速度快,使用及查询方便。主要用来解决合理的商户对用户付款需求,比如:保险理赔、彩票兑换等等。”

对于上述定义,北哥用大白话做下诠释

  • 这个接口可以编程

  • 钱最后进入了会员的微信零钱包。

  • 基于公众号配置,需要填写appId和会员的openid。

于是一个特别好的需求就诞生了,我们现在就做一个后台会员的打款功能。

开发前的准备工作

首先你必须开通微信支付且拥有“企业付款到零钱”的权限,进入微信支付 ? 产品中心,看看有没有企业付款到零钱,有就开通它,没有那就歇菜了~

现在开通这个也越来越难了,以前企业账号都是默认有,现在需要 1、商户号已入驻90日 2、商户号有30天连续正常交易。

所以说干啥都要尽快,要不吃屎都赶不上热乎的。

点击穿越到微信官方文档

我们需要3个参数和2个证书。

  • appId & mchid & key (参数可以在公众号后台找到)

  • cert & key 证书 (微信支付平台 ? 账户中心 ? API安全 ? 下载证书)

下载后证书目录如下

我们是PHP环境,所以需要使用其中的apiclient_cert.pem、apiclient_key.pem以及rootca.pem这3个,将这些证书文件保存到你服务器上,最好不要放到web下,放到@app下比较安全。

可以如我所做。

// 配置文件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'//必须
        ],
    ],
];

app_id、merchant_id、key、cert_path、key_path都是必须填写的,其中cert_path和key_path需要有效的物理路径。

我将证书放到了yii2程序根目录 /cert文件夹。因此如上路径配置。

开始打款

我们假设指定一个action来做打款的事情,使用EasyWeChat后代码变的更加简单。

// index.php?r=admin/user/send-money
namespace app\modules\admin\controllers;

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

class UserController extends Controller {
    ....
    /**
     * 给id会员微信打款
     * $params $money
    */
    public function actionSendMoney($id,$money){
        $user = User::findOne($id);

        //    配置支付参数
        $conf = Yii::$app->params['WECHAT'];
        
        $wxApp = new Application($config);
        //    初始化微信企业支付对象
        $merchantPay = $wxApp->merchant_pay;
        
        //    初始化支付到零钱包订单信息
        $merchantPayData = https://segmentfault.com/a/[
            //随机字符串作为订单号,跟红包和支付一个概念。'partner_trade_no' => str_random(16), 
            'openid' => $user->open_id,
            'check_name' => 'NO_CHECK',
            'amount' => $money*100,  //单位为分
            'desc' => "打款秒杀",
            'spbill_create_ip' =>$_SERVER['REMOTE_ADDR']
        ];
        
        $result = $merchantPay->send($merchantPayData);
        //$result['result_code']是否为SUCCESS 来判断是否成功,如果失败则信息再$result['err_code_des']内。
    }
    
    ...
}

我们看到了,经过EasyWeChat封装后的企业付款到零钱包变的非常简洁,配置一些必填项,然后传给 $merchantPay->send 即可。

返回的 $result 和官方文档一致。开启穿越

当然还是要有些注意的地方

  • spbill_create_ip 很多时候你本地调试发现不成功都是因为这个导致的

  • amount 企业付款金额最少为1元,就是说amount最少是100,微信支付里金额的单位都是分。

  • desc 这个字段不要乱写,在接收者微信零钱明细列表中会是 “企业付款:你的desc”

我们还可以通过EasyWechat来查询到零钱包的记录信息,留给大家自己思考,如果不会请留言。

最后为何开篇说对战支付宝那,这要追溯下“企业付款到零钱”的历史了,最开始它是必须先充值才能使用,但是去年年末出了一个运营账号的概念,你可以把和客户交易的钱直接转到企业付款里来。

这点改动也许对于微信是想让你的钱不要出去,仍然在我微信里玩。可是对于很多比如饭店、小企业而言,这个功能等价于是 公到私,和支付宝异曲同工,大大的方便了。

阿北曾经给一个饭店老板做自助订餐,眼看他每天1、2万的通过企业付款转账到个人微信上来,有机会也给大家讲讲YII2实现的订餐系统以及20w数据表的优化技巧

好了,就到这里,有啥不懂的请留言。

(完)

赞 (0) 评论 分享 ()