支付宝双功能接口使用
来源:互联网 发布: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
*/
08
function
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'
];
05
if
(
$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
}
16
else
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
}
27
else
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
}
38
else
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
}
49
else
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
}
60
else
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
}
71
else
{
72
//其他状态判断
73
echo
"success"
;
74
75
//调试用,写文本函数记录程序运行情况是否正常
76
//logResult ("这里写入想要调试的代码变量值,或其他运行的结果记录");
77
}
接下来将详细说明支付宝类文件所使用的方法。
- 支付宝双功能接口使用
- 银联支付接口+支付宝接口统一支付功能
- 使用易宝支付接口实现java网上支付功能。
- 订单支付功能对接支付宝支付接口
- 支付宝双功能接口,付款成功,显示错误结果
- 支付宝接口,不要使用ip支付
- 支付宝支付接口的使用
- ThinkPHP实现支付宝接口功能
- ThinkPHP实现支付宝接口功能
- ThinkPHP实现支付宝接口功能
- ThinkPHP实现支付宝接口功能
- ThinkPHP实现支付宝接口功能
- ThinkPHP实现支付宝接口功能
- ThinkPHP实现支付宝接口功能
- ThinkPHP实现支付宝接口功能
- ThinkPHP实现支付宝接口功能
- ThinkPHP实现支付宝接口功能
- ThinkPHP实现支付宝接口功能
- Android系统Recovery工作原理之使用update.zip升级过程分析(六)---Recovery服务流程细节
- Redis入门
- UIScrollViewDelegate 详解
- MySQL Range Optimization
- MySQL索引下推技术
- 支付宝双功能接口使用
- MyCAT ER分片的验证
- 多行文本溢出
- MySQL常见错误
- 1089. Insert or Merge (25)
- [置顶]Linux碎碎念
- [置顶]Oracle碎碎念~1
- [置顶]Shell碎碎念
- 8个方法让你成为更优秀的程序员