HostBill + SolusVM = Disaster

想吐槽这两货已经很久了,自从我去年很脑残的从 WHMCS、HostBill 里选了 HostBill 之后 …

嗯,噩梦就开始了。

首先是支付宝插件整合的问题,HostBill 官方的支付宝插件不能用。

为什么呢?日志里没提呀,嗯那我逆向工程看看吧 …于是我逆向工程发现了一个 Typo 然后感觉整体代码都写的太烂了于是重写了一个。

好的接下来我们需要把 SolusVM 整合进去,(⊙o⊙)… 听起来很简单是吧?

你错了,HostBill 的面向 Bug 编程真是深得我的真传,SolusVM Rebuild 的话会把 HostBill 数据库里的 Root 密码设置为 SolusVM 的登录密码。然后作为一个逆向工程爱好者我又一次看了它的源码,嗯 … 对不起我没找到在哪儿改的。

那,我去 SolusVM 看看文档自己发请求看看是哪个傻逼了吧。

1
2
3
4
5
6
7
8
aveline@web-a:~$ curl --insecure -i --data "id=$SOLUSVM_ACCESS_ID&key=$SOLUSVM_ACCESS_KEY&action=vserver-rebuild&template=linux-debian-7.3.0-x86-min-gen2-v1&vserverid=7&async=false&rdtype=json" https://master.solusvm.internal:5656/api/admin/command.php && echo
HTTP/1.1 200 OK
Content-type: text/html
Transfer-Encoding: chunked
Date: Tue, 10 Jun 2014 18:26:27 GMT
Server: SolusVM

{"status":"success","statusmsg":"Virtual server is being rebuilt","rootpassword":"5iuan90U","information":""}

然后等 VM 重装完了用这个密码登录上去果然可以,诶等等等等,登录上去之后,为毛还是 Ubuntu?!

看日志也别想了,没有的。有的也都显示是 Success 或者 Complete,和没有一样的。

看源码也别想了,这货代码不好好写,代码混淆倒是做的挺好,估计是写太烂不想给人看吧。

嗯,吐槽完毕。准备自己写 Billing Portal + 换 OpenStack(

好啦还是去写个 workaround 吧。叹气。

HostBill 支付宝模块更新

这次更新的主要内容有:

  • 不再使用和原有模块相同的文件名,避免被覆盖
  • 增加命名空间选项,防止共用商户时出现订单号重复导致无法支付的情况

戳这里下载

下载后解压到 HostBill 安装目录的 includes/modules/Payment 文件夹下,记得把 alipay-hostbill-1.4 重命名成 alipay2

另外由于模块名称变了,安装之后需要重新激活,新的模块名称是 Alipay2

呃如果觉得我描述的还有问题的话,复制以下命令执行就好啦:

1
2
3
4
5
cd /var/www/hostbill # 请替换成自己的 HostBill 安装目录
cd includes/modules/Payment
wget https://github.com/ym/alipay-hostbill/archive/1.4.tar.gz
tar zxvf 1.4.tar.gz
mv alipay-hostbill-1.4 alipay2

好像有同学不知道这里怎么填 … 嗯解释一下吧:

服务类型这里:

  • create_direct_pay_by_user 是即时到账交易接口
  • trade_create_by_buyer 是双接口
  • create_partner_trade_by_buyer 纯担保交易接口

然后代理商 ID 空着就行了。

如果有多个 HostBill 共用同一个支付宝账号的话,命名空间这里需要写一下名字,另外这里写了之后最好就不要再修改了,修改的话会导致用户还没支付的订单无法正确验证。

HostBill 支付宝模块

最近一阵子在搭建某 IDC 的客户与支持系统,由于 WHMCS 烂泥扶不上墙,所以我就选用了高大上的 HostBill。
(几乎免费的和一次性要付 999 刀的东西能比嘛

啊,当然呢,HostBill 也有很多不好的地方吖,比如这个自带的支付宝模块,就死活用不了,支付是没问题,但是回调啊总是 Failure。

找客服呢自然是没用的,为什么呢?我买了已经超过 30 天了,人家要额外收钱了而且还不一定能解决。

那只能自己来咯,首先付掉 2.50 EUR 在 http://easytoyou.eu 买个一天的 ionCube Decoder。

然后解密以下文件:

  • /includes/modules/Payment/class.alipay.php
  • /includes/modules/Payment/callback/alipay_return.php
  • /includes/modules/Payment/callback/alipay_callback.php

解密之后我发现调用模块居然是这样做的:

1
2
3
4
5
6
7
8
9
<?php
$_GET['cmd'] = 'callback';
$_GET['module'] = 'alipay';
$_GET['ali_type_r'] = 'callbak';
error_reporting( 0 );
session_name( 'SESSID' . substr( md5( $_SERVER['SERVER_NAME'] ), -4 ) );
session_start( );
include( '../../../../hbf/bootstrap.php' );
FrontController::init( 'module' );

你!能!想!象!调!用!模!块!居!然!用!$_GET!来!传!参!数!吗!
反!正!我!不!能!

好吧其实出错的原因呢和这儿关系不是很大,当然这么写肯定是不守妇道的!

这里用的是 $_GET['ali_type_r'],但是在 class.alipay.php 里面却检查的是 $_REQUEST['ali_type_r'],尼这是自己山寨的 $_GET 内容当然不会出现在 $_REQUEST 里啦!baka!

然后这里特么的你写的是 callbak 啊!睁大眼睛看看是不是少了一个 c

另外就是支付宝 return 的验证接口需要把 $_GET 里的所有内容做一个 chksum,然后,嗯,我想是个人都能想清楚了:
$_GET['cmd']$_GET['module']$_GET['ali_type_r'] 混进来之后 chksum 肯定会不一样的啦~

既然问题都知道了,那么就好解决了。

不过呢,作为蛋疼党,窝比较喜欢重写而不是修 Bug … 加起来连 500 行都不到嘛!(撸袖子

以及自带的模块用的还是老版本的支付宝接口,窝参考支付宝官方的 PHP 栗子更新了下。

嗯,以下是窝重写之后的代码,已经扔在 GitHub 上了喵~
https://github.com/ym/alipay-hostbill

下载之后扔在 includes/modules/Payment 目录覆盖原有文件即可。
我在 PHP 5.5 下测试过是木有问题的,其他版本有问题可能性也不大,因为这次比较收敛,没有怎么用新特性。
如果有问题的话,欢迎在 GitHub 上给我发 Bug 报告或者 Pull Request~

啊最后感谢师姑陪我写代码还送我蛋糕次以及顺便吐槽下支付宝你的 PHP 栗子是临时工写的吗,veryfyisSgin 这些是个什么玩意儿啊?!
再顺便吐槽下 1901 咖啡馆 你家为什么没有一个能让我吃 / 喝的下去的玩意儿以及为何 Wi-Fi 如此之烂以至于我在四月份的第一天就用掉了 900 M 的 3G 流量,太讨厌了!!!
发这篇文章到 Twitter 的时候我又发现了一个槽点啊哈哈,Logdown 的 slug 生成居然把 支付宝 给翻译成了 PayPal,给跪了!

哦,对了,刚才的蛋糕忘记上图了:

IMG_1006.JPG