啥是“企业付款到零钱”
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-unf1BM56-1588318076122)(https://nai8.me/uploads/question/2017/0619/1497851093-594764d54a886.jpg)]
对于上述定义,北哥用大白话做下诠释
- 这个接口可以编程。
- 钱最后进入了会员的微信零钱包。
- 基于公众号配置,需要填写appId和会员的openid。
于是一个特别好的需求就诞生了,我们现在就做一个后台会员的打款功能。
开发前的准备工作
首先你必须开通微信支付且拥有“企业付款到零钱”的权限,进入微信支付 ➭ 产品中心,看看有没有企业付款到零钱,有就开通它,没有那就歇菜了~
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-73S8Ogw5-1588318076133)(https://nai8.me/uploads/question/2017/0619/1497851690-5947672ad175b.png)]
现在开通这个也越来越难了,以前企业账号都是默认有,现在需要 1、商户号已入驻90日 2、商户号有30天连续正常交易。
所以说干啥都要尽快,要不吃屎都赶不上热乎的。
我们需要3个参数和2个证书。
- appId & mchid & key (参数可以在公众号后台找到)
- cert & key 证书 (微信支付平台 ➭ 账户中心 ➭ API安全 ➭ 下载证书)
下载后证书目录如下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zvnF4FOa-1588318076137)(https://nai8.me/uploads/question/2017/0619/1497854359-594771970b162.png)]
我们是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 = [
//随机字符串作为订单号,跟红包和支付一个概念。
'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来查询到零钱包的记录信息,留给大家自己思考,如果不会请留言。