<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>M78星云api</title>
	<atom:link href="http://liferar.com/tag/api/feed" rel="self" type="application/rss+xml" />
	<link>http://liferar.com</link>
	<description>愿我们的梦想，像光那样，从一颗星到另一颗星!</description>
	<lastBuildDate>Wed, 07 Dec 2011 16:07:51 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>支付宝集成经验之技术支持问题</title>
		<link>http://liferar.com/alipay_problems_technical_support</link>
		<comments>http://liferar.com/alipay_problems_technical_support#comments</comments>
		<pubDate>Sat, 25 Apr 2009 10:10:07 +0000</pubDate>
		<dc:creator>CK猪</dc:creator>
				<category><![CDATA[CK猪是程序员]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[支付宝]]></category>

		<guid isPermaLink="false">http://liferar.com/?p=93</guid>
		<description><![CDATA[经过三天的努力，终于把接口调通了。在调试的过程中，遇到了一些文档中未提到的问题。而且也发现了文档和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', [...]]]></description>
			<content:encoded><![CDATA[<p>
经过三天的努力，终于把接口调通了。在调试的过程中，遇到了一些文档中未提到的问题。而且也发现了文档和PHP编程接口的一些缺陷和错误。<br />
这些缺陷和错误可能给开发者带来了一些误导。
</p>
<p>
文档错误：<br />
1）所有的文档中都把错误代码HAS_NO_PRIVILEGE(没有权限访问该服务)写成HASNO_PRIVILEGE。
</p>
<p> <br />
文档缺陷：<br />
1）文档《标准快速付款接口文档 V2.0》和《批量付款到帐号》中关于数字签名部分有内容不明确。<br />
《标准快速付款接口文档 V2.0》5.2.4. 支付宝系统返回处理结果：</p>
<blockquote><p>
支付宝系统接收到商户系统发起的请求，处理成功后返回的参数中同样包含有参数sign、sign_type，商户需根据sign_type 计算sign 值，最终检验支付宝系统返回的sign 值，这里要注意的是商户需要对每一个返回参数的值先进行decode 后再验证sign。
</p></blockquote>
<p>
这里的decode我的理解应该是转换编码的意思吧?!但第一次看会很直觉地以为是urldecode。
</p>
<p>
2）文档中没有提到，本地以某种编码提交给支付宝，支付宝在发通知的时候就会以该编码对数据进行编码并发回本地。虽然这是比较容易想到的，但是文档还是应该说清楚。毕竟，搞错编码是网络传输中经常会出问题。<br />
3）支付宝返回到我的return_url中的参数中，is_success这个参数没有说明，虽然字面就看得出来，但是写到文档里也没什么不好吧。<br />
4）文档《标准快速付款接口文档 V2.0》中没有错误代码TRADE_SELLER_NOT_MATCH，网上查了好像是网址不匹配还是什么原因，不清楚。重现方法：用测试帐号***@***.com发个out_trade_no为1的请求就会出现。<br />
5）文档中还没提到，当网站使用非第三方权威机构签名的SSL证书时，将收不到支付宝的notify。确认已经加了notify_url。
</p>
<p>
PHP编程接口缺陷：<br />
1）编程接口及示例代码写得过于随便，出现明显的错误<br />
批量支付示例代码index.php中</p>
<pre lang="php" line="21">
"pay_date" => date(Ymd),  //付款日期 格式20070412
</pre>
<p>应为</p>
<pre lang="php" line="21">
"pay_date" => date('Ymd'),  //付款日期 格式20070412
</pre>
<pre lang="php" line="25">
"batch_no"  => date(Ymdhms) , //批量付款订单号
</pre>
<p>应为</p>
<pre lang="php" line="25">
"batch_no"  => date('Ymdhms') , //批量付款订单号
</pre>
</p>
<p>
出现这个错误，说明了支付宝在发demo代码给用户时没有先测试，至少是发给我的这份没有，因为这个demo是不可能运行得起来的。
</p>
<p>
2）alipay_service.php中
</p>
<pre lang="php" line="26">
if($parameter['_input_charset'] == "")
</pre>
<p>应为</p>
<pre lang="php" line="26">
if (array_key_exists('_input_charset', $parameter))
</pre>
<p><p>
否则，当传进来的$parameter不包含_input_charset项是会出现错误Undefined index: _input_charset
</p>
<p>
3)编程接口能写得完善一些，实现DSA签名和RAS签名功能
</p>
<p>
另外，demo代码中把提交表单的按钮放到form外面了。一开始我没注意为什么要这么做，后来遇到签名错误时，弄了一个小时才发现，原来的我把提交按钮放到了FORM里面，并给了提交按钮一个name属性。这导致了提交到支付宝的数据中多了一项，导致签名错误。这是一个很隐蔽的陷阱，在文档中明确提醒集成开发者，相信会对集成开发者有很大的帮助。避免像我一样浪费了一个小时才找到错误原因。
</p>
<h3>相关文章</h3>
<ul class="related_posts">
<li><a href="http://liferar.com/relationship_between_variable_reference_and_memory_in_php" title="PHP中变量、引用和内存的对应关系" rel="bookmark inlinks">PHP中变量、引用和内存的对应关系</a><span class="count">( 0 )</span></li>
<li><a href="http://liferar.com/buffer_control_in_php" title="PHP输出缓存控制" rel="bookmark inlinks">PHP输出缓存控制</a><span class="count">( 0 )</span></li>
<li><a href="http://liferar.com/behavior_of_assignment_operator_in_php" title="PHP中=赋值操作符对不同数据类型的不同行为" rel="bookmark inlinks">PHP中=赋值操作符对不同数据类型的不同行为</a><span class="count">( 2 )</span></li>
<li><a href="http://liferar.com/httpd_php_compile_parameters" title="httpd、php编译参数" rel="bookmark inlinks">httpd、php编译参数</a><span class="count">( 0 )</span></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://liferar.com/alipay_problems_technical_support/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
	</channel>
</rss>

