之前就有想法做一个自动收款然后交易的程序, 因为支付宝和微信的官方收款api只对企业开放!
但是前段时间因为主机商 (息壤)不做主机业务了, 导致我的备案被取消, 又在阿里云重新备案耽搁了一个月左右, 这几天才审核下来!
首先还是需要跑起来我们的微信机器人程序, 目前由很多开源的机器人程序可以自己选择, 现在以 php 的vbot 为例子:
目前主要讲技术细节:
首先我经过给微信转账查看收到数据来分析(抓包)发现, 微信支付在个人收款账号支付成功后, 除了一条模板消息之外, 没有其他的数据被监控到, 因此只能从模板消息入手了,
首先给自己的收款码付钱:
转账之后, 接下里我们怎么分析到这条呢? 我的方法如下:
为了扩展, 我建了一个配置文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
{ "meet": [ "测试群", "加班or吃饭群", "供应链富豪群" ], "skeyword": [ "记录", "保存" ], "at": [ { "kwd": [ "读书馆", "记录馆" ], "url": "xxx", "action": "search" } ], "monitor": [ { "text": "红包", "fromType": "group", "type": "share", "url": "xxx" }, { "text": "支付收款", "fromType": "official", "type": "official", "url": "xxx" } ], "debug": false, "logGroup": [] } |
收到数据之后先分析数据类型: 如果是 微信公众号消息(fromType=official), 则走我们的配置文件, 也就是 monitor 项,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
protected function monitor () { $config = log::includeConfig(); $message = $this->message; $nextData = []; foreach ($config['monitor'] as $k => $v) { $_type = strtolower(isset($message['type']) ? $message['type']: ''); $status1 = (strtolower($message['fromType']) == $v['fromType']) ? true: false; $status2 = ($_type == $v['type']) ? true: false; $inVal = ['official', 'share']; if (in_array($_type, $inVal)) { $status3 = (strpos($message['title'], $v['text']) > 0) ? true : false; } else { $status3 = (strpos($message['content'], $v['text']) > 0) ? true : false; } if ($status1 && $status2 && $status3) { $nextData = $v; log::write($v, '命中数据'); break; } } if(!empty($nextData)) { $text = $this->sendApi($nextData['url']); return $text; } } |
循环配置项, 如果是公众号的消息, 并且在 原始数据的字段里有 指定的关键字, 则 触发消息推送到指定的URL(sendApi),处理完成之后再返回到服务器,
哈哈哈就是一分钱, 我们抓到的数据解析如下:
我们得到这些数据后开始分析, 然后返回结果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
public function payBack () { log::getInstance()->set(input(), 'payBack'); $str = $this->rawArr['description']; $array = array_unique(explode(',', str_replace("\n",",",$str))); log::getInstance()->set($array, 'payBack'); $money = $array[0]; $formData = [ 'money'=> null, 'mark'=> null ]; $isMatched = preg_match_all('/¥(.*)/', $money, $matches); if ($isMatched) { $formData['money'] = $matches[1][0]; } $mark = $array[1]; $isMatched = preg_match_all('/\d{4,6}/', $mark, $matches); if ($isMatched) { $formData['mark'] = $matches[0][0]; } log::getInstance()->set($formData, 'formData'); out::success($formData, '感谢, 收到您的付款'); } |
利用正则表达式 拆了 description 字段来分析, 得到数据后返回给接口处理,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
[命中数据(array)][2019-09-09 17:55:34] ------------------------------------- {"text":"支付收款","fromType":"official","type":"official","url":"http:\/\/api.he29.com\/index\/wechat\/index.html?act=payBack"} ------------------------------------- [sendApi数据URL(text)][2019-09-09 17:55:34] ------------------------------------- http://api.he29.com/index/wechat/index.html?act=payBack ------------------------------------- [sendApi接口返回(array)][2019-09-09 17:55:34] ------------------------------------- {"code":200,"data":{"money":"0.10","mark":"2580"},"msg":"感谢, 收到您的付款"} ------------------------------------- [系统及消息拦截处理结果:(text)][2019-09-09 17:55:34] ------------------------------------- 感谢, 收到您的付款 ------------------------------------- [:即将回复的消息(最终结果)(text)][2019-09-09 17:55:34] ------------------------------------- 感谢, 收到您的付款 ------------------------------------- |
sendApi 获取到了我刚才的转账金额, 还有备注(我刚备注写了2580), 完成!
程序的用途??
可以作用在一些自动交易的场景, 不需要人为干预,
例如: 我们贴出付款吗, 让用户付款之后才能查看指定的内容, 在弹出付款码的时候, 自动随机生成一个 code, 用来标示用户此次的行为, 在付款时候让用户添加到备注里来标明!
当然还有更多的场景都可以使用!
ps:来源文献参考:
01, 天明·新氧供应链富豪群~
02, 天明·加班~吃饭群