本文介绍支付宝中当面付下属的条码支付、扫码支付、订单查询、退款申请的集成开发过程。
本文分为以下五个部分:
- 条码支付和扫码支付介绍
- 申请应用
- 密钥生成及配置
- api及sdk集成
- 条码支付、扫码支付、订单查询、退款申请
一、条码支付及二维码支付介绍
1. 条码支付
条码支付是支付宝给到线下传统行业的一种收款方式。商家使用扫码枪等条码识别设备扫描用户支付宝钱包上的条码/二维码,完成收款。用户仅需出示付款码,所有收款操作由商家端完成。其使用场景如下:
业务流程:
使用步骤:
- 用户登陆支付宝钱包,点击首页“付款”,进入付款码界面;
- 收银员在商家收银系统操作生成订单,用户确认支付金额;
- 用户出示钱包的“付款码”,收银员用扫码设备来扫描用户手机上的条码/二维码后,商家收银系统提交支付;
- 付款成功后商家收银系统会拿到支付成功或者失败的结果。
2. 扫码支付
扫码支付,指用户打开支付宝钱包中的“扫一扫”功能,扫描商家展示在某收银场景下的二维码并进行支付的模式。该模式适用于线下实体店支付、面对面支付等场景。
其使用场景如下:
业务流程:
使用步骤:
- 用户登陆支付宝钱包,点击首页“付款-扫码付”,进入扫一扫界面;
- 收银员在商家收银系统操作生成支付宝订单,用户确认支付金额,并生成二维码;
- 用户使用钱包的“扫码付”,扫收银员提供的二维码,确认支付;
- 用户付款后商家收银系统会拿到支付成功或者失败的结果。
二、接口申请
企业在申请企业支付宝之后,进行功能申请并签约,然后在蚂蚁金服开放平台中申请应用如下(详细过程就略了)
然后在功能列表中,申请当面付这一功能,申请成功后如下。
这样,我们就有了当面付的权限了。
三、密钥生成
在支付宝当面付的接口中,使用了非对称加密算法,商户自己的公钥和私钥需要自己使用openssl手动生成。对这些概念比较陌生的话,请先自行先了解一下密码学的相关知识。openssl也可以从方倍工作室博客中找到。
下载支付宝官方提供的密钥生成工具openssl,然后执行以下命令就可以生成公钥和私钥。
其中
1
|
genrsa -out rsa_private_key.pem 1024
|
是用于生成rsa私钥,执行后在程序目录中生成一个文件rsa_private_key.pem,其内容如下
-----begin rsa private key-----
miicxaibaakbgqcyffrongd8q/1krh1cpssri360dxlhi7zxdpjgye5hkdwf7u9b
3zzu9erzpm90xe7gzrksxigourh4uqhmvrbto3e+liyoynpd6as3q427kctit7aj
hhicz6gwhegtuivlqiuwlsauqcbi6do4gezrlvadzus0wcjijoxw02rxsqidaqab
aogaxbjyyvac4zj3jph8yostlr5n13bwdatdw/glwwt+0rnnei90tqhrnvy7lnvn
jgrprts182tvgjopxmwsnebakhiugidpq99gle4lgd5lkwtzkd84bmvhatfnsccz
cevfqkg3tzd4t3fq93frilsnnzplhiw53jirstckr3rx9oecqqdwmshyc91hevmq
qvnasbgeickwxhodqjdm2lhkbx4mrb9jezfds6mxwdajf2/qw+tgtpn3ybccdw/h
nghhqtstakea1vtyjodawwode8x4fu0ipq9+e19mcvoajjlbh46mropwgodj3raq
t/thakeaydjabstaiy2j18hitiyh+1bgjqjbakgrjxh5ofxsg7uxibcofyjifi34
g7ecfxxvcqxaaw4u4n2uy0c0txkl5t+lxzeqg8d/gfbjj0qutvnzgdofdoecqbhy
ozncfk6xe8pguxquht4jg/iu4djwjt+kuzbsjerhtcvyly4jpzfuohrkom4fj6/4
uuqwrjmabfgzrx4+sfkcqcni8rcz6yprh5keoepo3uazalnenp8dkkhgqchawdk7
7nzlj727nt23sthfx6nkhzyrujgq5vx1lkl0wkukbxm=
-----end rsa private key-----
命令
1
|
rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
|
是用于生成rsa公钥,执行后在程序目录中生成一个文件rsa_public_key.pem,其内容如下
-----begin public key-----
migfma0gcsqgsib3dqebaquaa4gnadcbiqkbgqcyffrongd8q/1krh1cpssri360
dxlhi7zxdpjgye5hkdwf7u9b3zzu9erzpm90xe7gzrksxigourh4uqhmvrbto3e+
liyoynpd6as3q427kctit7ajhhicz6gwhegtuivlqiuwlsauqcbi6do4gezrlvad
zus0wcjijoxw02rxsqidaqab
-----end public key-----
生成的这个rsa公钥,需要填写到应用中去,填写地址如下所示。私钥不需要填到配置中,到时候配置到代码中。
特别注意,密钥要去掉注释部分,且转换成一行字符,否则回车换行也成为密钥的一部分,将导致无法正常加解密。
同时,可以点击 “查看支付宝公钥”,将支付宝的公钥复制保存下来,后面的程序中将需要用到。
四、密钥生成api与密钥配置
公共参数
请求地址:
环境 | https请求地址 |
---|---|
正式环境 | https://openapi.alipay.com/gateway.do |
公共请求参数:
参数 | 类型 | 是否必填 | 最大长度 | 描述 |
---|---|---|---|---|
app_id | string | 是 | 32 | 支付宝分配给开发者的应用id |
method | string | 是 | 128 | 接口名称 |
format | string | 否 | 40 | 仅支持json |
charset | string | 是 | 10 | 请求使用的编码格式,如utf-8,gbk,gb2312等 |
sign_type | string | 是 | 10 | 商户生成签名字符串所使用的签名算法类型,目前支持rsa |
sign | string | 是 | 256 | 商户请求参数的签名串,详见签名 |
timestamp | string | 是 | 19 | 发送请求的时间,格式"yyyy-mm-dd hh:mm:ss" |
version | string | 是 | 3 | 调用的接口版本,固定为:1.0 |
notify_url | string | 否 | 256 | 支付宝服务器主动通知商户服务器里指定的页面http/https路径。 |
app_auth_token | string | 否 | 40 | 详见应用授权概述 |
biz_content | string | 是 | - | 请求参数的集合,最大长度不限,除公共参数外所有请求参数都必须放在这个参数中传递,具体参照各产品快速接入文档 |
请求参数
参数 | 类型 | 是否必填 | 最大长度 | 描述 |
---|---|---|---|---|
out_trade_no | string | 必须 | 64 | 商户订单号,64个字符以内、可包含字母、数字、下划线;需保证在商户端不重复 |
scene | string | 必须 | 32 | 支付场景 条码支付,取值:bar_code 声波支付,取值:wave_code |
auth_code | string | 必须 | 32 | 支付授权码 |
seller_id | string | 可选 | 28 | 如果该值为空,则默认为商户签约账号对应的支付宝用户id |
total_amount | price | 可选 | 11 | 订单总金额,单位为元, |
discountable_amount | price | 可选 | 11 | 参与优惠计算的金额,单位为元 |
undiscountable_amount | price | 可选 | 11 | 不参与优惠计算的金额,单位为元 |
subject | string | 必须 | 256 | 订单标题 |
body | string | 可选 | 128 | 订单描述 |
goodsdetail [] | 可选 | - | 订单包含的商品列表信息,json格式,其它说明详见商品明细说明 | |
operator_id | string | 可选 | 28 | 商户操作员编号 |
store_id | string | 可选 | 32 | 商户门店编号 |
terminal_id | string | 可选 | 32 | 商户机具终端编号 |
alipay_store_id | string | 可选 | 32 | 支付宝的店铺编号 |
extendparams | 可选 | - | 业务扩展参数 | |
timeout_express | string | 可选 | 6 | 该笔订单允许的最晚付款时间,逾期将关闭交易。 |
royaltyinfo | 可选 | - | 描述分账信息,json格式,其它说明详见分账说明 | |
submerchant | 可选 | - | 二级商户信息,当前只对特殊银行机构特定场景下使用此字段 |
公共响应参数
参数 | 类型 | 是否必填 | 最大长度 | 描述 |
---|---|---|---|---|
code | string | 是 | - | 网关返回码,详见文档 |
msg | string | 是 | - | 网关返回码描述,详见文档 |
sub_code | string | 否 | - | 业务返回码,详见文档 |
sub_msg | string | 否 | - | 业务返回码描述,详见文档 |
sign | string | 是 | - | 签名,详见文档 |
响应参数
参数 | 类型 | 是否必填 | 最大长度 | 描述 |
---|---|---|---|---|
trade_no | string | 必填 | 64 | 支付宝交易号 |
out_trade_no | string | 必填 | 64 | 商户订单号 |
buyer_logon_id | string | 必填 | 100 | 买家支付宝账号 |
total_amount | price | 必填 | 11 | 交易金额 |
receipt_amount | string | 必填 | 11 | 实收金额 |
buyer_pay_amount | price | 选填 | 11 | 买家付款的金额 |
point_amount | price | 选填 | 11 | 使用积分宝付款的金额 |
invoice_amount | price | 选填 | 11 | 交易中可给用户开具发票的金额 |
gmt_payment | date | 必填 | 32 | 交易支付时间 |
tradefundbill [] | 必填 | - | 交易支付使用的资金渠道 | |
card_balance | price | 选填 | 11 | 支付宝卡余额 |
store_name | string | 选填 | 512 | 发生支付交易的商户门店名称 |
buyer_user_id | string | 必填 | 28 | 买家在支付宝的用户id |
discount_goods_detail | string | 必填 | - | 本次交易支付所使用的单品券优惠的商品优惠信息 |
系统中配置如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
<?php
$config = array (
//支付宝公钥
'alipay_public_key' => "migfma0gcsqgsib3dqebaquaa4gnadcbiqkbgqddi6d306q8fifcoatxyiuejhkrivyisrcc73s3vf1zt7xn8rnpwjxo8pwajmmvytn9n4hq632qjbvhf8sxhi/fesraprwctzvzqetrnrwvxlo5jvmrgi60j8ue1efilzpxv9je9mkjzomdssymzkh2qhurcmzyi/fcea3/cnmw0qidaqab" ,
//商户私钥
'merchant_private_key' => "miicxaibaakbgqcyffrongd8q/1krh1cpssri360dxlhi7zxdpjgye5hkdwf7u9b3zzu9erzpm90xe7gzrksxigourh4uqhmvrbto3e+liyoynpd6as3q427kctit7ajhhicz6gwhegtuivlqiuwlsauqcbi6do4gezrlvadzus0wcjijoxw02rxsqidaqabaogaxbjyyvac4zj3jph8yostlr5n13bwdatdw/glwwt+0rnnei90tqhrnvy7lnvnjgrprts182tvgjopxmwsnebakhiugidpq99gle4lgd5lkwtzkd84bmvhatfnscczcevfqkg3tzd4t3fq93frilsnnzplhiw53jirstckr3rx9oecqqdwmshyc91hevmqqvnasbgeickwxhodqjdm2lhkbx4mrb9jezfds6mxwdajf2/qw+tgtpn3ybccdw/hnghhqtstakea1vtyjodawwode8x4fu0ipq9+e19mcvoajjlbh46mropwgodj3raqt/thakeaydjabstaiy2j18hitiyh+1bgjqjbakgrjxh5ofxsg7uxibcofyjifi34g7ecfxxvcqxaaw4u4n2uy0c0txkl5t+lxzeqg8d/gfbjj0qutvnzgdofdoecqbhyozncfk6xe8pguxquht4jg/iu4djwjt+kuzbsjerhtcvyly4jpzfuohrkom4fj6/4uuqwrjmabfgzrx4+sfkcqcni8rcz6yprh5keoepo3uazalnenp8dkkhgqchawdk77nzlj727nt23sthfx6nkhzyrujgq5vx1lkl0wkukbxm=" ,
//编码格式
'charset' => "utf-8" ,
//支付宝网关
'gatewayurl' => "https://openapi.alipay.com/gateway.do" ,
//应用id
'app_id' => "2016061501500000" ,
//异步通知地址,只有扫码支付预下单可用
'notify_url' => "http://www.fangbei.org/alipay/notify.html" ,
//最大查询重试次数
'maxqueryretry' => "10" ,
//查询间隔
'queryduration' => "3"
);
|
其中支付宝公钥就是在前面中复制保存的,直接复制到程序中即可,而商户私钥是之前openssl中生成的私钥。appid是该服务的id号。
而这个异步通知将会接收扫码支付结果的通知。
五、条码支付、扫码支付、订单查询、退款申请
1. 条码支付
条码支付的参数配置如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
// (必填) 商户网站订单系统中唯一订单号,64个字符以内,只能包含字母、数字、下划线,
// 需保证商户系统端不能重复,建议通过数据库sequence生成,
$outtradeno = "barpay" . date ( 'ymdhis' ) . mt_rand(100, 1000);
$subject = "方倍工作室-支付宝-当面付-扫码支付" ;
$totalamount = 0.01; // (必填) 订单总金额,单位为元,不能超过1亿元
// (必填) 付款条码,用户支付宝钱包手机app点击“付款”产生的付款条码
$authcode = $_post [ 'auth_code' ]; //28开头18位数字
// 支付超时,线下扫码交易定义为5分钟
$timeexpress = "5m" ;
// 创建请求builder,设置请求参数
$barpayrequestbuilder = new alipaytradepaycontentbuilder();
$barpayrequestbuilder ->setouttradeno( $outtradeno );
$barpayrequestbuilder ->settotalamount( $totalamount );
$barpayrequestbuilder ->setauthcode( $authcode );
$barpayrequestbuilder ->settimeexpress( $timeexpress );
$barpayrequestbuilder ->setsubject( $subject );
// 调用barpay方法获取当面付应答
$barpay = new alipaytradeservice( $config );
$barpayresult = $barpay ->barpay( $barpayrequestbuilder );
switch ( $barpayresult ->gettradestatus()) {
case "success" :
echo "支付宝支付成功:" . "<br>--------------------------<br>" ;
print_r( $barpayresult ->getresponse());
break ;
case "failed" :
echo "支付宝支付失败!!!" . "<br>--------------------------<br>" ;
if (! empty ( $barpayresult ->getresponse())) {
print_r( $barpayresult ->getresponse());
}
break ;
case "unknown" :
echo "系统异常,订单状态未知!!!" . "<br>--------------------------<br>" ;
if (! empty ( $barpayresult ->getresponse())) {
print_r( $barpayresult ->getresponse());
}
break ;
default :
echo "不支持的交易状态,交易返回异常!!!" ;
break ;
}
return ;
}
|
程序监测,最终提交的url如下
https://openapi.alipay.com/gateway.do?app_id=2016061501500000&version=1.0&format=json&sign_type=rsa&method=alipay.trade.pay×tamp=2016-08-26+17%3a14%3a52&auth_token=&alipay_sdk=alipay-sdk-php-20160411&terminal_type=&terminal_info=&prod_code=¬ify_url=&charset=utf-8&app_auth_token=&sign=emvobahpkw6b1m%2boxytdbupixniaq73jtiphlh2vuyy4ocjq2uivtxwttw0y%2b7uexhwily8fyrdonrjwsjbatraqbgclppc4ybqswtpcb%2f76d65dmqeyrenk2sgcqhxcijnkroqjgaqmbqdhneeru7swsnj%2fff%2f025yltzk5lzq%3d
发送的json数据如下:
1
2
3
4
5
6
7
8
|
{
"scene" : "bar_code" ,
"out_trade_no" : "barpay20160826051452680" ,
"total_amount" :0.01,
"auth_code" : "289743098358423535" ,
"timeout_express" : "5m" ,
"subject" : "方倍工作室-支付宝-当面付-扫码支付"
}
|
接收到的数据如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
{
"alipay_trade_pay_response" :{
"code" : "10000" ,
"msg" : "success" ,
"buyer_logon_id" : "118***@qq.com" ,
"buyer_pay_amount" : "0.01" ,
"buyer_user_id" : "2088002364008751" ,
"fund_bill_list" :[
{
"amount" : "0.01" ,
"fund_channel" : "alipayaccount"
}
],
"gmt_payment" : "2016-08-26 17:14:59" ,
"invoice_amount" : "0.01" ,
"open_id" : "20880044751374809757987911112575" ,
"out_trade_no" : "barpay20160826051452680" ,
"point_amount" : "0.00" ,
"receipt_amount" : "0.01" ,
"total_amount" : "0.01" ,
"trade_no" : "2016082621001004750244100034"
},
"sign" : "pedemwh6x73t9lmwrzpgnvb1npnktodw6+8mduturnpvwxr1jht+x3crt2g4sdnhzxkjtzspuxjnylswisrtnqjjzqrp5xmujxmaahp/d5xxeywasdag5cj7ygd7t80budasde4eoqq6ox7kzj6lwkcphox13ti+ukt1dgcqs5o="
}
|
2. 扫码支付
扫码支付的参数配置如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
// (必填) 商户网站订单系统中唯一订单号,64个字符以内,只能包含字母、数字、下划线,
// 需保证商户系统端不能重复,建议通过数据库sequence生成,
$outtradeno = "qrpay" . date ( 'ymdhis' ).mt_rand(100,1000);
$subject = "方倍工作室-支付宝-当面付-扫码支付" ;
$totalamount = "0.01" ;
// 支付超时,线下扫码交易定义为5分钟
$timeexpress = "5m" ;
// 创建请求builder,设置请求参数
$qrpayrequestbuilder = new alipaytradeprecreatecontentbuilder();
$qrpayrequestbuilder ->setouttradeno( $outtradeno );
$qrpayrequestbuilder ->settotalamount( $totalamount );
$qrpayrequestbuilder ->settimeexpress( $timeexpress );
$qrpayrequestbuilder ->setsubject( $subject );
// 调用qrpay方法获取当面付应答
$qrpay = new alipaytradeservice( $config );
$qrpayresult = $qrpay ->qrpay( $qrpayrequestbuilder );
// 根据状态值进行业务处理
switch ( $qrpayresult ->gettradestatus()){
case "success" :
echo "支付宝创建订单二维码成功:" . "<br>---------------------------------------<br>" ;
$response = $qrpayresult ->getresponse();
$qrcode = $qrpay ->create_erweima( $response ->qr_code);
echo $qrcode ;
print_r( $response );
break ;
case "failed" :
echo "支付宝创建订单二维码失败!!!" . "<br>--------------------------<br>" ;
if (! empty ( $qrpayresult ->getresponse())){
print_r( $qrpayresult ->getresponse());
}
break ;
case "unknown" :
echo "系统异常,状态未知!!!" . "<br>--------------------------<br>" ;
if (! empty ( $qrpayresult ->getresponse())){
print_r( $qrpayresult ->getresponse());
}
break ;
default :
echo "不支持的返回状态,创建订单二维码返回异常!!!" ;
break ;
}
|
生成的提交请求url如下
https://openapi.alipay.com/gateway.do?app_id=2016061501500000&version=1.0&format=json&sign_type=rsa&method=alipay.trade.precreate×tamp=2016-08-26+17%3a38%3a13&auth_token=&alipay_sdk=alipay-sdk-php-20160411&terminal_type=&terminal_info=&prod_code=¬ify_url=http%3a%2f%2f123.daoqidata.com%2fweixin%2frawpost.php&charset=utf-8&app_auth_token=&sign=ayyijrz63romvet8ayz58uiyv3y5irbbx8ctfx6znhkt%2fu11u7isuywcxjrwrwco2oq2tdo%2fjtuhrbbdp5ulntmubbuktqdccf53pf5yiudgikxupfyugeurtg3gw4dqxoinkm6zb6mi0n%2f9m78a%2fnp8gtz4wthyhil%2b%2fozsyt4%3d
发送的json数据如下:
1
2
3
4
5
6
|
{
"out_trade_no" : "qrpay20160826053813582" ,
"total_amount" : "0.01" ,
"timeout_express" : "5m" ,
"subject" : "方倍工作室-支付宝-当面付-扫码支付"
}
|
返回的数据如下:
1
2
3
4
5
6
7
8
9
|
{
"alipay_trade_precreate_response" :{
"code" : "10000" ,
"msg" : "success" ,
"out_trade_no" : "qrpay20160826053813582" ,
"qr_code" : "https://qr.alipay.com/bax00885xbhszseo9l7p404d"
},
"sign" : "vfntgo2wmz+2ce1l05lnywtfn4inhxo/tuabzibhn4fplxncvyc9ihs8s7wa3fyw23g30luepehkzwobnfpujilonmexzvelhv3ylinz+q2mq5m8sb/d61ypvf4bgy1ovlrt4d3h/i3judmzedbroyfn9kb9vskkayc+b6l41zw="
}
|
其中的 就是二维码链接地址,使用接口将其成二维码后。
当支付宝用户扫码的时候,接口通知将收到如下数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
{
"notify_id" : "4c2c04c3cc50e978d44212febe7c3f0lse" ,
"seller_email" : "pay***@fangbei.org" ,
"notify_type" : "trade_status_sync" ,
"sign" : "r0irdymsq0+zusuglzkuthcr40hoop+cckojvbcma1uji3rqqfe5xehojb1nmbcape3zxpkhxmdlis109ngpbgy+nuebr7yzjyur/hxq3wxeyfz8aiwlvlozhrf7dqwxdho/vhyexaleqvri/03m0hxrwhzkuou1es9wmgzolqq=" ,
"trade_no" : "2016082621001004750241229810" ,
"buyer_id" : "2088002364008751" ,
"app_id" : "2016061501500000" ,
"gmt_create" : "2016-08-26 18:20:37" ,
"out_trade_no" : "qrpay20160826062009757" ,
"seller_id" : "2088421202724253" ,
"notify_time" : "2016-08-26 18:20:37" ,
"subject" : "方倍工作室-支付宝-当面付-扫码支付" ,
"trade_status" : "wait_buyer_pay" ,
"open_id" : "20880044751374809757987911112575" ,
"total_amount" : "0.01" ,
"sign_type" : "rsa" ,
"buyer_logon_id" : "118***@qq.com"
}
|
当用户输入密码付款成功之后,将收到如下数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
{
"fund_bill_list" : "[{" amount ":" 0.01 "," fundchannel ":" alipayaccount "}]" ,
"subject" : "方倍工作室-支付宝-当面付-扫码支付" ,
"trade_no" : "2016082621001004750241229810" ,
"gmt_create" : "2016-08-26 18:20:37" ,
"notify_type" : "trade_status_sync" ,
"total_amount" : "0.01" ,
"out_trade_no" : "qrpay20160826062009757" ,
"invoice_amount" : "0.01" ,
"open_id" : "20880044751374809757987911112575" ,
"seller_id" : "2088421202724253" ,
"notify_time" : "2016-08-26 18:20:50" ,
"trade_status" : "trade_success" ,
"gmt_payment" : "2016-08-26 18:20:50" ,
"seller_email" : "pay***@fangbei.org" ,
"receipt_amount" : "0.01" ,
"buyer_id" : "2088002364008751" ,
"app_id" : "2016061501500000" ,
"notify_id" : "56f97611ee609f46384b188b409e75else" ,
"buyer_logon_id" : "118***@qq.com" ,
"sign_type" : "rsa" ,
"buyer_pay_amount" : "0.01" ,
"sign" : "nf/kjryack0utqlnrnuymisnyw6hsxqpjpk2o5mhcz+wzuvqbrd3sq5poo3gu7lsrosiuuio4jeyel12ek2+w3ltcls9wei60syowpocjeygmvfnzbvr6+k7yo5au2wikm3mksxm2xxib9xpmmrdacghvqz2bxuaqujkpk1ft0s=" ,
"point_amount" : "0.00"
}
|
3. 订单查询
订单查询的参数配置如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
////获取商户订单号
$out_trade_no = trim( $_post [ 'out_trade_no' ]);
//第三方应用授权令牌,商户授权系统商开发模式下使用
$appauthtoken = "" ; //根据真实值填写
//构造查询业务请求参数对象
$querycontentbuilder = new alipaytradequerycontentbuilder();
$querycontentbuilder ->setouttradeno( $out_trade_no );
$querycontentbuilder ->setappauthtoken( $appauthtoken );
//初始化类对象,调用querytraderesult方法获取查询应答
$queryresponse = new alipaytradeservice( $config );
$queryresult = $queryresponse ->querytraderesult( $querycontentbuilder );
//根据查询返回结果状态进行业务处理
switch ( $queryresult ->gettradestatus()){
case "success" :
echo "支付宝查询交易成功:" . "<br>--------------------------<br>" ;
print_r( $queryresult ->getresponse());
break ;
case "failed" :
echo "支付宝查询交易失败或者交易已关闭!!!" . "<br>--------------------------<br>" ;
if (! empty ( $queryresult ->getresponse())){
print_r( $queryresult ->getresponse());
}
break ;
case "unknown" :
echo "系统异常,订单状态未知!!!" . "<br>--------------------------<br>" ;
if (! empty ( $queryresult ->getresponse())){
print_r( $queryresult ->getresponse());
}
break ;
default :
echo "不支持的查询状态,交易返回异常!!!" ;
break ;
}
|
最终提交的url如下
https://openapi.alipay.com/gateway.do?app_id=2016061501500000&version=1.0&format=json&sign_type=rsa&method=alipay.trade.query×tamp=2016-08-26+18%3a27%3a07&auth_token=&alipay_sdk=alipay-sdk-php-20160411&terminal_type=&terminal_info=&prod_code=¬ify_url=&charset=utf-8&app_auth_token=&sign=eiuyjtes95quan3x9exbqzba%2fcvm5qgq0touss8mskcjhzacypnu7zt5mud31lpzpfhvejcksdwiq4tuntjpfpxirg7pktit09c%2bz8psua844y7hjkkx%2b4cvzcgto11m3ap0jecrtzw8hhjte9bpy1v43x2bsl5cp3ulpac1fsm%3d
发送的json数据如下:
1
2
3
|
{
"out_trade_no" : "qrpay20160826053813582"
}
|
接收到的数据如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
{
"alipay_trade_query_response" :{
"code" : "10000" ,
"msg" : "success" ,
"buyer_logon_id" : "118***@qq.com" ,
"buyer_pay_amount" : "0.01" ,
"buyer_user_id" : "2088002364008751" ,
"fund_bill_list" :[
{
"amount" : "0.01" ,
"fund_channel" : "alipayaccount"
}
],
"invoice_amount" : "0.01" ,
"open_id" : "20880044751374809757987911112575" ,
"out_trade_no" : "qrpay20160826053813582" ,
"point_amount" : "0.00" ,
"receipt_amount" : "0.01" ,
"send_pay_date" : "2016-08-26 17:38:58" ,
"total_amount" : "0.01" ,
"trade_no" : "2016082621001004750239053830" ,
"trade_status" : "trade_success"
},
"sign" : "e2mxjdahw/eqrfnkzgy/y//da5cmb54hnqa0cjbz+zcftuli1lvfms93onp7cpvk/fi7yxbkztkbpk29o4aewkxlsycrt92domayqahzyca7/5a3msc/awalyrfodwyjjdlncwdfrn9hx52ivrijxvlj0himviqqedavg28hpbo="
}
|
4. 订单退款
订单退款的参数配置如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
$out_trade_no = trim( $_post [ 'out_trade_no' ]);
$refund_amount = trim( $_post [ 'refund_amount' ]);
$out_request_no = trim( $_post [ 'out_request_no' ]);
//第三方应用授权令牌,商户授权系统商开发模式下使用
$appauthtoken = "" ; //根据真实值填写
//创建退款请求builder,设置参数
$refundrequestbuilder = new alipaytraderefundcontentbuilder();
$refundrequestbuilder ->setouttradeno( $out_trade_no );
$refundrequestbuilder ->setrefundamount( $refund_amount );
$refundrequestbuilder ->setoutrequestno( $out_request_no );
$refundrequestbuilder ->setappauthtoken( $appauthtoken );
//初始化类对象,调用refund获取退款应答
$refundresponse = new alipaytradeservice( $config );
$refundresult = $refundresponse ->refund( $refundrequestbuilder );
//根据交易状态进行处理
switch ( $refundresult ->gettradestatus()){
case "success" :
echo "支付宝退款成功:" . "<br>--------------------------<br>" ;
print_r( $refundresult ->getresponse());
break ;
case "failed" :
echo "支付宝退款失败!!!" . "<br>--------------------------<br>" ;
if (! empty ( $refundresult ->getresponse())){
print_r( $refundresult ->getresponse());
}
break ;
case "unknown" :
echo "系统异常,订单状态未知!!!" . "<br>--------------------------<br>" ;
if (! empty ( $refundresult ->getresponse())){
print_r( $refundresult ->getresponse());
}
break ;
default :
echo "不支持的交易状态,交易返回异常!!!" ;
break ;
}
|
最终提交的url如下
https://openapi.alipay.com/gateway.do?app_id=2016061501500000&version=1.0&format=json&sign_type=rsa&method=alipay.trade.refund×tamp=2016-08-26+18%3a47%3a35&auth_token=&alipay_sdk=alipay-sdk-php-20160411&terminal_type=&terminal_info=&prod_code=¬ify_url=&charset=utf-8&app_auth_token=&sign=y1c5qwglaq0t3brvietqfnijrqmn%2fl9vmla1xgxkcexercjopmys2rpohaw%2f2pjeokjc7r9qafdgknq4lhzxhbrd8sxlpqimps6awcw9p8s%2fzc2oqcjnlfapx6lh8veharj4wzdayezla48ttoqljumgpritgoxyjhhyukdbqss%3d
发送的json数据如下:
1
2
3
4
5
|
{
"out_trade_no" : "qrpay20160826053813582" ,
"refund_amount" : "0.01" ,
"out_request_no" : "1"
}
|
接收到的数据如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
{
"alipay_trade_refund_response" :{
"code" : "10000" ,
"msg" : "success" ,
"buyer_logon_id" : "123***@qq.com" ,
"buyer_user_id" : "2088002364008751" ,
"fund_change" : "y" ,
"gmt_refund_pay" : "2016-08-26 18:47:41" ,
"open_id" : "20880044751374809757987911112575" ,
"out_trade_no" : "qrpay20160826053813582" ,
"refund_detail_item_list" :[
{
"amount" : "0.01" ,
"fund_channel" : "alipayaccount"
}
],
"refund_fee" : "0.01" ,
"send_back_fee" : "0.01" ,
"trade_no" : "2016082621001004750239053830"
},
"sign" : "ydnsmpx5y0rqes0zbfnxrfvip8hf0w30or74cmtwkvpo2byee6tqc+pbnwessz2xsgloztyy7o+sia07l+fmhdv/ptt6qx1mvgqv7rhzodkls0zdrs/5/fy9oyj01xs1wb8od/93inlzdkd2yw9g0he6qgylpcxutkmwuasd7bm="
}
|
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。