支付宝双功能接口使用

来源:互联网 发布:java中的wait 编辑:程序博客网 时间:2024/04/30 06:10

最近公司有个项目,让我研究支付宝的接口。尽管支付宝官网上提供了相对全面的教程及文档,并提供在线技术支持,但是最初还是进入了一个误区,总觉得应该记载下来。因为支付宝并不提供测试账号,所以必须申请,而最初我们只能使用个人账号进行申请,由于是最初是想做虚拟交易,查了官方资料推荐的方式就是使用即时到帐了,但是由于我们是个人,而且之前也没有进行过相关的申请及运营,我就理所当然的以为个人账号只能申请担保交易接口了,后来才知道个人账号也是可以申请双接口的。

首先重述一下这个几个概念吧。

担保交易

担保交易是我们最熟悉也是最常用的付款方式了,尤其是经常网购的网民们。担保交易的流程是:买家先将交易资金存入支付宝并通知卖家发货,买家确认收货后资金自动进入卖家支付宝账户,完成交易。

及时到账

及时到账从字面理解便知其意了,网上交易时,买家的交易资金直接打入卖家支付宝账户,这对于企业而言可以快速回笼交易资金。当然这种方式相对担保交易而言买家需要担当一定风险,所以这种方式申请相对比较复杂和困难,适用于做一些虚拟物品交易,如充值花费,购买Q币等等。为了降低用户的风险,支付宝对于这种方式审核相对比较严格,为的就是保障用户的权益。

双功能接口

既然是双功能,那就是两种方式都可以使用,最初理解之所以有偏差就是因为双功能包含了即时到帐,当时觉得既然及时到账不能申请,那么双功能肯定也不行了。后来搞明白之后,才发现误解了支付宝的初衷。双功能接口的流程是:买家付款时,可选择担保交易或即时到账中的任一支付方式进行付款,完成交易。这种方式取决于买家,所以也保障了用户的权益。

 

关于使用

准备工作:申请一个商户号作为测试,个人账号即可。申请流程请点击此处查看。

申请通过后,就可以进行集成了,你可以自主集成也可以申请技术支持,其实很简单,根本不需要申请技术支持的,况且你也不希望把你的代码发给支付宝吧。

接下来,到 支付宝官网 下载最新的接口文档。本文以双功能接口为例使用PHP版本UTF编码格式进行说明一些需要注意的示例,实际请根据个人需要进行选择,官方接口中还提供了ASP、C#、JAVA语言的开发文档及接口。

从官方文档中你可以看到支付宝的数据交互原理,如图所示:

点击查看原图

其实对于我们商户网站来说,我们主要做的是[1]构造请求数据,以及[5]对相应的数据进行处理,其他的支付宝会进行处理。

构造请求数据

官方demo中提供的很全面,我们只需要把相应的值改成我们实际订单中的即可。

01//构造要请求的参数数组,无需改动
02$parameter array(
03        "service" => "trade_create_by_buyer",
04        "partner" => trim($alipay_config['partner']),
05        "payment_type"  => $payment_type,
06        "notify_url"    => $notify_url,
07        "return_url"    => $return_url,
08        "seller_email"  => $seller_email,
09        "out_trade_no"  => $out_trade_no,
10        "subject"   => $subject,
11        "price" => $price,
12        "quantity"  => $quantity,
13        "logistics_fee" => $logistics_fee,
14        "logistics_type"    => $logistics_type,
15        "logistics_payment" => $logistics_payment,
16        "body"  => $body,
17        "show_url"  => $show_url,
18        "receive_name"  => $receive_name,
19        "receive_address"   => $receive_address,
20        "receive_zip"   => $receive_zip,
21        "receive_phone" => $receive_phone,
22        "receive_mobile"    => $receive_mobile,
23        "_input_charset"    => trim(strtolower($alipay_config['input_charset']))
24);

具体参数的意思请查看官方文档4.2请求参数列表,里面讲解的很详细。

可能你会很好奇,那么数据怎么传递给支付宝的呢,在支付宝接口文档中的类AlipaySubmit文件中的buildRequestForm方法:

01/**
02 * 建立请求,以表单HTML形式构造(默认)
03 * @param $para_temp 请求参数数组
04 * @param $method 提交方式。两个值可选:post、get
05 * @param $button_name 确认按钮显示文字
06 * @return 提交表单HTML文本
07 */
08function buildRequestForm($para_temp$method$button_name) {
09    //待请求参数数组
10    $para $this->buildRequestPara($para_temp);
11     
12    $sHtml "<form id='alipaysubmit' name='alipaysubmit' action='".$this->alipay_gateway_new."_input_charset=".trim(strtolower($this->alipay_config['input_charset']))."' method='".$method."'>";
13    while (list ($key$val) = each ($para)) {
14        $sHtml.= "<input type='hidden' name='".$key."' value='".$val."'/>";
15    }
16 
17    //submit按钮控件请不要含有name属性
18    $sHtml $sHtml."<input type='submit' value='".$button_name."'></form>";
19     
20    $sHtml $sHtml."<script>document.forms['alipaysubmit'].submit();</script>";
21     
22    return $sHtml;
23}

按照官方的事例,当我们发送请求之后,会看到一个空白页面有一个确认按钮,其实不太美观,如果想去掉,我们就可以把上面代码中的:

1$sHtml $sHtml."<input type='submit' value='".$button_name."'></form>";

改成:

1$sHtml $sHtml."</form>";

即把submit按钮去掉,因为下面有一行Javascript会自动提交表单,我们不用去管。

这样支付宝的请求就建立了。

还有一个比较重要的就是异步通知文件按照示例是notify_url.php,这个文件必须要放到服务器上,即支付宝可以远程访问到即可,顾名思义不能放到我们的localhost上进行测试。

具体返回的参数参照官方文档中6.2服务器异步通知参数说明。

官方实例中也提供了demo,因为商户网站可以在相应交易状态下进行业务逻辑的处理,如相应更新商户网站订单状态、发送邮件通知等等(在此处提醒一下:交易过程中支付宝并不会给买家发送邮件,所以这一点如果需求需要,需要我们商户网站自己完成)。

最初在使用支付宝异步通知文件的时候有个误区,即退款的订单,最初我测试的时候使用的是交易状态,还以为是无效的,后来才发现原来是我想错了。我们查看参数列表可以知道,退款状态和交易状态是不一样的。

具体说一下:就是当我们判断订单交易状态时我们需要考虑退款状态,我们需要把退款的状态使用refund_status这个参数,而不是trade_status。我是不是太傻了,下面粘贴一下修改后的代码,谨以希望其他人不要像我一样犯傻。

01//商户订单号
02$out_trade_no $_POST['out_trade_no'];
03//退款状态 penglig.com添加
04$refund_status $_POST['refund_status'];
05if($refund_status == 'WAIT_SELLER_AGREE') {
06    //该判断表示退款协议等待卖家确认中 
07    //判断该笔订单是否在商户网站中已经做过处理
08    //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
09    //如果有做过处理,不执行商户的业务程序
10     
11    echo "success";     //请不要修改或删除
12     
13    //调试用,写文本函数记录程序运行情况是否正常
14    logResult($out_trade_no."退款协议等待卖家确认:".$refund_status);
15}
16else if($refund_status == 'SELLER_REFUSE_BUYER') {
17    //该判断表示卖家不同意协议,等待买家修改  
18    //判断该笔订单是否在商户网站中已经做过处理
19    //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
20    //如果有做过处理,不执行商户的业务程序
21     
22    echo "success";     //请不要修改或删除
23     
24    //调试用,写文本函数记录程序运行情况是否正常
25    logResult($out_trade_no."卖家不同意协议,等待买家修改:".$refund_status);
26}
27else if($refund_status == 'WAIT_BUYER_RETURN_GOODS') {
28    //该判断表示退款协议达成,等待买家退货   
29    //判断该笔订单是否在商户网站中已经做过处理
30    //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
31    //如果有做过处理,不执行商户的业务程序
32     
33    echo "success";     //请不要修改或删除
34     
35    //调试用,写文本函数记录程序运行情况是否正常
36    logResult($out_trade_no."退款协议达成,等待买家退货:".$refund_status);
37}
38else if($refund_status == 'WAIT_SELLER_CONFIRM_GOODS') {
39    //该判断表示等待卖家收货  
40    //判断该笔订单是否在商户网站中已经做过处理
41    //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
42    //如果有做过处理,不执行商户的业务程序
43     
44    echo "success";     //请不要修改或删除
45     
46    //调试用,写文本函数记录程序运行情况是否正常
47    logResult($out_trade_no."等待卖家收货:".$refund_status);
48}
49else if($refund_status == 'REFUND_SUCCESS') {
50    //该判断表示退款成功
51    //判断该笔订单是否在商户网站中已经做过处理
52    //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
53    //如果有做过处理,不执行商户的业务程序
54     
55    echo "success";     //请不要修改或删除
56     
57    //调试用,写文本函数记录程序运行情况是否正常
58    logResult($out_trade_no."退款成功:".$refund_status);
59}
60else if($refund_status == 'REFUND_CLOSED') {
61    //该判断表示等待卖家收货  
62    //判断该笔订单是否在商户网站中已经做过处理
63    //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
64    //如果有做过处理,不执行商户的业务程序
65     
66    echo "success";     //请不要修改或删除
67     
68    //调试用,写文本函数记录程序运行情况是否正常
69    logResult($out_trade_no."退款关闭:".$refund_status);
70}
71else {
72    //其他状态判断
73    echo "success";
74     
75    //调试用,写文本函数记录程序运行情况是否正常
76    //logResult ("这里写入想要调试的代码变量值,或其他运行的结果记录");
77}

接下来将详细说明支付宝类文件所使用的方法。

0 0
原创粉丝点击