支付宝支付开发――当面付条码支付和扫码支付实例


Posted in PHP onNovember 04, 2016

本文介绍支付宝中当面付下属的条码支付、扫码支付、订单查询、退款申请的集成开发过程。

 本文分为以下五个部分:

  • 条码支付和扫码支付介绍
  • 申请应用
  • 密钥生成及配置
  • API及SDK集成
  • 条码支付、扫码支付、订单查询、退款申请

 一、条码支付及二维码支付介绍

1. 条码支付
条码支付是支付宝给到线下传统行业的一种收款方式。商家使用扫码枪等条码识别设备扫描用户支付宝钱包上的条码/二维码,完成收款。用户仅需出示付款码,所有收款操作由商家端完成。其使用场景如下:支付宝支付开发――当面付条码支付和扫码支付实例
业务流程:支付宝支付开发――当面付条码支付和扫码支付实例

使用步骤:

  1. 用户登陆支付宝钱包,点击首页“付款”,进入付款码界面;
  2. 收银员在商家收银系统操作生成订单,用户确认支付金额;
  3. 用户出示钱包的“付款码”,收银员用扫码设备来扫描用户手机上的条码/二维码后,商家收银系统提交支付;
  4. 付款成功后商家收银系统会拿到支付成功或者失败的结果。

2. 扫码支付

扫码支付,指用户打开支付宝钱包中的“扫一扫”功能,扫描商家展示在某收银场景下的二维码并进行支付的模式。该模式适用于线下实体店支付、面对面支付等场景。

其使用场景如下:支付宝支付开发――当面付条码支付和扫码支付实例
业务流程:支付宝支付开发――当面付条码支付和扫码支付实例

使用步骤:

  1. 用户登陆支付宝钱包,点击首页“付款-扫码付”,进入扫一扫界面;
  2. 收银员在商家收银系统操作生成支付宝订单,用户确认支付金额,并生成二维码;
  3. 用户使用钱包的“扫码付”,扫收银员提供的二维码,确认支付;
  4. 用户付款后商家收银系统会拿到支付成功或者失败的结果。 

二、接口申请

企业在申请企业支付宝之后,进行功能申请并签约,然后在蚂蚁金服开放平台中申请应用如下(详细过程就略了)支付宝支付开发――当面付条码支付和扫码支付实例
然后在功能列表中,申请当面付这一功能,申请成功后如下。支付宝支付开发――当面付条码支付和扫码支付实例
这样,我们就有了当面付的权限了。

三、密钥生成

在支付宝当面付的接口中,使用了非对称加密算法,商户自己的公钥和私钥需要自己使用OpenSSL手动生成。对这些概念比较陌生的话,请先自行先了解一下密码学的相关知识。OpenSSL也可以从方倍工作室博客中找到。

下载支付宝官方提供的密钥生成工具OpenSSL,然后执行以下命令就可以生成公钥和私钥。支付宝支付开发――当面付条码支付和扫码支付实例
其中

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-----

命令

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 订单描述
?goods_detail GoodsDetail [] 可选 - 订单包含的商品列表信息,Json格式,其它说明详见商品明细说明
operator_id String 可选 28 商户操作员编号
store_id String 可选 32 商户门店编号
terminal_id String 可选 32 商户机具终端编号
alipay_store_id String 可选 32 支付宝的店铺编号
?extend_params ExtendParams 可选 - 业务扩展参数
timeout_express String 可选 6 该笔订单允许的最晚付款时间,逾期将关闭交易。
?royalty_info RoyaltyInfo 可选 - 描述分账信息,Json格式,其它说明详见分账说明
?sub_merchant 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 交易支付时间
?fund_bill_list TradeFundBill [] 必填 - 交易支付使用的资金渠道
card_balance Price 选填 11 支付宝卡余额
store_name String 选填 512 发生支付交易的商户门店名称
buyer_user_id String 必填 28 买家在支付宝的用户id
discount_goods_detail String 必填 - 本次交易支付所使用的单品券优惠的商品优惠信息

系统中配置如下

<?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. 条码支付

条码支付的参数配置如下

// (必填) 商户网站订单系统中唯一订单号,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数据如下:

{
 "scene":"bar_code",
 "out_trade_no":"barpay20160826051452680",
 "total_amount":0.01,
 "auth_code":"289743098358423535",
 "timeout_express":"5m",
 "subject":"方倍工作室-支付宝-当面付-扫码支付"
}

接收到的数据如下

{
 "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. 扫码支付
扫码支付的参数配置如下

// (必填) 商户网站订单系统中唯一订单号,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数据如下:

{
 "out_trade_no":"qrpay20160826053813582",
 "total_amount":"0.01",
 "timeout_express":"5m",
 "subject":"方倍工作室-支付宝-当面付-扫码支付"
}

返回的数据如下:

{
 "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="
}

其中的https://qr.alipay.com/bax00885xbhszseo9l7p404d 就是二维码链接地址,使用接口将其成二维码后。
当支付宝用户扫码的时候,接口通知将收到如下数据

{
 "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"
}

当用户输入密码付款成功之后,将收到如下数据

{
 "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. 订单查询

订单查询的参数配置如下

////获取商户订单号
$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数据如下:

{
 "out_trade_no":"qrpay20160826053813582"
}

接收到的数据如下

{
 "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. 订单退款

订单退款的参数配置如下

$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数据如下:

{
 "out_trade_no":"qrpay20160826053813582",
 "refund_amount":"0.01",
 "out_request_no":"1"
}

接收到的数据如下

{
 "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="
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。
PHP 相关文章推荐
PHP 替换模板变量实现步骤
Aug 24 PHP
Mysql的Root密码忘记,查看或修改的解决方法(图文介绍)
Jun 14 PHP
解析php框架codeigniter中如何使用框架的session
Jun 24 PHP
win7计划任务定时执行PHP脚本设置图解
May 09 PHP
对PHP语言认识上需要避免的10大误区
Jun 12 PHP
PHP生成指定长度随机数最简洁的方法
Jul 14 PHP
php时间戳格式化显示友好的时间函数分享
Oct 21 PHP
PHP+Ajax实时自动检测是否联网的方法
Jul 01 PHP
提交表单后 PHP获取提交内容的实现方法
May 25 PHP
PHP正则表达式匹配替换与分割功能实例浅析
Feb 04 PHP
PHP7下协程的实现方法详解
Dec 17 PHP
PHP实现腾讯短网址生成api接口实例
Dec 08 PHP
Redis使用Eval多个键值自增的操作实例
Nov 04 #PHP
php array_slice 取出数组中的一段序列实例
Nov 04 #PHP
PHP获取访问页面HTTP状态码的实现代码
Nov 03 #PHP
PHP之将POST数据转化为字符串的实现代码
Nov 03 #PHP
PHP读取文件的常见几种方法
Nov 03 #PHP
PHP自定义多进制的方法
Nov 03 #PHP
关于PHP中字符串与多进制转换函数的实例代码
Nov 03 #PHP
You might like
用Zend Encode编写开发PHP程序
2006/10/09 PHP
php中的MVC模式运用技巧
2007/05/03 PHP
php学习笔记之面向对象编程
2012/12/29 PHP
PHP如何使用Memcached
2016/04/05 PHP
通过PHP设置BugFree获取邮箱通知
2019/04/25 PHP
精解window.setTimeout()&amp;window.setInterval()使用方式与参数传递问题!
2007/11/23 Javascript
Javascript isArray 数组类型检测函数
2009/10/08 Javascript
jquery插件之easing 动态菜单
2010/08/21 Javascript
juqery 学习之三 选择器 简单 内容
2010/11/25 Javascript
jquery插件制作 自增长输入框实现代码
2012/08/17 jQuery
Event altKey,ctrlKey,shiftKey属性解析
2013/12/18 Javascript
jquery遍历select元素(实例讲解)
2013/12/31 Javascript
js获取IP地址的方法小结
2014/07/01 Javascript
ECMAScript 5严格模式(Strict Mode)介绍
2015/03/02 Javascript
jQuery实现的向下图文信息滚动效果
2015/05/03 Javascript
JS实现的倒计时效果实例(2则实例)
2015/12/23 Javascript
详解如何在angular2中获取节点
2017/11/23 Javascript
基于vue-cli配置lib-flexible + rem实现移动端自适应
2017/12/26 Javascript
vue.js分页中单击页码更换页面内容的方法(配合spring springmvc)
2018/02/10 Javascript
vue 每次渲染完页面后div的滚动条保持在最底部的方法
2018/03/17 Javascript
elementUI 设置input的只读或禁用的方法
2018/10/30 Javascript
vue v-model的用法解析
2020/10/19 Javascript
解决vue使用vant轮播组件swipe + flex时文字抖动问题
2021/01/07 Vue.js
[51:43]OG vs LGD 2018国际邀请赛淘汰赛BO3 第五场 8.26
2018/08/30 DOTA
[39:46]完美世界DOTA2联赛PWL S2 LBZS vs Rebirth 第二场 11.25
2020/11/25 DOTA
跟老齐学Python之编写类之一创建实例
2014/10/11 Python
使用python实现接口的方法
2017/07/07 Python
Python实现计算圆周率π的值到任意位的方法示例
2018/05/08 Python
Python爬取商家联系电话以及各种数据的方法
2018/11/10 Python
numpy.array 操作使用简单总结
2019/11/08 Python
python多进程下的生产者和消费者模型
2020/05/07 Python
python 如何对logging日志封装
2020/12/02 Python
护理专科自荐书范文
2014/02/18 职场文书
期末考试复习计划
2015/01/19 职场文书
观看安全警示教育片心得体会
2016/01/15 职场文书
python利用while求100内的整数和方式
2021/11/07 Python