2009年4月 的存档

支付宝集成经验之技术支持问题

经过三天的努力,终于把接口调通了。在调试的过程中,遇到了一些文档中未提到的问题。而且也发现了文档和PHP编程接口的一些缺陷和错误。
这些缺陷和错误可能给开发者带来了一些误导。

文档错误:
1)所有的文档中都把错误代码HAS_NO_PRIVILEGE(没有权限访问该服务)写成HASNO_PRIVILEGE。

 
文档缺陷:
1)文档《标准快速付款接口文档 V2.0》和《批量付款到帐号》中关于数字签名部分有内容不明确。
《标准快速付款接口文档 V2.0》5.2.4. 支付宝系统返回处理结果:

支付宝系统接收到商户系统发起的请求,处理成功后返回的参数中同样包含有参数sign、sign_type,商户需根据sign_type 计算sign 值,最终检验支付宝系统返回的sign 值,这里要注意的是商户需要对每一个返回参数的值先进行decode 后再验证sign。

这里的decode我的理解应该是转换编码的意思吧?!但第一次看会很直觉地以为是urldecode。

2)文档中没有提到,本地以某种编码提交给支付宝,支付宝在发通知的时候就会以该编码对数据进行编码并发回本地。虽然这是比较容易想到的,但是文档还是应该说清楚。毕竟,搞错编码是网络传输中经常会出问题。
3)支付宝返回到我的return_url中的参数中,is_success这个参数没有说明,虽然字面就看得出来,但是写到文档里也没什么不好吧。
4)文档《标准快速付款接口文档 V2.0》中没有错误代码TRADE_SELLER_NOT_MATCH,网上查了好像是网址不匹配还是什么原因,不清楚。重现方法:用测试帐号***@***.com发个out_trade_no为1的请求就会出现。
5)文档中还没提到,当网站使用非第三方权威机构签名的SSL证书时,将收不到支付宝的notify。确认已经加了notify_url。

PHP编程接口缺陷:
1)编程接口及示例代码写得过于随便,出现明显的错误
批量支付示例代码index.php中

"pay_date" => date(Ymd),  //付款日期 格式20070412

应为

"pay_date" => date('Ymd'),  //付款日期 格式20070412
"batch_no"  => date(Ymdhms) , //批量付款订单号

应为

"batch_no"  => date('Ymdhms') , //批量付款订单号

出现这个错误,说明了支付宝在发demo代码给用户时没有先测试,至少是发给我的这份没有,因为这个demo是不可能运行得起来的。

2)alipay_service.php中

if($parameter['_input_charset'] == "")

应为

if (array_key_exists('_input_charset', $parameter))

否则,当传进来的$parameter不包含_input_charset项是会出现错误Undefined index: _input_charset

3)编程接口能写得完善一些,实现DSA签名和RAS签名功能

另外,demo代码中把提交表单的按钮放到form外面了。一开始我没注意为什么要这么做,后来遇到签名错误时,弄了一个小时才发现,原来的我把提交按钮放到了FORM里面,并给了提交按钮一个name属性。这导致了提交到支付宝的数据中多了一项,导致签名错误。这是一个很隐蔽的陷阱,在文档中明确提醒集成开发者,相信会对集成开发者有很大的帮助。避免像我一样浪费了一个小时才找到错误原因。

httpd、php编译参数

PHP编译参数

CFLAGS="-O2" ./configure --prefix=/usr/local --with-config-file-path=/etc \
--with-apxs2=/usr/local/httpd/bin/apxs  --with-libdir=lib --with-mysql=no  \
--disable-ipv6 --disable-tokenizer --disable-short-tags --enable-mbstring=shared  \
--with-gettext=shared --with-regex=php --with-freetype-dir=/usr/local --with-gd=shared \
--with-png-dir=/usr/local --with-jpeg-dir=/usr/local --with-pdo-mysql=shared,/usr/local/mysql \
--enable-pdo=shared --with-pdo-sqlite=shared --with-sqlite=shared --with-openssl-dir=/usr/local/openssl \
--with-openssl=/usr/local

APR编译参数

CFLAGS="-O2" ./configure --prefix=/usr/local

APR-UTIL编译参数

CFLAGS="-O2" ./configure --prefix=/usr/local/apr-util/ --with-apr=/usr/local/apr --with-mysql=/usr/local/mysql/

HTTPD编译参数

LDFLAGS="-L/usr/local/apr/lib" ./configure --prefix=/usr/local/httpd --with-apr=/usr/local/apr  \
--with-ssl=/usr/local/openssl --enable-mods-shared=all --enable-so --with-apr-util=/usr/local/apr-util \
--enable-modules=all --enable-isapi=shared --enable-cgi=shared --enable-ssl=shared

丰顺县汤南镇罗氏世系表

国朝凤宣隐,克仕光恩文。
邦端贞德裕,世绍礼义尊。
尧舜宗英俊,孔曾道永存。
天嘉明福善,万有继登云。
承平开泰运,先哲衍经纶。
益智连科捷,蓝田耀玉琨。

罗氏始祖画像

罗氏始祖画像

MySQL安装步骤

  1. 添加mysql用户组和mysql用户
  2. 从源码编译安装
  3. 把mysql/support-files/my-small.cnf(根据实际情况可选择my-large.cnf或者my-medium.cnf)复制到/etc/my.cnf
  4. 把mysql/support-files/mysql.server复制到/etc/init.d/mysqld,并添加可执行权限;
  5. 运行 mysql/bin/mysql_install_db安装数据库文件
  6. 将mysql/var的所有者设置成mysql
  7. 设置用户权限和密码
GRANT ALL PRIVELEGES ON *.* TO root@'%' IDENTIFIED BY 'password';

操作系统:CentOS 5.2

关闭防火墙

在家做开发开着防火墙是没什么意义的,只会惹来一堆麻烦,关掉为好。

临时关闭

/etc/init.d/iptables stop

永久关闭

chkconfig --level 35 iptables off

CentOS国际化配置

配置文件

/etc/sysconfig/i18n

设置为相应的区域和编码就行了

LANG="zh_CN.UTF-8"

我疯了,Windows!

今天回家重装了系统,弟弟的移动硬盘中毒了,根目录下有一个autorun.vinf的文件,病毒本体是一个.vmx文件,在回收站目录里面。

这两个文件的所有者被设置成一串不知道什么用户,其它用户都没有权限删除它,包括管理员。试过了好多文件删除工具都删除不了,包括DeleteOnBoot。只能格式化了。

Windows的设计者不知道怎么想到,竟然还有管理员都没有的权限。我无语了。